ath5k: use regulatory infrastructure
authorBob Copeland <me@bobcopeland.com>
Tue, 31 Mar 2009 02:30:31 +0000 (22:30 -0400)
committerJohn W. Linville <linville@tuxdriver.com>
Wed, 22 Apr 2009 20:54:37 +0000 (16:54 -0400)
Make ath5k select the ath module and add in the hooks to make the
eeprom regulatory hint and reg notifier take effect.

Changes to attach.c
Changes-licensed-under: ISC

Changes to base.c
Changes-licensed-under: 3-Clause-BSD

Signed-off-by: Bob Copeland <me@bobcopeland.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/ath5k/Kconfig
drivers/net/wireless/ath5k/ath5k.h
drivers/net/wireless/ath5k/base.c

index 75383a5..509b6f9 100644 (file)
@@ -1,6 +1,7 @@
 config ATH5K
        tristate "Atheros 5xxx wireless cards support"
        depends on PCI && MAC80211 && WLAN_80211 && EXPERIMENTAL
+       select ATH_COMMON
        select MAC80211_LEDS
        select LEDS_CLASS
        select NEW_LEDS
index 0b616e7..48c18d1 100644 (file)
@@ -27,6 +27,8 @@
 #include <linux/types.h>
 #include <net/mac80211.h>
 
+#include "../ath/regd.h"
+
 /* RX/TX descriptor hw structs
  * TODO: Driver part should only see sw structs */
 #include "desc.h"
@@ -1039,8 +1041,6 @@ struct ath5k_hw {
        bool                    ah_5ghz;
        bool                    ah_2ghz;
 
-#define ah_regdomain           ah_capabilities.cap_regdomain.reg_current
-#define ah_regdomain_hw                ah_capabilities.cap_regdomain.reg_hw
 #define ah_modes               ah_capabilities.cap_mode
 #define ah_ee_version          ah_capabilities.cap_eeprom.ee_version
 
@@ -1065,6 +1065,7 @@ struct ath5k_hw {
        u32                     ah_gpio[AR5K_MAX_GPIO];
        int                     ah_gpio_npins;
 
+       struct ath_regulatory   ah_regulatory;
        struct ath5k_capabilities ah_capabilities;
 
        struct ath5k_txq_info   ah_txq[AR5K_NUM_TX_QUEUES];
index d8c60c5..ff6d4f8 100644 (file)
@@ -709,6 +709,15 @@ err_no_irq:
 * Driver Initialization *
 \***********************/
 
+static int ath5k_reg_notifier(struct wiphy *wiphy, struct regulatory_request *request)
+{
+       struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
+       struct ath5k_softc *sc = hw->priv;
+       struct ath_regulatory *reg = &sc->ah->ah_regulatory;
+
+       return ath_reg_notifier_apply(wiphy, request, reg);
+}
+
 static int
 ath5k_attach(struct pci_dev *pdev, struct ieee80211_hw *hw)
 {
@@ -797,12 +806,23 @@ ath5k_attach(struct pci_dev *pdev, struct ieee80211_hw *hw)
        memset(sc->bssidmask, 0xff, ETH_ALEN);
        ath5k_hw_set_bssid_mask(sc->ah, sc->bssidmask);
 
+       ah->ah_regulatory.current_rd =
+               ah->ah_capabilities.cap_eeprom.ee_regdomain;
+       ret = ath_regd_init(&ah->ah_regulatory, hw->wiphy, ath5k_reg_notifier);
+       if (ret) {
+               ATH5K_ERR(sc, "can't initialize regulatory system\n");
+               goto err_queues;
+       }
+
        ret = ieee80211_register_hw(hw);
        if (ret) {
                ATH5K_ERR(sc, "can't register ieee80211 hw\n");
                goto err_queues;
        }
 
+       if (!ath_is_world_regd(&sc->ah->ah_regulatory))
+               regulatory_hint(hw->wiphy, sc->ah->ah_regulatory.alpha2);
+
        ath5k_init_leds(sc);
 
        return 0;