summaryrefslogtreecommitdiff
path: root/net
diff options
context:
space:
mode:
authorJohannes Berg <johannes@sipsolutions.net>2008-09-15 09:26:47 (GMT)
committerJohn W. Linville <linville@tuxdriver.com>2008-09-24 20:17:59 (GMT)
commit942b25cf9028e7c2f6446ee7c6618bd70dafec5f (patch)
treebbda96c17ac19cad03240829ad943ea6ebe740f3 /net
parenta3d2eaf0dcad6dfdf44f3093aef688dfca714b6c (diff)
downloadlinux-942b25cf9028e7c2f6446ee7c6618bd70dafec5f.tar.xz
cfg80211: clean up static regdomain mess
The statically defined regdomains are used in a very convoluted way, use them instead to prime the information we have and then continue operating normally. Signed-off-by: Johannes Berg <johannes@sipsolutions.net> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'net')
-rw-r--r--net/wireless/reg.c73
1 files changed, 20 insertions, 53 deletions
diff --git a/net/wireless/reg.c b/net/wireless/reg.c
index 7aba46e..626dbb6 100644
--- a/net/wireless/reg.c
+++ b/net/wireless/reg.c
@@ -174,32 +174,27 @@ static bool is_old_static_regdom(const struct ieee80211_regdomain *rd)
return true;
return false;
}
-
-/* The old crap never deals with a world regulatory domain, it only
- * deals with the static regulatory domain passed and if possible
- * an updated "US" or "JP" regulatory domain. We do however store the
- * old static regulatory domain in cfg80211_world_regdom for convenience
- * of use here */
-static void reset_regdomains_static(void)
+#else
+static inline bool is_old_static_regdom(const struct ieee80211_regdomain *rd)
{
- if (!is_old_static_regdom(cfg80211_regdomain))
- kfree(cfg80211_regdomain);
- /* This is setting the regdom to the old static regdom */
- cfg80211_regdomain =
- (struct ieee80211_regdomain *) cfg80211_world_regdom;
+ return false;
}
-#else
+#endif
+
static void reset_regdomains(void)
{
- if (cfg80211_world_regdom && cfg80211_world_regdom != &world_regdom) {
- if (cfg80211_world_regdom == cfg80211_regdomain) {
- kfree(cfg80211_regdomain);
- } else {
- kfree(cfg80211_world_regdom);
- kfree(cfg80211_regdomain);
- }
- } else if (cfg80211_regdomain && cfg80211_regdomain != &world_regdom)
- kfree(cfg80211_regdomain);
+ /* avoid freeing static information or freeing something twice */
+ if (cfg80211_regdomain == cfg80211_world_regdom)
+ cfg80211_regdomain = NULL;
+ if (cfg80211_world_regdom == &world_regdom)
+ cfg80211_world_regdom = NULL;
+ if (cfg80211_regdomain == &world_regdom)
+ cfg80211_regdomain = NULL;
+ if (is_old_static_regdom(cfg80211_regdomain))
+ cfg80211_regdomain = NULL;
+
+ kfree(cfg80211_regdomain);
+ kfree(cfg80211_world_regdom);
cfg80211_world_regdom = &world_regdom;
cfg80211_regdomain = NULL;
@@ -216,7 +211,6 @@ static void update_world_regdomain(const struct ieee80211_regdomain *rd)
cfg80211_world_regdom = rd;
cfg80211_regdomain = rd;
}
-#endif
bool is_world_regdom(const char *alpha2)
{
@@ -297,12 +291,8 @@ static int call_crda(const char *alpha2)
printk(KERN_INFO "cfg80211: Calling CRDA for country: %c%c\n",
alpha2[0], alpha2[1]);
else
-#ifdef CONFIG_WIRELESS_OLD_REGULATORY
- return -EINVAL;
-#else
printk(KERN_INFO "cfg80211: Calling CRDA to update world "
"regulatory domain\n");
-#endif
country_env[8] = alpha2[0];
country_env[9] = alpha2[1];
@@ -728,20 +718,12 @@ static int __set_regdom(const struct ieee80211_regdomain *rd)
/* Some basic sanity checks first */
-#ifdef CONFIG_WIRELESS_OLD_REGULATORY
- /* We ignore the world regdom with the old static regdomains setup
- * as there is no point to it with static regulatory definitions :(
- * Don't worry this shit will be removed soon... */
- if (is_world_regdom(rd->alpha2))
- return -EINVAL;
-#else
if (is_world_regdom(rd->alpha2)) {
if (WARN_ON(!__reg_is_valid_request(rd->alpha2, &request)))
return -EINVAL;
update_world_regdomain(rd);
return 0;
}
-#endif
if (!is_alpha2_set(rd->alpha2) && !is_an_alpha2(rd->alpha2) &&
!is_unknown_alpha2(rd->alpha2))
@@ -750,15 +732,10 @@ static int __set_regdom(const struct ieee80211_regdomain *rd)
if (list_empty(&regulatory_requests))
return -EINVAL;
-#ifdef CONFIG_WIRELESS_OLD_REGULATORY
- /* Static "US" and "JP" will be overridden, but just once */
+ /* allow overriding the static definitions if CRDA is present */
if (!is_old_static_regdom(cfg80211_regdomain) &&
- !regdom_changed(rd->alpha2))
- return -EINVAL;
-#else
- if (!regdom_changed(rd->alpha2))
+ !regdom_changed(rd->alpha2))
return -EINVAL;
-#endif
/* Now lets set the regulatory domain, update all driver channels
* and finally inform them of what we have done, in case they want
@@ -768,11 +745,7 @@ static int __set_regdom(const struct ieee80211_regdomain *rd)
if (WARN_ON(!__reg_is_valid_request(rd->alpha2, &request)))
return -EINVAL;
-#ifdef CONFIG_WIRELESS_OLD_REGULATORY
- reset_regdomains_static();
-#else
reset_regdomains();
-#endif
/* Country IE parsing coming soon */
switch (request->initiator) {
@@ -858,10 +831,8 @@ int regulatory_init(void)
#ifdef CONFIG_WIRELESS_OLD_REGULATORY
cfg80211_regdomain = static_regdom(ieee80211_regdom);
- /* Used during reset_regdomains_static() */
- cfg80211_world_regdom = cfg80211_regdomain;
- printk(KERN_INFO "cfg80211: Using old static regulatory domain:\n");
+ printk(KERN_INFO "cfg80211: Using static regulatory domain info\n");
print_regdomain_info(cfg80211_regdomain);
/* The old code still requests for a new regdomain and if
* you have CRDA you get it updated, otherwise you get
@@ -889,11 +860,7 @@ void regulatory_exit(void)
mutex_lock(&cfg80211_drv_mutex);
-#ifdef CONFIG_WIRELESS_OLD_REGULATORY
- reset_regdomains_static();
-#else
reset_regdomains();
-#endif
list_for_each_entry_safe(req, req_tmp, &regulatory_requests, list) {
list_del(&req->list);