diff options
author | Arik Nemtsov <arik@wizery.com> | 2014-03-04 21:58:46 +0400 |
---|---|---|
committer | Emmanuel Grumbach <emmanuel.grumbach@intel.com> | 2015-03-12 10:57:22 +0300 |
commit | 90d4f7db6c5d8af1f4eab7bc714ec0ee130f9f00 (patch) | |
tree | 58eff677b3afdc343166bf0fb3a4d22226237a32 /drivers/net/wireless/iwlwifi/mvm | |
parent | dcaf9f5ecb6f395152609bdc40660d9b593dca63 (diff) | |
download | linux-90d4f7db6c5d8af1f4eab7bc714ec0ee130f9f00.tar.xz |
iwlwifi: mvm: init country code on init/recovery
During init queue a regulatory update to retrieve the default
regulatory settings from FW. If we're during recovery, only replay the
current country code to FW, if it exists.
Signed-off-by: Arik Nemtsov <arikx.nemtsov@intel.com>
Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
Diffstat (limited to 'drivers/net/wireless/iwlwifi/mvm')
-rw-r--r-- | drivers/net/wireless/iwlwifi/mvm/fw.c | 4 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/mvm/mvm.h | 1 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/mvm/nvm.c | 37 |
3 files changed, 42 insertions, 0 deletions
diff --git a/drivers/net/wireless/iwlwifi/mvm/fw.c b/drivers/net/wireless/iwlwifi/mvm/fw.c index a81da4cde643..c03bde093927 100644 --- a/drivers/net/wireless/iwlwifi/mvm/fw.c +++ b/drivers/net/wireless/iwlwifi/mvm/fw.c @@ -739,6 +739,10 @@ int iwl_mvm_up(struct iwl_mvm *mvm) if (ret) goto error; + ret = iwl_mvm_init_mcc(mvm); + if (ret) + goto error; + if (mvm->fw->ucode_capa.capa[0] & IWL_UCODE_TLV_CAPA_UMAC_SCAN) { ret = iwl_mvm_config_scan(mvm); if (ret) diff --git a/drivers/net/wireless/iwlwifi/mvm/mvm.h b/drivers/net/wireless/iwlwifi/mvm/mvm.h index a0aa3b1dc7a5..b31f43c7cf80 100644 --- a/drivers/net/wireless/iwlwifi/mvm/mvm.h +++ b/drivers/net/wireless/iwlwifi/mvm/mvm.h @@ -1397,6 +1397,7 @@ int iwl_mvm_get_temp(struct iwl_mvm *mvm); /* Location Aware Regulatory */ struct iwl_mcc_update_resp * iwl_mvm_update_mcc(struct iwl_mvm *mvm, const char *alpha2); +int iwl_mvm_init_mcc(struct iwl_mvm *mvm); /* smart fifo */ int iwl_mvm_sf_update(struct iwl_mvm *mvm, struct ieee80211_vif *vif, diff --git a/drivers/net/wireless/iwlwifi/mvm/nvm.c b/drivers/net/wireless/iwlwifi/mvm/nvm.c index 96107b80e130..26c5d94d3717 100644 --- a/drivers/net/wireless/iwlwifi/mvm/nvm.c +++ b/drivers/net/wireless/iwlwifi/mvm/nvm.c @@ -63,6 +63,7 @@ * *****************************************************************************/ #include <linux/firmware.h> +#include <linux/rtnetlink.h> #include "iwl-trans.h" #include "iwl-csr.h" #include "mvm.h" @@ -654,3 +655,39 @@ exit: return ERR_PTR(ret); return resp_cp; } + +int iwl_mvm_init_mcc(struct iwl_mvm *mvm) +{ + if (!iwl_mvm_is_lar_supported(mvm)) + return 0; + + /* + * During HW restart, only replay the last set MCC to FW. Otherwise, + * queue an update to cfg80211 to retrieve the default alpha2 from FW. + */ + if (test_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status)) { + /* This should only be called during vif up and hold RTNL */ + const struct ieee80211_regdomain *r = + rtnl_dereference(mvm->hw->wiphy->regd); + + if (r) { + struct iwl_mcc_update_resp *resp; + + resp = iwl_mvm_update_mcc(mvm, r->alpha2); + if (IS_ERR_OR_NULL(resp)) + return -EIO; + + kfree(resp); + } + + return 0; + } + + /* + * Driver regulatory hint for initial update - use the special + * unknown-country "99" code. This will also clear the "custom reg" + * flag and allow regdomain changes. It will happen after init since + * RTNL is required. + */ + return regulatory_hint(mvm->hw->wiphy, "99"); +} |