diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/wireless/ath/regd.c | 55 | ||||
-rw-r--r-- | drivers/net/wireless/ath/regd.h | 12 | ||||
-rw-r--r-- | drivers/net/wireless/ath9k/main.c | 47 |
3 files changed, 58 insertions, 56 deletions
diff --git a/drivers/net/wireless/ath/regd.c b/drivers/net/wireless/ath/regd.c index 4d3935b6fbdd..3ccf21cceb5a 100644 --- a/drivers/net/wireless/ath/regd.c +++ b/drivers/net/wireless/ath/regd.c | |||
@@ -126,14 +126,13 @@ bool ath_is_world_regd(struct ath_regulatory *reg) | |||
126 | } | 126 | } |
127 | EXPORT_SYMBOL(ath_is_world_regd); | 127 | EXPORT_SYMBOL(ath_is_world_regd); |
128 | 128 | ||
129 | const struct ieee80211_regdomain *ath_default_world_regdomain(void) | 129 | static const struct ieee80211_regdomain *ath_default_world_regdomain(void) |
130 | { | 130 | { |
131 | /* this is the most restrictive */ | 131 | /* this is the most restrictive */ |
132 | return &ath_world_regdom_64; | 132 | return &ath_world_regdom_64; |
133 | } | 133 | } |
134 | EXPORT_SYMBOL(ath_default_world_regdomain); | ||
135 | 134 | ||
136 | const struct | 135 | static const struct |
137 | ieee80211_regdomain *ath_world_regdomain(struct ath_regulatory *reg) | 136 | ieee80211_regdomain *ath_world_regdomain(struct ath_regulatory *reg) |
138 | { | 137 | { |
139 | switch (reg->regpair->regDmnEnum) { | 138 | switch (reg->regpair->regDmnEnum) { |
@@ -158,7 +157,6 @@ ieee80211_regdomain *ath_world_regdomain(struct ath_regulatory *reg) | |||
158 | return ath_default_world_regdomain(); | 157 | return ath_default_world_regdomain(); |
159 | } | 158 | } |
160 | } | 159 | } |
161 | EXPORT_SYMBOL(ath_world_regdomain); | ||
162 | 160 | ||
163 | /* Frequency is one where radar detection is required */ | 161 | /* Frequency is one where radar detection is required */ |
164 | static bool ath_is_radar_freq(u16 center_freq) | 162 | static bool ath_is_radar_freq(u16 center_freq) |
@@ -285,7 +283,7 @@ static void ath_reg_apply_active_scan_flags( | |||
285 | } | 283 | } |
286 | 284 | ||
287 | /* Always apply Radar/DFS rules on freq range 5260 MHz - 5700 MHz */ | 285 | /* Always apply Radar/DFS rules on freq range 5260 MHz - 5700 MHz */ |
288 | void ath_reg_apply_radar_flags(struct wiphy *wiphy) | 286 | static void ath_reg_apply_radar_flags(struct wiphy *wiphy) |
289 | { | 287 | { |
290 | struct ieee80211_supported_band *sband; | 288 | struct ieee80211_supported_band *sband; |
291 | struct ieee80211_channel *ch; | 289 | struct ieee80211_channel *ch; |
@@ -316,11 +314,10 @@ void ath_reg_apply_radar_flags(struct wiphy *wiphy) | |||
316 | IEEE80211_CHAN_PASSIVE_SCAN; | 314 | IEEE80211_CHAN_PASSIVE_SCAN; |
317 | } | 315 | } |
318 | } | 316 | } |
319 | EXPORT_SYMBOL(ath_reg_apply_radar_flags); | ||
320 | 317 | ||
321 | void ath_reg_apply_world_flags(struct wiphy *wiphy, | 318 | static void ath_reg_apply_world_flags(struct wiphy *wiphy, |
322 | enum nl80211_reg_initiator initiator, | 319 | enum nl80211_reg_initiator initiator, |
323 | struct ath_regulatory *reg) | 320 | struct ath_regulatory *reg) |
324 | { | 321 | { |
325 | switch (reg->regpair->regDmnEnum) { | 322 | switch (reg->regpair->regDmnEnum) { |
326 | case 0x60: | 323 | case 0x60: |
@@ -336,7 +333,6 @@ void ath_reg_apply_world_flags(struct wiphy *wiphy, | |||
336 | } | 333 | } |
337 | return; | 334 | return; |
338 | } | 335 | } |
339 | EXPORT_SYMBOL(ath_reg_apply_world_flags); | ||
340 | 336 | ||
341 | int ath_reg_notifier_apply(struct wiphy *wiphy, | 337 | int ath_reg_notifier_apply(struct wiphy *wiphy, |
342 | struct regulatory_request *request, struct ath_regulatory *reg) | 338 | struct regulatory_request *request, struct ath_regulatory *reg) |
@@ -360,7 +356,7 @@ int ath_reg_notifier_apply(struct wiphy *wiphy, | |||
360 | } | 356 | } |
361 | EXPORT_SYMBOL(ath_reg_notifier_apply); | 357 | EXPORT_SYMBOL(ath_reg_notifier_apply); |
362 | 358 | ||
363 | bool ath_regd_is_eeprom_valid(struct ath_regulatory *reg) | 359 | static bool ath_regd_is_eeprom_valid(struct ath_regulatory *reg) |
364 | { | 360 | { |
365 | u16 rd = ath_regd_get_eepromRD(reg); | 361 | u16 rd = ath_regd_get_eepromRD(reg); |
366 | int i; | 362 | int i; |
@@ -381,7 +377,6 @@ bool ath_regd_is_eeprom_valid(struct ath_regulatory *reg) | |||
381 | "ath: invalid regulatory domain/country code 0x%x\n", rd); | 377 | "ath: invalid regulatory domain/country code 0x%x\n", rd); |
382 | return false; | 378 | return false; |
383 | } | 379 | } |
384 | EXPORT_SYMBOL(ath_regd_is_eeprom_valid); | ||
385 | 380 | ||
386 | /* EEPROM country code to regpair mapping */ | 381 | /* EEPROM country code to regpair mapping */ |
387 | static struct country_code_to_enum_rd* | 382 | static struct country_code_to_enum_rd* |
@@ -438,7 +433,40 @@ ath_get_regpair(int regdmn) | |||
438 | return NULL; | 433 | return NULL; |
439 | } | 434 | } |
440 | 435 | ||
441 | int ath_regd_init(struct ath_regulatory *reg) | 436 | static int ath_regd_init_wiphy(struct ath_regulatory *reg, struct wiphy *wiphy, |
437 | int (*reg_notifier)(struct wiphy *wiphy, | ||
438 | struct regulatory_request *request)) | ||
439 | { | ||
440 | const struct ieee80211_regdomain *regd; | ||
441 | |||
442 | wiphy->reg_notifier = reg_notifier; | ||
443 | wiphy->strict_regulatory = true; | ||
444 | |||
445 | if (ath_is_world_regd(reg)) { | ||
446 | /* | ||
447 | * Anything applied here (prior to wiphy registration) gets | ||
448 | * saved on the wiphy orig_* parameters | ||
449 | */ | ||
450 | regd = ath_world_regdomain(reg); | ||
451 | wiphy->custom_regulatory = true; | ||
452 | wiphy->strict_regulatory = false; | ||
453 | } else { | ||
454 | /* | ||
455 | * This gets applied in the case of the absense of CRDA, | ||
456 | * it's our own custom world regulatory domain, similar to | ||
457 | * cfg80211's but we enable passive scanning. | ||
458 | */ | ||
459 | regd = ath_default_world_regdomain(); | ||
460 | } | ||
461 | wiphy_apply_custom_regulatory(wiphy, regd); | ||
462 | ath_reg_apply_radar_flags(wiphy); | ||
463 | ath_reg_apply_world_flags(wiphy, NL80211_REGDOM_SET_BY_DRIVER, reg); | ||
464 | return 0; | ||
465 | } | ||
466 | |||
467 | int ath_regd_init(struct ath_regulatory *reg, struct wiphy *wiphy, | ||
468 | int (*reg_notifier)(struct wiphy *wiphy, | ||
469 | struct regulatory_request *request)) | ||
442 | { | 470 | { |
443 | struct country_code_to_enum_rd *country = NULL; | 471 | struct country_code_to_enum_rd *country = NULL; |
444 | u16 regdmn; | 472 | u16 regdmn; |
@@ -492,6 +520,7 @@ int ath_regd_init(struct ath_regulatory *reg) | |||
492 | printk(KERN_DEBUG "ath: Regpair detected: 0x%0x\n", | 520 | printk(KERN_DEBUG "ath: Regpair detected: 0x%0x\n", |
493 | reg->regpair->regDmnEnum); | 521 | reg->regpair->regDmnEnum); |
494 | 522 | ||
523 | ath_regd_init_wiphy(reg, wiphy, reg_notifier); | ||
495 | return 0; | 524 | return 0; |
496 | } | 525 | } |
497 | EXPORT_SYMBOL(ath_regd_init); | 526 | EXPORT_SYMBOL(ath_regd_init); |
diff --git a/drivers/net/wireless/ath/regd.h b/drivers/net/wireless/ath/regd.h index 981f5cf2bdb8..eba7c7123b50 100644 --- a/drivers/net/wireless/ath/regd.h +++ b/drivers/net/wireless/ath/regd.h | |||
@@ -254,15 +254,9 @@ enum CountryCode { | |||
254 | }; | 254 | }; |
255 | 255 | ||
256 | bool ath_is_world_regd(struct ath_regulatory *reg); | 256 | bool ath_is_world_regd(struct ath_regulatory *reg); |
257 | const | 257 | int ath_regd_init(struct ath_regulatory *reg, struct wiphy *wiphy, |
258 | struct ieee80211_regdomain *ath_world_regdomain(struct ath_regulatory *reg); | 258 | int (*reg_notifier)(struct wiphy *wiphy, |
259 | const struct ieee80211_regdomain *ath_default_world_regdomain(void); | 259 | struct regulatory_request *request)); |
260 | void ath_reg_apply_world_flags(struct wiphy *wiphy, | ||
261 | enum nl80211_reg_initiator, | ||
262 | struct ath_regulatory *reg); | ||
263 | void ath_reg_apply_radar_flags(struct wiphy *wiphy); | ||
264 | int ath_regd_init(struct ath_regulatory *reg); | ||
265 | bool ath_regd_is_eeprom_valid(struct ath_regulatory *reg); | ||
266 | u32 ath_regd_get_band_ctl(struct ath_regulatory *reg, | 260 | u32 ath_regd_get_band_ctl(struct ath_regulatory *reg, |
267 | enum ieee80211_band band); | 261 | enum ieee80211_band band); |
268 | int ath_reg_notifier_apply(struct wiphy *wiphy, | 262 | int ath_reg_notifier_apply(struct wiphy *wiphy, |
diff --git a/drivers/net/wireless/ath9k/main.c b/drivers/net/wireless/ath9k/main.c index d779f00c9b9d..8b6a7ea4e59b 100644 --- a/drivers/net/wireless/ath9k/main.c +++ b/drivers/net/wireless/ath9k/main.c | |||
@@ -1352,6 +1352,17 @@ void ath_detach(struct ath_softc *sc) | |||
1352 | ath9k_ps_restore(sc); | 1352 | ath9k_ps_restore(sc); |
1353 | } | 1353 | } |
1354 | 1354 | ||
1355 | static int ath9k_reg_notifier(struct wiphy *wiphy, | ||
1356 | struct regulatory_request *request) | ||
1357 | { | ||
1358 | struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy); | ||
1359 | struct ath_wiphy *aphy = hw->priv; | ||
1360 | struct ath_softc *sc = aphy->sc; | ||
1361 | struct ath_regulatory *reg = &sc->sc_ah->regulatory; | ||
1362 | |||
1363 | return ath_reg_notifier_apply(wiphy, request, reg); | ||
1364 | } | ||
1365 | |||
1355 | static int ath_init(u16 devid, struct ath_softc *sc) | 1366 | static int ath_init(u16 devid, struct ath_softc *sc) |
1356 | { | 1367 | { |
1357 | struct ath_hw *ah = NULL; | 1368 | struct ath_hw *ah = NULL; |
@@ -1406,7 +1417,8 @@ static int ath_init(u16 devid, struct ath_softc *sc) | |||
1406 | for (i = 0; i < sc->keymax; i++) | 1417 | for (i = 0; i < sc->keymax; i++) |
1407 | ath9k_hw_keyreset(ah, (u16) i); | 1418 | ath9k_hw_keyreset(ah, (u16) i); |
1408 | 1419 | ||
1409 | if (ath_regd_init(&sc->sc_ah->regulatory)) | 1420 | if (ath_regd_init(&sc->sc_ah->regulatory, sc->hw->wiphy, |
1421 | ath9k_reg_notifier)) | ||
1410 | goto bad; | 1422 | goto bad; |
1411 | 1423 | ||
1412 | /* default to MONITOR mode */ | 1424 | /* default to MONITOR mode */ |
@@ -1570,17 +1582,6 @@ bad: | |||
1570 | return error; | 1582 | return error; |
1571 | } | 1583 | } |
1572 | 1584 | ||
1573 | static int ath9k_reg_notifier(struct wiphy *wiphy, | ||
1574 | struct regulatory_request *request) | ||
1575 | { | ||
1576 | struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy); | ||
1577 | struct ath_wiphy *aphy = hw->priv; | ||
1578 | struct ath_softc *sc = aphy->sc; | ||
1579 | struct ath_regulatory *reg = &sc->sc_ah->regulatory; | ||
1580 | |||
1581 | return ath_reg_notifier_apply(wiphy, request, reg); | ||
1582 | } | ||
1583 | |||
1584 | void ath_set_hw_capab(struct ath_softc *sc, struct ieee80211_hw *hw) | 1585 | void ath_set_hw_capab(struct ath_softc *sc, struct ieee80211_hw *hw) |
1585 | { | 1586 | { |
1586 | hw->flags = IEEE80211_HW_RX_INCLUDES_FCS | | 1587 | hw->flags = IEEE80211_HW_RX_INCLUDES_FCS | |
@@ -1600,9 +1601,6 @@ void ath_set_hw_capab(struct ath_softc *sc, struct ieee80211_hw *hw) | |||
1600 | BIT(NL80211_IFTYPE_ADHOC) | | 1601 | BIT(NL80211_IFTYPE_ADHOC) | |
1601 | BIT(NL80211_IFTYPE_MESH_POINT); | 1602 | BIT(NL80211_IFTYPE_MESH_POINT); |
1602 | 1603 | ||
1603 | hw->wiphy->reg_notifier = ath9k_reg_notifier; | ||
1604 | hw->wiphy->strict_regulatory = true; | ||
1605 | |||
1606 | hw->queues = 4; | 1604 | hw->queues = 4; |
1607 | hw->max_rates = 4; | 1605 | hw->max_rates = 4; |
1608 | hw->channel_change_time = 5000; | 1606 | hw->channel_change_time = 5000; |
@@ -1623,7 +1621,6 @@ void ath_set_hw_capab(struct ath_softc *sc, struct ieee80211_hw *hw) | |||
1623 | int ath_attach(u16 devid, struct ath_softc *sc) | 1621 | int ath_attach(u16 devid, struct ath_softc *sc) |
1624 | { | 1622 | { |
1625 | struct ieee80211_hw *hw = sc->hw; | 1623 | struct ieee80211_hw *hw = sc->hw; |
1626 | const struct ieee80211_regdomain *regd; | ||
1627 | int error = 0, i; | 1624 | int error = 0, i; |
1628 | struct ath_regulatory *reg; | 1625 | struct ath_regulatory *reg; |
1629 | 1626 | ||
@@ -1667,24 +1664,6 @@ int ath_attach(u16 devid, struct ath_softc *sc) | |||
1667 | goto error_attach; | 1664 | goto error_attach; |
1668 | #endif | 1665 | #endif |
1669 | 1666 | ||
1670 | if (ath_is_world_regd(reg)) { | ||
1671 | /* Anything applied here (prior to wiphy registration) gets | ||
1672 | * saved on the wiphy orig_* parameters */ | ||
1673 | regd = ath_world_regdomain(reg); | ||
1674 | hw->wiphy->custom_regulatory = true; | ||
1675 | hw->wiphy->strict_regulatory = false; | ||
1676 | } else { | ||
1677 | /* This gets applied in the case of the absense of CRDA, | ||
1678 | * it's our own custom world regulatory domain, similar to | ||
1679 | * cfg80211's but we enable passive scanning */ | ||
1680 | regd = ath_default_world_regdomain(); | ||
1681 | } | ||
1682 | wiphy_apply_custom_regulatory(hw->wiphy, regd); | ||
1683 | ath_reg_apply_radar_flags(hw->wiphy); | ||
1684 | ath_reg_apply_world_flags(hw->wiphy, | ||
1685 | NL80211_REGDOM_SET_BY_DRIVER, | ||
1686 | reg); | ||
1687 | |||
1688 | INIT_WORK(&sc->chan_work, ath9k_wiphy_chan_work); | 1667 | INIT_WORK(&sc->chan_work, ath9k_wiphy_chan_work); |
1689 | INIT_DELAYED_WORK(&sc->wiphy_work, ath9k_wiphy_work); | 1668 | INIT_DELAYED_WORK(&sc->wiphy_work, ath9k_wiphy_work); |
1690 | sc->wiphy_scheduler_int = msecs_to_jiffies(500); | 1669 | sc->wiphy_scheduler_int = msecs_to_jiffies(500); |