ath9k: Revamp wireless mode usage
Use a single enum for managing modes, store supported modes by
the HW in a bitmask.
Register legacy rates with mac80211 only at init.
Signed-off-by: Sujith Manoharan <Sujith.Manoharan@atheros.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
diff --git a/drivers/net/wireless/ath9k/hw.c b/drivers/net/wireless/ath9k/hw.c
index d4b7b63..bde162f 100644
--- a/drivers/net/wireless/ath9k/hw.c
+++ b/drivers/net/wireless/ath9k/hw.c
@@ -225,10 +225,10 @@
const struct ath9k_channel *chan)
{
if (IS_CHAN_CCK(chan))
- return WIRELESS_MODE_11b;
+ return ATH9K_MODE_11A;
if (IS_CHAN_G(chan))
- return WIRELESS_MODE_11g;
- return WIRELESS_MODE_11a;
+ return ATH9K_MODE_11G;
+ return ATH9K_MODE_11A;
}
static bool ath9k_hw_wait(struct ath_hal *ah,
@@ -2416,7 +2416,7 @@
return;
} else {
mode = ath9k_hw_chan2wmode(ah, chan);
- if (mode == WIRELESS_MODE_11g || mode == WIRELESS_MODE_11b) {
+ if (mode == ATH9K_MODE_11G || mode == ATH9K_MODE_11B) {
if (!aniState->ofdmWeakSigDetectOff)
ath9k_hw_ani_control(ah,
ATH9K_ANI_OFDM_WEAK_SIGNAL_DETECTION,
@@ -2462,7 +2462,7 @@
aniState->firstepLevel + 1);
} else {
mode = ath9k_hw_chan2wmode(ah, chan);
- if (mode == WIRELESS_MODE_11g || mode == WIRELESS_MODE_11b) {
+ if (mode == ATH9K_MODE_11G || mode == ATH9K_MODE_11B) {
if (aniState->firstepLevel > 0)
ath9k_hw_ani_control(ah,
ATH9K_ANI_FIRSTEP_LEVEL,
@@ -2970,29 +2970,40 @@
ah->ah_currentRD);
}
- pCap->wireless_modes = 0;
eeval = ath9k_hw_get_eeprom(ahp, EEP_OP_MODE);
+ bitmap_zero(pCap->wireless_modes, ATH9K_MODE_MAX);
if (eeval & AR5416_OPFLAGS_11A) {
- pCap->wireless_modes |= ATH9K_MODE_SEL_11A |
- ((!ah->ah_config.ht_enable
- || (eeval & AR5416_OPFLAGS_N_5G_HT20)) ? 0
- : (ATH9K_MODE_SEL_11NA_HT20 |
- ((eeval & AR5416_OPFLAGS_N_5G_HT40) ? 0
- : (ATH9K_MODE_SEL_11NA_HT40PLUS |
- ATH9K_MODE_SEL_11NA_HT40MINUS))));
+ set_bit(ATH9K_MODE_11A, pCap->wireless_modes);
+ if (ah->ah_config.ht_enable) {
+ if (!(eeval & AR5416_OPFLAGS_N_5G_HT20))
+ set_bit(ATH9K_MODE_11NA_HT20,
+ pCap->wireless_modes);
+ if (!(eeval & AR5416_OPFLAGS_N_5G_HT40)) {
+ set_bit(ATH9K_MODE_11NA_HT40PLUS,
+ pCap->wireless_modes);
+ set_bit(ATH9K_MODE_11NA_HT40MINUS,
+ pCap->wireless_modes);
+ }
+ }
}
- if (eeval & AR5416_OPFLAGS_11G) {
- pCap->wireless_modes |=
- ATH9K_MODE_SEL_11B | ATH9K_MODE_SEL_11G |
- ((!ah->ah_config.ht_enable
- || (eeval & AR5416_OPFLAGS_N_2G_HT20)) ? 0
- : (ATH9K_MODE_SEL_11NG_HT20 |
- ((eeval & AR5416_OPFLAGS_N_2G_HT40) ? 0
- : (ATH9K_MODE_SEL_11NG_HT40PLUS |
- ATH9K_MODE_SEL_11NG_HT40MINUS))));
+ if (eeval & AR5416_OPFLAGS_11G) {
+ set_bit(ATH9K_MODE_11B, pCap->wireless_modes);
+ set_bit(ATH9K_MODE_11G, pCap->wireless_modes);
+ if (ah->ah_config.ht_enable) {
+ if (!(eeval & AR5416_OPFLAGS_N_2G_HT20))
+ set_bit(ATH9K_MODE_11NG_HT20,
+ pCap->wireless_modes);
+ if (!(eeval & AR5416_OPFLAGS_N_2G_HT40)) {
+ set_bit(ATH9K_MODE_11NG_HT40PLUS,
+ pCap->wireless_modes);
+ set_bit(ATH9K_MODE_11NG_HT40MINUS,
+ pCap->wireless_modes);
+ }
+ }
}
+
pCap->tx_chainmask = ath9k_hw_get_eeprom(ahp, EEP_TX_MASK);
if ((ah->ah_isPciExpress)
|| (eeval & AR5416_OPFLAGS_11A)) {
@@ -5213,7 +5224,7 @@
return clks /
CLOCK_RATE[ath9k_hw_chan2wmode(ah, ah->ah_curchan)];
else
- return clks / CLOCK_RATE[WIRELESS_MODE_11b];
+ return clks / CLOCK_RATE[ATH9K_MODE_11B];
}
static u32 ath9k_hw_mac_to_usec(struct ath_hal *ah, u32 clks)
@@ -5232,7 +5243,7 @@
return usecs * CLOCK_RATE[ath9k_hw_chan2wmode(ah,
ah->ah_curchan)];
else
- return usecs * CLOCK_RATE[WIRELESS_MODE_11b];
+ return usecs * CLOCK_RATE[ATH9K_MODE_11B];
}
static u32 ath9k_hw_mac_to_clks(struct ath_hal *ah, u32 usecs)
@@ -5924,7 +5935,7 @@
REG_SET_BIT(ah, AR_GPIO_INPUT_EN_VAL,
AR_GPIO_JTAG_DISABLE);
- if (ah->ah_caps.wireless_modes & ATH9K_MODE_SEL_11A) {
+ if (test_bit(ATH9K_MODE_11A, ah->ah_caps.wireless_modes)) {
if (IS_CHAN_5GHZ(chan))
ath9k_hw_set_gpio(ah, 9, 0);
else
@@ -8238,23 +8249,23 @@
{
struct ath9k_rate_table *rt;
switch (mode) {
- case ATH9K_MODE_SEL_11A:
+ case ATH9K_MODE_11A:
rt = &ar5416_11a_table;
break;
- case ATH9K_MODE_SEL_11B:
+ case ATH9K_MODE_11B:
rt = &ar5416_11b_table;
break;
- case ATH9K_MODE_SEL_11G:
+ case ATH9K_MODE_11G:
rt = &ar5416_11g_table;
break;
- case ATH9K_MODE_SEL_11NG_HT20:
- case ATH9K_MODE_SEL_11NG_HT40PLUS:
- case ATH9K_MODE_SEL_11NG_HT40MINUS:
+ case ATH9K_MODE_11NG_HT20:
+ case ATH9K_MODE_11NG_HT40PLUS:
+ case ATH9K_MODE_11NG_HT40MINUS:
rt = &ar5416_11ng_table;
break;
- case ATH9K_MODE_SEL_11NA_HT20:
- case ATH9K_MODE_SEL_11NA_HT40PLUS:
- case ATH9K_MODE_SEL_11NA_HT40MINUS:
+ case ATH9K_MODE_11NA_HT20:
+ case ATH9K_MODE_11NA_HT40PLUS:
+ case ATH9K_MODE_11NA_HT40MINUS:
rt = &ar5416_11na_table;
break;
default: