/* Central wireless core regulatory domains, we only need two,
* the current one and a world regulatory domain in case we have no
* information to give us an alpha2 */
-static struct ieee80211_regdomain *cfg80211_regdomain;
+static const struct ieee80211_regdomain *cfg80211_regdomain;
/* We keep a static world regulatory domain in case of the absence of CRDA */
static const struct ieee80211_regdomain world_regdom = {
}
};
-static struct ieee80211_regdomain *cfg80211_world_regdom =
- (struct ieee80211_regdomain *) &world_regdom;
+static const struct ieee80211_regdomain *cfg80211_world_regdom =
+ &world_regdom;
#ifdef CONFIG_WIRELESS_OLD_REGULATORY
static char *ieee80211_regdom = "US";
return &us_regdom;
}
-static bool is_old_static_regdom(struct ieee80211_regdomain *rd)
+static bool is_old_static_regdom(const struct ieee80211_regdomain *rd)
{
if (rd == &us_regdom || rd == &jp_regdom || rd == &eu_regdom)
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 = (struct ieee80211_regdomain *) &world_regdom;
+ cfg80211_world_regdom = &world_regdom;
cfg80211_regdomain = NULL;
}
/* Dynamic world regulatory domain requested by the wireless
* core upon initialization */
-static void update_world_regdomain(struct ieee80211_regdomain *rd)
+static void update_world_regdomain(const struct ieee80211_regdomain *rd)
{
BUG_ON(list_empty(®ulatory_requests));
cfg80211_world_regdom = rd;
cfg80211_regdomain = rd;
}
-#endif
-bool is_world_regdom(char *alpha2)
+bool is_world_regdom(const char *alpha2)
{
if (!alpha2)
return false;
return false;
}
-static bool is_alpha2_set(char *alpha2)
+static bool is_alpha2_set(const char *alpha2)
{
if (!alpha2)
return false;
return false;
}
-static bool is_unknown_alpha2(char *alpha2)
+static bool is_unknown_alpha2(const char *alpha2)
{
if (!alpha2)
return false;
return false;
}
-static bool is_an_alpha2(char *alpha2)
+static bool is_an_alpha2(const char *alpha2)
{
if (!alpha2)
return false;
return false;
}
-static bool alpha2_equal(char *alpha2_x, char *alpha2_y)
+static bool alpha2_equal(const char *alpha2_x, const char *alpha2_y)
{
if (!alpha2_x || !alpha2_y)
return false;
return false;
}
-static bool regdom_changed(char *alpha2)
+static bool regdom_changed(const char *alpha2)
{
if (!cfg80211_regdomain)
return true;
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];
}
}
-static bool __reg_is_valid_request(char *alpha2,
+static bool __reg_is_valid_request(const char *alpha2,
struct regulatory_request **request)
{
struct regulatory_request *req;
}
/* Used by nl80211 before kmalloc'ing our regulatory domain */
-bool reg_is_valid_request(char *alpha2)
+bool reg_is_valid_request(const char *alpha2)
{
struct regulatory_request *request = NULL;
return __reg_is_valid_request(alpha2, &request);
}
/* Sanity check on a regulatory rule */
-static bool is_valid_reg_rule(struct ieee80211_reg_rule *rule)
+static bool is_valid_reg_rule(const struct ieee80211_reg_rule *rule)
{
- struct ieee80211_freq_range *freq_range = &rule->freq_range;
+ const struct ieee80211_freq_range *freq_range = &rule->freq_range;
u32 freq_diff;
if (freq_range->start_freq_khz == 0 || freq_range->end_freq_khz == 0)
return true;
}
-static bool is_valid_rd(struct ieee80211_regdomain *rd)
+static bool is_valid_rd(const struct ieee80211_regdomain *rd)
{
- struct ieee80211_reg_rule *reg_rule = NULL;
+ const struct ieee80211_reg_rule *reg_rule = NULL;
unsigned int i;
if (!rd->n_reg_rules)
EXPORT_SYMBOL(regulatory_hint);
-static void print_rd_rules(struct ieee80211_regdomain *rd)
+static void print_rd_rules(const struct ieee80211_regdomain *rd)
{
unsigned int i;
- struct ieee80211_reg_rule *reg_rule = NULL;
- struct ieee80211_freq_range *freq_range = NULL;
- struct ieee80211_power_rule *power_rule = NULL;
+ const struct ieee80211_reg_rule *reg_rule = NULL;
+ const struct ieee80211_freq_range *freq_range = NULL;
+ const struct ieee80211_power_rule *power_rule = NULL;
printk(KERN_INFO "\t(start_freq - end_freq @ bandwidth), "
"(max_antenna_gain, max_eirp)\n");
}
}
-static void print_regdomain(struct ieee80211_regdomain *rd)
+static void print_regdomain(const struct ieee80211_regdomain *rd)
{
if (is_world_regdom(rd->alpha2))
print_rd_rules(rd);
}
-void print_regdomain_info(struct ieee80211_regdomain *rd)
+void print_regdomain_info(const struct ieee80211_regdomain *rd)
{
printk(KERN_INFO "cfg80211: Regulatory domain: %c%c\n",
rd->alpha2[0], rd->alpha2[1]);
print_rd_rules(rd);
}
-static int __set_regdom(struct ieee80211_regdomain *rd)
+static int __set_regdom(const struct ieee80211_regdomain *rd)
{
struct regulatory_request *request = NULL;
/* 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))
if (list_empty(®ulatory_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
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) {
* multiple drivers can be ironed out later. Caller must've already
* kmalloc'd the rd structure. If this calls fails you should kfree()
* the passed rd. Caller must hold cfg80211_drv_mutex */
-int set_regdom(struct ieee80211_regdomain *rd)
+int set_regdom(const struct ieee80211_regdomain *rd)
{
struct regulatory_request *this_request = NULL, *prev_request = NULL;
int r;
return PTR_ERR(reg_pdev);
#ifdef CONFIG_WIRELESS_OLD_REGULATORY
- cfg80211_regdomain =
- (struct ieee80211_regdomain *) static_regdom(ieee80211_regdom);
- /* Used during reset_regdomains_static() */
- cfg80211_world_regdom = cfg80211_regdomain;
+ cfg80211_regdomain = static_regdom(ieee80211_regdom);
- 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
err = __regulatory_hint(NULL, REGDOM_SET_BY_CORE,
ieee80211_regdom, NULL);
#else
- cfg80211_regdomain =
- (struct ieee80211_regdomain *) cfg80211_world_regdom;
+ cfg80211_regdomain = cfg80211_world_regdom;
err = __regulatory_hint(NULL, REGDOM_SET_BY_CORE, "00", NULL);
if (err)
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, ®ulatory_requests, list) {
list_del(&req->list);