diff --git a/package/mac80211/patches/556-ath9k_ani_revert.patch b/package/mac80211/patches/556-ath9k_ani_revert.patch new file mode 100644 index 0000000000..006f3930e9 --- /dev/null +++ b/package/mac80211/patches/556-ath9k_ani_revert.patch @@ -0,0 +1,74 @@ +--- a/drivers/net/wireless/ath/ath9k/ani.h ++++ b/drivers/net/wireless/ath/ath9k/ani.h +@@ -20,8 +20,12 @@ + #define BEACON_RSSI(ahp) (ahp->stats.avgbrssi) + + /* units are errors per second */ +-#define ATH9K_ANI_OFDM_TRIG_HIGH 1000 ++#define ATH9K_ANI_OFDM_TRIG_HIGH 3500 ++#define ATH9K_ANI_OFDM_TRIG_HIGH_BELOW_INI 1000 ++ + #define ATH9K_ANI_OFDM_TRIG_LOW 400 ++#define ATH9K_ANI_OFDM_TRIG_LOW_ABOVE_INI 900 ++ + #define ATH9K_ANI_CCK_TRIG_HIGH 600 + #define ATH9K_ANI_CCK_TRIG_LOW 300 + +--- a/drivers/net/wireless/ath/ath9k/ani.c ++++ b/drivers/net/wireless/ath/ath9k/ani.c +@@ -177,14 +177,17 @@ static void ath9k_hw_set_ofdm_nil(struct + BEACON_RSSI(ah) <= ATH9K_ANI_RSSI_THR_HIGH) + weak_sig = true; + +- /* +- * OFDM Weak signal detection is always enabled for AP mode. +- */ +- if (ah->opmode != NL80211_IFTYPE_AP && +- aniState->ofdmWeakSigDetect != weak_sig) { +- ath9k_hw_ani_control(ah, +- ATH9K_ANI_OFDM_WEAK_SIGNAL_DETECTION, +- entry_ofdm->ofdm_weak_signal_on); ++ 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; + } + } + +@@ -420,25 +423,12 @@ void ath9k_hw_ani_monitor(struct ath_hw + ofdmPhyErrRate, aniState->cckNoiseImmunityLevel, + cckPhyErrRate, aniState->ofdmsTurn); + +- if (aniState->listenTime > 5 * ah->aniperiod) { +- /* +- * Check if we need to lower immunity if +- * 5 ani_periods have passed. +- */ +- if (ofdmPhyErrRate <= ah->config.ofdm_trig_low && +- cckPhyErrRate <= ah->config.cck_trig_low) { ++ if (aniState->listenTime > ah->aniperiod) { ++ if (cckPhyErrRate < ah->config.cck_trig_low && ++ ofdmPhyErrRate < ah->config.ofdm_trig_low) { + ath9k_hw_ani_lower_immunity(ah); + aniState->ofdmsTurn = !aniState->ofdmsTurn; +- } +- ath9k_ani_restart(ah); +- } else if (aniState->listenTime > ah->aniperiod) { +- /* +- * Check if immunity has to be raised, +- * (either OFDM or CCK). +- */ +- if (ofdmPhyErrRate > ah->config.ofdm_trig_high && +- (cckPhyErrRate <= ah->config.cck_trig_high || +- aniState->ofdmsTurn)) { ++ } 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) {