ath9k: add ANI fix for ar913x to improve stability
authorFelix Fietkau <nbd@openwrt.org>
Sun, 27 Apr 2014 14:39:06 +0000 (14:39 +0000)
committerFelix Fietkau <nbd@openwrt.org>
Sun, 27 Apr 2014 14:39:06 +0000 (14:39 +0000)
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
SVN-Revision: 40573

package/kernel/mac80211/patches/300-pending_work.patch

index 71f2af379b8aa3cd29939ae6a0fa0150df16df07..5c7f7e0019f80ca73deab53a1c6ffbedd34d1ad6 100644 (file)
@@ -1,3 +1,20 @@
+commit 98a713933d8495f4078f561c1e651b738dd5b531
+Author: Felix Fietkau <nbd@openwrt.org>
+Date:   Sun Apr 27 14:49:03 2014 +0200
+
+    ath9k_hw: do not lower ANI setting below default on AR913x
+    
+    When the amount of noise fluctuates strongly, low immunity settings
+    can sometimes disrupt signal detection on AR913x chips. When that
+    happens, no OFDM/CCK errors are reported anymore, and ANI tunes the
+    radio to the lowest immunity settings.
+    Usually rx/tx fails as well in that case.
+    
+    To fix this, keep noise immunity settings at or above ANI default level,
+    which will keep radio parameters at or above INI values.
+    
+    Signed-off-by: Felix Fietkau <nbd@openwrt.org>
+
 commit 7cbb4c021bfd1e656f5b9953a947ab3c64e4e3b0
 Author: Felix Fietkau <nbd@openwrt.org>
 Date:   Thu Apr 10 10:49:01 2014 +0200
@@ -98,3 +115,25 @@ Date:   Sun Apr 6 23:35:28 2014 +0200
                return;
  
        drv_bss_info_changed(local, sdata, &sdata->vif.bss_conf, changed);
+--- a/drivers/net/wireless/ath/ath9k/ani.c
++++ b/drivers/net/wireless/ath/ath9k/ani.c
+@@ -155,6 +155,9 @@ static void ath9k_hw_set_ofdm_nil(struct
+               ATH9K_ANI_RSSI_THR_LOW,
+               ATH9K_ANI_RSSI_THR_HIGH);
++      if (AR_SREV_9100(ah) && immunityLevel < ATH9K_ANI_OFDM_DEF_LEVEL)
++              immunityLevel = ATH9K_ANI_OFDM_DEF_LEVEL;
++
+       if (!scan)
+               aniState->ofdmNoiseImmunityLevel = immunityLevel;
+@@ -235,6 +238,9 @@ static void ath9k_hw_set_cck_nil(struct 
+               BEACON_RSSI(ah), ATH9K_ANI_RSSI_THR_LOW,
+               ATH9K_ANI_RSSI_THR_HIGH);
++      if (AR_SREV_9100(ah) && immunityLevel < ATH9K_ANI_CCK_DEF_LEVEL)
++              immunityLevel = ATH9K_ANI_CCK_DEF_LEVEL;
++
+       if (ah->opmode == NL80211_IFTYPE_STATION &&
+           BEACON_RSSI(ah) <= ATH9K_ANI_RSSI_THR_LOW &&
+           immunityLevel > ATH9K_ANI_CCK_MAX_LEVEL_LOW_RSSI)