aboutsummaryrefslogtreecommitdiffstats
path: root/net/wireless
diff options
context:
space:
mode:
Diffstat (limited to 'net/wireless')
-rw-r--r--net/wireless/reg.c34
1 files changed, 25 insertions, 9 deletions
diff --git a/net/wireless/reg.c b/net/wireless/reg.c
index ba823120d245..6373a78a37e7 100644
--- a/net/wireless/reg.c
+++ b/net/wireless/reg.c
@@ -1050,11 +1050,7 @@ static int ignore_request(struct wiphy *wiphy, enum reg_set_by set_by,
1050 case REGDOM_SET_BY_INIT: 1050 case REGDOM_SET_BY_INIT:
1051 return -EINVAL; 1051 return -EINVAL;
1052 case REGDOM_SET_BY_CORE: 1052 case REGDOM_SET_BY_CORE:
1053 /* 1053 return -EINVAL;
1054 * Always respect new wireless core hints, should only happen
1055 * when updating the world regulatory domain at init.
1056 */
1057 return 0;
1058 case REGDOM_SET_BY_COUNTRY_IE: 1054 case REGDOM_SET_BY_COUNTRY_IE:
1059 if (unlikely(!is_an_alpha2(alpha2))) 1055 if (unlikely(!is_an_alpha2(alpha2)))
1060 return -EINVAL; 1056 return -EINVAL;
@@ -1183,6 +1179,26 @@ new_request:
1183 return call_crda(alpha2); 1179 return call_crda(alpha2);
1184} 1180}
1185 1181
1182static int regulatory_hint_core(const char *alpha2)
1183{
1184 struct regulatory_request *request;
1185
1186 BUG_ON(last_request);
1187
1188 request = kzalloc(sizeof(struct regulatory_request),
1189 GFP_KERNEL);
1190 if (!request)
1191 return -ENOMEM;
1192
1193 request->alpha2[0] = alpha2[0];
1194 request->alpha2[1] = alpha2[1];
1195 request->initiator = REGDOM_SET_BY_CORE;
1196
1197 last_request = request;
1198
1199 return call_crda(alpha2);
1200}
1201
1186void regulatory_hint(struct wiphy *wiphy, const char *alpha2) 1202void regulatory_hint(struct wiphy *wiphy, const char *alpha2)
1187{ 1203{
1188 int r; 1204 int r;
@@ -1616,16 +1632,16 @@ int regulatory_init(void)
1616 * stuck with the static values. We ignore "EU" code as 1632 * stuck with the static values. We ignore "EU" code as
1617 * that is not a valid ISO / IEC 3166 alpha2 */ 1633 * that is not a valid ISO / IEC 3166 alpha2 */
1618 if (ieee80211_regdom[0] != 'E' || ieee80211_regdom[1] != 'U') 1634 if (ieee80211_regdom[0] != 'E' || ieee80211_regdom[1] != 'U')
1619 err = __regulatory_hint(NULL, REGDOM_SET_BY_CORE, 1635 err = regulatory_hint_core(ieee80211_regdom);
1620 ieee80211_regdom, 0, ENVIRON_ANY);
1621#else 1636#else
1622 cfg80211_regdomain = cfg80211_world_regdom; 1637 cfg80211_regdomain = cfg80211_world_regdom;
1623 1638
1624 err = __regulatory_hint(NULL, REGDOM_SET_BY_CORE, "00", 0, ENVIRON_ANY); 1639 err = regulatory_hint_core("00");
1625 if (err) 1640 if (err) {
1626 printk(KERN_ERR "cfg80211: calling CRDA failed - " 1641 printk(KERN_ERR "cfg80211: calling CRDA failed - "
1627 "unable to update world regulatory domain, " 1642 "unable to update world regulatory domain, "
1628 "using static definition\n"); 1643 "using static definition\n");
1644 }
1629#endif 1645#endif
1630 1646
1631 return 0; 1647 return 0;