aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless
diff options
context:
space:
mode:
authorArik Nemtsov <arik@wizery.com>2015-03-23 08:32:53 -0400
committerEmmanuel Grumbach <emmanuel.grumbach@intel.com>2015-04-02 02:26:46 -0400
commitb6e160ab15c203fe77d13a121081b1a9bce7cbfe (patch)
treea8058247cf9a81c8aa2a07081ddf460683c36006 /drivers/net/wireless
parent484b3d13b4ac3d721f3479433ad82100e1277580 (diff)
iwlwifi: mvm: always reconfigure last MCC on init
Currently the last found MCC is reconfigured only in the recovery flow. But it should always be used when available, for the ifdown/up or RF-Kill/CT-Kill scenarios. While at it, fix a couple of bugs in the init-from-last-MCC flow. Return an error value when a current MCC is not found. Pass on the regdomain to cfg80211 only if it was changed and don't ignore the return value from the cfg80211-setter function. Signed-off-by: Arik Nemtsov <arikx.nemtsov@intel.com> Reviewed-by: Johannes Berg <johannes.berg@intel.com> Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
Diffstat (limited to 'drivers/net/wireless')
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/mac80211.c17
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/nvm.c9
2 files changed, 16 insertions, 10 deletions
diff --git a/drivers/net/wireless/iwlwifi/mvm/mac80211.c b/drivers/net/wireless/iwlwifi/mvm/mac80211.c
index 07344e11ce0a..0dd999ceed36 100644
--- a/drivers/net/wireless/iwlwifi/mvm/mac80211.c
+++ b/drivers/net/wireless/iwlwifi/mvm/mac80211.c
@@ -379,11 +379,13 @@ int iwl_mvm_init_fw_regd(struct iwl_mvm *mvm)
379{ 379{
380 enum iwl_mcc_source used_src; 380 enum iwl_mcc_source used_src;
381 struct ieee80211_regdomain *regd; 381 struct ieee80211_regdomain *regd;
382 int ret;
383 bool changed;
382 const struct ieee80211_regdomain *r = 384 const struct ieee80211_regdomain *r =
383 rtnl_dereference(mvm->hw->wiphy->regd); 385 rtnl_dereference(mvm->hw->wiphy->regd);
384 386
385 if (!r) 387 if (!r)
386 return 0; 388 return -ENOENT;
387 389
388 /* save the last source in case we overwrite it below */ 390 /* save the last source in case we overwrite it below */
389 used_src = mvm->mcc_src; 391 used_src = mvm->mcc_src;
@@ -395,14 +397,19 @@ int iwl_mvm_init_fw_regd(struct iwl_mvm *mvm)
395 } 397 }
396 398
397 /* Now set our last stored MCC and source */ 399 /* Now set our last stored MCC and source */
398 regd = iwl_mvm_get_regdomain(mvm->hw->wiphy, r->alpha2, used_src, NULL); 400 regd = iwl_mvm_get_regdomain(mvm->hw->wiphy, r->alpha2, used_src,
401 &changed);
399 if (IS_ERR_OR_NULL(regd)) 402 if (IS_ERR_OR_NULL(regd))
400 return -EIO; 403 return -EIO;
401 404
402 regulatory_set_wiphy_regd(mvm->hw->wiphy, regd); 405 /* update cfg80211 if the regdomain was changed */
403 kfree(regd); 406 if (changed)
407 ret = regulatory_set_wiphy_regd_sync_rtnl(mvm->hw->wiphy, regd);
408 else
409 ret = 0;
404 410
405 return 0; 411 kfree(regd);
412 return ret;
406} 413}
407 414
408int iwl_mvm_mac_setup_register(struct iwl_mvm *mvm) 415int iwl_mvm_mac_setup_register(struct iwl_mvm *mvm)
diff --git a/drivers/net/wireless/iwlwifi/mvm/nvm.c b/drivers/net/wireless/iwlwifi/mvm/nvm.c
index 524ade241418..87b2a30a2308 100644
--- a/drivers/net/wireless/iwlwifi/mvm/nvm.c
+++ b/drivers/net/wireless/iwlwifi/mvm/nvm.c
@@ -806,13 +806,12 @@ int iwl_mvm_init_mcc(struct iwl_mvm *mvm)
806 return 0; 806 return 0;
807 807
808 /* 808 /*
809 * During HW restart, only replay the last set MCC to FW. Otherwise, 809 * try to replay the last set MCC to FW. If it doesn't exist,
810 * queue an update to cfg80211 to retrieve the default alpha2 from FW. 810 * queue an update to cfg80211 to retrieve the default alpha2 from FW.
811 */ 811 */
812 if (test_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status)) { 812 retval = iwl_mvm_init_fw_regd(mvm);
813 /* This should only be called during vif up and hold RTNL */ 813 if (retval != -ENOENT)
814 return iwl_mvm_init_fw_regd(mvm); 814 return retval;
815 }
816 815
817 /* 816 /*
818 * Driver regulatory hint for initial update, this also informs the 817 * Driver regulatory hint for initial update, this also informs the