mac80211: fix regdb locking issues

SVN-Revision: 33398
This commit is contained in:
Felix Fietkau 2012-09-14 13:37:30 +00:00
parent 623169bc49
commit ef8b5fda8d
2 changed files with 37 additions and 2 deletions

View file

@ -327,3 +327,38 @@
priv->tsf_high32 = 0; priv->tsf_high32 = 0;
priv->tsf_low32 = 0; priv->tsf_low32 = 0;
--- a/net/wireless/reg.c
+++ b/net/wireless/reg.c
@@ -352,6 +352,9 @@ static void reg_regdb_search(struct work
struct reg_regdb_search_request *request;
const struct ieee80211_regdomain *curdom, *regdom;
int i, r;
+ bool set_reg = false;
+
+ mutex_lock(&cfg80211_mutex);
mutex_lock(&reg_regdb_search_mutex);
while (!list_empty(&reg_regdb_search_list)) {
@@ -367,9 +370,7 @@ static void reg_regdb_search(struct work
r = reg_copy_regd(&regdom, curdom);
if (r)
break;
- mutex_lock(&cfg80211_mutex);
- set_regdom(regdom);
- mutex_unlock(&cfg80211_mutex);
+ set_reg = true;
break;
}
}
@@ -377,6 +378,11 @@ static void reg_regdb_search(struct work
kfree(request);
}
mutex_unlock(&reg_regdb_search_mutex);
+
+ if (set_reg)
+ set_regdom(regdom);
+
+ mutex_unlock(&cfg80211_mutex);
}
static DECLARE_WORK(reg_regdb_work, reg_regdb_search);

View file

@ -1,6 +1,6 @@
--- a/net/wireless/reg.c --- a/net/wireless/reg.c
+++ b/net/wireless/reg.c +++ b/net/wireless/reg.c
@@ -1790,6 +1790,8 @@ void regulatory_hint_11d(struct wiphy *w @@ -1796,6 +1796,8 @@ void regulatory_hint_11d(struct wiphy *w
enum environment_cap env = ENVIRON_ANY; enum environment_cap env = ENVIRON_ANY;
struct regulatory_request *request; struct regulatory_request *request;
@ -9,7 +9,7 @@
mutex_lock(&reg_mutex); mutex_lock(&reg_mutex);
if (unlikely(!last_request)) if (unlikely(!last_request))
@@ -2024,6 +2026,8 @@ static void restore_regulatory_settings( @@ -2030,6 +2032,8 @@ static void restore_regulatory_settings(
void regulatory_hint_disconnect(void) void regulatory_hint_disconnect(void)
{ {