diff options
Diffstat (limited to 'package/mac80211/patches/542-ath9k_no_mode_idx.patch')
-rw-r--r-- | package/mac80211/patches/542-ath9k_no_mode_idx.patch | 247 |
1 files changed, 247 insertions, 0 deletions
diff --git a/package/mac80211/patches/542-ath9k_no_mode_idx.patch b/package/mac80211/patches/542-ath9k_no_mode_idx.patch new file mode 100644 index 0000000000..ae6854637d --- /dev/null +++ b/package/mac80211/patches/542-ath9k_no_mode_idx.patch @@ -0,0 +1,247 @@ +--- a/drivers/net/wireless/ath/ath9k/rc.c ++++ b/drivers/net/wireless/ath/ath9k/rc.c +@@ -378,17 +378,6 @@ static const struct ath_rate_table ar541 + 0, /* Phy rates allowed initially */ + }; + +-static const struct ath_rate_table *hw_rate_table[ATH9K_MODE_MAX] = { +- [ATH9K_MODE_11A] = &ar5416_11a_ratetable, +- [ATH9K_MODE_11G] = &ar5416_11g_ratetable, +- [ATH9K_MODE_11NA_HT20] = &ar5416_11na_ratetable, +- [ATH9K_MODE_11NG_HT20] = &ar5416_11ng_ratetable, +- [ATH9K_MODE_11NA_HT40PLUS] = &ar5416_11na_ratetable, +- [ATH9K_MODE_11NA_HT40MINUS] = &ar5416_11na_ratetable, +- [ATH9K_MODE_11NG_HT40PLUS] = &ar5416_11ng_ratetable, +- [ATH9K_MODE_11NG_HT40MINUS] = &ar5416_11ng_ratetable, +-}; +- + static int ath_rc_get_rateindex(const struct ath_rate_table *rate_table, + struct ieee80211_tx_rate *rate); + +@@ -1200,38 +1189,23 @@ static void ath_rc_tx_status(struct ath_ + static const + struct ath_rate_table *ath_choose_rate_table(struct ath_softc *sc, + enum ieee80211_band band, +- bool is_ht, +- bool is_cw_40) ++ bool is_ht) + { +- int mode = 0; + struct ath_common *common = ath9k_hw_common(sc->sc_ah); + + switch(band) { + case IEEE80211_BAND_2GHZ: +- mode = ATH9K_MODE_11G; + if (is_ht) +- mode = ATH9K_MODE_11NG_HT20; +- if (is_cw_40) +- mode = ATH9K_MODE_11NG_HT40PLUS; +- break; ++ return &ar5416_11ng_ratetable; ++ return &ar5416_11g_ratetable; + case IEEE80211_BAND_5GHZ: +- mode = ATH9K_MODE_11A; + if (is_ht) +- mode = ATH9K_MODE_11NA_HT20; +- if (is_cw_40) +- mode = ATH9K_MODE_11NA_HT40PLUS; +- break; ++ return &ar5416_11na_ratetable; ++ return &ar5416_11a_ratetable; + default: + ath_print(common, ATH_DBG_CONFIG, "Invalid band\n"); + return NULL; + } +- +- BUG_ON(mode >= ATH9K_MODE_MAX); +- +- ath_print(common, ATH_DBG_CONFIG, +- "Choosing rate table for mode: %d\n", mode); +- +- return hw_rate_table[mode]; + } + + static void ath_rc_init(struct ath_softc *sc, +@@ -1480,7 +1454,7 @@ static void ath_rate_init(void *priv, st + /* Choose rate table first */ + + rate_table = ath_choose_rate_table(sc, sband->band, +- sta->ht_cap.ht_supported, is_cw40); ++ sta->ht_cap.ht_supported); + + ath_rc_priv->ht_cap = ath_rc_build_ht_caps(sc, sta, is_cw40, is_sgi); + ath_rc_init(sc, priv_sta, sband, sta, rate_table); +@@ -1520,8 +1494,7 @@ static void ath_rate_update(void *priv, + + if ((local_cw40 != oper_cw40) || (local_sgi != oper_sgi)) { + rate_table = ath_choose_rate_table(sc, sband->band, +- sta->ht_cap.ht_supported, +- oper_cw40); ++ sta->ht_cap.ht_supported); + ath_rc_priv->ht_cap = ath_rc_build_ht_caps(sc, sta, + oper_cw40, oper_sgi); + ath_rc_init(sc, priv_sta, sband, sta, rate_table); +--- a/drivers/net/wireless/ath/ath9k/hw.c ++++ b/drivers/net/wireless/ath/ath9k/hw.c +@@ -1812,37 +1812,11 @@ int ath9k_hw_fill_cap_info(struct ath_hw + return -EINVAL; + } + +- bitmap_zero(pCap->wireless_modes, ATH9K_MODE_MAX); ++ if (eeval & AR5416_OPFLAGS_11A) ++ pCap->hw_caps |= ATH9K_HW_CAP_5GHZ; + +- if (eeval & AR5416_OPFLAGS_11A) { +- set_bit(ATH9K_MODE_11A, pCap->wireless_modes); +- if (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) { +- set_bit(ATH9K_MODE_11G, pCap->wireless_modes); +- if (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); +- } +- } +- } ++ if (eeval & AR5416_OPFLAGS_11G) ++ pCap->hw_caps |= ATH9K_HW_CAP_2GHZ; + + pCap->tx_chainmask = ah->eep_ops->get_eeprom(ah, EEP_TX_MASK); + /* +--- a/drivers/net/wireless/ath/ath9k/hw.h ++++ b/drivers/net/wireless/ath/ath9k/hw.h +@@ -164,18 +164,6 @@ enum ath_ini_subsys { + ATH_INI_NUM_SPLIT, + }; + +-enum wireless_mode { +- ATH9K_MODE_11A = 0, +- ATH9K_MODE_11G, +- ATH9K_MODE_11NA_HT20, +- ATH9K_MODE_11NG_HT20, +- ATH9K_MODE_11NA_HT40PLUS, +- ATH9K_MODE_11NA_HT40MINUS, +- ATH9K_MODE_11NG_HT40PLUS, +- ATH9K_MODE_11NG_HT40MINUS, +- ATH9K_MODE_MAX, +-}; +- + enum ath9k_hw_caps { + ATH9K_HW_CAP_HT = BIT(0), + ATH9K_HW_CAP_RFSILENT = BIT(1), +@@ -190,11 +178,12 @@ enum ath9k_hw_caps { + ATH9K_HW_CAP_SGI_20 = BIT(10), + ATH9K_HW_CAP_PAPRD = BIT(11), + ATH9K_HW_CAP_ANT_DIV_COMB = BIT(12), ++ ATH9K_HW_CAP_2GHZ = BIT(13), ++ ATH9K_HW_CAP_5GHZ = BIT(14), + }; + + struct ath9k_hw_capabilities { + u32 hw_caps; /* ATH9K_HW_CAP_* from ath9k_hw_caps */ +- DECLARE_BITMAP(wireless_modes, ATH9K_MODE_MAX); /* ATH9K_MODE_* */ + u16 total_queues; + u16 keycache_size; + u16 low_5ghz_chan, high_5ghz_chan; +--- a/drivers/net/wireless/ath/ath9k/init.c ++++ b/drivers/net/wireless/ath/ath9k/init.c +@@ -486,7 +486,7 @@ static int ath9k_init_channels_rates(str + ARRAY_SIZE(ath9k_5ghz_chantable) != + ATH9K_NUM_CHANNELS); + +- if (test_bit(ATH9K_MODE_11G, sc->sc_ah->caps.wireless_modes)) { ++ if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_2GHZ) { + channels = kmemdup(ath9k_2ghz_chantable, + sizeof(ath9k_2ghz_chantable), GFP_KERNEL); + if (!channels) +@@ -501,7 +501,7 @@ static int ath9k_init_channels_rates(str + ARRAY_SIZE(ath9k_legacy_rates); + } + +- if (test_bit(ATH9K_MODE_11A, sc->sc_ah->caps.wireless_modes)) { ++ if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_5GHZ) { + channels = kmemdup(ath9k_5ghz_chantable, + sizeof(ath9k_5ghz_chantable), GFP_KERNEL); + if (!channels) { +@@ -690,17 +690,17 @@ void ath9k_set_hw_capab(struct ath_softc + hw->rate_control_algorithm = "ath9k_rate_control"; + #endif + +- if (test_bit(ATH9K_MODE_11G, sc->sc_ah->caps.wireless_modes)) ++ if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_2GHZ) + hw->wiphy->bands[IEEE80211_BAND_2GHZ] = + &sc->sbands[IEEE80211_BAND_2GHZ]; +- if (test_bit(ATH9K_MODE_11A, sc->sc_ah->caps.wireless_modes)) ++ if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_5GHZ) + hw->wiphy->bands[IEEE80211_BAND_5GHZ] = + &sc->sbands[IEEE80211_BAND_5GHZ]; + + if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_HT) { +- if (test_bit(ATH9K_MODE_11G, sc->sc_ah->caps.wireless_modes)) ++ if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_2GHZ) + setup_ht_cap(sc, &sc->sbands[IEEE80211_BAND_2GHZ].ht_cap); +- if (test_bit(ATH9K_MODE_11A, sc->sc_ah->caps.wireless_modes)) ++ if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_5GHZ) + setup_ht_cap(sc, &sc->sbands[IEEE80211_BAND_5GHZ].ht_cap); + } + +--- a/drivers/net/wireless/ath/ath9k/htc_drv_init.c ++++ b/drivers/net/wireless/ath/ath9k/htc_drv_init.c +@@ -566,7 +566,7 @@ static void ath9k_init_crypto(struct ath + + static void ath9k_init_channels_rates(struct ath9k_htc_priv *priv) + { +- if (test_bit(ATH9K_MODE_11G, priv->ah->caps.wireless_modes)) { ++ if (priv->ah->caps.hw_caps & ATH9K_HW_CAP_2GHZ) { + priv->sbands[IEEE80211_BAND_2GHZ].channels = + ath9k_2ghz_channels; + priv->sbands[IEEE80211_BAND_2GHZ].band = IEEE80211_BAND_2GHZ; +@@ -577,7 +577,7 @@ static void ath9k_init_channels_rates(st + ARRAY_SIZE(ath9k_legacy_rates); + } + +- if (test_bit(ATH9K_MODE_11A, priv->ah->caps.wireless_modes)) { ++ if (priv->ah->caps.hw_caps & ATH9K_HW_CAP_5GHZ) { + priv->sbands[IEEE80211_BAND_5GHZ].channels = ath9k_5ghz_channels; + priv->sbands[IEEE80211_BAND_5GHZ].band = IEEE80211_BAND_5GHZ; + priv->sbands[IEEE80211_BAND_5GHZ].n_channels = +@@ -740,18 +740,18 @@ static void ath9k_set_hw_capab(struct at + hw->extra_tx_headroom = sizeof(struct tx_frame_hdr) + + sizeof(struct htc_frame_hdr) + 4; + +- if (test_bit(ATH9K_MODE_11G, priv->ah->caps.wireless_modes)) ++ if (priv->ah->caps.hw_caps & ATH9K_HW_CAP_2GHZ) + hw->wiphy->bands[IEEE80211_BAND_2GHZ] = + &priv->sbands[IEEE80211_BAND_2GHZ]; +- if (test_bit(ATH9K_MODE_11A, priv->ah->caps.wireless_modes)) ++ if (priv->ah->caps.hw_caps & ATH9K_HW_CAP_5GHZ) + hw->wiphy->bands[IEEE80211_BAND_5GHZ] = + &priv->sbands[IEEE80211_BAND_5GHZ]; + + if (priv->ah->caps.hw_caps & ATH9K_HW_CAP_HT) { +- if (test_bit(ATH9K_MODE_11G, priv->ah->caps.wireless_modes)) ++ if (priv->ah->caps.hw_caps & ATH9K_HW_CAP_2GHZ) + setup_ht_cap(priv, + &priv->sbands[IEEE80211_BAND_2GHZ].ht_cap); +- if (test_bit(ATH9K_MODE_11A, priv->ah->caps.wireless_modes)) ++ if (priv->ah->caps.hw_caps & ATH9K_HW_CAP_5GHZ) + setup_ht_cap(priv, + &priv->sbands[IEEE80211_BAND_5GHZ].ht_cap); + } |