ath9k_hw: toggle weak signal detection in AP mode on older chipsets
authorFelix Fietkau <nbd@openwrt.org>
Fri, 28 Feb 2014 18:02:24 +0000 (19:02 +0100)
committerJohn W. Linville <linville@tuxdriver.com>
Mon, 3 Mar 2014 20:35:55 +0000 (15:35 -0500)
The commit 80b4205b "ath9k: Fix OFDM weak signal detection for AP mode"
prevented weak signal detection changes from taking effect in AP mode on
all chipsets, claiming it is "not allowed".

The main reason for not disabling weak signal detection in AP mode is
that typically beacon RSSI is used to track whether it is needed to
boost range, and this is unavailable in AP mode for obvious reasons.

The problem with not disabling weak signal detection is that older
chipsets are very sensitive to high PHY error counts. When faced with
heavy noise, this can lead to an excessive amount of "Failed to stop
TX DMA" errors in the field.

Signed-off-by: Felix Fietkau <nbd@openwrt.org>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/ath/ath9k/ani.c

index d28923b7435b257f13a91e3f8896115c30adb1c9..3227ee059813f5772ca030a46fecad3eca0cee5e 100644 (file)
@@ -176,16 +176,18 @@ static void ath9k_hw_set_ofdm_nil(struct ath_hw *ah, u8 immunityLevel,
        if (ah->opmode == NL80211_IFTYPE_STATION &&
            BEACON_RSSI(ah) <= ATH9K_ANI_RSSI_THR_HIGH)
                weak_sig = true;
-
        /*
-        * OFDM Weak signal detection is always enabled for AP mode.
+        * Newer chipsets are better at dealing with high PHY error counts -
+        * keep weak signal detection enabled when no RSSI threshold is
+        * available to determine if it is needed (mode != STA)
         */
-       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);
-       }
+       else if (AR_SREV_9300_20_OR_LATER(ah) &&
+                ah->opmode != NL80211_IFTYPE_STATION)
+               weak_sig = true;
+
+       if (aniState->ofdmWeakSigDetect != weak_sig)
+               ath9k_hw_ani_control(ah, ATH9K_ANI_OFDM_WEAK_SIGNAL_DETECTION,
+                                    weak_sig);
 
        if (aniState->ofdmNoiseImmunityLevel >= ATH9K_ANI_OFDM_DEF_LEVEL) {
                ah->config.ofdm_trig_high = ATH9K_ANI_OFDM_TRIG_HIGH;