ath5k: use regulatory infrastructure

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>
This commit is contained in:
Bob Copeland 2009-03-30 22:30:31 -04:00 коммит произвёл John W. Linville
Родитель e3bb249be8
Коммит f769c36bd7
3 изменённых файлов: 24 добавлений и 2 удалений

Просмотреть файл

@ -1,6 +1,7 @@
config ATH5K config ATH5K
tristate "Atheros 5xxx wireless cards support" tristate "Atheros 5xxx wireless cards support"
depends on PCI && MAC80211 && WLAN_80211 && EXPERIMENTAL depends on PCI && MAC80211 && WLAN_80211 && EXPERIMENTAL
select ATH_COMMON
select MAC80211_LEDS select MAC80211_LEDS
select LEDS_CLASS select LEDS_CLASS
select NEW_LEDS select NEW_LEDS

Просмотреть файл

@ -27,6 +27,8 @@
#include <linux/types.h> #include <linux/types.h>
#include <net/mac80211.h> #include <net/mac80211.h>
#include "../ath/regd.h"
/* RX/TX descriptor hw structs /* RX/TX descriptor hw structs
* TODO: Driver part should only see sw structs */ * TODO: Driver part should only see sw structs */
#include "desc.h" #include "desc.h"
@ -1039,8 +1041,6 @@ struct ath5k_hw {
bool ah_5ghz; bool ah_5ghz;
bool ah_2ghz; 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_modes ah_capabilities.cap_mode
#define ah_ee_version ah_capabilities.cap_eeprom.ee_version #define ah_ee_version ah_capabilities.cap_eeprom.ee_version
@ -1065,6 +1065,7 @@ struct ath5k_hw {
u32 ah_gpio[AR5K_MAX_GPIO]; u32 ah_gpio[AR5K_MAX_GPIO];
int ah_gpio_npins; int ah_gpio_npins;
struct ath_regulatory ah_regulatory;
struct ath5k_capabilities ah_capabilities; struct ath5k_capabilities ah_capabilities;
struct ath5k_txq_info ah_txq[AR5K_NUM_TX_QUEUES]; struct ath5k_txq_info ah_txq[AR5K_NUM_TX_QUEUES];

Просмотреть файл

@ -709,6 +709,15 @@ err_no_irq:
* Driver Initialization * * 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 static int
ath5k_attach(struct pci_dev *pdev, struct ieee80211_hw *hw) 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); memset(sc->bssidmask, 0xff, ETH_ALEN);
ath5k_hw_set_bssid_mask(sc->ah, sc->bssidmask); 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); ret = ieee80211_register_hw(hw);
if (ret) { if (ret) {
ATH5K_ERR(sc, "can't register ieee80211 hw\n"); ATH5K_ERR(sc, "can't register ieee80211 hw\n");
goto err_queues; 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); ath5k_init_leds(sc);
return 0; return 0;