cfg80211: fix set_regdom() to cancel requests with same alpha2
While adding regulatory support to ath6kl I noticed that I easily got the regulatory code confused. The way to reproduce the bug was: 1. iw reg set FI (in userspace) 2. cfg80211 calls ath6kl_reg_notify(FI) 3. ath6kl sets regdomain in firmware 4. firmware sends regdomain event to notify about the new regdomain (FI) 5. ath6kl calls regulatory_hint(FI) And this (from FI to FI transition) confuses cfg80211 and after that I only get "Pending regulatory request, waiting for it to be processed...." messages and regdomain changes won't work anymore. The reason why ath6kl calls regulatory_hint() is that firmware can change the regulatory domain by it's own, for example due to 11d IEs. I could of course workaround this in ath6kl but I think it's better to handle the case in cfg80211. The fix is pretty simple, use a different error code if the regdomain is same and then just set the request processed so that it doesn't block new requests. Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com> Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
parent
84f10708f7
commit
959085352b
@ -2128,7 +2128,7 @@ static int __set_regdom(const struct ieee80211_regdomain *rd)
|
|||||||
* checking if the alpha2 changes if CRDA was already called
|
* checking if the alpha2 changes if CRDA was already called
|
||||||
*/
|
*/
|
||||||
if (!regdom_changes(rd->alpha2))
|
if (!regdom_changes(rd->alpha2))
|
||||||
return -EINVAL;
|
return -EALREADY;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -2248,6 +2248,9 @@ int set_regdom(const struct ieee80211_regdomain *rd)
|
|||||||
/* Note that this doesn't update the wiphys, this is done below */
|
/* Note that this doesn't update the wiphys, this is done below */
|
||||||
r = __set_regdom(rd);
|
r = __set_regdom(rd);
|
||||||
if (r) {
|
if (r) {
|
||||||
|
if (r == -EALREADY)
|
||||||
|
reg_set_request_processed();
|
||||||
|
|
||||||
kfree(rd);
|
kfree(rd);
|
||||||
mutex_unlock(®_mutex);
|
mutex_unlock(®_mutex);
|
||||||
return r;
|
return r;
|
||||||
|
Loading…
Reference in New Issue
Block a user