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>
This commit is contained in:
Родитель
484b3d13b4
Коммит
b6e160ab15
|
@ -379,11 +379,13 @@ int iwl_mvm_init_fw_regd(struct iwl_mvm *mvm)
|
||||||
{
|
{
|
||||||
enum iwl_mcc_source used_src;
|
enum iwl_mcc_source used_src;
|
||||||
struct ieee80211_regdomain *regd;
|
struct ieee80211_regdomain *regd;
|
||||||
|
int ret;
|
||||||
|
bool changed;
|
||||||
const struct ieee80211_regdomain *r =
|
const struct ieee80211_regdomain *r =
|
||||||
rtnl_dereference(mvm->hw->wiphy->regd);
|
rtnl_dereference(mvm->hw->wiphy->regd);
|
||||||
|
|
||||||
if (!r)
|
if (!r)
|
||||||
return 0;
|
return -ENOENT;
|
||||||
|
|
||||||
/* save the last source in case we overwrite it below */
|
/* save the last source in case we overwrite it below */
|
||||||
used_src = mvm->mcc_src;
|
used_src = mvm->mcc_src;
|
||||||
|
@ -395,14 +397,19 @@ int iwl_mvm_init_fw_regd(struct iwl_mvm *mvm)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Now set our last stored MCC and source */
|
/* Now set our last stored MCC and source */
|
||||||
regd = iwl_mvm_get_regdomain(mvm->hw->wiphy, r->alpha2, used_src, NULL);
|
regd = iwl_mvm_get_regdomain(mvm->hw->wiphy, r->alpha2, used_src,
|
||||||
|
&changed);
|
||||||
if (IS_ERR_OR_NULL(regd))
|
if (IS_ERR_OR_NULL(regd))
|
||||||
return -EIO;
|
return -EIO;
|
||||||
|
|
||||||
regulatory_set_wiphy_regd(mvm->hw->wiphy, regd);
|
/* update cfg80211 if the regdomain was changed */
|
||||||
kfree(regd);
|
if (changed)
|
||||||
|
ret = regulatory_set_wiphy_regd_sync_rtnl(mvm->hw->wiphy, regd);
|
||||||
|
else
|
||||||
|
ret = 0;
|
||||||
|
|
||||||
return 0;
|
kfree(regd);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int iwl_mvm_mac_setup_register(struct iwl_mvm *mvm)
|
int iwl_mvm_mac_setup_register(struct iwl_mvm *mvm)
|
||||||
|
|
|
@ -806,13 +806,12 @@ int iwl_mvm_init_mcc(struct iwl_mvm *mvm)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* During HW restart, only replay the last set MCC to FW. Otherwise,
|
* try to replay the last set MCC to FW. If it doesn't exist,
|
||||||
* queue an update to cfg80211 to retrieve the default alpha2 from FW.
|
* queue an update to cfg80211 to retrieve the default alpha2 from FW.
|
||||||
*/
|
*/
|
||||||
if (test_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status)) {
|
retval = iwl_mvm_init_fw_regd(mvm);
|
||||||
/* This should only be called during vif up and hold RTNL */
|
if (retval != -ENOENT)
|
||||||
return iwl_mvm_init_fw_regd(mvm);
|
return retval;
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Driver regulatory hint for initial update, this also informs the
|
* Driver regulatory hint for initial update, this also informs the
|
||||||
|
|
Загрузка…
Ссылка в новой задаче