From 749e98921529c8078cef4af2c2b25680711acf18 Mon Sep 17 00:00:00 2001
From: Felix Fietkau <nbd@openwrt.org>
Date: Sun, 16 Jun 2013 12:56:16 +0000
Subject: [PATCH] ath9k: revert parts of the ANI changes in the latest mac80211
 update to fix regressions

Signed-off-by: Felix Fietkau <nbd@openwrt.org>

SVN-Revision: 36941
---
 .../patches/556-ath9k_ani_revert.patch        | 74 +++++++++++++++++++
 1 file changed, 74 insertions(+)
 create mode 100644 package/mac80211/patches/556-ath9k_ani_revert.patch

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) {
-- 
2.30.2