diff options
7 files changed, 1412 insertions, 0 deletions
diff --git a/package/mac80211/patches/572-ath9k_ani_cleanup_weak_signal_detect.patch b/package/mac80211/patches/572-ath9k_ani_cleanup_weak_signal_detect.patch new file mode 100644 index 000000000..2e071817f --- /dev/null +++ b/package/mac80211/patches/572-ath9k_ani_cleanup_weak_signal_detect.patch @@ -0,0 +1,192 @@ +--- a/drivers/net/wireless/ath/ath9k/ani.c ++++ b/drivers/net/wireless/ath/ath9k/ani.c +@@ -185,7 +185,7 @@ static void ath9k_hw_ani_ofdm_err_trigge + 	} + 	rssi = BEACON_RSSI(ah); + 	if (rssi > aniState->rssiThrHigh) { +-		if (!aniState->ofdmWeakSigDetectOff) { ++		if (aniState->ofdmWeakSigDetect) { + 			if (ath9k_hw_ani_control(ah, + 					 ATH9K_ANI_OFDM_WEAK_SIGNAL_DETECTION, + 					 false)) { +@@ -200,7 +200,7 @@ static void ath9k_hw_ani_ofdm_err_trigge + 			return; + 		} + 	} else if (rssi > aniState->rssiThrLow) { +-		if (aniState->ofdmWeakSigDetectOff) ++		if (!aniState->ofdmWeakSigDetect) + 			ath9k_hw_ani_control(ah, + 				     ATH9K_ANI_OFDM_WEAK_SIGNAL_DETECTION, + 				     true); +@@ -211,7 +211,7 @@ static void ath9k_hw_ani_ofdm_err_trigge + 	} else { + 		if ((conf->channel->band == IEEE80211_BAND_2GHZ) && + 		    !conf_is_ht(conf)) { +-			if (!aniState->ofdmWeakSigDetectOff) ++			if (aniState->ofdmWeakSigDetect) + 				ath9k_hw_ani_control(ah, + 				     ATH9K_ANI_OFDM_WEAK_SIGNAL_DETECTION, + 				     false); +@@ -296,7 +296,7 @@ static void ath9k_hw_set_ofdm_nil(struct + 	    BEACON_RSSI(ah) <= aniState->rssiThrHigh) + 		weak_sig = true; +  +-	if (!aniState->ofdmWeakSigDetectOff != weak_sig) ++	if (aniState->ofdmWeakSigDetect != weak_sig) + 			ath9k_hw_ani_control(ah, + 				ATH9K_ANI_OFDM_WEAK_SIGNAL_DETECTION, + 				entry_ofdm->ofdm_weak_signal_on); +@@ -401,7 +401,7 @@ static void ath9k_hw_ani_lower_immunity_ + 		if (rssi > aniState->rssiThrHigh) { + 			/* XXX: Handle me */ + 		} else if (rssi > aniState->rssiThrLow) { +-			if (aniState->ofdmWeakSigDetectOff) { ++			if (!aniState->ofdmWeakSigDetect) { + 				if (ath9k_hw_ani_control(ah, + 					 ATH9K_ANI_OFDM_WEAK_SIGNAL_DETECTION, + 					 true)) +@@ -509,9 +509,9 @@ static void ath9k_ani_reset_old(struct a + 	if (aniState->spurImmunityLevel != 0) + 		ath9k_hw_ani_control(ah, ATH9K_ANI_SPUR_IMMUNITY_LEVEL, + 				     aniState->spurImmunityLevel); +-	if (aniState->ofdmWeakSigDetectOff) ++	if (!aniState->ofdmWeakSigDetect) + 		ath9k_hw_ani_control(ah, ATH9K_ANI_OFDM_WEAK_SIGNAL_DETECTION, +-				     !aniState->ofdmWeakSigDetectOff); ++				     aniState->ofdmWeakSigDetect); + 	if (aniState->cckWeakSigThreshold) + 		ath9k_hw_ani_control(ah, ATH9K_ANI_CCK_WEAK_SIGNAL_THR, + 				     aniState->cckWeakSigThreshold); +@@ -887,8 +887,7 @@ void ath9k_hw_ani_init(struct ath_hw *ah +  + 		ani->rssiThrHigh = ATH9K_ANI_RSSI_THR_HIGH; + 		ani->rssiThrLow = ATH9K_ANI_RSSI_THR_LOW; +-		ani->ofdmWeakSigDetectOff = +-			!ATH9K_ANI_USE_OFDM_WEAK_SIG; ++		ani->ofdmWeakSigDetect = ATH9K_ANI_USE_OFDM_WEAK_SIG; + 		ani->cckNoiseImmunityLevel = ATH9K_ANI_CCK_DEF_LEVEL; + 		ani->ofdmNoiseImmunityLevel = ATH9K_ANI_OFDM_DEF_LEVEL; + 		ani->update_ani = false; +--- a/drivers/net/wireless/ath/ath9k/ani.h ++++ b/drivers/net/wireless/ath/ath9k/ani.h +@@ -122,7 +122,7 @@ struct ar5416AniState { + 	u8 mrcCCKOff; + 	u8 spurImmunityLevel; + 	u8 firstepLevel; +-	u8 ofdmWeakSigDetectOff; ++	u8 ofdmWeakSigDetect; + 	u8 cckWeakSigThreshold; + 	bool update_ani; + 	u32 listenTime; +--- a/drivers/net/wireless/ath/ath9k/ar5008_phy.c ++++ b/drivers/net/wireless/ath/ath9k/ar5008_phy.c +@@ -1042,12 +1042,12 @@ static bool ar5008_hw_ani_control_old(st + 			REG_CLR_BIT(ah, AR_PHY_SFCORR_LOW, + 				    AR_PHY_SFCORR_LOW_USE_SELF_CORR_LOW); +  +-		if (!on != aniState->ofdmWeakSigDetectOff) { ++		if (on != aniState->ofdmWeakSigDetect) { + 			if (on) + 				ah->stats.ast_ani_ofdmon++; + 			else + 				ah->stats.ast_ani_ofdmoff++; +-			aniState->ofdmWeakSigDetectOff = !on; ++			aniState->ofdmWeakSigDetect = on; + 		} + 		break; + 	} +@@ -1114,10 +1114,10 @@ static bool ar5008_hw_ani_control_old(st +  + 	ath_dbg(common, ANI, "ANI parameters:\n"); + 	ath_dbg(common, ANI, +-		"noiseImmunityLevel=%d, spurImmunityLevel=%d, ofdmWeakSigDetectOff=%d\n", ++		"noiseImmunityLevel=%d, spurImmunityLevel=%d, ofdmWeakSigDetect=%d\n", + 		aniState->noiseImmunityLevel, + 		aniState->spurImmunityLevel, +-		!aniState->ofdmWeakSigDetectOff); ++		aniState->ofdmWeakSigDetect); + 	ath_dbg(common, ANI, + 		"cckWeakSigThreshold=%d, firstepLevel=%d, listenTime=%d\n", + 		aniState->cckWeakSigThreshold, +@@ -1206,18 +1206,18 @@ static bool ar5008_hw_ani_control_new(st + 			REG_CLR_BIT(ah, AR_PHY_SFCORR_LOW, + 				    AR_PHY_SFCORR_LOW_USE_SELF_CORR_LOW); +  +-		if (!on != aniState->ofdmWeakSigDetectOff) { ++		if (on != aniState->ofdmWeakSigDetect) { + 			ath_dbg(common, ANI, + 				"** ch %d: ofdm weak signal: %s=>%s\n", + 				chan->channel, +-				!aniState->ofdmWeakSigDetectOff ? ++				aniState->ofdmWeakSigDetect ? + 				"on" : "off", + 				on ? "on" : "off"); + 			if (on) + 				ah->stats.ast_ani_ofdmon++; + 			else + 				ah->stats.ast_ani_ofdmoff++; +-			aniState->ofdmWeakSigDetectOff = !on; ++			aniState->ofdmWeakSigDetect = on; + 		} + 		break; + 	} +@@ -1367,7 +1367,7 @@ static bool ar5008_hw_ani_control_new(st + 	ath_dbg(common, ANI, + 		"ANI parameters: SI=%d, ofdmWS=%s FS=%d MRCcck=%s listenTime=%d ofdmErrs=%d cckErrs=%d\n", + 		aniState->spurImmunityLevel, +-		!aniState->ofdmWeakSigDetectOff ? "on" : "off", ++		aniState->ofdmWeakSigDetect ? "on" : "off", + 		aniState->firstepLevel, + 		!aniState->mrcCCKOff ? "on" : "off", + 		aniState->listenTime, +@@ -1456,7 +1456,7 @@ static void ar5008_hw_ani_cache_ini_regs + 	/* these levels just got reset to defaults by the INI */ + 	aniState->spurImmunityLevel = ATH9K_ANI_SPUR_IMMUNE_LVL_NEW; + 	aniState->firstepLevel = ATH9K_ANI_FIRSTEP_LVL_NEW; +-	aniState->ofdmWeakSigDetectOff = !ATH9K_ANI_USE_OFDM_WEAK_SIG; ++	aniState->ofdmWeakSigDetect = ATH9K_ANI_USE_OFDM_WEAK_SIG; + 	aniState->mrcCCKOff = true; /* not available on pre AR9003 */ + } +  +--- a/drivers/net/wireless/ath/ath9k/ar9003_phy.c ++++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.c +@@ -821,18 +821,18 @@ static bool ar9003_hw_ani_control(struct + 			REG_CLR_BIT(ah, AR_PHY_SFCORR_LOW, + 				    AR_PHY_SFCORR_LOW_USE_SELF_CORR_LOW); +  +-		if (!on != aniState->ofdmWeakSigDetectOff) { ++		if (on != aniState->ofdmWeakSigDetect) { + 			ath_dbg(common, ANI, + 				"** ch %d: ofdm weak signal: %s=>%s\n", + 				chan->channel, +-				!aniState->ofdmWeakSigDetectOff ? ++				aniState->ofdmWeakSigDetect ? + 				"on" : "off", + 				on ? "on" : "off"); + 			if (on) + 				ah->stats.ast_ani_ofdmon++; + 			else + 				ah->stats.ast_ani_ofdmoff++; +-			aniState->ofdmWeakSigDetectOff = !on; ++			aniState->ofdmWeakSigDetect = on; + 		} + 		break; + 	} +@@ -998,7 +998,7 @@ static bool ar9003_hw_ani_control(struct + 	ath_dbg(common, ANI, + 		"ANI parameters: SI=%d, ofdmWS=%s FS=%d MRCcck=%s listenTime=%d ofdmErrs=%d cckErrs=%d\n", + 		aniState->spurImmunityLevel, +-		!aniState->ofdmWeakSigDetectOff ? "on" : "off", ++		aniState->ofdmWeakSigDetect ? "on" : "off", + 		aniState->firstepLevel, + 		!aniState->mrcCCKOff ? "on" : "off", + 		aniState->listenTime, +@@ -1109,7 +1109,7 @@ static void ar9003_hw_ani_cache_ini_regs + 	/* these levels just got reset to defaults by the INI */ + 	aniState->spurImmunityLevel = ATH9K_ANI_SPUR_IMMUNE_LVL_NEW; + 	aniState->firstepLevel = ATH9K_ANI_FIRSTEP_LVL_NEW; +-	aniState->ofdmWeakSigDetectOff = !ATH9K_ANI_USE_OFDM_WEAK_SIG; ++	aniState->ofdmWeakSigDetect = ATH9K_ANI_USE_OFDM_WEAK_SIG; + 	aniState->mrcCCKOff = !ATH9K_ANI_ENABLE_MRC_CCK; + } +  diff --git a/package/mac80211/patches/573-ath9k_ani_fix_mode_checks.patch b/package/mac80211/patches/573-ath9k_ani_fix_mode_checks.patch new file mode 100644 index 000000000..759699614 --- /dev/null +++ b/package/mac80211/patches/573-ath9k_ani_fix_mode_checks.patch @@ -0,0 +1,49 @@ +--- a/drivers/net/wireless/ath/ath9k/ani.c ++++ b/drivers/net/wireless/ath/ath9k/ani.c +@@ -176,7 +176,7 @@ static void ath9k_hw_ani_ofdm_err_trigge + 		} + 	} +  +-	if (ah->opmode == NL80211_IFTYPE_AP) { ++	if (ah->opmode != NL80211_IFTYPE_STATION) { + 		if (aniState->firstepLevel < HAL_FIRST_STEP_MAX) { + 			ath9k_hw_ani_control(ah, ATH9K_ANI_FIRSTEP_LEVEL, + 					     aniState->firstepLevel + 1); +@@ -236,7 +236,7 @@ static void ath9k_hw_ani_cck_err_trigger + 			return; + 		} + 	} +-	if (ah->opmode == NL80211_IFTYPE_AP) { ++	if (ah->opmode != NL80211_IFTYPE_STATION) { + 		if (aniState->firstepLevel < HAL_FIRST_STEP_MAX) { + 			ath9k_hw_ani_control(ah, ATH9K_ANI_FIRSTEP_LEVEL, + 					     aniState->firstepLevel + 1); +@@ -335,8 +335,7 @@ static void ath9k_hw_set_cck_nil(struct  + 		BEACON_RSSI(ah), aniState->rssiThrLow, + 		aniState->rssiThrHigh); +  +-	if ((ah->opmode == NL80211_IFTYPE_STATION || +-	     ah->opmode == NL80211_IFTYPE_ADHOC) && ++	if (ah->opmode == NL80211_IFTYPE_STATION && + 	    BEACON_RSSI(ah) <= aniState->rssiThrLow && + 	    immunityLevel > ATH9K_ANI_CCK_MAX_LEVEL_LOW_RSSI) + 		immunityLevel = ATH9K_ANI_CCK_MAX_LEVEL_LOW_RSSI; +@@ -390,7 +389,7 @@ static void ath9k_hw_ani_lower_immunity_ +  + 	aniState = &ah->curchan->ani; +  +-	if (ah->opmode == NL80211_IFTYPE_AP) { ++	if (ah->opmode != NL80211_IFTYPE_STATION) { + 		if (aniState->firstepLevel > 0) { + 			if (ath9k_hw_ani_control(ah, ATH9K_ANI_FIRSTEP_LEVEL, + 						 aniState->firstepLevel - 1)) +@@ -474,8 +473,7 @@ static void ath9k_ani_reset_old(struct a +  + 	aniState = &ah->curchan->ani; +  +-	if (ah->opmode != NL80211_IFTYPE_STATION +-	    && ah->opmode != NL80211_IFTYPE_ADHOC) { ++	if (ah->opmode != NL80211_IFTYPE_STATION) { + 		ath_dbg(common, ANI, "Reset ANI state opmode %u\n", ah->opmode); + 		ah->stats.ast_ani_reset++; +  diff --git a/package/mac80211/patches/574-ath9k_remove_old_ani.patch b/package/mac80211/patches/574-ath9k_remove_old_ani.patch new file mode 100644 index 000000000..e90e48c7d --- /dev/null +++ b/package/mac80211/patches/574-ath9k_remove_old_ani.patch @@ -0,0 +1,627 @@ +--- a/drivers/net/wireless/ath/ath9k/ani.c ++++ b/drivers/net/wireless/ath/ath9k/ani.c +@@ -104,11 +104,6 @@ static const struct ani_cck_level_entry  + #define ATH9K_ANI_CCK_DEF_LEVEL \ + 	2 /* default level - matches the INI settings */ +  +-static bool use_new_ani(struct ath_hw *ah) +-{ +-	return AR_SREV_9300_20_OR_LATER(ah) || modparam_force_new_ani; +-} +- + static void ath9k_hw_update_mibstats(struct ath_hw *ah, + 				     struct ath9k_mib_stats *stats) + { +@@ -131,11 +126,6 @@ static void ath9k_ani_restart(struct ath + 	aniState = &ah->curchan->ani; + 	aniState->listenTime = 0; +  +-	if (!use_new_ani(ah)) { +-		ofdm_base = AR_PHY_COUNTMAX - ah->config.ofdm_trig_high; +-		cck_base = AR_PHY_COUNTMAX - ah->config.cck_trig_high; +-	} +- + 	ath_dbg(common, ANI, "Writing ofdmbase=%u   cckbase=%u\n", + 		ofdm_base, cck_base); +  +@@ -154,110 +144,6 @@ static void ath9k_ani_restart(struct ath + 	aniState->cckPhyErrCount = 0; + } +  +-static void ath9k_hw_ani_ofdm_err_trigger_old(struct ath_hw *ah) +-{ +-	struct ieee80211_conf *conf = &ath9k_hw_common(ah)->hw->conf; +-	struct ar5416AniState *aniState; +-	int32_t rssi; +- +-	aniState = &ah->curchan->ani; +- +-	if (aniState->noiseImmunityLevel < HAL_NOISE_IMMUNE_MAX) { +-		if (ath9k_hw_ani_control(ah, ATH9K_ANI_NOISE_IMMUNITY_LEVEL, +-					 aniState->noiseImmunityLevel + 1)) { +-			return; +-		} +-	} +- +-	if (aniState->spurImmunityLevel < HAL_SPUR_IMMUNE_MAX) { +-		if (ath9k_hw_ani_control(ah, ATH9K_ANI_SPUR_IMMUNITY_LEVEL, +-					 aniState->spurImmunityLevel + 1)) { +-			return; +-		} +-	} +- +-	if (ah->opmode != NL80211_IFTYPE_STATION) { +-		if (aniState->firstepLevel < HAL_FIRST_STEP_MAX) { +-			ath9k_hw_ani_control(ah, ATH9K_ANI_FIRSTEP_LEVEL, +-					     aniState->firstepLevel + 1); +-		} +-		return; +-	} +-	rssi = BEACON_RSSI(ah); +-	if (rssi > aniState->rssiThrHigh) { +-		if (aniState->ofdmWeakSigDetect) { +-			if (ath9k_hw_ani_control(ah, +-					 ATH9K_ANI_OFDM_WEAK_SIGNAL_DETECTION, +-					 false)) { +-				ath9k_hw_ani_control(ah, +-					ATH9K_ANI_SPUR_IMMUNITY_LEVEL, 0); +-				return; +-			} +-		} +-		if (aniState->firstepLevel < HAL_FIRST_STEP_MAX) { +-			ath9k_hw_ani_control(ah, ATH9K_ANI_FIRSTEP_LEVEL, +-					     aniState->firstepLevel + 1); +-			return; +-		} +-	} else if (rssi > aniState->rssiThrLow) { +-		if (!aniState->ofdmWeakSigDetect) +-			ath9k_hw_ani_control(ah, +-				     ATH9K_ANI_OFDM_WEAK_SIGNAL_DETECTION, +-				     true); +-		if (aniState->firstepLevel < HAL_FIRST_STEP_MAX) +-			ath9k_hw_ani_control(ah, ATH9K_ANI_FIRSTEP_LEVEL, +-					     aniState->firstepLevel + 1); +-		return; +-	} else { +-		if ((conf->channel->band == IEEE80211_BAND_2GHZ) && +-		    !conf_is_ht(conf)) { +-			if (aniState->ofdmWeakSigDetect) +-				ath9k_hw_ani_control(ah, +-				     ATH9K_ANI_OFDM_WEAK_SIGNAL_DETECTION, +-				     false); +-			if (aniState->firstepLevel > 0) +-				ath9k_hw_ani_control(ah, +-					     ATH9K_ANI_FIRSTEP_LEVEL, 0); +-			return; +-		} +-	} +-} +- +-static void ath9k_hw_ani_cck_err_trigger_old(struct ath_hw *ah) +-{ +-	struct ieee80211_conf *conf = &ath9k_hw_common(ah)->hw->conf; +-	struct ar5416AniState *aniState; +-	int32_t rssi; +- +-	aniState = &ah->curchan->ani; +-	if (aniState->noiseImmunityLevel < HAL_NOISE_IMMUNE_MAX) { +-		if (ath9k_hw_ani_control(ah, ATH9K_ANI_NOISE_IMMUNITY_LEVEL, +-					 aniState->noiseImmunityLevel + 1)) { +-			return; +-		} +-	} +-	if (ah->opmode != NL80211_IFTYPE_STATION) { +-		if (aniState->firstepLevel < HAL_FIRST_STEP_MAX) { +-			ath9k_hw_ani_control(ah, ATH9K_ANI_FIRSTEP_LEVEL, +-					     aniState->firstepLevel + 1); +-		} +-		return; +-	} +-	rssi = BEACON_RSSI(ah); +-	if (rssi > aniState->rssiThrLow) { +-		if (aniState->firstepLevel < HAL_FIRST_STEP_MAX) +-			ath9k_hw_ani_control(ah, ATH9K_ANI_FIRSTEP_LEVEL, +-					     aniState->firstepLevel + 1); +-	} else { +-		if ((conf->channel->band == IEEE80211_BAND_2GHZ) && +-		    !conf_is_ht(conf)) { +-			if (aniState->firstepLevel > 0) +-				ath9k_hw_ani_control(ah, +-					     ATH9K_ANI_FIRSTEP_LEVEL, 0); +-		} +-	} +-} +- + /* Adjust the OFDM Noise Immunity Level */ + static void ath9k_hw_set_ofdm_nil(struct ath_hw *ah, u8 immunityLevel) + { +@@ -309,11 +195,6 @@ static void ath9k_hw_ani_ofdm_err_trigge + 	if (!DO_ANI(ah)) + 		return; +  +-	if (!use_new_ani(ah)) { +-		ath9k_hw_ani_ofdm_err_trigger_old(ah); +-		return; +-	} +- + 	aniState = &ah->curchan->ani; +  + 	if (aniState->ofdmNoiseImmunityLevel < ATH9K_ANI_OFDM_MAX_LEVEL) +@@ -371,70 +252,12 @@ static void ath9k_hw_ani_cck_err_trigger + 	if (!DO_ANI(ah)) + 		return; +  +-	if (!use_new_ani(ah)) { +-		ath9k_hw_ani_cck_err_trigger_old(ah); +-		return; +-	} +- + 	aniState = &ah->curchan->ani; +  + 	if (aniState->cckNoiseImmunityLevel < ATH9K_ANI_CCK_MAX_LEVEL) + 		ath9k_hw_set_cck_nil(ah, aniState->cckNoiseImmunityLevel + 1); + } +  +-static void ath9k_hw_ani_lower_immunity_old(struct ath_hw *ah) +-{ +-	struct ar5416AniState *aniState; +-	int32_t rssi; +- +-	aniState = &ah->curchan->ani; +- +-	if (ah->opmode != NL80211_IFTYPE_STATION) { +-		if (aniState->firstepLevel > 0) { +-			if (ath9k_hw_ani_control(ah, ATH9K_ANI_FIRSTEP_LEVEL, +-						 aniState->firstepLevel - 1)) +-				return; +-		} +-	} else { +-		rssi = BEACON_RSSI(ah); +-		if (rssi > aniState->rssiThrHigh) { +-			/* XXX: Handle me */ +-		} else if (rssi > aniState->rssiThrLow) { +-			if (!aniState->ofdmWeakSigDetect) { +-				if (ath9k_hw_ani_control(ah, +-					 ATH9K_ANI_OFDM_WEAK_SIGNAL_DETECTION, +-					 true)) +-					return; +-			} +-			if (aniState->firstepLevel > 0) { +-				if (ath9k_hw_ani_control(ah, +-					 ATH9K_ANI_FIRSTEP_LEVEL, +-					 aniState->firstepLevel - 1)) +-					return; +-			} +-		} else { +-			if (aniState->firstepLevel > 0) { +-				if (ath9k_hw_ani_control(ah, +-					 ATH9K_ANI_FIRSTEP_LEVEL, +-					 aniState->firstepLevel - 1)) +-					return; +-			} +-		} +-	} +- +-	if (aniState->spurImmunityLevel > 0) { +-		if (ath9k_hw_ani_control(ah, ATH9K_ANI_SPUR_IMMUNITY_LEVEL, +-					 aniState->spurImmunityLevel - 1)) +-			return; +-	} +- +-	if (aniState->noiseImmunityLevel > 0) { +-		ath9k_hw_ani_control(ah, ATH9K_ANI_NOISE_IMMUNITY_LEVEL, +-				     aniState->noiseImmunityLevel - 1); +-		return; +-	} +-} +- + /* +  * only lower either OFDM or CCK errors per turn +  * we lower the other one next time +@@ -445,11 +268,6 @@ static void ath9k_hw_ani_lower_immunity( +  + 	aniState = &ah->curchan->ani; +  +-	if (!use_new_ani(ah)) { +-		ath9k_hw_ani_lower_immunity_old(ah); +-		return; +-	} +- + 	/* lower OFDM noise immunity */ + 	if (aniState->ofdmNoiseImmunityLevel > 0 && + 	    (aniState->ofdmsTurn || aniState->cckNoiseImmunityLevel == 0)) { +@@ -462,71 +280,6 @@ static void ath9k_hw_ani_lower_immunity( + 		ath9k_hw_set_cck_nil(ah, aniState->cckNoiseImmunityLevel - 1); + } +  +-static void ath9k_ani_reset_old(struct ath_hw *ah, bool is_scanning) +-{ +-	struct ar5416AniState *aniState; +-	struct ath9k_channel *chan = ah->curchan; +-	struct ath_common *common = ath9k_hw_common(ah); +- +-	if (!DO_ANI(ah)) +-		return; +- +-	aniState = &ah->curchan->ani; +- +-	if (ah->opmode != NL80211_IFTYPE_STATION) { +-		ath_dbg(common, ANI, "Reset ANI state opmode %u\n", ah->opmode); +-		ah->stats.ast_ani_reset++; +- +-		if (ah->opmode == NL80211_IFTYPE_AP) { +-			/* +-			 * ath9k_hw_ani_control() will only process items set on +-			 * ah->ani_function +-			 */ +-			if (IS_CHAN_2GHZ(chan)) +-				ah->ani_function = (ATH9K_ANI_SPUR_IMMUNITY_LEVEL | +-						    ATH9K_ANI_FIRSTEP_LEVEL); +-			else +-				ah->ani_function = 0; +-		} +- +-		ath9k_hw_ani_control(ah, ATH9K_ANI_NOISE_IMMUNITY_LEVEL, 0); +-		ath9k_hw_ani_control(ah, ATH9K_ANI_SPUR_IMMUNITY_LEVEL, 0); +-		ath9k_hw_ani_control(ah, ATH9K_ANI_FIRSTEP_LEVEL, 0); +-		ath9k_hw_ani_control(ah, ATH9K_ANI_OFDM_WEAK_SIGNAL_DETECTION, +-				     !ATH9K_ANI_USE_OFDM_WEAK_SIG); +-		ath9k_hw_ani_control(ah, ATH9K_ANI_CCK_WEAK_SIGNAL_THR, +-				     ATH9K_ANI_CCK_WEAK_SIG_THR); +- +-		ath9k_ani_restart(ah); +-		return; +-	} +- +-	if (aniState->noiseImmunityLevel != 0) +-		ath9k_hw_ani_control(ah, ATH9K_ANI_NOISE_IMMUNITY_LEVEL, +-				     aniState->noiseImmunityLevel); +-	if (aniState->spurImmunityLevel != 0) +-		ath9k_hw_ani_control(ah, ATH9K_ANI_SPUR_IMMUNITY_LEVEL, +-				     aniState->spurImmunityLevel); +-	if (!aniState->ofdmWeakSigDetect) +-		ath9k_hw_ani_control(ah, ATH9K_ANI_OFDM_WEAK_SIGNAL_DETECTION, +-				     aniState->ofdmWeakSigDetect); +-	if (aniState->cckWeakSigThreshold) +-		ath9k_hw_ani_control(ah, ATH9K_ANI_CCK_WEAK_SIGNAL_THR, +-				     aniState->cckWeakSigThreshold); +-	if (aniState->firstepLevel != 0) +-		ath9k_hw_ani_control(ah, ATH9K_ANI_FIRSTEP_LEVEL, +-				     aniState->firstepLevel); +- +-	ath9k_ani_restart(ah); +- +-	ENABLE_REGWRITE_BUFFER(ah); +- +-	REG_WRITE(ah, AR_PHY_ERR_MASK_1, AR_PHY_ERR_OFDM_TIMING); +-	REG_WRITE(ah, AR_PHY_ERR_MASK_2, AR_PHY_ERR_CCK_TIMING); +- +-	REGWRITE_BUFFER_FLUSH(ah); +-} +- + /* +  * Restore the ANI parameters in the HAL and reset the statistics. +  * This routine should be called for every hardware reset and for +@@ -541,9 +294,6 @@ void ath9k_ani_reset(struct ath_hw *ah,  + 	if (!DO_ANI(ah)) + 		return; +  +-	if (!use_new_ani(ah)) +-		return ath9k_ani_reset_old(ah, is_scanning); +- + 	BUG_ON(aniState == NULL); + 	ah->stats.ast_ani_reset++; +  +@@ -640,11 +390,6 @@ static bool ath9k_hw_ani_read_counters(s + 		return false; + 	} +  +-	if (!use_new_ani(ah)) { +-		ofdm_base = AR_PHY_COUNTMAX - ah->config.ofdm_trig_high; +-		cck_base = AR_PHY_COUNTMAX - ah->config.cck_trig_high; +-	} +- + 	aniState->listenTime += listenTime; +  + 	ath9k_hw_update_mibstats(ah, &ah->ah_mibStats); +@@ -652,26 +397,6 @@ static bool ath9k_hw_ani_read_counters(s + 	phyCnt1 = REG_READ(ah, AR_PHY_ERR_1); + 	phyCnt2 = REG_READ(ah, AR_PHY_ERR_2); +  +-	if (!use_new_ani(ah) && (phyCnt1 < ofdm_base || phyCnt2 < cck_base)) { +-		if (phyCnt1 < ofdm_base) { +-			ath_dbg(common, ANI, +-				"phyCnt1 0x%x, resetting counter value to 0x%x\n", +-				phyCnt1, ofdm_base); +-			REG_WRITE(ah, AR_PHY_ERR_1, ofdm_base); +-			REG_WRITE(ah, AR_PHY_ERR_MASK_1, +-				  AR_PHY_ERR_OFDM_TIMING); +-		} +-		if (phyCnt2 < cck_base) { +-			ath_dbg(common, ANI, +-				"phyCnt2 0x%x, resetting counter value to 0x%x\n", +-				phyCnt2, cck_base); +-			REG_WRITE(ah, AR_PHY_ERR_2, cck_base); +-			REG_WRITE(ah, AR_PHY_ERR_MASK_2, +-				  AR_PHY_ERR_CCK_TIMING); +-		} +-		return false; +-	} +- + 	ofdmPhyErrCnt = phyCnt1 - ofdm_base; + 	ah->stats.ast_ani_ofdmerrs += + 		ofdmPhyErrCnt - aniState->ofdmPhyErrCount; +@@ -810,9 +535,6 @@ void ath9k_hw_proc_mib_event(struct ath_ + 	if (((phyCnt1 & AR_MIBCNT_INTRMASK) == AR_MIBCNT_INTRMASK) || + 	    ((phyCnt2 & AR_MIBCNT_INTRMASK) == AR_MIBCNT_INTRMASK)) { +  +-		if (!use_new_ani(ah)) +-			ath9k_hw_ani_read_counters(ah); +- + 		/* NB: always restart to insure the h/w counters are reset */ + 		ath9k_ani_restart(ah); + 	} +@@ -843,45 +565,28 @@ void ath9k_hw_ani_init(struct ath_hw *ah +  + 	ath_dbg(common, ANI, "Initialize ANI\n"); +  +-	if (use_new_ani(ah)) { +-		ah->config.ofdm_trig_high = ATH9K_ANI_OFDM_TRIG_HIGH_NEW; +-		ah->config.ofdm_trig_low = ATH9K_ANI_OFDM_TRIG_LOW_NEW; ++	ah->config.ofdm_trig_high = ATH9K_ANI_OFDM_TRIG_HIGH_NEW; ++	ah->config.ofdm_trig_low = ATH9K_ANI_OFDM_TRIG_LOW_NEW; +  +-		ah->config.cck_trig_high = ATH9K_ANI_CCK_TRIG_HIGH_NEW; +-		ah->config.cck_trig_low = ATH9K_ANI_CCK_TRIG_LOW_NEW; +-	} else { +-		ah->config.ofdm_trig_high = ATH9K_ANI_OFDM_TRIG_HIGH_OLD; +-		ah->config.ofdm_trig_low = ATH9K_ANI_OFDM_TRIG_LOW_OLD; +- +-		ah->config.cck_trig_high = ATH9K_ANI_CCK_TRIG_HIGH_OLD; +-		ah->config.cck_trig_low = ATH9K_ANI_CCK_TRIG_LOW_OLD; +-	} ++	ah->config.cck_trig_high = ATH9K_ANI_CCK_TRIG_HIGH_NEW; ++	ah->config.cck_trig_low = ATH9K_ANI_CCK_TRIG_LOW_NEW; +  + 	for (i = 0; i < ARRAY_SIZE(ah->channels); i++) { + 		struct ath9k_channel *chan = &ah->channels[i]; + 		struct ar5416AniState *ani = &chan->ani; +  +-		if (use_new_ani(ah)) { +-			ani->spurImmunityLevel = +-				ATH9K_ANI_SPUR_IMMUNE_LVL_NEW; ++		ani->spurImmunityLevel = ++			ATH9K_ANI_SPUR_IMMUNE_LVL_NEW; +  +-			ani->firstepLevel = ATH9K_ANI_FIRSTEP_LVL_NEW; ++		ani->firstepLevel = ATH9K_ANI_FIRSTEP_LVL_NEW; +  +-			if (AR_SREV_9300_20_OR_LATER(ah)) +-				ani->mrcCCKOff = +-					!ATH9K_ANI_ENABLE_MRC_CCK; +-			else +-				ani->mrcCCKOff = true; +- +-			ani->ofdmsTurn = true; +-		} else { +-			ani->spurImmunityLevel = +-				ATH9K_ANI_SPUR_IMMUNE_LVL_OLD; +-			ani->firstepLevel = ATH9K_ANI_FIRSTEP_LVL_OLD; ++		if (AR_SREV_9300_20_OR_LATER(ah)) ++			ani->mrcCCKOff = ++				!ATH9K_ANI_ENABLE_MRC_CCK; ++		else ++			ani->mrcCCKOff = true; +  +-			ani->cckWeakSigThreshold = +-				ATH9K_ANI_CCK_WEAK_SIG_THR; +-		} ++		ani->ofdmsTurn = true; +  + 		ani->rssiThrHigh = ATH9K_ANI_RSSI_THR_HIGH; + 		ani->rssiThrLow = ATH9K_ANI_RSSI_THR_LOW; +@@ -895,13 +600,8 @@ void ath9k_hw_ani_init(struct ath_hw *ah + 	 * since we expect some ongoing maintenance on the tables, let's sanity + 	 * check here default level should not modify INI setting. + 	 */ +-	if (use_new_ani(ah)) { +-		ah->aniperiod = ATH9K_ANI_PERIOD_NEW; +-		ah->config.ani_poll_interval = ATH9K_ANI_POLLINTERVAL_NEW; +-	} else { +-		ah->aniperiod = ATH9K_ANI_PERIOD_OLD; +-		ah->config.ani_poll_interval = ATH9K_ANI_POLLINTERVAL_OLD; +-	} ++	ah->aniperiod = ATH9K_ANI_PERIOD_NEW; ++	ah->config.ani_poll_interval = ATH9K_ANI_POLLINTERVAL_NEW; +  + 	if (ah->config.enable_ani) + 		ah->proc_phyerr |= HAL_PROCESS_ANI; +--- a/drivers/net/wireless/ath/ath9k/ar5008_phy.c ++++ b/drivers/net/wireless/ath/ath9k/ar5008_phy.c +@@ -995,141 +995,6 @@ static u32 ar5008_hw_compute_pll_control + 	return pll; + } +  +-static bool ar5008_hw_ani_control_old(struct ath_hw *ah, +-				      enum ath9k_ani_cmd cmd, +-				      int param) +-{ +-	struct ar5416AniState *aniState = &ah->curchan->ani; +-	struct ath_common *common = ath9k_hw_common(ah); +- +-	switch (cmd & ah->ani_function) { +-	case ATH9K_ANI_NOISE_IMMUNITY_LEVEL:{ +-		u32 level = param; +- +-		if (level >= ARRAY_SIZE(ah->totalSizeDesired)) { +-			ath_dbg(common, ANI, "level out of range (%u > %zu)\n", +-				level, ARRAY_SIZE(ah->totalSizeDesired)); +-			return false; +-		} +- +-		REG_RMW_FIELD(ah, AR_PHY_DESIRED_SZ, +-			      AR_PHY_DESIRED_SZ_TOT_DES, +-			      ah->totalSizeDesired[level]); +-		REG_RMW_FIELD(ah, AR_PHY_AGC_CTL1, +-			      AR_PHY_AGC_CTL1_COARSE_LOW, +-			      ah->coarse_low[level]); +-		REG_RMW_FIELD(ah, AR_PHY_AGC_CTL1, +-			      AR_PHY_AGC_CTL1_COARSE_HIGH, +-			      ah->coarse_high[level]); +-		REG_RMW_FIELD(ah, AR_PHY_FIND_SIG, +-			      AR_PHY_FIND_SIG_FIRPWR, +-			      ah->firpwr[level]); +- +-		if (level > aniState->noiseImmunityLevel) +-			ah->stats.ast_ani_niup++; +-		else if (level < aniState->noiseImmunityLevel) +-			ah->stats.ast_ani_nidown++; +-		aniState->noiseImmunityLevel = level; +-		break; +-	} +-	case ATH9K_ANI_OFDM_WEAK_SIGNAL_DETECTION:{ +-		u32 on = param ? 1 : 0; +- +-		if (on) +-			REG_SET_BIT(ah, AR_PHY_SFCORR_LOW, +-				    AR_PHY_SFCORR_LOW_USE_SELF_CORR_LOW); +-		else +-			REG_CLR_BIT(ah, AR_PHY_SFCORR_LOW, +-				    AR_PHY_SFCORR_LOW_USE_SELF_CORR_LOW); +- +-		if (on != aniState->ofdmWeakSigDetect) { +-			if (on) +-				ah->stats.ast_ani_ofdmon++; +-			else +-				ah->stats.ast_ani_ofdmoff++; +-			aniState->ofdmWeakSigDetect = on; +-		} +-		break; +-	} +-	case ATH9K_ANI_CCK_WEAK_SIGNAL_THR:{ +-		static const int weakSigThrCck[] = { 8, 6 }; +-		u32 high = param ? 1 : 0; +- +-		REG_RMW_FIELD(ah, AR_PHY_CCK_DETECT, +-			      AR_PHY_CCK_DETECT_WEAK_SIG_THR_CCK, +-			      weakSigThrCck[high]); +-		if (high != aniState->cckWeakSigThreshold) { +-			if (high) +-				ah->stats.ast_ani_cckhigh++; +-			else +-				ah->stats.ast_ani_ccklow++; +-			aniState->cckWeakSigThreshold = high; +-		} +-		break; +-	} +-	case ATH9K_ANI_FIRSTEP_LEVEL:{ +-		static const int firstep[] = { 0, 4, 8 }; +-		u32 level = param; +- +-		if (level >= ARRAY_SIZE(firstep)) { +-			ath_dbg(common, ANI, "level out of range (%u > %zu)\n", +-				level, ARRAY_SIZE(firstep)); +-			return false; +-		} +-		REG_RMW_FIELD(ah, AR_PHY_FIND_SIG, +-			      AR_PHY_FIND_SIG_FIRSTEP, +-			      firstep[level]); +-		if (level > aniState->firstepLevel) +-			ah->stats.ast_ani_stepup++; +-		else if (level < aniState->firstepLevel) +-			ah->stats.ast_ani_stepdown++; +-		aniState->firstepLevel = level; +-		break; +-	} +-	case ATH9K_ANI_SPUR_IMMUNITY_LEVEL:{ +-		static const int cycpwrThr1[] = { 2, 4, 6, 8, 10, 12, 14, 16 }; +-		u32 level = param; +- +-		if (level >= ARRAY_SIZE(cycpwrThr1)) { +-			ath_dbg(common, ANI, "level out of range (%u > %zu)\n", +-				level, ARRAY_SIZE(cycpwrThr1)); +-			return false; +-		} +-		REG_RMW_FIELD(ah, AR_PHY_TIMING5, +-			      AR_PHY_TIMING5_CYCPWR_THR1, +-			      cycpwrThr1[level]); +-		if (level > aniState->spurImmunityLevel) +-			ah->stats.ast_ani_spurup++; +-		else if (level < aniState->spurImmunityLevel) +-			ah->stats.ast_ani_spurdown++; +-		aniState->spurImmunityLevel = level; +-		break; +-	} +-	case ATH9K_ANI_PRESENT: +-		break; +-	default: +-		ath_dbg(common, ANI, "invalid cmd %u\n", cmd); +-		return false; +-	} +- +-	ath_dbg(common, ANI, "ANI parameters:\n"); +-	ath_dbg(common, ANI, +-		"noiseImmunityLevel=%d, spurImmunityLevel=%d, ofdmWeakSigDetect=%d\n", +-		aniState->noiseImmunityLevel, +-		aniState->spurImmunityLevel, +-		aniState->ofdmWeakSigDetect); +-	ath_dbg(common, ANI, +-		"cckWeakSigThreshold=%d, firstepLevel=%d, listenTime=%d\n", +-		aniState->cckWeakSigThreshold, +-		aniState->firstepLevel, +-		aniState->listenTime); +-	ath_dbg(common, ANI, "ofdmPhyErrCount=%d, cckPhyErrCount=%d\n\n", +-		aniState->ofdmPhyErrCount, +-		aniState->cckPhyErrCount); +- +-	return true; +-} +- + static bool ar5008_hw_ani_control_new(struct ath_hw *ah, + 				      enum ath9k_ani_cmd cmd, + 				      int param) +@@ -1545,11 +1410,8 @@ void ar5008_hw_attach_phy_ops(struct ath + 	priv_ops->do_getnf = ar5008_hw_do_getnf; + 	priv_ops->set_radar_params = ar5008_hw_set_radar_params; +  +-	if (modparam_force_new_ani) { +-		priv_ops->ani_control = ar5008_hw_ani_control_new; +-		priv_ops->ani_cache_ini_regs = ar5008_hw_ani_cache_ini_regs; +-	} else +-		priv_ops->ani_control = ar5008_hw_ani_control_old; ++	priv_ops->ani_control = ar5008_hw_ani_control_new; ++	priv_ops->ani_cache_ini_regs = ar5008_hw_ani_cache_ini_regs; +  + 	if (AR_SREV_9100(ah) || AR_SREV_9160_10_OR_LATER(ah)) + 		priv_ops->compute_pll_control = ar9160_hw_compute_pll_control; +--- a/drivers/net/wireless/ath/ath9k/ar9002_hw.c ++++ b/drivers/net/wireless/ath/ath9k/ar9002_hw.c +@@ -21,10 +21,6 @@ + #include "ar9002_initvals.h" + #include "ar9002_phy.h" +  +-int modparam_force_new_ani; +-module_param_named(force_new_ani, modparam_force_new_ani, int, 0444); +-MODULE_PARM_DESC(force_new_ani, "Force new ANI for AR5008, AR9001, AR9002"); +- + /* General hardware code for the A5008/AR9001/AR9002 hadware families */ +  + static void ar9002_hw_init_mode_regs(struct ath_hw *ah) +--- a/drivers/net/wireless/ath/ath9k/hw.h ++++ b/drivers/net/wireless/ath/ath9k/hw.h +@@ -1021,14 +1021,7 @@ void ar9002_hw_attach_ops(struct ath_hw  + void ar9003_hw_attach_ops(struct ath_hw *ah); +  + void ar9002_hw_load_ani_reg(struct ath_hw *ah, struct ath9k_channel *chan); +-/* +- * ANI work can be shared between all families but a next +- * generation implementation of ANI will be used only for AR9003 only +- * for now as the other families still need to be tested with the same +- * next generation ANI. Feel free to start testing it though for the +- * older families (AR5008, AR9001, AR9002) by using modparam_force_new_ani. +- */ +-extern int modparam_force_new_ani; ++ + void ath9k_ani_reset(struct ath_hw *ah, bool is_scanning); + void ath9k_hw_proc_mib_event(struct ath_hw *ah); + void ath9k_hw_ani_monitor(struct ath_hw *ah, struct ath9k_channel *chan); diff --git a/package/mac80211/patches/575-ath9k_ani_cleanup.patch b/package/mac80211/patches/575-ath9k_ani_cleanup.patch new file mode 100644 index 000000000..1cd85b3d3 --- /dev/null +++ b/package/mac80211/patches/575-ath9k_ani_cleanup.patch @@ -0,0 +1,320 @@ +--- a/drivers/net/wireless/ath/ath9k/ani.c ++++ b/drivers/net/wireless/ath/ath9k/ani.c +@@ -117,8 +117,6 @@ static void ath9k_hw_update_mibstats(str + static void ath9k_ani_restart(struct ath_hw *ah) + { + 	struct ar5416AniState *aniState; +-	struct ath_common *common = ath9k_hw_common(ah); +-	u32 ofdm_base = 0, cck_base = 0; +  + 	if (!DO_ANI(ah)) + 		return; +@@ -126,13 +124,10 @@ static void ath9k_ani_restart(struct ath + 	aniState = &ah->curchan->ani; + 	aniState->listenTime = 0; +  +-	ath_dbg(common, ANI, "Writing ofdmbase=%u   cckbase=%u\n", +-		ofdm_base, cck_base); +- + 	ENABLE_REGWRITE_BUFFER(ah); +  +-	REG_WRITE(ah, AR_PHY_ERR_1, ofdm_base); +-	REG_WRITE(ah, AR_PHY_ERR_2, cck_base); ++	REG_WRITE(ah, AR_PHY_ERR_1, 0); ++	REG_WRITE(ah, AR_PHY_ERR_2, 0); + 	REG_WRITE(ah, AR_PHY_ERR_MASK_1, AR_PHY_ERR_OFDM_TIMING); + 	REG_WRITE(ah, AR_PHY_ERR_MASK_2, AR_PHY_ERR_CCK_TIMING); +  +@@ -375,9 +370,6 @@ static bool ath9k_hw_ani_read_counters(s + { + 	struct ath_common *common = ath9k_hw_common(ah); + 	struct ar5416AniState *aniState = &ah->curchan->ani; +-	u32 ofdm_base = 0; +-	u32 cck_base = 0; +-	u32 ofdmPhyErrCnt, cckPhyErrCnt; + 	u32 phyCnt1, phyCnt2; + 	int32_t listenTime; +  +@@ -397,15 +389,12 @@ static bool ath9k_hw_ani_read_counters(s + 	phyCnt1 = REG_READ(ah, AR_PHY_ERR_1); + 	phyCnt2 = REG_READ(ah, AR_PHY_ERR_2); +  +-	ofdmPhyErrCnt = phyCnt1 - ofdm_base; +-	ah->stats.ast_ani_ofdmerrs += +-		ofdmPhyErrCnt - aniState->ofdmPhyErrCount; +-	aniState->ofdmPhyErrCount = ofdmPhyErrCnt; +- +-	cckPhyErrCnt = phyCnt2 - cck_base; +-	ah->stats.ast_ani_cckerrs += +-		cckPhyErrCnt - aniState->cckPhyErrCount; +-	aniState->cckPhyErrCount = cckPhyErrCnt; ++	ah->stats.ast_ani_ofdmerrs += phyCnt1 - aniState->ofdmPhyErrCount; ++	aniState->ofdmPhyErrCount = phyCnt1; ++ ++	ah->stats.ast_ani_cckerrs += phyCnt2 - aniState->cckPhyErrCount; ++	aniState->cckPhyErrCount = phyCnt2; ++ + 	return true; + } +  +@@ -565,20 +554,19 @@ void ath9k_hw_ani_init(struct ath_hw *ah +  + 	ath_dbg(common, ANI, "Initialize ANI\n"); +  +-	ah->config.ofdm_trig_high = ATH9K_ANI_OFDM_TRIG_HIGH_NEW; +-	ah->config.ofdm_trig_low = ATH9K_ANI_OFDM_TRIG_LOW_NEW; ++	ah->config.ofdm_trig_high = ATH9K_ANI_OFDM_TRIG_HIGH; ++	ah->config.ofdm_trig_low = ATH9K_ANI_OFDM_TRIG_LOW; +  +-	ah->config.cck_trig_high = ATH9K_ANI_CCK_TRIG_HIGH_NEW; +-	ah->config.cck_trig_low = ATH9K_ANI_CCK_TRIG_LOW_NEW; ++	ah->config.cck_trig_high = ATH9K_ANI_CCK_TRIG_HIGH; ++	ah->config.cck_trig_low = ATH9K_ANI_CCK_TRIG_LOW; +  + 	for (i = 0; i < ARRAY_SIZE(ah->channels); i++) { + 		struct ath9k_channel *chan = &ah->channels[i]; + 		struct ar5416AniState *ani = &chan->ani; +  +-		ani->spurImmunityLevel = +-			ATH9K_ANI_SPUR_IMMUNE_LVL_NEW; ++		ani->spurImmunityLevel = ATH9K_ANI_SPUR_IMMUNE_LVL; +  +-		ani->firstepLevel = ATH9K_ANI_FIRSTEP_LVL_NEW; ++		ani->firstepLevel = ATH9K_ANI_FIRSTEP_LVL; +  + 		if (AR_SREV_9300_20_OR_LATER(ah)) + 			ani->mrcCCKOff = +@@ -600,8 +588,8 @@ void ath9k_hw_ani_init(struct ath_hw *ah + 	 * since we expect some ongoing maintenance on the tables, let's sanity + 	 * check here default level should not modify INI setting. + 	 */ +-	ah->aniperiod = ATH9K_ANI_PERIOD_NEW; +-	ah->config.ani_poll_interval = ATH9K_ANI_POLLINTERVAL_NEW; ++	ah->aniperiod = ATH9K_ANI_PERIOD; ++	ah->config.ani_poll_interval = ATH9K_ANI_POLLINTERVAL; +  + 	if (ah->config.enable_ani) + 		ah->proc_phyerr |= HAL_PROCESS_ANI; +--- a/drivers/net/wireless/ath/ath9k/ani.h ++++ b/drivers/net/wireless/ath/ath9k/ani.h +@@ -24,42 +24,34 @@ + #define BEACON_RSSI(ahp) (ahp->stats.avgbrssi) +  + /* units are errors per second */ +-#define ATH9K_ANI_OFDM_TRIG_HIGH_OLD      500 +-#define ATH9K_ANI_OFDM_TRIG_HIGH_NEW      3500 ++#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_OLD       200 +-#define ATH9K_ANI_OFDM_TRIG_LOW_NEW       400 ++#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_OLD       200 +-#define ATH9K_ANI_CCK_TRIG_HIGH_NEW       600 ++#define ATH9K_ANI_CCK_TRIG_HIGH           600 +  + /* units are errors per second */ +-#define ATH9K_ANI_CCK_TRIG_LOW_OLD        100 +-#define ATH9K_ANI_CCK_TRIG_LOW_NEW        300 ++#define ATH9K_ANI_CCK_TRIG_LOW            300 +  + #define ATH9K_ANI_NOISE_IMMUNE_LVL        4 + #define ATH9K_ANI_USE_OFDM_WEAK_SIG       true + #define ATH9K_ANI_CCK_WEAK_SIG_THR        false +  +-#define ATH9K_ANI_SPUR_IMMUNE_LVL_OLD     7 +-#define ATH9K_ANI_SPUR_IMMUNE_LVL_NEW     3 ++#define ATH9K_ANI_SPUR_IMMUNE_LVL         3 +  +-#define ATH9K_ANI_FIRSTEP_LVL_OLD         0 +-#define ATH9K_ANI_FIRSTEP_LVL_NEW         2 ++#define ATH9K_ANI_FIRSTEP_LVL             2 +  + #define ATH9K_ANI_RSSI_THR_HIGH           40 + #define ATH9K_ANI_RSSI_THR_LOW            7 +  +-#define ATH9K_ANI_PERIOD_OLD              100 +-#define ATH9K_ANI_PERIOD_NEW              300 ++#define ATH9K_ANI_PERIOD                  300 +  + /* in ms */ +-#define ATH9K_ANI_POLLINTERVAL_OLD        100 +-#define ATH9K_ANI_POLLINTERVAL_NEW        1000 ++#define ATH9K_ANI_POLLINTERVAL            1000 +  + #define HAL_NOISE_IMMUNE_MAX              4 + #define HAL_SPUR_IMMUNE_MAX               7 +--- a/drivers/net/wireless/ath/ath9k/ar5008_phy.c ++++ b/drivers/net/wireless/ath/ath9k/ar5008_phy.c +@@ -1101,7 +1101,7 @@ static bool ar5008_hw_ani_control_new(st + 		 * from INI file & cap value + 		 */ + 		value = firstep_table[level] - +-			firstep_table[ATH9K_ANI_FIRSTEP_LVL_NEW] + ++			firstep_table[ATH9K_ANI_FIRSTEP_LVL] + + 			aniState->iniDef.firstep; + 		if (value < ATH9K_SIG_FIRSTEP_SETTING_MIN) + 			value = ATH9K_SIG_FIRSTEP_SETTING_MIN; +@@ -1116,7 +1116,7 @@ static bool ar5008_hw_ani_control_new(st + 		 * from INI file & cap value + 		 */ + 		value2 = firstep_table[level] - +-			 firstep_table[ATH9K_ANI_FIRSTEP_LVL_NEW] + ++			 firstep_table[ATH9K_ANI_FIRSTEP_LVL] + + 			 aniState->iniDef.firstepLow; + 		if (value2 < ATH9K_SIG_FIRSTEP_SETTING_MIN) + 			value2 = ATH9K_SIG_FIRSTEP_SETTING_MIN; +@@ -1132,7 +1132,7 @@ static bool ar5008_hw_ani_control_new(st + 				chan->channel, + 				aniState->firstepLevel, + 				level, +-				ATH9K_ANI_FIRSTEP_LVL_NEW, ++				ATH9K_ANI_FIRSTEP_LVL, + 				value, + 				aniState->iniDef.firstep); + 			ath_dbg(common, ANI, +@@ -1140,7 +1140,7 @@ static bool ar5008_hw_ani_control_new(st + 				chan->channel, + 				aniState->firstepLevel, + 				level, +-				ATH9K_ANI_FIRSTEP_LVL_NEW, ++				ATH9K_ANI_FIRSTEP_LVL, + 				value2, + 				aniState->iniDef.firstepLow); + 			if (level > aniState->firstepLevel) +@@ -1165,7 +1165,7 @@ static bool ar5008_hw_ani_control_new(st + 		 * from INI file & cap value + 		 */ + 		value = cycpwrThr1_table[level] - +-			cycpwrThr1_table[ATH9K_ANI_SPUR_IMMUNE_LVL_NEW] + ++			cycpwrThr1_table[ATH9K_ANI_SPUR_IMMUNE_LVL] + + 			aniState->iniDef.cycpwrThr1; + 		if (value < ATH9K_SIG_SPUR_IMM_SETTING_MIN) + 			value = ATH9K_SIG_SPUR_IMM_SETTING_MIN; +@@ -1181,7 +1181,7 @@ static bool ar5008_hw_ani_control_new(st + 		 * from INI file & cap value + 		 */ + 		value2 = cycpwrThr1_table[level] - +-			 cycpwrThr1_table[ATH9K_ANI_SPUR_IMMUNE_LVL_NEW] + ++			 cycpwrThr1_table[ATH9K_ANI_SPUR_IMMUNE_LVL] + + 			 aniState->iniDef.cycpwrThr1Ext; + 		if (value2 < ATH9K_SIG_SPUR_IMM_SETTING_MIN) + 			value2 = ATH9K_SIG_SPUR_IMM_SETTING_MIN; +@@ -1196,7 +1196,7 @@ static bool ar5008_hw_ani_control_new(st + 				chan->channel, + 				aniState->spurImmunityLevel, + 				level, +-				ATH9K_ANI_SPUR_IMMUNE_LVL_NEW, ++				ATH9K_ANI_SPUR_IMMUNE_LVL, + 				value, + 				aniState->iniDef.cycpwrThr1); + 			ath_dbg(common, ANI, +@@ -1204,7 +1204,7 @@ static bool ar5008_hw_ani_control_new(st + 				chan->channel, + 				aniState->spurImmunityLevel, + 				level, +-				ATH9K_ANI_SPUR_IMMUNE_LVL_NEW, ++				ATH9K_ANI_SPUR_IMMUNE_LVL, + 				value2, + 				aniState->iniDef.cycpwrThr1Ext); + 			if (level > aniState->spurImmunityLevel) +@@ -1319,8 +1319,8 @@ static void ar5008_hw_ani_cache_ini_regs + 					       AR_PHY_EXT_TIMING5_CYCPWR_THR1); +  + 	/* these levels just got reset to defaults by the INI */ +-	aniState->spurImmunityLevel = ATH9K_ANI_SPUR_IMMUNE_LVL_NEW; +-	aniState->firstepLevel = ATH9K_ANI_FIRSTEP_LVL_NEW; ++	aniState->spurImmunityLevel = ATH9K_ANI_SPUR_IMMUNE_LVL; ++	aniState->firstepLevel = ATH9K_ANI_FIRSTEP_LVL; + 	aniState->ofdmWeakSigDetect = ATH9K_ANI_USE_OFDM_WEAK_SIG; + 	aniState->mrcCCKOff = true; /* not available on pre AR9003 */ + } +--- a/drivers/net/wireless/ath/ath9k/ar9003_phy.c ++++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.c +@@ -851,7 +851,7 @@ static bool ar9003_hw_ani_control(struct + 		 * from INI file & cap value + 		 */ + 		value = firstep_table[level] - +-			firstep_table[ATH9K_ANI_FIRSTEP_LVL_NEW] + ++			firstep_table[ATH9K_ANI_FIRSTEP_LVL] + + 			aniState->iniDef.firstep; + 		if (value < ATH9K_SIG_FIRSTEP_SETTING_MIN) + 			value = ATH9K_SIG_FIRSTEP_SETTING_MIN; +@@ -866,7 +866,7 @@ static bool ar9003_hw_ani_control(struct + 		 * from INI file & cap value + 		 */ + 		value2 = firstep_table[level] - +-			 firstep_table[ATH9K_ANI_FIRSTEP_LVL_NEW] + ++			 firstep_table[ATH9K_ANI_FIRSTEP_LVL] + + 			 aniState->iniDef.firstepLow; + 		if (value2 < ATH9K_SIG_FIRSTEP_SETTING_MIN) + 			value2 = ATH9K_SIG_FIRSTEP_SETTING_MIN; +@@ -882,7 +882,7 @@ static bool ar9003_hw_ani_control(struct + 				chan->channel, + 				aniState->firstepLevel, + 				level, +-				ATH9K_ANI_FIRSTEP_LVL_NEW, ++				ATH9K_ANI_FIRSTEP_LVL, + 				value, + 				aniState->iniDef.firstep); + 			ath_dbg(common, ANI, +@@ -890,7 +890,7 @@ static bool ar9003_hw_ani_control(struct + 				chan->channel, + 				aniState->firstepLevel, + 				level, +-				ATH9K_ANI_FIRSTEP_LVL_NEW, ++				ATH9K_ANI_FIRSTEP_LVL, + 				value2, + 				aniState->iniDef.firstepLow); + 			if (level > aniState->firstepLevel) +@@ -915,7 +915,7 @@ static bool ar9003_hw_ani_control(struct + 		 * from INI file & cap value + 		 */ + 		value = cycpwrThr1_table[level] - +-			cycpwrThr1_table[ATH9K_ANI_SPUR_IMMUNE_LVL_NEW] + ++			cycpwrThr1_table[ATH9K_ANI_SPUR_IMMUNE_LVL] + + 			aniState->iniDef.cycpwrThr1; + 		if (value < ATH9K_SIG_SPUR_IMM_SETTING_MIN) + 			value = ATH9K_SIG_SPUR_IMM_SETTING_MIN; +@@ -931,7 +931,7 @@ static bool ar9003_hw_ani_control(struct + 		 * from INI file & cap value + 		 */ + 		value2 = cycpwrThr1_table[level] - +-			 cycpwrThr1_table[ATH9K_ANI_SPUR_IMMUNE_LVL_NEW] + ++			 cycpwrThr1_table[ATH9K_ANI_SPUR_IMMUNE_LVL] + + 			 aniState->iniDef.cycpwrThr1Ext; + 		if (value2 < ATH9K_SIG_SPUR_IMM_SETTING_MIN) + 			value2 = ATH9K_SIG_SPUR_IMM_SETTING_MIN; +@@ -946,7 +946,7 @@ static bool ar9003_hw_ani_control(struct + 				chan->channel, + 				aniState->spurImmunityLevel, + 				level, +-				ATH9K_ANI_SPUR_IMMUNE_LVL_NEW, ++				ATH9K_ANI_SPUR_IMMUNE_LVL, + 				value, + 				aniState->iniDef.cycpwrThr1); + 			ath_dbg(common, ANI, +@@ -954,7 +954,7 @@ static bool ar9003_hw_ani_control(struct + 				chan->channel, + 				aniState->spurImmunityLevel, + 				level, +-				ATH9K_ANI_SPUR_IMMUNE_LVL_NEW, ++				ATH9K_ANI_SPUR_IMMUNE_LVL, + 				value2, + 				aniState->iniDef.cycpwrThr1Ext); + 			if (level > aniState->spurImmunityLevel) +@@ -1107,8 +1107,8 @@ static void ar9003_hw_ani_cache_ini_regs + 					       AR_PHY_EXT_CYCPWR_THR1); +  + 	/* these levels just got reset to defaults by the INI */ +-	aniState->spurImmunityLevel = ATH9K_ANI_SPUR_IMMUNE_LVL_NEW; +-	aniState->firstepLevel = ATH9K_ANI_FIRSTEP_LVL_NEW; ++	aniState->spurImmunityLevel = ATH9K_ANI_SPUR_IMMUNE_LVL; ++	aniState->firstepLevel = ATH9K_ANI_FIRSTEP_LVL; + 	aniState->ofdmWeakSigDetect = ATH9K_ANI_USE_OFDM_WEAK_SIG; + 	aniState->mrcCCKOff = !ATH9K_ANI_ENABLE_MRC_CCK; + } diff --git a/package/mac80211/patches/576-ath9k_ani_remove_mib_int.patch b/package/mac80211/patches/576-ath9k_ani_remove_mib_int.patch new file mode 100644 index 000000000..d071e0ca5 --- /dev/null +++ b/package/mac80211/patches/576-ath9k_ani_remove_mib_int.patch @@ -0,0 +1,114 @@ +--- a/drivers/net/wireless/ath/ath9k/ani.c ++++ b/drivers/net/wireless/ath/ath9k/ani.c +@@ -490,46 +490,6 @@ void ath9k_hw_disable_mib_counters(struc + } + EXPORT_SYMBOL(ath9k_hw_disable_mib_counters); +  +-/* +- * Process a MIB interrupt.  We may potentially be invoked because +- * any of the MIB counters overflow/trigger so don't assume we're +- * here because a PHY error counter triggered. +- */ +-void ath9k_hw_proc_mib_event(struct ath_hw *ah) +-{ +-	u32 phyCnt1, phyCnt2; +- +-	/* Reset these counters regardless */ +-	REG_WRITE(ah, AR_FILT_OFDM, 0); +-	REG_WRITE(ah, AR_FILT_CCK, 0); +-	if (!(REG_READ(ah, AR_SLP_MIB_CTRL) & AR_SLP_MIB_PENDING)) +-		REG_WRITE(ah, AR_SLP_MIB_CTRL, AR_SLP_MIB_CLEAR); +- +-	/* Clear the mib counters and save them in the stats */ +-	ath9k_hw_update_mibstats(ah, &ah->ah_mibStats); +- +-	if (!DO_ANI(ah)) { +-		/* +-		 * We must always clear the interrupt cause by +-		 * resetting the phy error regs. +-		 */ +-		REG_WRITE(ah, AR_PHY_ERR_1, 0); +-		REG_WRITE(ah, AR_PHY_ERR_2, 0); +-		return; +-	} +- +-	/* NB: these are not reset-on-read */ +-	phyCnt1 = REG_READ(ah, AR_PHY_ERR_1); +-	phyCnt2 = REG_READ(ah, AR_PHY_ERR_2); +-	if (((phyCnt1 & AR_MIBCNT_INTRMASK) == AR_MIBCNT_INTRMASK) || +-	    ((phyCnt2 & AR_MIBCNT_INTRMASK) == AR_MIBCNT_INTRMASK)) { +- +-		/* NB: always restart to insure the h/w counters are reset */ +-		ath9k_ani_restart(ah); +-	} +-} +-EXPORT_SYMBOL(ath9k_hw_proc_mib_event); +- + void ath9k_hw_ani_setup(struct ath_hw *ah) + { + 	int i; +--- a/drivers/net/wireless/ath/ath9k/hw.h ++++ b/drivers/net/wireless/ath/ath9k/hw.h +@@ -1023,7 +1023,6 @@ void ar9003_hw_attach_ops(struct ath_hw  + void ar9002_hw_load_ani_reg(struct ath_hw *ah, struct ath9k_channel *chan); +  + void ath9k_ani_reset(struct ath_hw *ah, bool is_scanning); +-void ath9k_hw_proc_mib_event(struct ath_hw *ah); + void ath9k_hw_ani_monitor(struct ath_hw *ah, struct ath9k_channel *chan); +  + #ifdef CONFIG_ATH9K_BTCOEX_SUPPORT +--- a/drivers/net/wireless/ath/ath9k/main.c ++++ b/drivers/net/wireless/ath/ath9k/main.c +@@ -827,24 +827,6 @@ irqreturn_t ath_isr(int irq, void *dev) + 		ath9k_hw_set_interrupts(ah); + 	} +  +-	if (status & ATH9K_INT_MIB) { +-		/* +-		 * Disable interrupts until we service the MIB +-		 * interrupt; otherwise it will continue to +-		 * fire. +-		 */ +-		ath9k_hw_disable_interrupts(ah); +-		/* +-		 * Let the hal handle the event. We assume +-		 * it will clear whatever condition caused +-		 * the interrupt. +-		 */ +-		spin_lock(&common->cc_lock); +-		ath9k_hw_proc_mib_event(ah); +-		spin_unlock(&common->cc_lock); +-		ath9k_hw_enable_interrupts(ah); +-	} +- + 	if (!(ah->caps.hw_caps & ATH9K_HW_CAP_AUTOSLEEP)) + 		if (status & ATH9K_INT_TIM_TIMER) { + 			if (ATH_DBG_WARN_ON_ONCE(sc->ps_idle)) +@@ -1347,14 +1329,10 @@ static void ath9k_calculate_summary_stat + 	/* + 	 * Enable MIB interrupts when there are hardware phy counters. + 	 */ +-	if ((iter_data.nstations + iter_data.nadhocs + iter_data.nmeshes) > 0) { +-		if (ah->config.enable_ani) +-			ah->imask |= ATH9K_INT_MIB; ++	if ((iter_data.nstations + iter_data.nadhocs + iter_data.nmeshes) > 0) + 		ah->imask |= ATH9K_INT_TSFOOR; +-	} else { +-		ah->imask &= ~ATH9K_INT_MIB; ++	else + 		ah->imask &= ~ATH9K_INT_TSFOOR; +-	} +  + 	ath9k_hw_set_interrupts(ah); +  +--- a/drivers/net/wireless/ath/ath9k/debug.c ++++ b/drivers/net/wireless/ath/ath9k/debug.c +@@ -348,8 +348,6 @@ void ath_debug_stat_interrupt(struct ath + 		sc->debug.stats.istats.txok++; + 	if (status & ATH9K_INT_TXURN) + 		sc->debug.stats.istats.txurn++; +-	if (status & ATH9K_INT_MIB) +-		sc->debug.stats.istats.mib++; + 	if (status & ATH9K_INT_RXPHY) + 		sc->debug.stats.istats.rxphyerr++; + 	if (status & ATH9K_INT_RXKCM) diff --git a/package/mac80211/patches/577-ath9k_fix_noise_immunity.patch b/package/mac80211/patches/577-ath9k_fix_noise_immunity.patch new file mode 100644 index 000000000..d6ef67826 --- /dev/null +++ b/package/mac80211/patches/577-ath9k_fix_noise_immunity.patch @@ -0,0 +1,69 @@ +--- a/drivers/net/wireless/ath/ath9k/ani.c ++++ b/drivers/net/wireless/ath/ath9k/ani.c +@@ -154,9 +154,7 @@ static void ath9k_hw_set_ofdm_nil(struct + 		aniState->rssiThrLow, aniState->rssiThrHigh); +  + 	if (aniState->update_ani) +-		aniState->ofdmNoiseImmunityLevel = +-			(immunityLevel > ATH9K_ANI_OFDM_DEF_LEVEL) ? +-			immunityLevel : ATH9K_ANI_OFDM_DEF_LEVEL; ++		aniState->ofdmNoiseImmunityLevel = immunityLevel; +  + 	entry_ofdm = &ofdm_level_table[aniState->ofdmNoiseImmunityLevel]; + 	entry_cck = &cck_level_table[aniState->cckNoiseImmunityLevel]; +@@ -217,9 +215,7 @@ static void ath9k_hw_set_cck_nil(struct  + 		immunityLevel = ATH9K_ANI_CCK_MAX_LEVEL_LOW_RSSI; +  + 	if (aniState->update_ani) +-		aniState->cckNoiseImmunityLevel = +-			(immunityLevel > ATH9K_ANI_CCK_DEF_LEVEL) ? +-			immunityLevel : ATH9K_ANI_CCK_DEF_LEVEL; ++		aniState->cckNoiseImmunityLevel = immunityLevel; +  + 	entry_ofdm = &ofdm_level_table[aniState->ofdmNoiseImmunityLevel]; + 	entry_cck = &cck_level_table[aniState->cckNoiseImmunityLevel]; +@@ -285,6 +281,7 @@ void ath9k_ani_reset(struct ath_hw *ah,  + 	struct ar5416AniState *aniState = &ah->curchan->ani; + 	struct ath9k_channel *chan = ah->curchan; + 	struct ath_common *common = ath9k_hw_common(ah); ++	int ofdm_nil, cck_nil; +  + 	if (!DO_ANI(ah)) + 		return; +@@ -306,6 +303,11 @@ void ath9k_ani_reset(struct ath_hw *ah,  + 	/* always allow mode (on/off) to be controlled */ + 	ah->ani_function |= ATH9K_ANI_MODE; +  ++	ofdm_nil = max_t(int, ATH9K_ANI_OFDM_DEF_LEVEL, ++			 aniState->ofdmNoiseImmunityLevel); ++	cck_nil = max_t(int, ATH9K_ANI_CCK_DEF_LEVEL, ++			 aniState->cckNoiseImmunityLevel); ++ + 	if (is_scanning || + 	    (ah->opmode != NL80211_IFTYPE_STATION && + 	     ah->opmode != NL80211_IFTYPE_ADHOC)) { +@@ -329,8 +331,8 @@ void ath9k_ani_reset(struct ath_hw *ah,  + 				aniState->cckNoiseImmunityLevel); +  + 			aniState->update_ani = false; +-			ath9k_hw_set_ofdm_nil(ah, ATH9K_ANI_OFDM_DEF_LEVEL); +-			ath9k_hw_set_cck_nil(ah, ATH9K_ANI_CCK_DEF_LEVEL); ++			ofdm_nil = ATH9K_ANI_OFDM_DEF_LEVEL; ++			cck_nil = ATH9K_ANI_CCK_DEF_LEVEL; + 		} + 	} else { + 		/* +@@ -346,11 +348,9 @@ void ath9k_ani_reset(struct ath_hw *ah,  + 			aniState->cckNoiseImmunityLevel); +  + 			aniState->update_ani = true; +-			ath9k_hw_set_ofdm_nil(ah, +-					      aniState->ofdmNoiseImmunityLevel); +-			ath9k_hw_set_cck_nil(ah, +-					     aniState->cckNoiseImmunityLevel); + 	} ++	ath9k_hw_set_ofdm_nil(ah, ofdm_nil); ++	ath9k_hw_set_cck_nil(ah, cck_nil); +  + 	/* + 	 * enable phy counters if hw supports or if not, enable phy diff --git a/package/mac80211/patches/578-ath9k_cleanup_ani_ofdm_trig.patch b/package/mac80211/patches/578-ath9k_cleanup_ani_ofdm_trig.patch new file mode 100644 index 000000000..9b4b9910f --- /dev/null +++ b/package/mac80211/patches/578-ath9k_cleanup_ani_ofdm_trig.patch @@ -0,0 +1,41 @@ +--- a/drivers/net/wireless/ath/ath9k/ani.c ++++ b/drivers/net/wireless/ath/ath9k/ani.c +@@ -179,6 +179,14 @@ static void ath9k_hw_set_ofdm_nil(struct + 			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; ++	} + } +  + static void ath9k_hw_ani_ofdm_err_trigger(struct ath_hw *ah) +@@ -428,21 +436,10 @@ void ath9k_hw_ani_monitor(struct ath_hw  +  + 	if (aniState->listenTime > ah->aniperiod) { + 		if (cckPhyErrRate < ah->config.cck_trig_low && +-		    ((ofdmPhyErrRate < ah->config.ofdm_trig_low && +-		      aniState->ofdmNoiseImmunityLevel < +-		      ATH9K_ANI_OFDM_DEF_LEVEL) || +-		     (ofdmPhyErrRate < ATH9K_ANI_OFDM_TRIG_LOW_ABOVE_INI && +-		      aniState->ofdmNoiseImmunityLevel >= +-		      ATH9K_ANI_OFDM_DEF_LEVEL))) { ++		    ofdmPhyErrRate < ah->config.ofdm_trig_low) { + 			ath9k_hw_ani_lower_immunity(ah); + 			aniState->ofdmsTurn = !aniState->ofdmsTurn; +-		} else if ((ofdmPhyErrRate > ah->config.ofdm_trig_high && +-			    aniState->ofdmNoiseImmunityLevel >= +-			    ATH9K_ANI_OFDM_DEF_LEVEL) || +-			   (ofdmPhyErrRate > +-			    ATH9K_ANI_OFDM_TRIG_HIGH_BELOW_INI && +-			    aniState->ofdmNoiseImmunityLevel < +-			    ATH9K_ANI_OFDM_DEF_LEVEL)) { ++		} 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) {  | 
