ath9k: Fix ANI monitoring
authorSujith Manoharan <c_manoha@qca.qualcomm.com>
Tue, 4 Jun 2013 10:11:31 +0000 (15:41 +0530)
committerJohn W. Linville <linville@tuxdriver.com>
Wed, 12 Jun 2013 18:59:10 +0000 (14:59 -0400)
The commit "ath9k_hw: improve ANI processing and rx desensitizing parameters"
changed various ANI operational parameters to address a specific
card/environment. This is not really applicable for other cards
in general usage.

As per internal documentation, lowering the immunity level can be
done only after 5 periods have passed and the CCK/OFDM errors are
below the low watermak threshold - which have been fixed at 300 and
400 respectively by the sytems team.

Raising the immunity level can be done when CCK/OFDM errors exceed
600 and 1000 (per second).

Set these values once during attach.

Signed-off-by: Sujith Manoharan <c_manoha@qca.qualcomm.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/ath/ath9k/ani.c
drivers/net/wireless/ath/ath9k/ani.h

index 3ec4c5388c2826187b381eac90b12452332500df..1520e550821090d6443985c56b410e054177be20 100644 (file)
@@ -186,14 +186,6 @@ static void ath9k_hw_set_ofdm_nil(struct ath_hw *ah, u8 immunityLevel,
                                     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;
-       }
 }
 
 static void ath9k_hw_ani_ofdm_err_trigger(struct ath_hw *ah)
@@ -439,12 +431,25 @@ void ath9k_hw_ani_monitor(struct ath_hw *ah, struct ath9k_channel *chan)
                ofdmPhyErrRate, aniState->cckNoiseImmunityLevel,
                cckPhyErrRate, aniState->ofdmsTurn);
 
-       if (aniState->listenTime > ah->aniperiod) {
-               if (cckPhyErrRate < ah->config.cck_trig_low &&
-                   ofdmPhyErrRate < ah->config.ofdm_trig_low) {
+       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) {
                        ath9k_hw_ani_lower_immunity(ah);
                        aniState->ofdmsTurn = !aniState->ofdmsTurn;
-               } else if (ofdmPhyErrRate > ah->config.ofdm_trig_high) {
+               }
+               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)) {
                        ath9k_hw_ani_ofdm_err_trigger(ah);
                        aniState->ofdmsTurn = false;
                } else if (cckPhyErrRate > ah->config.cck_trig_high) {
index 78b9fa9f6455efbcd51e458ccd2c6fdb006f5023..10884728d30ec1e10682acd659c4ce27faab7182 100644 (file)
 
 /* units are errors per second */
 #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           400
-#define ATH9K_ANI_OFDM_TRIG_LOW_ABOVE_INI 900
 
 /* units are errors per second */
 #define ATH9K_ANI_CCK_TRIG_HIGH           600