| From 39bd984c203e86f3109b49c2a2e20677c4d3ab65 Mon Sep 17 00:00:00 2001 |
| From: Luca Coelho <luciano.coelho@intel.com> |
| Date: Mon, 24 Jun 2019 22:29:33 +0300 |
| Subject: iwlwifi: mvm: don't send GEO_TX_POWER_LIMIT on version < 41 |
| |
| From: Luca Coelho <luciano.coelho@intel.com> |
| |
| commit 39bd984c203e86f3109b49c2a2e20677c4d3ab65 upstream. |
| |
| Firmware versions before 41 don't support the GEO_TX_POWER_LIMIT |
| command, and sending it to the firmware will cause a firmware crash. |
| We allow this via debugfs, so we need to return an error value in case |
| it's not supported. |
| |
| This had already been fixed during init, when we send the command if |
| the ACPI WGDS table is present. Fix it also for the other, |
| userspace-triggered case. |
| |
| Cc: stable@vger.kernel.org |
| Fixes: 7fe90e0e3d60 ("iwlwifi: mvm: refactor geo init") |
| Signed-off-by: Luca Coelho <luciano.coelho@intel.com> |
| Signed-off-by: Johannes Berg <johannes.berg@intel.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/net/wireless/intel/iwlwifi/mvm/fw.c | 22 +++++++++++++++------- |
| 1 file changed, 15 insertions(+), 7 deletions(-) |
| |
| --- a/drivers/net/wireless/intel/iwlwifi/mvm/fw.c |
| +++ b/drivers/net/wireless/intel/iwlwifi/mvm/fw.c |
| @@ -912,6 +912,17 @@ int iwl_mvm_sar_select_profile(struct iw |
| return iwl_mvm_send_cmd_pdu(mvm, REDUCE_TX_POWER_CMD, 0, len, &cmd); |
| } |
| |
| +static bool iwl_mvm_sar_geo_support(struct iwl_mvm *mvm) |
| +{ |
| + /* |
| + * The GEO_TX_POWER_LIMIT command is not supported on earlier |
| + * firmware versions. Unfortunately, we don't have a TLV API |
| + * flag to rely on, so rely on the major version which is in |
| + * the first byte of ucode_ver. |
| + */ |
| + return IWL_UCODE_SERIAL(mvm->fw->ucode_ver) >= 41; |
| +} |
| + |
| int iwl_mvm_get_sar_geo_profile(struct iwl_mvm *mvm) |
| { |
| struct iwl_geo_tx_power_profiles_resp *resp; |
| @@ -927,6 +938,9 @@ int iwl_mvm_get_sar_geo_profile(struct i |
| .data = { &geo_cmd }, |
| }; |
| |
| + if (!iwl_mvm_sar_geo_support(mvm)) |
| + return -EOPNOTSUPP; |
| + |
| ret = iwl_mvm_send_cmd(mvm, &cmd); |
| if (ret) { |
| IWL_ERR(mvm, "Failed to get geographic profile info %d\n", ret); |
| @@ -952,13 +966,7 @@ static int iwl_mvm_sar_geo_init(struct i |
| int ret, i, j; |
| u16 cmd_wide_id = WIDE_ID(PHY_OPS_GROUP, GEO_TX_POWER_LIMIT); |
| |
| - /* |
| - * This command is not supported on earlier firmware versions. |
| - * Unfortunately, we don't have a TLV API flag to rely on, so |
| - * rely on the major version which is in the first byte of |
| - * ucode_ver. |
| - */ |
| - if (IWL_UCODE_SERIAL(mvm->fw->ucode_ver) < 41) |
| + if (!iwl_mvm_sar_geo_support(mvm)) |
| return 0; |
| |
| ret = iwl_mvm_sar_get_wgds_table(mvm); |