diff mbox series

[v5.7] iwlwifi: fix WGDS check when WRDS is disabled

Message ID 20200417073738.2049606-1-luca@coelho.fi (mailing list archive)
State Superseded
Delegated to: Kalle Valo
Headers show
Series [v5.7] iwlwifi: fix WGDS check when WRDS is disabled | expand

Commit Message

Luca Coelho April 17, 2020, 7:37 a.m. UTC
From: Luca Coelho <luciano.coelho@intel.com>

In the reference BIOS implementation, WRDS can be disabled without
disabling WGDS.  And this happens in most cases where WRDS is
disabled, causing the WGDS without WRDS check and issue an error.

To avoid this issue, we change the check so that we only considered it
an error if the WRDS entry doesn't exist.  If the entry (or the
selected profile is disabled for any other reason), we just silently
ignore WGDS.

Cc: stable@vger.kernel.org # 4.14+
Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=205513
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
---

Kalle, I'm going to assing this directly to you, since this should go
to v5.7-rc*.


 drivers/net/wireless/intel/iwlwifi/fw/acpi.c |  9 +++++--
 drivers/net/wireless/intel/iwlwifi/mvm/fw.c  | 25 +++++++++-----------
 2 files changed, 18 insertions(+), 16 deletions(-)

Comments

Luca Coelho April 17, 2020, 10:33 a.m. UTC | #1
On Fri, 2020-04-17 at 10:37 +0300, Luca Coelho wrote:
> From: Luca Coelho <luciano.coelho@intel.com>
> 
> In the reference BIOS implementation, WRDS can be disabled without
> disabling WGDS.  And this happens in most cases where WRDS is
> disabled, causing the WGDS without WRDS check and issue an error.
> 
> To avoid this issue, we change the check so that we only considered it
> an error if the WRDS entry doesn't exist.  If the entry (or the
> selected profile is disabled for any other reason), we just silently
> ignore WGDS.
> 
> Cc: stable@vger.kernel.org # 4.14+
> Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=205513
> Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
> ---
> 

[...]

> @@ -741,9 +742,14 @@ int iwl_mvm_sar_select_profile(struct iwl_mvm *mvm, int prof_a, int prof_b)
>  		len = sizeof(cmd.v4.v3);
>  
>  
> -	if (iwl_sar_select_profile(&mvm->fwrt, cmd.v5.v3.per_chain_restriction,
> -				   prof_a, prof_b))
> -		return -ENOENT;
> +	ret = iwl_sar_select_profile(&mvm->fwrt,
> +				     cmd.v5.v3.per_chain_restriction,
> +				     prof_a, prof_b);
> +
> +	/* return on error or if the profile is disabled (positive numeber) */
> +	if (!ret)
> +		return ret;
> +

Oops, this should be "if (ret)" instead, as someone pointed out in an
internal review.  I'll send v2 in a sec.

--
Cheers,
Luca.
diff mbox series

Patch

diff --git a/drivers/net/wireless/intel/iwlwifi/fw/acpi.c b/drivers/net/wireless/intel/iwlwifi/fw/acpi.c
index ba2aff3af0fe..e3a33388be70 100644
--- a/drivers/net/wireless/intel/iwlwifi/fw/acpi.c
+++ b/drivers/net/wireless/intel/iwlwifi/fw/acpi.c
@@ -296,9 +296,14 @@  int iwl_sar_select_profile(struct iwl_fw_runtime *fwrt,
 		if (!prof->enabled) {
 			IWL_DEBUG_RADIO(fwrt, "SAR profile %d is disabled.\n",
 					profs[i]);
-			/* if one of the profiles is disabled, we fail all */
-			return -ENOENT;
+			/*
+			 * if one of the profiles is disabled, we
+			 * ignore all of them and return 1 to
+			 * differentiate disabled from other failures.
+			 */
+			return 1;
 		}
+
 		IWL_DEBUG_INFO(fwrt,
 			       "SAR EWRD: chain %d profile index %d\n",
 			       i, profs[i]);
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/fw.c b/drivers/net/wireless/intel/iwlwifi/mvm/fw.c
index a4038f289ab3..2a4a55f3b073 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/fw.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/fw.c
@@ -727,6 +727,7 @@  int iwl_mvm_sar_select_profile(struct iwl_mvm *mvm, int prof_a, int prof_b)
 		struct iwl_dev_tx_power_cmd_v4 v4;
 	} cmd;
 
+	int ret;
 	u16 len = 0;
 
 	cmd.v5.v3.set_mode = cpu_to_le32(IWL_TX_POWER_MODE_SET_CHAINS);
@@ -741,9 +742,14 @@  int iwl_mvm_sar_select_profile(struct iwl_mvm *mvm, int prof_a, int prof_b)
 		len = sizeof(cmd.v4.v3);
 
 
-	if (iwl_sar_select_profile(&mvm->fwrt, cmd.v5.v3.per_chain_restriction,
-				   prof_a, prof_b))
-		return -ENOENT;
+	ret = iwl_sar_select_profile(&mvm->fwrt,
+				     cmd.v5.v3.per_chain_restriction,
+				     prof_a, prof_b);
+
+	/* return on error or if the profile is disabled (positive numeber) */
+	if (!ret)
+		return ret;
+
 	IWL_DEBUG_RADIO(mvm, "Sending REDUCE_TX_POWER_CMD per chain\n");
 	return iwl_mvm_send_cmd_pdu(mvm, REDUCE_TX_POWER_CMD, 0, len, &cmd);
 }
@@ -1034,16 +1040,7 @@  static int iwl_mvm_sar_init(struct iwl_mvm *mvm)
 				"EWRD SAR BIOS table invalid or unavailable. (%d)\n",
 				ret);
 
-	ret = iwl_mvm_sar_select_profile(mvm, 1, 1);
-	/*
-	 * 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)
-		return 1;
-
-	return ret;
+	return iwl_mvm_sar_select_profile(mvm, 1, 1);
 }
 
 static int iwl_mvm_load_rt_fw(struct iwl_mvm *mvm)
@@ -1272,7 +1269,7 @@  int iwl_mvm_up(struct iwl_mvm *mvm)
 	ret = iwl_mvm_sar_init(mvm);
 	if (ret == 0) {
 		ret = iwl_mvm_sar_geo_init(mvm);
-	} else if (ret > 0 && !iwl_sar_get_wgds_table(&mvm->fwrt)) {
+	} else if (ret == -ENOENT && !iwl_sar_get_wgds_table(&mvm->fwrt)) {
 		/*
 		 * If basic SAR is not available, we check for WGDS,
 		 * which should *not* be available either.  If it is