|
@@ -915,6 +915,11 @@ static int iwl_mvm_sar_get_ewrd_table(struct iwl_mvm *mvm)
|
|
|
return -ENOENT;
|
|
return -ENOENT;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+static int iwl_mvm_sar_get_wgds_table(struct iwl_mvm *mvm)
|
|
|
|
|
+{
|
|
|
|
|
+ return -ENOENT;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
static int iwl_mvm_sar_geo_init(struct iwl_mvm *mvm)
|
|
static int iwl_mvm_sar_geo_init(struct iwl_mvm *mvm)
|
|
|
{
|
|
{
|
|
|
return 0;
|
|
return 0;
|
|
@@ -941,8 +946,11 @@ static int iwl_mvm_sar_init(struct iwl_mvm *mvm)
|
|
|
IWL_DEBUG_RADIO(mvm,
|
|
IWL_DEBUG_RADIO(mvm,
|
|
|
"WRDS SAR BIOS table invalid or unavailable. (%d)\n",
|
|
"WRDS SAR BIOS table invalid or unavailable. (%d)\n",
|
|
|
ret);
|
|
ret);
|
|
|
- /* if not available, don't fail and don't bother with EWRD */
|
|
|
|
|
- return 0;
|
|
|
|
|
|
|
+ /*
|
|
|
|
|
+ * If not available, don't fail and don't bother with EWRD.
|
|
|
|
|
+ * Return 1 to tell that we can't use WGDS either.
|
|
|
|
|
+ */
|
|
|
|
|
+ return 1;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
ret = iwl_mvm_sar_get_ewrd_table(mvm);
|
|
ret = iwl_mvm_sar_get_ewrd_table(mvm);
|
|
@@ -955,9 +963,13 @@ static int iwl_mvm_sar_init(struct iwl_mvm *mvm)
|
|
|
/* choose profile 1 (WRDS) as default for both chains */
|
|
/* choose profile 1 (WRDS) as default for both chains */
|
|
|
ret = iwl_mvm_sar_select_profile(mvm, 1, 1);
|
|
ret = iwl_mvm_sar_select_profile(mvm, 1, 1);
|
|
|
|
|
|
|
|
- /* if we don't have profile 0 from BIOS, just skip it */
|
|
|
|
|
|
|
+ /*
|
|
|
|
|
+ * If we don't have profile 0 from BIOS, just skip it. This
|
|
|
|
|
+ * means that SAR Geo will not be enabled either, even if we
|
|
|
|
|
+ * have other valid profiles.
|
|
|
|
|
+ */
|
|
|
if (ret == -ENOENT)
|
|
if (ret == -ENOENT)
|
|
|
- return 0;
|
|
|
|
|
|
|
+ return 1;
|
|
|
|
|
|
|
|
return ret;
|
|
return ret;
|
|
|
}
|
|
}
|
|
@@ -1155,11 +1167,19 @@ int iwl_mvm_up(struct iwl_mvm *mvm)
|
|
|
iwl_mvm_unref(mvm, IWL_MVM_REF_UCODE_DOWN);
|
|
iwl_mvm_unref(mvm, IWL_MVM_REF_UCODE_DOWN);
|
|
|
|
|
|
|
|
ret = iwl_mvm_sar_init(mvm);
|
|
ret = iwl_mvm_sar_init(mvm);
|
|
|
- if (ret)
|
|
|
|
|
- goto error;
|
|
|
|
|
|
|
+ if (ret == 0) {
|
|
|
|
|
+ ret = iwl_mvm_sar_geo_init(mvm);
|
|
|
|
|
+ } else if (ret > 0 && !iwl_mvm_sar_get_wgds_table(mvm)) {
|
|
|
|
|
+ /*
|
|
|
|
|
+ * If basic SAR is not available, we check for WGDS,
|
|
|
|
|
+ * which should *not* be available either. If it is
|
|
|
|
|
+ * available, issue an error, because we can't use SAR
|
|
|
|
|
+ * Geo without basic SAR.
|
|
|
|
|
+ */
|
|
|
|
|
+ IWL_ERR(mvm, "BIOS contains WGDS but no WRDS\n");
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- ret = iwl_mvm_sar_geo_init(mvm);
|
|
|
|
|
- if (ret)
|
|
|
|
|
|
|
+ if (ret < 0)
|
|
|
goto error;
|
|
goto error;
|
|
|
|
|
|
|
|
iwl_mvm_leds_sync(mvm);
|
|
iwl_mvm_leds_sync(mvm);
|