diff options
Diffstat (limited to 'package/mac80211/patches/300-pending_work.patch')
-rw-r--r-- | package/mac80211/patches/300-pending_work.patch | 1555 |
1 files changed, 1263 insertions, 292 deletions
diff --git a/package/mac80211/patches/300-pending_work.patch b/package/mac80211/patches/300-pending_work.patch index 9044396dc..cb219c914 100644 --- a/package/mac80211/patches/300-pending_work.patch +++ b/package/mac80211/patches/300-pending_work.patch @@ -1,63 +1,1221 @@ ---- a/drivers/net/wireless/ath/ath5k/base.c -+++ b/drivers/net/wireless/ath/ath5k/base.c -@@ -2417,6 +2417,22 @@ ath5k_tx_complete_poll_work(struct work_ - * Initialization routines * - \*************************/ - -+static const struct ieee80211_iface_limit if_limits[] = { -+ { .max = 2048, .types = BIT(NL80211_IFTYPE_STATION) }, -+ { .max = 4, .types = -+#ifdef CONFIG_MAC80211_MESH -+ BIT(NL80211_IFTYPE_MESH_POINT) | -+#endif -+ BIT(NL80211_IFTYPE_AP) }, -+}; -+ -+static const struct ieee80211_iface_combination if_comb = { -+ .limits = if_limits, -+ .n_limits = ARRAY_SIZE(if_limits), -+ .max_interfaces = 2048, -+ .num_different_channels = 1, -+}; -+ - int __devinit - ath5k_init_ah(struct ath5k_hw *ah, const struct ath_bus_ops *bus_ops) +--- a/drivers/net/wireless/ath/ath9k/ani.c ++++ b/drivers/net/wireless/ath/ath9k/ani.c +@@ -104,11 +104,6 @@ static const struct ani_cck_level_entry + #define ATH9K_ANI_CCK_DEF_LEVEL \ + 2 /* default level - matches the INI settings */ + +-static bool use_new_ani(struct ath_hw *ah) +-{ +- return AR_SREV_9300_20_OR_LATER(ah) || modparam_force_new_ani; +-} +- + static void ath9k_hw_update_mibstats(struct ath_hw *ah, + struct ath9k_mib_stats *stats) + { +@@ -122,8 +117,6 @@ static void ath9k_hw_update_mibstats(str + static void ath9k_ani_restart(struct ath_hw *ah) + { + struct ar5416AniState *aniState; +- struct ath_common *common = ath9k_hw_common(ah); +- u32 ofdm_base = 0, cck_base = 0; + + if (!DO_ANI(ah)) + return; +@@ -131,18 +124,10 @@ static void ath9k_ani_restart(struct ath + aniState = &ah->curchan->ani; + aniState->listenTime = 0; + +- if (!use_new_ani(ah)) { +- ofdm_base = AR_PHY_COUNTMAX - ah->config.ofdm_trig_high; +- cck_base = AR_PHY_COUNTMAX - ah->config.cck_trig_high; +- } +- +- ath_dbg(common, ANI, "Writing ofdmbase=%u cckbase=%u\n", +- ofdm_base, cck_base); +- + ENABLE_REGWRITE_BUFFER(ah); + +- REG_WRITE(ah, AR_PHY_ERR_1, ofdm_base); +- REG_WRITE(ah, AR_PHY_ERR_2, cck_base); ++ REG_WRITE(ah, AR_PHY_ERR_1, 0); ++ REG_WRITE(ah, AR_PHY_ERR_2, 0); + REG_WRITE(ah, AR_PHY_ERR_MASK_1, AR_PHY_ERR_OFDM_TIMING); + REG_WRITE(ah, AR_PHY_ERR_MASK_2, AR_PHY_ERR_CCK_TIMING); + +@@ -154,110 +139,6 @@ static void ath9k_ani_restart(struct ath + aniState->cckPhyErrCount = 0; + } + +-static void ath9k_hw_ani_ofdm_err_trigger_old(struct ath_hw *ah) +-{ +- struct ieee80211_conf *conf = &ath9k_hw_common(ah)->hw->conf; +- struct ar5416AniState *aniState; +- int32_t rssi; +- +- aniState = &ah->curchan->ani; +- +- if (aniState->noiseImmunityLevel < HAL_NOISE_IMMUNE_MAX) { +- if (ath9k_hw_ani_control(ah, ATH9K_ANI_NOISE_IMMUNITY_LEVEL, +- aniState->noiseImmunityLevel + 1)) { +- return; +- } +- } +- +- if (aniState->spurImmunityLevel < HAL_SPUR_IMMUNE_MAX) { +- if (ath9k_hw_ani_control(ah, ATH9K_ANI_SPUR_IMMUNITY_LEVEL, +- aniState->spurImmunityLevel + 1)) { +- return; +- } +- } +- +- if (ah->opmode == NL80211_IFTYPE_AP) { +- if (aniState->firstepLevel < HAL_FIRST_STEP_MAX) { +- ath9k_hw_ani_control(ah, ATH9K_ANI_FIRSTEP_LEVEL, +- aniState->firstepLevel + 1); +- } +- return; +- } +- rssi = BEACON_RSSI(ah); +- if (rssi > aniState->rssiThrHigh) { +- if (!aniState->ofdmWeakSigDetectOff) { +- if (ath9k_hw_ani_control(ah, +- ATH9K_ANI_OFDM_WEAK_SIGNAL_DETECTION, +- false)) { +- ath9k_hw_ani_control(ah, +- ATH9K_ANI_SPUR_IMMUNITY_LEVEL, 0); +- return; +- } +- } +- if (aniState->firstepLevel < HAL_FIRST_STEP_MAX) { +- ath9k_hw_ani_control(ah, ATH9K_ANI_FIRSTEP_LEVEL, +- aniState->firstepLevel + 1); +- return; +- } +- } else if (rssi > aniState->rssiThrLow) { +- if (aniState->ofdmWeakSigDetectOff) +- ath9k_hw_ani_control(ah, +- ATH9K_ANI_OFDM_WEAK_SIGNAL_DETECTION, +- true); +- if (aniState->firstepLevel < HAL_FIRST_STEP_MAX) +- ath9k_hw_ani_control(ah, ATH9K_ANI_FIRSTEP_LEVEL, +- aniState->firstepLevel + 1); +- return; +- } else { +- if ((conf->channel->band == IEEE80211_BAND_2GHZ) && +- !conf_is_ht(conf)) { +- if (!aniState->ofdmWeakSigDetectOff) +- ath9k_hw_ani_control(ah, +- ATH9K_ANI_OFDM_WEAK_SIGNAL_DETECTION, +- false); +- if (aniState->firstepLevel > 0) +- ath9k_hw_ani_control(ah, +- ATH9K_ANI_FIRSTEP_LEVEL, 0); +- return; +- } +- } +-} +- +-static void ath9k_hw_ani_cck_err_trigger_old(struct ath_hw *ah) +-{ +- struct ieee80211_conf *conf = &ath9k_hw_common(ah)->hw->conf; +- struct ar5416AniState *aniState; +- int32_t rssi; +- +- aniState = &ah->curchan->ani; +- if (aniState->noiseImmunityLevel < HAL_NOISE_IMMUNE_MAX) { +- if (ath9k_hw_ani_control(ah, ATH9K_ANI_NOISE_IMMUNITY_LEVEL, +- aniState->noiseImmunityLevel + 1)) { +- return; +- } +- } +- if (ah->opmode == NL80211_IFTYPE_AP) { +- if (aniState->firstepLevel < HAL_FIRST_STEP_MAX) { +- ath9k_hw_ani_control(ah, ATH9K_ANI_FIRSTEP_LEVEL, +- aniState->firstepLevel + 1); +- } +- return; +- } +- rssi = BEACON_RSSI(ah); +- if (rssi > aniState->rssiThrLow) { +- if (aniState->firstepLevel < HAL_FIRST_STEP_MAX) +- ath9k_hw_ani_control(ah, ATH9K_ANI_FIRSTEP_LEVEL, +- aniState->firstepLevel + 1); +- } else { +- if ((conf->channel->band == IEEE80211_BAND_2GHZ) && +- !conf_is_ht(conf)) { +- if (aniState->firstepLevel > 0) +- ath9k_hw_ani_control(ah, +- ATH9K_ANI_FIRSTEP_LEVEL, 0); +- } +- } +-} +- + /* Adjust the OFDM Noise Immunity Level */ + static void ath9k_hw_set_ofdm_nil(struct ath_hw *ah, u8 immunityLevel) { -@@ -2438,6 +2454,9 @@ ath5k_init_ah(struct ath5k_hw *ah, const - BIT(NL80211_IFTYPE_ADHOC) | - BIT(NL80211_IFTYPE_MESH_POINT); +@@ -265,18 +146,15 @@ static void ath9k_hw_set_ofdm_nil(struct + struct ath_common *common = ath9k_hw_common(ah); + const struct ani_ofdm_level_entry *entry_ofdm; + const struct ani_cck_level_entry *entry_cck; +- +- aniState->noiseFloor = BEACON_RSSI(ah); ++ bool weak_sig; + + ath_dbg(common, ANI, "**** ofdmlevel %d=>%d, rssi=%d[lo=%d hi=%d]\n", + aniState->ofdmNoiseImmunityLevel, +- immunityLevel, aniState->noiseFloor, ++ immunityLevel, BEACON_RSSI(ah), + aniState->rssiThrLow, aniState->rssiThrHigh); + + if (aniState->update_ani) +- aniState->ofdmNoiseImmunityLevel = +- (immunityLevel > ATH9K_ANI_OFDM_DEF_LEVEL) ? +- immunityLevel : ATH9K_ANI_OFDM_DEF_LEVEL; ++ aniState->ofdmNoiseImmunityLevel = immunityLevel; + + entry_ofdm = &ofdm_level_table[aniState->ofdmNoiseImmunityLevel]; + entry_cck = &cck_level_table[aniState->cckNoiseImmunityLevel]; +@@ -292,12 +170,22 @@ static void ath9k_hw_set_ofdm_nil(struct + ATH9K_ANI_FIRSTEP_LEVEL, + entry_ofdm->fir_step_level); -+ hw->wiphy->iface_combinations = &if_comb; -+ hw->wiphy->n_iface_combinations = 1; +- if ((aniState->noiseFloor >= aniState->rssiThrHigh) && +- (!aniState->ofdmWeakSigDetectOff != +- entry_ofdm->ofdm_weak_signal_on)) { ++ weak_sig = entry_ofdm->ofdm_weak_signal_on; ++ if (ah->opmode == NL80211_IFTYPE_STATION && ++ BEACON_RSSI(ah) <= aniState->rssiThrHigh) ++ weak_sig = true; + - /* SW support for IBSS_RSN is provided by mac80211 */ - hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN; ++ if (aniState->ofdmWeakSigDetect != weak_sig) + ath9k_hw_ani_control(ah, + ATH9K_ANI_OFDM_WEAK_SIGNAL_DETECTION, + entry_ofdm->ofdm_weak_signal_on); ++ ++ if (aniState->ofdmNoiseImmunityLevel >= ATH9K_ANI_OFDM_DEF_LEVEL) { ++ ah->config.ofdm_trig_high = ATH9K_ANI_OFDM_TRIG_HIGH; ++ ah->config.ofdm_trig_low = ATH9K_ANI_OFDM_TRIG_LOW_ABOVE_INI; ++ } else { ++ ah->config.ofdm_trig_high = ATH9K_ANI_OFDM_TRIG_HIGH_BELOW_INI; ++ ah->config.ofdm_trig_low = ATH9K_ANI_OFDM_TRIG_LOW; + } + } ---- a/net/mac80211/agg-rx.c -+++ b/net/mac80211/agg-rx.c -@@ -145,15 +145,20 @@ static void sta_rx_agg_session_timer_exp - struct tid_ampdu_rx *tid_rx; - unsigned long timeout; +@@ -308,11 +196,6 @@ static void ath9k_hw_ani_ofdm_err_trigge + if (!DO_ANI(ah)) + return; -+ rcu_read_lock(); - tid_rx = rcu_dereference(sta->ampdu_mlme.tid_rx[*ptid]); -- if (!tid_rx) -+ if (!tid_rx) { -+ rcu_read_unlock(); +- if (!use_new_ani(ah)) { +- ath9k_hw_ani_ofdm_err_trigger_old(ah); +- return; +- } +- + aniState = &ah->curchan->ani; + + if (aniState->ofdmNoiseImmunityLevel < ATH9K_ANI_OFDM_MAX_LEVEL) +@@ -329,22 +212,18 @@ static void ath9k_hw_set_cck_nil(struct + const struct ani_ofdm_level_entry *entry_ofdm; + const struct ani_cck_level_entry *entry_cck; + +- aniState->noiseFloor = BEACON_RSSI(ah); + ath_dbg(common, ANI, "**** ccklevel %d=>%d, rssi=%d[lo=%d hi=%d]\n", + aniState->cckNoiseImmunityLevel, immunityLevel, +- aniState->noiseFloor, aniState->rssiThrLow, ++ BEACON_RSSI(ah), aniState->rssiThrLow, + aniState->rssiThrHigh); + +- if ((ah->opmode == NL80211_IFTYPE_STATION || +- ah->opmode == NL80211_IFTYPE_ADHOC) && +- aniState->noiseFloor <= aniState->rssiThrLow && ++ if (ah->opmode == NL80211_IFTYPE_STATION && ++ BEACON_RSSI(ah) <= aniState->rssiThrLow && + immunityLevel > ATH9K_ANI_CCK_MAX_LEVEL_LOW_RSSI) + immunityLevel = ATH9K_ANI_CCK_MAX_LEVEL_LOW_RSSI; + + if (aniState->update_ani) +- aniState->cckNoiseImmunityLevel = +- (immunityLevel > ATH9K_ANI_CCK_DEF_LEVEL) ? +- immunityLevel : ATH9K_ANI_CCK_DEF_LEVEL; ++ aniState->cckNoiseImmunityLevel = immunityLevel; + + entry_ofdm = &ofdm_level_table[aniState->ofdmNoiseImmunityLevel]; + entry_cck = &cck_level_table[aniState->cckNoiseImmunityLevel]; +@@ -372,70 +251,12 @@ static void ath9k_hw_ani_cck_err_trigger + if (!DO_ANI(ah)) return; -+ } - timeout = tid_rx->last_rx + TU_TO_JIFFIES(tid_rx->timeout); - if (time_is_after_jiffies(timeout)) { - mod_timer(&tid_rx->session_timer, timeout); -+ rcu_read_unlock(); +- if (!use_new_ani(ah)) { +- ath9k_hw_ani_cck_err_trigger_old(ah); +- return; +- } +- + aniState = &ah->curchan->ani; + + if (aniState->cckNoiseImmunityLevel < ATH9K_ANI_CCK_MAX_LEVEL) + ath9k_hw_set_cck_nil(ah, aniState->cckNoiseImmunityLevel + 1); + } + +-static void ath9k_hw_ani_lower_immunity_old(struct ath_hw *ah) +-{ +- struct ar5416AniState *aniState; +- int32_t rssi; +- +- aniState = &ah->curchan->ani; +- +- if (ah->opmode == NL80211_IFTYPE_AP) { +- if (aniState->firstepLevel > 0) { +- if (ath9k_hw_ani_control(ah, ATH9K_ANI_FIRSTEP_LEVEL, +- aniState->firstepLevel - 1)) +- return; +- } +- } else { +- rssi = BEACON_RSSI(ah); +- if (rssi > aniState->rssiThrHigh) { +- /* XXX: Handle me */ +- } else if (rssi > aniState->rssiThrLow) { +- if (aniState->ofdmWeakSigDetectOff) { +- if (ath9k_hw_ani_control(ah, +- ATH9K_ANI_OFDM_WEAK_SIGNAL_DETECTION, +- true)) +- return; +- } +- if (aniState->firstepLevel > 0) { +- if (ath9k_hw_ani_control(ah, +- ATH9K_ANI_FIRSTEP_LEVEL, +- aniState->firstepLevel - 1)) +- return; +- } +- } else { +- if (aniState->firstepLevel > 0) { +- if (ath9k_hw_ani_control(ah, +- ATH9K_ANI_FIRSTEP_LEVEL, +- aniState->firstepLevel - 1)) +- return; +- } +- } +- } +- +- if (aniState->spurImmunityLevel > 0) { +- if (ath9k_hw_ani_control(ah, ATH9K_ANI_SPUR_IMMUNITY_LEVEL, +- aniState->spurImmunityLevel - 1)) +- return; +- } +- +- if (aniState->noiseImmunityLevel > 0) { +- ath9k_hw_ani_control(ah, ATH9K_ANI_NOISE_IMMUNITY_LEVEL, +- aniState->noiseImmunityLevel - 1); +- return; +- } +-} +- + /* + * only lower either OFDM or CCK errors per turn + * we lower the other one next time +@@ -446,11 +267,6 @@ static void ath9k_hw_ani_lower_immunity( + + aniState = &ah->curchan->ani; + +- if (!use_new_ani(ah)) { +- ath9k_hw_ani_lower_immunity_old(ah); +- return; +- } +- + /* lower OFDM noise immunity */ + if (aniState->ofdmNoiseImmunityLevel > 0 && + (aniState->ofdmsTurn || aniState->cckNoiseImmunityLevel == 0)) { +@@ -463,72 +279,6 @@ static void ath9k_hw_ani_lower_immunity( + ath9k_hw_set_cck_nil(ah, aniState->cckNoiseImmunityLevel - 1); + } + +-static void ath9k_ani_reset_old(struct ath_hw *ah, bool is_scanning) +-{ +- struct ar5416AniState *aniState; +- struct ath9k_channel *chan = ah->curchan; +- struct ath_common *common = ath9k_hw_common(ah); +- +- if (!DO_ANI(ah)) +- return; +- +- aniState = &ah->curchan->ani; +- +- if (ah->opmode != NL80211_IFTYPE_STATION +- && ah->opmode != NL80211_IFTYPE_ADHOC) { +- ath_dbg(common, ANI, "Reset ANI state opmode %u\n", ah->opmode); +- ah->stats.ast_ani_reset++; +- +- if (ah->opmode == NL80211_IFTYPE_AP) { +- /* +- * ath9k_hw_ani_control() will only process items set on +- * ah->ani_function +- */ +- if (IS_CHAN_2GHZ(chan)) +- ah->ani_function = (ATH9K_ANI_SPUR_IMMUNITY_LEVEL | +- ATH9K_ANI_FIRSTEP_LEVEL); +- else +- ah->ani_function = 0; +- } +- +- ath9k_hw_ani_control(ah, ATH9K_ANI_NOISE_IMMUNITY_LEVEL, 0); +- ath9k_hw_ani_control(ah, ATH9K_ANI_SPUR_IMMUNITY_LEVEL, 0); +- ath9k_hw_ani_control(ah, ATH9K_ANI_FIRSTEP_LEVEL, 0); +- ath9k_hw_ani_control(ah, ATH9K_ANI_OFDM_WEAK_SIGNAL_DETECTION, +- !ATH9K_ANI_USE_OFDM_WEAK_SIG); +- ath9k_hw_ani_control(ah, ATH9K_ANI_CCK_WEAK_SIGNAL_THR, +- ATH9K_ANI_CCK_WEAK_SIG_THR); +- +- ath9k_ani_restart(ah); +- return; +- } +- +- if (aniState->noiseImmunityLevel != 0) +- ath9k_hw_ani_control(ah, ATH9K_ANI_NOISE_IMMUNITY_LEVEL, +- aniState->noiseImmunityLevel); +- if (aniState->spurImmunityLevel != 0) +- ath9k_hw_ani_control(ah, ATH9K_ANI_SPUR_IMMUNITY_LEVEL, +- aniState->spurImmunityLevel); +- if (aniState->ofdmWeakSigDetectOff) +- ath9k_hw_ani_control(ah, ATH9K_ANI_OFDM_WEAK_SIGNAL_DETECTION, +- !aniState->ofdmWeakSigDetectOff); +- if (aniState->cckWeakSigThreshold) +- ath9k_hw_ani_control(ah, ATH9K_ANI_CCK_WEAK_SIGNAL_THR, +- aniState->cckWeakSigThreshold); +- if (aniState->firstepLevel != 0) +- ath9k_hw_ani_control(ah, ATH9K_ANI_FIRSTEP_LEVEL, +- aniState->firstepLevel); +- +- ath9k_ani_restart(ah); +- +- ENABLE_REGWRITE_BUFFER(ah); +- +- REG_WRITE(ah, AR_PHY_ERR_MASK_1, AR_PHY_ERR_OFDM_TIMING); +- REG_WRITE(ah, AR_PHY_ERR_MASK_2, AR_PHY_ERR_CCK_TIMING); +- +- REGWRITE_BUFFER_FLUSH(ah); +-} +- + /* + * Restore the ANI parameters in the HAL and reset the statistics. + * This routine should be called for every hardware reset and for +@@ -539,13 +289,11 @@ void ath9k_ani_reset(struct ath_hw *ah, + struct ar5416AniState *aniState = &ah->curchan->ani; + struct ath9k_channel *chan = ah->curchan; + struct ath_common *common = ath9k_hw_common(ah); ++ int ofdm_nil, cck_nil; + + if (!DO_ANI(ah)) return; + +- if (!use_new_ani(ah)) +- return ath9k_ani_reset_old(ah, is_scanning); +- + BUG_ON(aniState == NULL); + ah->stats.ast_ani_reset++; + +@@ -563,6 +311,11 @@ void ath9k_ani_reset(struct ath_hw *ah, + /* always allow mode (on/off) to be controlled */ + ah->ani_function |= ATH9K_ANI_MODE; + ++ ofdm_nil = max_t(int, ATH9K_ANI_OFDM_DEF_LEVEL, ++ aniState->ofdmNoiseImmunityLevel); ++ cck_nil = max_t(int, ATH9K_ANI_CCK_DEF_LEVEL, ++ aniState->cckNoiseImmunityLevel); ++ + if (is_scanning || + (ah->opmode != NL80211_IFTYPE_STATION && + ah->opmode != NL80211_IFTYPE_ADHOC)) { +@@ -586,8 +339,8 @@ void ath9k_ani_reset(struct ath_hw *ah, + aniState->cckNoiseImmunityLevel); + + aniState->update_ani = false; +- ath9k_hw_set_ofdm_nil(ah, ATH9K_ANI_OFDM_DEF_LEVEL); +- ath9k_hw_set_cck_nil(ah, ATH9K_ANI_CCK_DEF_LEVEL); ++ ofdm_nil = ATH9K_ANI_OFDM_DEF_LEVEL; ++ cck_nil = ATH9K_ANI_CCK_DEF_LEVEL; + } + } else { + /* +@@ -603,11 +356,9 @@ void ath9k_ani_reset(struct ath_hw *ah, + aniState->cckNoiseImmunityLevel); + + aniState->update_ani = true; +- ath9k_hw_set_ofdm_nil(ah, +- aniState->ofdmNoiseImmunityLevel); +- ath9k_hw_set_cck_nil(ah, +- aniState->cckNoiseImmunityLevel); } -+ rcu_read_unlock(); ++ ath9k_hw_set_ofdm_nil(ah, ofdm_nil); ++ ath9k_hw_set_cck_nil(ah, cck_nil); + + /* + * enable phy counters if hw supports or if not, enable phy +@@ -627,9 +378,6 @@ static bool ath9k_hw_ani_read_counters(s + { + struct ath_common *common = ath9k_hw_common(ah); + struct ar5416AniState *aniState = &ah->curchan->ani; +- u32 ofdm_base = 0; +- u32 cck_base = 0; +- u32 ofdmPhyErrCnt, cckPhyErrCnt; + u32 phyCnt1, phyCnt2; + int32_t listenTime; + +@@ -642,11 +390,6 @@ static bool ath9k_hw_ani_read_counters(s + return false; + } + +- if (!use_new_ani(ah)) { +- ofdm_base = AR_PHY_COUNTMAX - ah->config.ofdm_trig_high; +- cck_base = AR_PHY_COUNTMAX - ah->config.cck_trig_high; +- } +- + aniState->listenTime += listenTime; + + ath9k_hw_update_mibstats(ah, &ah->ah_mibStats); +@@ -654,35 +397,12 @@ static bool ath9k_hw_ani_read_counters(s + phyCnt1 = REG_READ(ah, AR_PHY_ERR_1); + phyCnt2 = REG_READ(ah, AR_PHY_ERR_2); + +- if (!use_new_ani(ah) && (phyCnt1 < ofdm_base || phyCnt2 < cck_base)) { +- if (phyCnt1 < ofdm_base) { +- ath_dbg(common, ANI, +- "phyCnt1 0x%x, resetting counter value to 0x%x\n", +- phyCnt1, ofdm_base); +- REG_WRITE(ah, AR_PHY_ERR_1, ofdm_base); +- REG_WRITE(ah, AR_PHY_ERR_MASK_1, +- AR_PHY_ERR_OFDM_TIMING); +- } +- if (phyCnt2 < cck_base) { +- ath_dbg(common, ANI, +- "phyCnt2 0x%x, resetting counter value to 0x%x\n", +- phyCnt2, cck_base); +- REG_WRITE(ah, AR_PHY_ERR_2, cck_base); +- REG_WRITE(ah, AR_PHY_ERR_MASK_2, +- AR_PHY_ERR_CCK_TIMING); +- } +- return false; +- } ++ ah->stats.ast_ani_ofdmerrs += phyCnt1 - aniState->ofdmPhyErrCount; ++ aniState->ofdmPhyErrCount = phyCnt1; ++ ++ ah->stats.ast_ani_cckerrs += phyCnt2 - aniState->cckPhyErrCount; ++ aniState->cckPhyErrCount = phyCnt2; + +- ofdmPhyErrCnt = phyCnt1 - ofdm_base; +- ah->stats.ast_ani_ofdmerrs += +- ofdmPhyErrCnt - aniState->ofdmPhyErrCount; +- aniState->ofdmPhyErrCount = ofdmPhyErrCnt; +- +- cckPhyErrCnt = phyCnt2 - cck_base; +- ah->stats.ast_ani_cckerrs += +- cckPhyErrCnt - aniState->cckPhyErrCount; +- aniState->cckPhyErrCount = cckPhyErrCnt; + return true; + } + +@@ -716,21 +436,10 @@ void ath9k_hw_ani_monitor(struct ath_hw + + if (aniState->listenTime > ah->aniperiod) { + if (cckPhyErrRate < ah->config.cck_trig_low && +- ((ofdmPhyErrRate < ah->config.ofdm_trig_low && +- aniState->ofdmNoiseImmunityLevel < +- ATH9K_ANI_OFDM_DEF_LEVEL) || +- (ofdmPhyErrRate < ATH9K_ANI_OFDM_TRIG_LOW_ABOVE_INI && +- aniState->ofdmNoiseImmunityLevel >= +- ATH9K_ANI_OFDM_DEF_LEVEL))) { ++ ofdmPhyErrRate < ah->config.ofdm_trig_low) { + ath9k_hw_ani_lower_immunity(ah); + aniState->ofdmsTurn = !aniState->ofdmsTurn; +- } else if ((ofdmPhyErrRate > ah->config.ofdm_trig_high && +- aniState->ofdmNoiseImmunityLevel >= +- ATH9K_ANI_OFDM_DEF_LEVEL) || +- (ofdmPhyErrRate > +- ATH9K_ANI_OFDM_TRIG_HIGH_BELOW_INI && +- aniState->ofdmNoiseImmunityLevel < +- ATH9K_ANI_OFDM_DEF_LEVEL)) { ++ } else if (ofdmPhyErrRate > ah->config.ofdm_trig_high) { + ath9k_hw_ani_ofdm_err_trigger(ah); + aniState->ofdmsTurn = false; + } else if (cckPhyErrRate > ah->config.cck_trig_high) { +@@ -778,49 +487,6 @@ void ath9k_hw_disable_mib_counters(struc + } + EXPORT_SYMBOL(ath9k_hw_disable_mib_counters); + +-/* +- * Process a MIB interrupt. We may potentially be invoked because +- * any of the MIB counters overflow/trigger so don't assume we're +- * here because a PHY error counter triggered. +- */ +-void ath9k_hw_proc_mib_event(struct ath_hw *ah) +-{ +- u32 phyCnt1, phyCnt2; +- +- /* Reset these counters regardless */ +- REG_WRITE(ah, AR_FILT_OFDM, 0); +- REG_WRITE(ah, AR_FILT_CCK, 0); +- if (!(REG_READ(ah, AR_SLP_MIB_CTRL) & AR_SLP_MIB_PENDING)) +- REG_WRITE(ah, AR_SLP_MIB_CTRL, AR_SLP_MIB_CLEAR); +- +- /* Clear the mib counters and save them in the stats */ +- ath9k_hw_update_mibstats(ah, &ah->ah_mibStats); +- +- if (!DO_ANI(ah)) { +- /* +- * We must always clear the interrupt cause by +- * resetting the phy error regs. +- */ +- REG_WRITE(ah, AR_PHY_ERR_1, 0); +- REG_WRITE(ah, AR_PHY_ERR_2, 0); +- return; +- } +- +- /* NB: these are not reset-on-read */ +- phyCnt1 = REG_READ(ah, AR_PHY_ERR_1); +- phyCnt2 = REG_READ(ah, AR_PHY_ERR_2); +- if (((phyCnt1 & AR_MIBCNT_INTRMASK) == AR_MIBCNT_INTRMASK) || +- ((phyCnt2 & AR_MIBCNT_INTRMASK) == AR_MIBCNT_INTRMASK)) { +- +- if (!use_new_ani(ah)) +- ath9k_hw_ani_read_counters(ah); +- +- /* NB: always restart to insure the h/w counters are reset */ +- ath9k_ani_restart(ah); +- } +-} +-EXPORT_SYMBOL(ath9k_hw_proc_mib_event); +- + void ath9k_hw_ani_setup(struct ath_hw *ah) + { + int i; +@@ -845,50 +511,31 @@ void ath9k_hw_ani_init(struct ath_hw *ah + + ath_dbg(common, ANI, "Initialize ANI\n"); + +- if (use_new_ani(ah)) { +- ah->config.ofdm_trig_high = ATH9K_ANI_OFDM_TRIG_HIGH_NEW; +- ah->config.ofdm_trig_low = ATH9K_ANI_OFDM_TRIG_LOW_NEW; ++ ah->config.ofdm_trig_high = ATH9K_ANI_OFDM_TRIG_HIGH; ++ ah->config.ofdm_trig_low = ATH9K_ANI_OFDM_TRIG_LOW; + +- ah->config.cck_trig_high = ATH9K_ANI_CCK_TRIG_HIGH_NEW; +- ah->config.cck_trig_low = ATH9K_ANI_CCK_TRIG_LOW_NEW; +- } else { +- ah->config.ofdm_trig_high = ATH9K_ANI_OFDM_TRIG_HIGH_OLD; +- ah->config.ofdm_trig_low = ATH9K_ANI_OFDM_TRIG_LOW_OLD; +- +- ah->config.cck_trig_high = ATH9K_ANI_CCK_TRIG_HIGH_OLD; +- ah->config.cck_trig_low = ATH9K_ANI_CCK_TRIG_LOW_OLD; +- } ++ ah->config.cck_trig_high = ATH9K_ANI_CCK_TRIG_HIGH; ++ ah->config.cck_trig_low = ATH9K_ANI_CCK_TRIG_LOW; + + for (i = 0; i < ARRAY_SIZE(ah->channels); i++) { + struct ath9k_channel *chan = &ah->channels[i]; + struct ar5416AniState *ani = &chan->ani; + +- if (use_new_ani(ah)) { +- ani->spurImmunityLevel = +- ATH9K_ANI_SPUR_IMMUNE_LVL_NEW; ++ ani->spurImmunityLevel = ATH9K_ANI_SPUR_IMMUNE_LVL; + +- ani->firstepLevel = ATH9K_ANI_FIRSTEP_LVL_NEW; ++ ani->firstepLevel = ATH9K_ANI_FIRSTEP_LVL; + +- if (AR_SREV_9300_20_OR_LATER(ah)) +- ani->mrcCCKOff = +- !ATH9K_ANI_ENABLE_MRC_CCK; +- else +- ani->mrcCCKOff = true; +- +- ani->ofdmsTurn = true; +- } else { +- ani->spurImmunityLevel = +- ATH9K_ANI_SPUR_IMMUNE_LVL_OLD; +- ani->firstepLevel = ATH9K_ANI_FIRSTEP_LVL_OLD; ++ if (AR_SREV_9300_20_OR_LATER(ah)) ++ ani->mrcCCKOff = ++ !ATH9K_ANI_ENABLE_MRC_CCK; ++ else ++ ani->mrcCCKOff = true; + +- ani->cckWeakSigThreshold = +- ATH9K_ANI_CCK_WEAK_SIG_THR; +- } ++ ani->ofdmsTurn = true; + + ani->rssiThrHigh = ATH9K_ANI_RSSI_THR_HIGH; + ani->rssiThrLow = ATH9K_ANI_RSSI_THR_LOW; +- ani->ofdmWeakSigDetectOff = +- !ATH9K_ANI_USE_OFDM_WEAK_SIG; ++ ani->ofdmWeakSigDetect = ATH9K_ANI_USE_OFDM_WEAK_SIG; + ani->cckNoiseImmunityLevel = ATH9K_ANI_CCK_DEF_LEVEL; + ani->ofdmNoiseImmunityLevel = ATH9K_ANI_OFDM_DEF_LEVEL; + ani->update_ani = false; +@@ -898,13 +545,8 @@ void ath9k_hw_ani_init(struct ath_hw *ah + * since we expect some ongoing maintenance on the tables, let's sanity + * check here default level should not modify INI setting. + */ +- if (use_new_ani(ah)) { +- ah->aniperiod = ATH9K_ANI_PERIOD_NEW; +- ah->config.ani_poll_interval = ATH9K_ANI_POLLINTERVAL_NEW; +- } else { +- ah->aniperiod = ATH9K_ANI_PERIOD_OLD; +- ah->config.ani_poll_interval = ATH9K_ANI_POLLINTERVAL_OLD; +- } ++ ah->aniperiod = ATH9K_ANI_PERIOD; ++ ah->config.ani_poll_interval = ATH9K_ANI_POLLINTERVAL; + + if (ah->config.enable_ani) + ah->proc_phyerr |= HAL_PROCESS_ANI; +--- a/drivers/net/wireless/ath/ath9k/ani.h ++++ b/drivers/net/wireless/ath/ath9k/ani.h +@@ -24,42 +24,34 @@ + #define BEACON_RSSI(ahp) (ahp->stats.avgbrssi) + + /* units are errors per second */ +-#define ATH9K_ANI_OFDM_TRIG_HIGH_OLD 500 +-#define ATH9K_ANI_OFDM_TRIG_HIGH_NEW 3500 ++#define ATH9K_ANI_OFDM_TRIG_HIGH 3500 + #define ATH9K_ANI_OFDM_TRIG_HIGH_BELOW_INI 1000 + + /* units are errors per second */ +-#define ATH9K_ANI_OFDM_TRIG_LOW_OLD 200 +-#define ATH9K_ANI_OFDM_TRIG_LOW_NEW 400 ++#define ATH9K_ANI_OFDM_TRIG_LOW 400 + #define ATH9K_ANI_OFDM_TRIG_LOW_ABOVE_INI 900 + + /* units are errors per second */ +-#define ATH9K_ANI_CCK_TRIG_HIGH_OLD 200 +-#define ATH9K_ANI_CCK_TRIG_HIGH_NEW 600 ++#define ATH9K_ANI_CCK_TRIG_HIGH 600 + + /* units are errors per second */ +-#define ATH9K_ANI_CCK_TRIG_LOW_OLD 100 +-#define ATH9K_ANI_CCK_TRIG_LOW_NEW 300 ++#define ATH9K_ANI_CCK_TRIG_LOW 300 + + #define ATH9K_ANI_NOISE_IMMUNE_LVL 4 + #define ATH9K_ANI_USE_OFDM_WEAK_SIG true + #define ATH9K_ANI_CCK_WEAK_SIG_THR false + +-#define ATH9K_ANI_SPUR_IMMUNE_LVL_OLD 7 +-#define ATH9K_ANI_SPUR_IMMUNE_LVL_NEW 3 ++#define ATH9K_ANI_SPUR_IMMUNE_LVL 3 + +-#define ATH9K_ANI_FIRSTEP_LVL_OLD 0 +-#define ATH9K_ANI_FIRSTEP_LVL_NEW 2 ++#define ATH9K_ANI_FIRSTEP_LVL 2 + + #define ATH9K_ANI_RSSI_THR_HIGH 40 + #define ATH9K_ANI_RSSI_THR_LOW 7 + +-#define ATH9K_ANI_PERIOD_OLD 100 +-#define ATH9K_ANI_PERIOD_NEW 300 ++#define ATH9K_ANI_PERIOD 300 + + /* in ms */ +-#define ATH9K_ANI_POLLINTERVAL_OLD 100 +-#define ATH9K_ANI_POLLINTERVAL_NEW 1000 ++#define ATH9K_ANI_POLLINTERVAL 1000 + + #define HAL_NOISE_IMMUNE_MAX 4 + #define HAL_SPUR_IMMUNE_MAX 7 +@@ -122,13 +114,12 @@ struct ar5416AniState { + u8 mrcCCKOff; + u8 spurImmunityLevel; + u8 firstepLevel; +- u8 ofdmWeakSigDetectOff; ++ u8 ofdmWeakSigDetect; + u8 cckWeakSigThreshold; + bool update_ani; + u32 listenTime; + int32_t rssiThrLow; + int32_t rssiThrHigh; +- u32 noiseFloor; + u32 ofdmPhyErrCount; + u32 cckPhyErrCount; + int16_t pktRssi[2]; +--- a/drivers/net/wireless/ath/ath9k/ar5008_phy.c ++++ b/drivers/net/wireless/ath/ath9k/ar5008_phy.c +@@ -995,141 +995,6 @@ static u32 ar5008_hw_compute_pll_control + return pll; + } + +-static bool ar5008_hw_ani_control_old(struct ath_hw *ah, +- enum ath9k_ani_cmd cmd, +- int param) +-{ +- struct ar5416AniState *aniState = &ah->curchan->ani; +- struct ath_common *common = ath9k_hw_common(ah); +- +- switch (cmd & ah->ani_function) { +- case ATH9K_ANI_NOISE_IMMUNITY_LEVEL:{ +- u32 level = param; +- +- if (level >= ARRAY_SIZE(ah->totalSizeDesired)) { +- ath_dbg(common, ANI, "level out of range (%u > %zu)\n", +- level, ARRAY_SIZE(ah->totalSizeDesired)); +- return false; +- } +- +- REG_RMW_FIELD(ah, AR_PHY_DESIRED_SZ, +- AR_PHY_DESIRED_SZ_TOT_DES, +- ah->totalSizeDesired[level]); +- REG_RMW_FIELD(ah, AR_PHY_AGC_CTL1, +- AR_PHY_AGC_CTL1_COARSE_LOW, +- ah->coarse_low[level]); +- REG_RMW_FIELD(ah, AR_PHY_AGC_CTL1, +- AR_PHY_AGC_CTL1_COARSE_HIGH, +- ah->coarse_high[level]); +- REG_RMW_FIELD(ah, AR_PHY_FIND_SIG, +- AR_PHY_FIND_SIG_FIRPWR, +- ah->firpwr[level]); +- +- if (level > aniState->noiseImmunityLevel) +- ah->stats.ast_ani_niup++; +- else if (level < aniState->noiseImmunityLevel) +- ah->stats.ast_ani_nidown++; +- aniState->noiseImmunityLevel = level; +- break; +- } +- case ATH9K_ANI_OFDM_WEAK_SIGNAL_DETECTION:{ +- u32 on = param ? 1 : 0; +- +- if (on) +- REG_SET_BIT(ah, AR_PHY_SFCORR_LOW, +- AR_PHY_SFCORR_LOW_USE_SELF_CORR_LOW); +- else +- REG_CLR_BIT(ah, AR_PHY_SFCORR_LOW, +- AR_PHY_SFCORR_LOW_USE_SELF_CORR_LOW); +- +- if (!on != aniState->ofdmWeakSigDetectOff) { +- if (on) +- ah->stats.ast_ani_ofdmon++; +- else +- ah->stats.ast_ani_ofdmoff++; +- aniState->ofdmWeakSigDetectOff = !on; +- } +- break; +- } +- case ATH9K_ANI_CCK_WEAK_SIGNAL_THR:{ +- static const int weakSigThrCck[] = { 8, 6 }; +- u32 high = param ? 1 : 0; +- +- REG_RMW_FIELD(ah, AR_PHY_CCK_DETECT, +- AR_PHY_CCK_DETECT_WEAK_SIG_THR_CCK, +- weakSigThrCck[high]); +- if (high != aniState->cckWeakSigThreshold) { +- if (high) +- ah->stats.ast_ani_cckhigh++; +- else +- ah->stats.ast_ani_ccklow++; +- aniState->cckWeakSigThreshold = high; +- } +- break; +- } +- case ATH9K_ANI_FIRSTEP_LEVEL:{ +- static const int firstep[] = { 0, 4, 8 }; +- u32 level = param; +- +- if (level >= ARRAY_SIZE(firstep)) { +- ath_dbg(common, ANI, "level out of range (%u > %zu)\n", +- level, ARRAY_SIZE(firstep)); +- return false; +- } +- REG_RMW_FIELD(ah, AR_PHY_FIND_SIG, +- AR_PHY_FIND_SIG_FIRSTEP, +- firstep[level]); +- if (level > aniState->firstepLevel) +- ah->stats.ast_ani_stepup++; +- else if (level < aniState->firstepLevel) +- ah->stats.ast_ani_stepdown++; +- aniState->firstepLevel = level; +- break; +- } +- case ATH9K_ANI_SPUR_IMMUNITY_LEVEL:{ +- static const int cycpwrThr1[] = { 2, 4, 6, 8, 10, 12, 14, 16 }; +- u32 level = param; +- +- if (level >= ARRAY_SIZE(cycpwrThr1)) { +- ath_dbg(common, ANI, "level out of range (%u > %zu)\n", +- level, ARRAY_SIZE(cycpwrThr1)); +- return false; +- } +- REG_RMW_FIELD(ah, AR_PHY_TIMING5, +- AR_PHY_TIMING5_CYCPWR_THR1, +- cycpwrThr1[level]); +- if (level > aniState->spurImmunityLevel) +- ah->stats.ast_ani_spurup++; +- else if (level < aniState->spurImmunityLevel) +- ah->stats.ast_ani_spurdown++; +- aniState->spurImmunityLevel = level; +- break; +- } +- case ATH9K_ANI_PRESENT: +- break; +- default: +- ath_dbg(common, ANI, "invalid cmd %u\n", cmd); +- return false; +- } +- +- ath_dbg(common, ANI, "ANI parameters:\n"); +- ath_dbg(common, ANI, +- "noiseImmunityLevel=%d, spurImmunityLevel=%d, ofdmWeakSigDetectOff=%d\n", +- aniState->noiseImmunityLevel, +- aniState->spurImmunityLevel, +- !aniState->ofdmWeakSigDetectOff); +- ath_dbg(common, ANI, +- "cckWeakSigThreshold=%d, firstepLevel=%d, listenTime=%d\n", +- aniState->cckWeakSigThreshold, +- aniState->firstepLevel, +- aniState->listenTime); +- ath_dbg(common, ANI, "ofdmPhyErrCount=%d, cckPhyErrCount=%d\n\n", +- aniState->ofdmPhyErrCount, +- aniState->cckPhyErrCount); +- +- return true; +-} +- + static bool ar5008_hw_ani_control_new(struct ath_hw *ah, + enum ath9k_ani_cmd cmd, + int param) +@@ -1206,18 +1071,18 @@ static bool ar5008_hw_ani_control_new(st + REG_CLR_BIT(ah, AR_PHY_SFCORR_LOW, + AR_PHY_SFCORR_LOW_USE_SELF_CORR_LOW); + +- if (!on != aniState->ofdmWeakSigDetectOff) { ++ if (on != aniState->ofdmWeakSigDetect) { + ath_dbg(common, ANI, + "** ch %d: ofdm weak signal: %s=>%s\n", + chan->channel, +- !aniState->ofdmWeakSigDetectOff ? ++ aniState->ofdmWeakSigDetect ? + "on" : "off", + on ? "on" : "off"); + if (on) + ah->stats.ast_ani_ofdmon++; + else + ah->stats.ast_ani_ofdmoff++; +- aniState->ofdmWeakSigDetectOff = !on; ++ aniState->ofdmWeakSigDetect = on; + } + break; + } +@@ -1236,7 +1101,7 @@ static bool ar5008_hw_ani_control_new(st + * from INI file & cap value + */ + value = firstep_table[level] - +- firstep_table[ATH9K_ANI_FIRSTEP_LVL_NEW] + ++ firstep_table[ATH9K_ANI_FIRSTEP_LVL] + + aniState->iniDef.firstep; + if (value < ATH9K_SIG_FIRSTEP_SETTING_MIN) + value = ATH9K_SIG_FIRSTEP_SETTING_MIN; +@@ -1251,7 +1116,7 @@ static bool ar5008_hw_ani_control_new(st + * from INI file & cap value + */ + value2 = firstep_table[level] - +- firstep_table[ATH9K_ANI_FIRSTEP_LVL_NEW] + ++ firstep_table[ATH9K_ANI_FIRSTEP_LVL] + + aniState->iniDef.firstepLow; + if (value2 < ATH9K_SIG_FIRSTEP_SETTING_MIN) + value2 = ATH9K_SIG_FIRSTEP_SETTING_MIN; +@@ -1267,7 +1132,7 @@ static bool ar5008_hw_ani_control_new(st + chan->channel, + aniState->firstepLevel, + level, +- ATH9K_ANI_FIRSTEP_LVL_NEW, ++ ATH9K_ANI_FIRSTEP_LVL, + value, + aniState->iniDef.firstep); + ath_dbg(common, ANI, +@@ -1275,7 +1140,7 @@ static bool ar5008_hw_ani_control_new(st + chan->channel, + aniState->firstepLevel, + level, +- ATH9K_ANI_FIRSTEP_LVL_NEW, ++ ATH9K_ANI_FIRSTEP_LVL, + value2, + aniState->iniDef.firstepLow); + if (level > aniState->firstepLevel) +@@ -1300,7 +1165,7 @@ static bool ar5008_hw_ani_control_new(st + * from INI file & cap value + */ + value = cycpwrThr1_table[level] - +- cycpwrThr1_table[ATH9K_ANI_SPUR_IMMUNE_LVL_NEW] + ++ cycpwrThr1_table[ATH9K_ANI_SPUR_IMMUNE_LVL] + + aniState->iniDef.cycpwrThr1; + if (value < ATH9K_SIG_SPUR_IMM_SETTING_MIN) + value = ATH9K_SIG_SPUR_IMM_SETTING_MIN; +@@ -1316,7 +1181,7 @@ static bool ar5008_hw_ani_control_new(st + * from INI file & cap value + */ + value2 = cycpwrThr1_table[level] - +- cycpwrThr1_table[ATH9K_ANI_SPUR_IMMUNE_LVL_NEW] + ++ cycpwrThr1_table[ATH9K_ANI_SPUR_IMMUNE_LVL] + + aniState->iniDef.cycpwrThr1Ext; + if (value2 < ATH9K_SIG_SPUR_IMM_SETTING_MIN) + value2 = ATH9K_SIG_SPUR_IMM_SETTING_MIN; +@@ -1331,7 +1196,7 @@ static bool ar5008_hw_ani_control_new(st + chan->channel, + aniState->spurImmunityLevel, + level, +- ATH9K_ANI_SPUR_IMMUNE_LVL_NEW, ++ ATH9K_ANI_SPUR_IMMUNE_LVL, + value, + aniState->iniDef.cycpwrThr1); + ath_dbg(common, ANI, +@@ -1339,7 +1204,7 @@ static bool ar5008_hw_ani_control_new(st + chan->channel, + aniState->spurImmunityLevel, + level, +- ATH9K_ANI_SPUR_IMMUNE_LVL_NEW, ++ ATH9K_ANI_SPUR_IMMUNE_LVL, + value2, + aniState->iniDef.cycpwrThr1Ext); + if (level > aniState->spurImmunityLevel) +@@ -1367,7 +1232,7 @@ static bool ar5008_hw_ani_control_new(st + ath_dbg(common, ANI, + "ANI parameters: SI=%d, ofdmWS=%s FS=%d MRCcck=%s listenTime=%d ofdmErrs=%d cckErrs=%d\n", + aniState->spurImmunityLevel, +- !aniState->ofdmWeakSigDetectOff ? "on" : "off", ++ aniState->ofdmWeakSigDetect ? "on" : "off", + aniState->firstepLevel, + !aniState->mrcCCKOff ? "on" : "off", + aniState->listenTime, +@@ -1454,9 +1319,9 @@ static void ar5008_hw_ani_cache_ini_regs + AR_PHY_EXT_TIMING5_CYCPWR_THR1); + + /* these levels just got reset to defaults by the INI */ +- aniState->spurImmunityLevel = ATH9K_ANI_SPUR_IMMUNE_LVL_NEW; +- aniState->firstepLevel = ATH9K_ANI_FIRSTEP_LVL_NEW; +- aniState->ofdmWeakSigDetectOff = !ATH9K_ANI_USE_OFDM_WEAK_SIG; ++ aniState->spurImmunityLevel = ATH9K_ANI_SPUR_IMMUNE_LVL; ++ aniState->firstepLevel = ATH9K_ANI_FIRSTEP_LVL; ++ aniState->ofdmWeakSigDetect = ATH9K_ANI_USE_OFDM_WEAK_SIG; + aniState->mrcCCKOff = true; /* not available on pre AR9003 */ + } + +@@ -1545,11 +1410,8 @@ void ar5008_hw_attach_phy_ops(struct ath + priv_ops->do_getnf = ar5008_hw_do_getnf; + priv_ops->set_radar_params = ar5008_hw_set_radar_params; + +- if (modparam_force_new_ani) { +- priv_ops->ani_control = ar5008_hw_ani_control_new; +- priv_ops->ani_cache_ini_regs = ar5008_hw_ani_cache_ini_regs; +- } else +- priv_ops->ani_control = ar5008_hw_ani_control_old; ++ priv_ops->ani_control = ar5008_hw_ani_control_new; ++ priv_ops->ani_cache_ini_regs = ar5008_hw_ani_cache_ini_regs; + + if (AR_SREV_9100(ah) || AR_SREV_9160_10_OR_LATER(ah)) + priv_ops->compute_pll_control = ar9160_hw_compute_pll_control; +--- a/drivers/net/wireless/ath/ath9k/ar9002_hw.c ++++ b/drivers/net/wireless/ath/ath9k/ar9002_hw.c +@@ -21,10 +21,6 @@ + #include "ar9002_initvals.h" + #include "ar9002_phy.h" + +-int modparam_force_new_ani; +-module_param_named(force_new_ani, modparam_force_new_ani, int, 0444); +-MODULE_PARM_DESC(force_new_ani, "Force new ANI for AR5008, AR9001, AR9002"); +- + /* General hardware code for the A5008/AR9001/AR9002 hadware families */ + + static void ar9002_hw_init_mode_regs(struct ath_hw *ah) +--- a/drivers/net/wireless/ath/ath9k/ar9003_phy.c ++++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.c +@@ -825,18 +825,18 @@ static bool ar9003_hw_ani_control(struct + REG_CLR_BIT(ah, AR_PHY_SFCORR_LOW, + AR_PHY_SFCORR_LOW_USE_SELF_CORR_LOW); + +- if (!on != aniState->ofdmWeakSigDetectOff) { ++ if (on != aniState->ofdmWeakSigDetect) { + ath_dbg(common, ANI, + "** ch %d: ofdm weak signal: %s=>%s\n", + chan->channel, +- !aniState->ofdmWeakSigDetectOff ? ++ aniState->ofdmWeakSigDetect ? + "on" : "off", + on ? "on" : "off"); + if (on) + ah->stats.ast_ani_ofdmon++; + else + ah->stats.ast_ani_ofdmoff++; +- aniState->ofdmWeakSigDetectOff = !on; ++ aniState->ofdmWeakSigDetect = on; + } + break; + } +@@ -855,7 +855,7 @@ static bool ar9003_hw_ani_control(struct + * from INI file & cap value + */ + value = firstep_table[level] - +- firstep_table[ATH9K_ANI_FIRSTEP_LVL_NEW] + ++ firstep_table[ATH9K_ANI_FIRSTEP_LVL] + + aniState->iniDef.firstep; + if (value < ATH9K_SIG_FIRSTEP_SETTING_MIN) + value = ATH9K_SIG_FIRSTEP_SETTING_MIN; +@@ -870,7 +870,7 @@ static bool ar9003_hw_ani_control(struct + * from INI file & cap value + */ + value2 = firstep_table[level] - +- firstep_table[ATH9K_ANI_FIRSTEP_LVL_NEW] + ++ firstep_table[ATH9K_ANI_FIRSTEP_LVL] + + aniState->iniDef.firstepLow; + if (value2 < ATH9K_SIG_FIRSTEP_SETTING_MIN) + value2 = ATH9K_SIG_FIRSTEP_SETTING_MIN; +@@ -886,7 +886,7 @@ static bool ar9003_hw_ani_control(struct + chan->channel, + aniState->firstepLevel, + level, +- ATH9K_ANI_FIRSTEP_LVL_NEW, ++ ATH9K_ANI_FIRSTEP_LVL, + value, + aniState->iniDef.firstep); + ath_dbg(common, ANI, +@@ -894,7 +894,7 @@ static bool ar9003_hw_ani_control(struct + chan->channel, + aniState->firstepLevel, + level, +- ATH9K_ANI_FIRSTEP_LVL_NEW, ++ ATH9K_ANI_FIRSTEP_LVL, + value2, + aniState->iniDef.firstepLow); + if (level > aniState->firstepLevel) +@@ -919,7 +919,7 @@ static bool ar9003_hw_ani_control(struct + * from INI file & cap value + */ + value = cycpwrThr1_table[level] - +- cycpwrThr1_table[ATH9K_ANI_SPUR_IMMUNE_LVL_NEW] + ++ cycpwrThr1_table[ATH9K_ANI_SPUR_IMMUNE_LVL] + + aniState->iniDef.cycpwrThr1; + if (value < ATH9K_SIG_SPUR_IMM_SETTING_MIN) + value = ATH9K_SIG_SPUR_IMM_SETTING_MIN; +@@ -935,7 +935,7 @@ static bool ar9003_hw_ani_control(struct + * from INI file & cap value + */ + value2 = cycpwrThr1_table[level] - +- cycpwrThr1_table[ATH9K_ANI_SPUR_IMMUNE_LVL_NEW] + ++ cycpwrThr1_table[ATH9K_ANI_SPUR_IMMUNE_LVL] + + aniState->iniDef.cycpwrThr1Ext; + if (value2 < ATH9K_SIG_SPUR_IMM_SETTING_MIN) + value2 = ATH9K_SIG_SPUR_IMM_SETTING_MIN; +@@ -950,7 +950,7 @@ static bool ar9003_hw_ani_control(struct + chan->channel, + aniState->spurImmunityLevel, + level, +- ATH9K_ANI_SPUR_IMMUNE_LVL_NEW, ++ ATH9K_ANI_SPUR_IMMUNE_LVL, + value, + aniState->iniDef.cycpwrThr1); + ath_dbg(common, ANI, +@@ -958,7 +958,7 @@ static bool ar9003_hw_ani_control(struct + chan->channel, + aniState->spurImmunityLevel, + level, +- ATH9K_ANI_SPUR_IMMUNE_LVL_NEW, ++ ATH9K_ANI_SPUR_IMMUNE_LVL, + value2, + aniState->iniDef.cycpwrThr1Ext); + if (level > aniState->spurImmunityLevel) +@@ -1002,7 +1002,7 @@ static bool ar9003_hw_ani_control(struct + ath_dbg(common, ANI, + "ANI parameters: SI=%d, ofdmWS=%s FS=%d MRCcck=%s listenTime=%d ofdmErrs=%d cckErrs=%d\n", + aniState->spurImmunityLevel, +- !aniState->ofdmWeakSigDetectOff ? "on" : "off", ++ aniState->ofdmWeakSigDetect ? "on" : "off", + aniState->firstepLevel, + !aniState->mrcCCKOff ? "on" : "off", + aniState->listenTime, +@@ -1111,9 +1111,9 @@ static void ar9003_hw_ani_cache_ini_regs + AR_PHY_EXT_CYCPWR_THR1); + + /* these levels just got reset to defaults by the INI */ +- aniState->spurImmunityLevel = ATH9K_ANI_SPUR_IMMUNE_LVL_NEW; +- aniState->firstepLevel = ATH9K_ANI_FIRSTEP_LVL_NEW; +- aniState->ofdmWeakSigDetectOff = !ATH9K_ANI_USE_OFDM_WEAK_SIG; ++ aniState->spurImmunityLevel = ATH9K_ANI_SPUR_IMMUNE_LVL; ++ aniState->firstepLevel = ATH9K_ANI_FIRSTEP_LVL; ++ aniState->ofdmWeakSigDetect = ATH9K_ANI_USE_OFDM_WEAK_SIG; + aniState->mrcCCKOff = !ATH9K_ANI_ENABLE_MRC_CCK; + } + +--- a/drivers/net/wireless/ath/ath9k/debug.c ++++ b/drivers/net/wireless/ath/ath9k/debug.c +@@ -348,8 +348,6 @@ void ath_debug_stat_interrupt(struct ath + sc->debug.stats.istats.txok++; + if (status & ATH9K_INT_TXURN) + sc->debug.stats.istats.txurn++; +- if (status & ATH9K_INT_MIB) +- sc->debug.stats.istats.mib++; + if (status & ATH9K_INT_RXPHY) + sc->debug.stats.istats.rxphyerr++; + if (status & ATH9K_INT_RXKCM) +--- a/drivers/net/wireless/ath/ath9k/hw.h ++++ b/drivers/net/wireless/ath/ath9k/hw.h +@@ -1019,16 +1019,8 @@ void ar9002_hw_attach_ops(struct ath_hw + void ar9003_hw_attach_ops(struct ath_hw *ah); + + void ar9002_hw_load_ani_reg(struct ath_hw *ah, struct ath9k_channel *chan); +-/* +- * ANI work can be shared between all families but a next +- * generation implementation of ANI will be used only for AR9003 only +- * for now as the other families still need to be tested with the same +- * next generation ANI. Feel free to start testing it though for the +- * older families (AR5008, AR9001, AR9002) by using modparam_force_new_ani. +- */ +-extern int modparam_force_new_ani; ++ + void ath9k_ani_reset(struct ath_hw *ah, bool is_scanning); +-void ath9k_hw_proc_mib_event(struct ath_hw *ah); + void ath9k_hw_ani_monitor(struct ath_hw *ah, struct ath9k_channel *chan); + + #ifdef CONFIG_ATH9K_BTCOEX_SUPPORT +--- a/drivers/net/wireless/ath/ath9k/main.c ++++ b/drivers/net/wireless/ath/ath9k/main.c +@@ -516,24 +516,6 @@ irqreturn_t ath_isr(int irq, void *dev) + ath9k_hw_set_interrupts(ah); + } + +- if (status & ATH9K_INT_MIB) { +- /* +- * Disable interrupts until we service the MIB +- * interrupt; otherwise it will continue to +- * fire. +- */ +- ath9k_hw_disable_interrupts(ah); +- /* +- * Let the hal handle the event. We assume +- * it will clear whatever condition caused +- * the interrupt. +- */ +- spin_lock(&common->cc_lock); +- ath9k_hw_proc_mib_event(ah); +- spin_unlock(&common->cc_lock); +- ath9k_hw_enable_interrupts(ah); +- } +- + if (!(ah->caps.hw_caps & ATH9K_HW_CAP_AUTOSLEEP)) + if (status & ATH9K_INT_TIM_TIMER) { + if (ATH_DBG_WARN_ON_ONCE(sc->ps_idle)) +@@ -959,14 +941,10 @@ static void ath9k_calculate_summary_stat + /* + * Enable MIB interrupts when there are hardware phy counters. + */ +- if ((iter_data.nstations + iter_data.nadhocs + iter_data.nmeshes) > 0) { +- if (ah->config.enable_ani) +- ah->imask |= ATH9K_INT_MIB; ++ if ((iter_data.nstations + iter_data.nadhocs + iter_data.nmeshes) > 0) + ah->imask |= ATH9K_INT_TSFOOR; +- } else { +- ah->imask &= ~ATH9K_INT_MIB; ++ else + ah->imask &= ~ATH9K_INT_TSFOOR; +- } + + ath9k_hw_set_interrupts(ah); - #ifdef CONFIG_MAC80211_HT_DEBUG - printk(KERN_DEBUG "rx session timer expired on tid %d\n", (u16)*ptid); -@@ -200,6 +205,8 @@ static void ieee80211_send_addba_resp(st +--- a/net/mac80211/agg-rx.c ++++ b/net/mac80211/agg-rx.c +@@ -201,6 +201,8 @@ static void ieee80211_send_addba_resp(st memcpy(mgmt->bssid, sdata->u.mgd.bssid, ETH_ALEN); else if (sdata->vif.type == NL80211_IFTYPE_ADHOC) memcpy(mgmt->bssid, sdata->u.ibss.bssid, ETH_ALEN); @@ -78,7 +1236,7 @@ memcpy(mgmt->bssid, sdata->vif.addr, ETH_ALEN); else if (sdata->vif.type == NL80211_IFTYPE_STATION) memcpy(mgmt->bssid, sdata->u.mgd.bssid, ETH_ALEN); -@@ -490,6 +491,7 @@ int ieee80211_start_tx_ba_session(struct +@@ -456,6 +457,7 @@ int ieee80211_start_tx_ba_session(struct sdata->vif.type != NL80211_IFTYPE_MESH_POINT && sdata->vif.type != NL80211_IFTYPE_AP_VLAN && sdata->vif.type != NL80211_IFTYPE_AP && @@ -141,7 +1299,7 @@ /* * set_multicast_list will be invoked by the networking core * which will check whether any increments here were done in -@@ -642,6 +619,8 @@ static void ieee80211_do_stop(struct iee +@@ -639,6 +616,8 @@ static void ieee80211_do_stop(struct iee ieee80211_configure_filter(local); break; default: @@ -150,7 +1308,7 @@ flush_work(&sdata->work); /* * When we get here, the interface is marked down. -@@ -848,6 +827,72 @@ static void ieee80211_if_setup(struct ne +@@ -845,6 +824,72 @@ static void ieee80211_if_setup(struct ne dev->destructor = free_netdev; } @@ -223,7 +1381,7 @@ static void ieee80211_iface_work(struct work_struct *work) { struct ieee80211_sub_if_data *sdata = -@@ -952,6 +997,9 @@ static void ieee80211_iface_work(struct +@@ -949,6 +994,9 @@ static void ieee80211_iface_work(struct break; ieee80211_mesh_rx_queued_mgmt(sdata, skb); break; @@ -235,7 +1393,7 @@ break; --- a/net/mac80211/rx.c +++ b/net/mac80211/rx.c -@@ -2284,6 +2284,7 @@ ieee80211_rx_h_action(struct ieee80211_r +@@ -2281,6 +2281,7 @@ ieee80211_rx_h_action(struct ieee80211_r sdata->vif.type != NL80211_IFTYPE_MESH_POINT && sdata->vif.type != NL80211_IFTYPE_AP_VLAN && sdata->vif.type != NL80211_IFTYPE_AP && @@ -243,7 +1401,7 @@ sdata->vif.type != NL80211_IFTYPE_ADHOC) break; -@@ -2498,14 +2499,15 @@ ieee80211_rx_h_mgmt(struct ieee80211_rx_ +@@ -2495,14 +2496,15 @@ ieee80211_rx_h_mgmt(struct ieee80211_rx_ if (!ieee80211_vif_is_mesh(&sdata->vif) && sdata->vif.type != NL80211_IFTYPE_ADHOC && @@ -261,13 +1419,13 @@ break; case cpu_to_le16(IEEE80211_STYPE_ASSOC_RESP): case cpu_to_le16(IEEE80211_STYPE_REASSOC_RESP): -@@ -2839,10 +2841,16 @@ static int prepare_for_handlers(struct i +@@ -2833,10 +2835,16 @@ static int prepare_for_handlers(struct i } break; case NL80211_IFTYPE_WDS: - if (bssid || !ieee80211_is_data(hdr->frame_control)) - return 0; - if (compare_ether_addr(sdata->u.wds.remote_addr, hdr->addr2)) + if (!ether_addr_equal(sdata->u.wds.remote_addr, hdr->addr2)) return 0; + + if (ieee80211_is_data(hdr->frame_control) || @@ -298,238 +1456,13 @@ WLAN_STA_CLEAR_PS_FILT, WLAN_STA_MFP, WLAN_STA_BLOCK_BA, ---- a/net/mac80211/util.c -+++ b/net/mac80211/util.c -@@ -804,7 +804,7 @@ void ieee80211_set_wmm_default(struct ie - struct ieee80211_local *local = sdata->local; - struct ieee80211_tx_queue_params qparam; - int ac; -- bool use_11b; -+ bool use_11b, enable_qos; - int aCWmin, aCWmax; - - if (!local->ops->conf_tx) -@@ -818,6 +818,13 @@ void ieee80211_set_wmm_default(struct ie - use_11b = (local->hw.conf.channel->band == IEEE80211_BAND_2GHZ) && - !(sdata->flags & IEEE80211_SDATA_OPERATING_GMODE); - -+ /* -+ * By default disable QoS in STA mode for old access points, which do -+ * not support 802.11e. New APs will provide proper queue parameters, -+ * that we will configure later. -+ */ -+ enable_qos = (sdata->vif.type != NL80211_IFTYPE_STATION); -+ - for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) { - /* Set defaults according to 802.11-2007 Table 7-37 */ - aCWmax = 1023; -@@ -826,38 +833,47 @@ void ieee80211_set_wmm_default(struct ie - else - aCWmin = 15; - -- switch (ac) { -- case IEEE80211_AC_BK: -- qparam.cw_max = aCWmax; -- qparam.cw_min = aCWmin; -- qparam.txop = 0; -- qparam.aifs = 7; -- break; -- default: /* never happens but let's not leave undefined */ -- case IEEE80211_AC_BE: -+ if (enable_qos) { -+ switch (ac) { -+ case IEEE80211_AC_BK: -+ qparam.cw_max = aCWmax; -+ qparam.cw_min = aCWmin; -+ qparam.txop = 0; -+ qparam.aifs = 7; -+ break; -+ /* never happens but let's not leave undefined */ -+ default: -+ case IEEE80211_AC_BE: -+ qparam.cw_max = aCWmax; -+ qparam.cw_min = aCWmin; -+ qparam.txop = 0; -+ qparam.aifs = 3; -+ break; -+ case IEEE80211_AC_VI: -+ qparam.cw_max = aCWmin; -+ qparam.cw_min = (aCWmin + 1) / 2 - 1; -+ if (use_11b) -+ qparam.txop = 6016/32; -+ else -+ qparam.txop = 3008/32; -+ qparam.aifs = 2; -+ break; -+ case IEEE80211_AC_VO: -+ qparam.cw_max = (aCWmin + 1) / 2 - 1; -+ qparam.cw_min = (aCWmin + 1) / 4 - 1; -+ if (use_11b) -+ qparam.txop = 3264/32; -+ else -+ qparam.txop = 1504/32; -+ qparam.aifs = 2; -+ break; -+ } -+ } else { -+ /* Confiure old 802.11b/g medium access rules. */ - qparam.cw_max = aCWmax; - qparam.cw_min = aCWmin; - qparam.txop = 0; -- qparam.aifs = 3; -- break; -- case IEEE80211_AC_VI: -- qparam.cw_max = aCWmin; -- qparam.cw_min = (aCWmin + 1) / 2 - 1; -- if (use_11b) -- qparam.txop = 6016/32; -- else -- qparam.txop = 3008/32; - qparam.aifs = 2; -- break; -- case IEEE80211_AC_VO: -- qparam.cw_max = (aCWmin + 1) / 2 - 1; -- qparam.cw_min = (aCWmin + 1) / 4 - 1; -- if (use_11b) -- qparam.txop = 3264/32; -- else -- qparam.txop = 1504/32; -- qparam.aifs = 2; -- break; - } - - qparam.uapsd = false; -@@ -866,12 +882,8 @@ void ieee80211_set_wmm_default(struct ie - drv_conf_tx(local, sdata, ac, &qparam); - } - -- /* after reinitialize QoS TX queues setting to default, -- * disable QoS at all */ -- - if (sdata->vif.type != NL80211_IFTYPE_MONITOR) { -- sdata->vif.bss_conf.qos = -- sdata->vif.type != NL80211_IFTYPE_STATION; -+ sdata->vif.bss_conf.qos = enable_qos; - if (bss_notify) - ieee80211_bss_info_change_notify(sdata, - BSS_CHANGED_QOS); ---- a/drivers/net/wireless/ath/ath9k/beacon.c -+++ b/drivers/net/wireless/ath/ath9k/beacon.c -@@ -48,7 +48,10 @@ int ath_beaconq_config(struct ath_softc - txq = sc->tx.txq_map[WME_AC_BE]; - ath9k_hw_get_txq_props(ah, txq->axq_qnum, &qi_be); - qi.tqi_aifs = qi_be.tqi_aifs; -- qi.tqi_cwmin = 4*qi_be.tqi_cwmin; -+ if (ah->slottime == ATH9K_SLOT_TIME_20) -+ qi.tqi_cwmin = 2*qi_be.tqi_cwmin; -+ else -+ qi.tqi_cwmin = 4*qi_be.tqi_cwmin; - qi.tqi_cwmax = qi_be.tqi_cwmax; - } - ---- a/net/mac80211/mlme.c -+++ b/net/mac80211/mlme.c -@@ -1220,6 +1220,22 @@ static void ieee80211_sta_wmm_params(str - sdata->vif.bss_conf.qos = true; - } - -+static void __ieee80211_stop_poll(struct ieee80211_sub_if_data *sdata) -+{ -+ lockdep_assert_held(&sdata->local->mtx); -+ -+ sdata->u.mgd.flags &= ~(IEEE80211_STA_CONNECTION_POLL | -+ IEEE80211_STA_BEACON_POLL); -+ ieee80211_run_deferred_scan(sdata->local); -+} -+ -+static void ieee80211_stop_poll(struct ieee80211_sub_if_data *sdata) -+{ -+ mutex_lock(&sdata->local->mtx); -+ __ieee80211_stop_poll(sdata); -+ mutex_unlock(&sdata->local->mtx); -+} -+ - static u32 ieee80211_handle_bss_capability(struct ieee80211_sub_if_data *sdata, - u16 capab, bool erp_valid, u8 erp) - { -@@ -1285,8 +1301,7 @@ static void ieee80211_set_associated(str - sdata->u.mgd.flags |= IEEE80211_STA_RESET_SIGNAL_AVE; - - /* just to be sure */ -- sdata->u.mgd.flags &= ~(IEEE80211_STA_CONNECTION_POLL | -- IEEE80211_STA_BEACON_POLL); -+ ieee80211_stop_poll(sdata); - - ieee80211_led_assoc(local, 1); - -@@ -1456,8 +1471,7 @@ static void ieee80211_reset_ap_probe(str - return; - } - -- ifmgd->flags &= ~(IEEE80211_STA_CONNECTION_POLL | -- IEEE80211_STA_BEACON_POLL); -+ __ieee80211_stop_poll(sdata); - - mutex_lock(&local->iflist_mtx); - ieee80211_recalc_ps(local, -1); -@@ -1477,7 +1491,6 @@ static void ieee80211_reset_ap_probe(str - round_jiffies_up(jiffies + - IEEE80211_CONNECTION_IDLE_TIME)); - out: -- ieee80211_run_deferred_scan(local); - mutex_unlock(&local->mtx); - } - -@@ -2413,7 +2426,11 @@ static void ieee80211_rx_mgmt_beacon(str - "to a received beacon\n", sdata->name); - } - #endif -+ mutex_lock(&local->mtx); - ifmgd->flags &= ~IEEE80211_STA_BEACON_POLL; -+ ieee80211_run_deferred_scan(local); -+ mutex_unlock(&local->mtx); -+ - mutex_lock(&local->iflist_mtx); - ieee80211_recalc_ps(local, -1); - mutex_unlock(&local->iflist_mtx); -@@ -2600,8 +2617,7 @@ static void ieee80211_sta_connection_los - struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; - u8 frame_buf[DEAUTH_DISASSOC_LEN]; - -- ifmgd->flags &= ~(IEEE80211_STA_CONNECTION_POLL | -- IEEE80211_STA_BEACON_POLL); -+ ieee80211_stop_poll(sdata); - - ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, reason, - false, frame_buf); -@@ -2879,8 +2895,7 @@ static void ieee80211_restart_sta_timer( - u32 flags; - - if (sdata->vif.type == NL80211_IFTYPE_STATION) { -- sdata->u.mgd.flags &= ~(IEEE80211_STA_BEACON_POLL | -- IEEE80211_STA_CONNECTION_POLL); -+ __ieee80211_stop_poll(sdata); - - /* let's probe the connection once */ - flags = sdata->local->hw.flags; -@@ -2949,7 +2964,10 @@ void ieee80211_sta_restart(struct ieee80 - if (test_and_clear_bit(TMR_RUNNING_CHANSW, &ifmgd->timers_running)) - add_timer(&ifmgd->chswitch_timer); - ieee80211_sta_reset_beacon_monitor(sdata); -+ -+ mutex_lock(&sdata->local->mtx); - ieee80211_restart_sta_timer(sdata); -+ mutex_unlock(&sdata->local->mtx); - } - #endif - --- a/drivers/net/wireless/ath/ath9k/ath9k.h +++ b/drivers/net/wireless/ath/ath9k/ath9k.h @@ -214,6 +214,7 @@ struct ath_frame_info { enum ath9k_key_type keytype; u8 keyix; u8 retries; -+ bool short_preamble; ++ u8 rtscts_rate; }; struct ath_buf_state { @@ -543,33 +1476,71 @@ int i; u8 rix = 0; -@@ -957,8 +958,7 @@ static void ath_buf_set_rate(struct ath_ - rate = ieee80211_get_rts_cts_rate(sc->hw, tx_info); - info->rtscts_rate = rate->hw_value; +@@ -948,18 +949,7 @@ static void ath_buf_set_rate(struct ath_ + /* set dur_update_en for l-sig computation except for PS-Poll frames */ + info->dur_update = !ieee80211_is_pspoll(hdr->frame_control); +- +- /* +- * We check if Short Preamble is needed for the CTS rate by +- * checking the BSS's global flag. +- * But for the rate series, IEEE80211_TX_RC_USE_SHORT_PREAMBLE is used. +- */ +- rate = ieee80211_get_rts_cts_rate(sc->hw, tx_info); +- info->rtscts_rate = rate->hw_value; +- - if (tx_info->control.vif && - tx_info->control.vif->bss_conf.use_short_preamble) -+ if (fi->short_preamble) - info->rtscts_rate |= rate->hw_value_short; +- info->rtscts_rate |= rate->hw_value_short; ++ info->rtscts_rate = fi->rtscts_rate; for (i = 0; i < 4; i++) { -@@ -1779,6 +1779,11 @@ static void setup_frame_info(struct ieee + bool is_40, is_sgi, is_sp; +@@ -1001,13 +991,13 @@ static void ath_buf_set_rate(struct ath_ + } + + /* legacy rates */ ++ rate = &sc->sbands[tx_info->band].bitrates[rates[i].idx]; + if ((tx_info->band == IEEE80211_BAND_2GHZ) && + !(rate->flags & IEEE80211_RATE_ERP_G)) + phy = WLAN_RC_PHY_CCK; + else + phy = WLAN_RC_PHY_OFDM; + +- rate = &sc->sbands[tx_info->band].bitrates[rates[i].idx]; + info->rates[i].Rate = rate->hw_value; + if (rate->hw_value_short) { + if (rates[i].flags & IEEE80211_TX_RC_USE_SHORT_PREAMBLE) +@@ -1776,10 +1766,22 @@ static void setup_frame_info(struct ieee + struct ieee80211_sta *sta = tx_info->control.sta; + struct ieee80211_key_conf *hw_key = tx_info->control.hw_key; + struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; ++ const struct ieee80211_rate *rate; struct ath_frame_info *fi = get_frame_info(skb); struct ath_node *an = NULL; enum ath9k_key_type keytype; + bool short_preamble = false; + ++ /* ++ * We check if Short Preamble is needed for the CTS rate by ++ * checking the BSS's global flag. ++ * But for the rate series, IEEE80211_TX_RC_USE_SHORT_PREAMBLE is used. ++ */ + if (tx_info->control.vif && + tx_info->control.vif->bss_conf.use_short_preamble) + short_preamble = true; ++ rate = ieee80211_get_rts_cts_rate(hw, tx_info); keytype = ath9k_cmn_get_hw_crypto_keytype(skb); -@@ -1794,6 +1799,7 @@ static void setup_frame_info(struct ieee + if (sta) +@@ -1794,6 +1796,9 @@ static void setup_frame_info(struct ieee fi->keyix = ATH9K_TXKEYIX_INVALID; fi->keytype = keytype; fi->framelen = framelen; -+ fi->short_preamble = short_preamble; ++ fi->rtscts_rate = rate->hw_value; ++ if (short_preamble) ++ fi->rtscts_rate |= rate->hw_value_short; } u8 ath_txchainmask_reduction(struct ath_softc *sc, u8 chainmask, u32 rate) |