diff options
author | David S. Miller <davem@davemloft.net> | 2009-03-27 20:35:07 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2009-03-27 20:35:07 -0400 |
commit | 0870352bc6e0dee485c86a0c99dd60e7089c8917 (patch) | |
tree | 0c6259b663350594bff4f128e12f8bd6d4c769c1 /net/wireless/reg.c | |
parent | c44a4366649aca4f5b4a51ff71d4c9cde3b7c9da (diff) | |
parent | 8a5117d80fe93de5df5b56480054f7df1fd20755 (diff) |
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-2.6
Diffstat (limited to 'net/wireless/reg.c')
-rw-r--r-- | net/wireless/reg.c | 65 |
1 files changed, 31 insertions, 34 deletions
diff --git a/net/wireless/reg.c b/net/wireless/reg.c index eb8b8ed16155..6327e1617acb 100644 --- a/net/wireless/reg.c +++ b/net/wireless/reg.c | |||
@@ -122,9 +122,14 @@ static const struct ieee80211_regdomain *cfg80211_world_regdom = | |||
122 | 122 | ||
123 | #ifdef CONFIG_WIRELESS_OLD_REGULATORY | 123 | #ifdef CONFIG_WIRELESS_OLD_REGULATORY |
124 | static char *ieee80211_regdom = "US"; | 124 | static char *ieee80211_regdom = "US"; |
125 | #else | ||
126 | static char *ieee80211_regdom = "00"; | ||
127 | #endif | ||
128 | |||
125 | module_param(ieee80211_regdom, charp, 0444); | 129 | module_param(ieee80211_regdom, charp, 0444); |
126 | MODULE_PARM_DESC(ieee80211_regdom, "IEEE 802.11 regulatory domain code"); | 130 | MODULE_PARM_DESC(ieee80211_regdom, "IEEE 802.11 regulatory domain code"); |
127 | 131 | ||
132 | #ifdef CONFIG_WIRELESS_OLD_REGULATORY | ||
128 | /* | 133 | /* |
129 | * We assume 40 MHz bandwidth for the old regulatory work. | 134 | * We assume 40 MHz bandwidth for the old regulatory work. |
130 | * We make emphasis we are using the exact same frequencies | 135 | * We make emphasis we are using the exact same frequencies |
@@ -1415,16 +1420,6 @@ new_request: | |||
1415 | return r; | 1420 | return r; |
1416 | } | 1421 | } |
1417 | 1422 | ||
1418 | /* | ||
1419 | * Note: When CONFIG_WIRELESS_OLD_REGULATORY is enabled | ||
1420 | * AND if CRDA is NOT present nothing will happen, if someone | ||
1421 | * wants to bother with 11d with OLD_REG you can add a timer. | ||
1422 | * If after x amount of time nothing happens you can call: | ||
1423 | * | ||
1424 | * return set_regdom(country_ie_regdomain); | ||
1425 | * | ||
1426 | * to intersect with the static rd | ||
1427 | */ | ||
1428 | return call_crda(last_request->alpha2); | 1423 | return call_crda(last_request->alpha2); |
1429 | } | 1424 | } |
1430 | 1425 | ||
@@ -1601,6 +1596,10 @@ static bool reg_same_country_ie_hint(struct wiphy *wiphy, | |||
1601 | 1596 | ||
1602 | assert_cfg80211_lock(); | 1597 | assert_cfg80211_lock(); |
1603 | 1598 | ||
1599 | if (unlikely(last_request->initiator != | ||
1600 | NL80211_REGDOM_SET_BY_COUNTRY_IE)) | ||
1601 | return false; | ||
1602 | |||
1604 | request_wiphy = wiphy_idx_to_wiphy(last_request->wiphy_idx); | 1603 | request_wiphy = wiphy_idx_to_wiphy(last_request->wiphy_idx); |
1605 | 1604 | ||
1606 | if (!request_wiphy) | 1605 | if (!request_wiphy) |
@@ -1663,7 +1662,9 @@ void regulatory_hint_11d(struct wiphy *wiphy, | |||
1663 | * we optimize an early check to exit out early if we don't have to | 1662 | * we optimize an early check to exit out early if we don't have to |
1664 | * do anything | 1663 | * do anything |
1665 | */ | 1664 | */ |
1666 | if (likely(wiphy_idx_valid(last_request->wiphy_idx))) { | 1665 | if (likely(last_request->initiator == |
1666 | NL80211_REGDOM_SET_BY_COUNTRY_IE && | ||
1667 | wiphy_idx_valid(last_request->wiphy_idx))) { | ||
1667 | struct cfg80211_registered_device *drv_last_ie; | 1668 | struct cfg80211_registered_device *drv_last_ie; |
1668 | 1669 | ||
1669 | drv_last_ie = | 1670 | drv_last_ie = |
@@ -2022,28 +2023,21 @@ static int __set_regdom(const struct ieee80211_regdomain *rd) | |||
2022 | */ | 2023 | */ |
2023 | 2024 | ||
2024 | BUG_ON(!country_ie_regdomain); | 2025 | BUG_ON(!country_ie_regdomain); |
2026 | BUG_ON(rd == country_ie_regdomain); | ||
2025 | 2027 | ||
2026 | if (rd != country_ie_regdomain) { | 2028 | /* |
2027 | /* | 2029 | * Intersect what CRDA returned and our what we |
2028 | * Intersect what CRDA returned and our what we | 2030 | * had built from the Country IE received |
2029 | * had built from the Country IE received | 2031 | */ |
2030 | */ | ||
2031 | 2032 | ||
2032 | intersected_rd = regdom_intersect(rd, country_ie_regdomain); | 2033 | intersected_rd = regdom_intersect(rd, country_ie_regdomain); |
2033 | 2034 | ||
2034 | reg_country_ie_process_debug(rd, country_ie_regdomain, | 2035 | reg_country_ie_process_debug(rd, |
2035 | intersected_rd); | 2036 | country_ie_regdomain, |
2037 | intersected_rd); | ||
2036 | 2038 | ||
2037 | kfree(country_ie_regdomain); | 2039 | kfree(country_ie_regdomain); |
2038 | country_ie_regdomain = NULL; | 2040 | country_ie_regdomain = NULL; |
2039 | } else { | ||
2040 | /* | ||
2041 | * This would happen when CRDA was not present and | ||
2042 | * OLD_REGULATORY was enabled. We intersect our Country | ||
2043 | * IE rd and what was set on cfg80211 originally | ||
2044 | */ | ||
2045 | intersected_rd = regdom_intersect(rd, cfg80211_regdomain); | ||
2046 | } | ||
2047 | 2041 | ||
2048 | if (!intersected_rd) | 2042 | if (!intersected_rd) |
2049 | return -EINVAL; | 2043 | return -EINVAL; |
@@ -2135,15 +2129,18 @@ int regulatory_init(void) | |||
2135 | /* | 2129 | /* |
2136 | * The old code still requests for a new regdomain and if | 2130 | * The old code still requests for a new regdomain and if |
2137 | * you have CRDA you get it updated, otherwise you get | 2131 | * you have CRDA you get it updated, otherwise you get |
2138 | * stuck with the static values. We ignore "EU" code as | 2132 | * stuck with the static values. Since "EU" is not a valid |
2139 | * that is not a valid ISO / IEC 3166 alpha2 | 2133 | * ISO / IEC 3166 alpha2 code we can't expect userpace to |
2134 | * give us a regulatory domain for it. We need last_request | ||
2135 | * iniitalized though so lets just send a request which we | ||
2136 | * know will be ignored... this crap will be removed once | ||
2137 | * OLD_REG dies. | ||
2140 | */ | 2138 | */ |
2141 | if (ieee80211_regdom[0] != 'E' || ieee80211_regdom[1] != 'U') | 2139 | err = regulatory_hint_core(ieee80211_regdom); |
2142 | err = regulatory_hint_core(ieee80211_regdom); | ||
2143 | #else | 2140 | #else |
2144 | cfg80211_regdomain = cfg80211_world_regdom; | 2141 | cfg80211_regdomain = cfg80211_world_regdom; |
2145 | 2142 | ||
2146 | err = regulatory_hint_core("00"); | 2143 | err = regulatory_hint_core(ieee80211_regdom); |
2147 | #endif | 2144 | #endif |
2148 | if (err) { | 2145 | if (err) { |
2149 | if (err == -ENOMEM) | 2146 | if (err == -ENOMEM) |