Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless
Conflicts: drivers/net/wireless/iwlwifi/iwl-agn.c drivers/net/wireless/libertas/cfg.c
This commit is contained in:
@@ -89,8 +89,8 @@ static const struct nla_policy nl80211_policy[NL80211_ATTR_MAX+1] = {
|
||||
[NL80211_ATTR_IFINDEX] = { .type = NLA_U32 },
|
||||
[NL80211_ATTR_IFNAME] = { .type = NLA_NUL_STRING, .len = IFNAMSIZ-1 },
|
||||
|
||||
[NL80211_ATTR_MAC] = { .type = NLA_BINARY, .len = ETH_ALEN },
|
||||
[NL80211_ATTR_PREV_BSSID] = { .type = NLA_BINARY, .len = ETH_ALEN },
|
||||
[NL80211_ATTR_MAC] = { .len = ETH_ALEN },
|
||||
[NL80211_ATTR_PREV_BSSID] = { .len = ETH_ALEN },
|
||||
|
||||
[NL80211_ATTR_KEY] = { .type = NLA_NESTED, },
|
||||
[NL80211_ATTR_KEY_DATA] = { .type = NLA_BINARY,
|
||||
|
@@ -57,8 +57,17 @@
|
||||
#define REG_DBG_PRINT(args...)
|
||||
#endif
|
||||
|
||||
static struct regulatory_request core_request_world = {
|
||||
.initiator = NL80211_REGDOM_SET_BY_CORE,
|
||||
.alpha2[0] = '0',
|
||||
.alpha2[1] = '0',
|
||||
.intersect = false,
|
||||
.processed = true,
|
||||
.country_ie_env = ENVIRON_ANY,
|
||||
};
|
||||
|
||||
/* Receipt of information from last regulatory request */
|
||||
static struct regulatory_request *last_request;
|
||||
static struct regulatory_request *last_request = &core_request_world;
|
||||
|
||||
/* To trigger userspace events */
|
||||
static struct platform_device *reg_pdev;
|
||||
@@ -150,7 +159,7 @@ static char user_alpha2[2];
|
||||
module_param(ieee80211_regdom, charp, 0444);
|
||||
MODULE_PARM_DESC(ieee80211_regdom, "IEEE 802.11 regulatory domain code");
|
||||
|
||||
static void reset_regdomains(void)
|
||||
static void reset_regdomains(bool full_reset)
|
||||
{
|
||||
/* avoid freeing static information or freeing something twice */
|
||||
if (cfg80211_regdomain == cfg80211_world_regdom)
|
||||
@@ -165,6 +174,13 @@ static void reset_regdomains(void)
|
||||
|
||||
cfg80211_world_regdom = &world_regdom;
|
||||
cfg80211_regdomain = NULL;
|
||||
|
||||
if (!full_reset)
|
||||
return;
|
||||
|
||||
if (last_request != &core_request_world)
|
||||
kfree(last_request);
|
||||
last_request = &core_request_world;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -175,7 +191,7 @@ static void update_world_regdomain(const struct ieee80211_regdomain *rd)
|
||||
{
|
||||
BUG_ON(!last_request);
|
||||
|
||||
reset_regdomains();
|
||||
reset_regdomains(false);
|
||||
|
||||
cfg80211_world_regdom = rd;
|
||||
cfg80211_regdomain = rd;
|
||||
@@ -1409,7 +1425,8 @@ static int __regulatory_hint(struct wiphy *wiphy,
|
||||
}
|
||||
|
||||
new_request:
|
||||
kfree(last_request);
|
||||
if (last_request != &core_request_world)
|
||||
kfree(last_request);
|
||||
|
||||
last_request = pending_request;
|
||||
last_request->intersect = intersect;
|
||||
@@ -1579,9 +1596,6 @@ static int regulatory_hint_core(const char *alpha2)
|
||||
{
|
||||
struct regulatory_request *request;
|
||||
|
||||
kfree(last_request);
|
||||
last_request = NULL;
|
||||
|
||||
request = kzalloc(sizeof(struct regulatory_request),
|
||||
GFP_KERNEL);
|
||||
if (!request)
|
||||
@@ -1779,7 +1793,7 @@ static void restore_regulatory_settings(bool reset_user)
|
||||
mutex_lock(&cfg80211_mutex);
|
||||
mutex_lock(®_mutex);
|
||||
|
||||
reset_regdomains();
|
||||
reset_regdomains(true);
|
||||
restore_alpha2(alpha2, reset_user);
|
||||
|
||||
/*
|
||||
@@ -2076,12 +2090,18 @@ static int __set_regdom(const struct ieee80211_regdomain *rd)
|
||||
}
|
||||
|
||||
request_wiphy = wiphy_idx_to_wiphy(last_request->wiphy_idx);
|
||||
if (!request_wiphy &&
|
||||
(last_request->initiator == NL80211_REGDOM_SET_BY_DRIVER ||
|
||||
last_request->initiator == NL80211_REGDOM_SET_BY_COUNTRY_IE)) {
|
||||
schedule_delayed_work(®_timeout, 0);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
if (!last_request->intersect) {
|
||||
int r;
|
||||
|
||||
if (last_request->initiator != NL80211_REGDOM_SET_BY_DRIVER) {
|
||||
reset_regdomains();
|
||||
reset_regdomains(false);
|
||||
cfg80211_regdomain = rd;
|
||||
return 0;
|
||||
}
|
||||
@@ -2102,7 +2122,7 @@ static int __set_regdom(const struct ieee80211_regdomain *rd)
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
reset_regdomains();
|
||||
reset_regdomains(false);
|
||||
cfg80211_regdomain = rd;
|
||||
return 0;
|
||||
}
|
||||
@@ -2127,7 +2147,7 @@ static int __set_regdom(const struct ieee80211_regdomain *rd)
|
||||
|
||||
rd = NULL;
|
||||
|
||||
reset_regdomains();
|
||||
reset_regdomains(false);
|
||||
cfg80211_regdomain = intersected_rd;
|
||||
|
||||
return 0;
|
||||
@@ -2147,7 +2167,7 @@ static int __set_regdom(const struct ieee80211_regdomain *rd)
|
||||
kfree(rd);
|
||||
rd = NULL;
|
||||
|
||||
reset_regdomains();
|
||||
reset_regdomains(false);
|
||||
cfg80211_regdomain = intersected_rd;
|
||||
|
||||
return 0;
|
||||
@@ -2300,9 +2320,9 @@ void /* __init_or_exit */ regulatory_exit(void)
|
||||
mutex_lock(&cfg80211_mutex);
|
||||
mutex_lock(®_mutex);
|
||||
|
||||
reset_regdomains();
|
||||
reset_regdomains(true);
|
||||
|
||||
kfree(last_request);
|
||||
dev_set_uevent_suppress(®_pdev->dev, true);
|
||||
|
||||
platform_device_unregister(reg_pdev);
|
||||
|
||||
|
Reference in New Issue
Block a user