ath9k: fix ANI weak signal detection handling
authorFelix Fietkau <nbd@openwrt.org>
Mon, 4 Jun 2012 13:42:39 +0000 (13:42 +0000)
committerFelix Fietkau <nbd@openwrt.org>
Mon, 4 Jun 2012 13:42:39 +0000 (13:42 +0000)
SVN-Revision: 32045

package/mac80211/patches/570-ath9k_remove_noiseFloor.patch [new file with mode: 0644]
package/mac80211/patches/571-ath9k_ani_fix_weak_sig.patch [new file with mode: 0644]

diff --git a/package/mac80211/patches/570-ath9k_remove_noiseFloor.patch b/package/mac80211/patches/570-ath9k_remove_noiseFloor.patch
new file mode 100644 (file)
index 0000000..fb17dc5
--- /dev/null
@@ -0,0 +1,52 @@
+--- a/drivers/net/wireless/ath/ath9k/ani.h
++++ b/drivers/net/wireless/ath/ath9k/ani.h
+@@ -128,7 +128,6 @@ struct ar5416AniState {
+       u32 listenTime;
+       int32_t rssiThrLow;
+       int32_t rssiThrHigh;
+-      u32 noiseFloor;
+       u32 ofdmPhyErrCount;
+       u32 cckPhyErrCount;
+       int16_t pktRssi[2];
+--- a/drivers/net/wireless/ath/ath9k/ani.c
++++ b/drivers/net/wireless/ath/ath9k/ani.c
+@@ -266,11 +266,9 @@ static void ath9k_hw_set_ofdm_nil(struct
+       const struct ani_ofdm_level_entry *entry_ofdm;
+       const struct ani_cck_level_entry *entry_cck;
+-      aniState->noiseFloor = BEACON_RSSI(ah);
+-
+       ath_dbg(common, ANI, "**** ofdmlevel %d=>%d, rssi=%d[lo=%d hi=%d]\n",
+               aniState->ofdmNoiseImmunityLevel,
+-              immunityLevel, aniState->noiseFloor,
++              immunityLevel, BEACON_RSSI(ah),
+               aniState->rssiThrLow, aniState->rssiThrHigh);
+       if (aniState->update_ani)
+@@ -292,7 +290,7 @@ static void ath9k_hw_set_ofdm_nil(struct
+                                    ATH9K_ANI_FIRSTEP_LEVEL,
+                                    entry_ofdm->fir_step_level);
+-      if ((aniState->noiseFloor >= aniState->rssiThrHigh) &&
++      if (BEACON_RSSI(ah) >= aniState->rssiThrHigh &&
+           (!aniState->ofdmWeakSigDetectOff !=
+            entry_ofdm->ofdm_weak_signal_on)) {
+                       ath9k_hw_ani_control(ah,
+@@ -329,15 +327,14 @@ static void ath9k_hw_set_cck_nil(struct 
+       const struct ani_ofdm_level_entry *entry_ofdm;
+       const struct ani_cck_level_entry *entry_cck;
+-      aniState->noiseFloor = BEACON_RSSI(ah);
+       ath_dbg(common, ANI, "**** ccklevel %d=>%d, rssi=%d[lo=%d hi=%d]\n",
+               aniState->cckNoiseImmunityLevel, immunityLevel,
+-              aniState->noiseFloor, aniState->rssiThrLow,
++              BEACON_RSSI(ah), aniState->rssiThrLow,
+               aniState->rssiThrHigh);
+       if ((ah->opmode == NL80211_IFTYPE_STATION ||
+            ah->opmode == NL80211_IFTYPE_ADHOC) &&
+-          aniState->noiseFloor <= aniState->rssiThrLow &&
++          BEACON_RSSI(ah) <= aniState->rssiThrLow &&
+           immunityLevel > ATH9K_ANI_CCK_MAX_LEVEL_LOW_RSSI)
+               immunityLevel = ATH9K_ANI_CCK_MAX_LEVEL_LOW_RSSI;
diff --git a/package/mac80211/patches/571-ath9k_ani_fix_weak_sig.patch b/package/mac80211/patches/571-ath9k_ani_fix_weak_sig.patch
new file mode 100644 (file)
index 0000000..bfe0f0b
--- /dev/null
@@ -0,0 +1,30 @@
+--- a/drivers/net/wireless/ath/ath9k/ani.c
++++ b/drivers/net/wireless/ath/ath9k/ani.c
+@@ -265,6 +265,7 @@ static void ath9k_hw_set_ofdm_nil(struct
+       struct ath_common *common = ath9k_hw_common(ah);
+       const struct ani_ofdm_level_entry *entry_ofdm;
+       const struct ani_cck_level_entry *entry_cck;
++      bool weak_sig;
+       ath_dbg(common, ANI, "**** ofdmlevel %d=>%d, rssi=%d[lo=%d hi=%d]\n",
+               aniState->ofdmNoiseImmunityLevel,
+@@ -290,13 +291,15 @@ static void ath9k_hw_set_ofdm_nil(struct
+                                    ATH9K_ANI_FIRSTEP_LEVEL,
+                                    entry_ofdm->fir_step_level);
+-      if (BEACON_RSSI(ah) >= aniState->rssiThrHigh &&
+-          (!aniState->ofdmWeakSigDetectOff !=
+-           entry_ofdm->ofdm_weak_signal_on)) {
++      weak_sig = entry_ofdm->ofdm_weak_signal_on;
++      if (ah->opmode == NL80211_IFTYPE_STATION &&
++          BEACON_RSSI(ah) >= aniState->rssiThrHigh)
++              weak_sig = true;
++
++      if (!aniState->ofdmWeakSigDetectOff != weak_sig)
+                       ath9k_hw_ani_control(ah,
+                               ATH9K_ANI_OFDM_WEAK_SIGNAL_DETECTION,
+                               entry_ofdm->ofdm_weak_signal_on);
+-      }
+ }
+ static void ath9k_hw_ani_ofdm_err_trigger(struct ath_hw *ah)