diff options
| -rw-r--r-- | package/mac80211/patches/570-ath9k_noise_dbm_fixup.patch | 88 | 
1 files changed, 88 insertions, 0 deletions
diff --git a/package/mac80211/patches/570-ath9k_noise_dbm_fixup.patch b/package/mac80211/patches/570-ath9k_noise_dbm_fixup.patch new file mode 100644 index 000000000..1de6b51b4 --- /dev/null +++ b/package/mac80211/patches/570-ath9k_noise_dbm_fixup.patch @@ -0,0 +1,88 @@ +--- a/drivers/net/wireless/ath/ath9k/calib.c ++++ b/drivers/net/wireless/ath/ath9k/calib.c +@@ -365,6 +365,7 @@ bool ath9k_hw_getnf(struct ath_hw *ah, s +  + 	if (!caldata) { + 		chan->noisefloor = nf; ++		ah->noise = ath9k_hw_getchan_noise(ah, chan); + 		return false; + 	} +  +@@ -372,6 +373,7 @@ bool ath9k_hw_getnf(struct ath_hw *ah, s + 	caldata->nfcal_pending = false; + 	ath9k_hw_update_nfcal_hist_buffer(ah, caldata, nfarray); + 	chan->noisefloor = h[0].privNF; ++	ah->noise = ath9k_hw_getchan_noise(ah, chan); + 	return true; + } +  +@@ -398,10 +400,15 @@ void ath9k_init_nfcal_hist_buffer(struct +  + s16 ath9k_hw_getchan_noise(struct ath_hw *ah, struct ath9k_channel *chan) + { +-	if (!ah->curchan || !ah->curchan->noisefloor) +-		return ath9k_hw_get_default_nf(ah, chan); ++	s8 noise = ATH_DEFAULT_NOISE_FLOOR; +  +-	return ah->curchan->noisefloor; ++	if (chan && chan->noisefloor) { ++		s8 delta = chan->noisefloor - ++			   ath9k_hw_get_default_nf(ah, chan); ++		if (delta > 0) ++			noise += delta; ++	} ++	return noise; + } + EXPORT_SYMBOL(ath9k_hw_getchan_noise); +  +--- a/drivers/net/wireless/ath/ath9k/hw.c ++++ b/drivers/net/wireless/ath/ath9k/hw.c +@@ -1286,6 +1286,7 @@ int ath9k_hw_reset(struct ath_hw *ah, st + 		memset(caldata, 0, sizeof(*caldata)); + 		ath9k_init_nfcal_hist_buffer(ah, chan); + 	} ++	ah->noise = ath9k_hw_getchan_noise(ah, chan); +  + 	if (bChannelChange && + 	    (ah->chip_fullsleep != true) && +--- a/drivers/net/wireless/ath/ath9k/hw.h ++++ b/drivers/net/wireless/ath/ath9k/hw.h +@@ -677,6 +677,7 @@ struct ath_hw { + 	enum nl80211_iftype opmode; + 	enum ath9k_power_mode power_mode; +  ++	s8 noise; + 	struct ath9k_hw_cal_data *caldata; + 	struct ath9k_pacal_info pacal_info; + 	struct ar5416Stats stats; +--- a/drivers/net/wireless/ath/ath9k/main.c ++++ b/drivers/net/wireless/ath/ath9k/main.c +@@ -165,7 +165,7 @@ static void ath_update_survey_nf(struct  +  + 	if (chan->noisefloor) { + 		survey->filled |= SURVEY_INFO_NOISE_DBM; +-		survey->noise = chan->noisefloor; ++		survey->noise = ath9k_hw_getchan_noise(ah, chan); + 	} + } +  +--- a/drivers/net/wireless/ath/ath9k/recv.c ++++ b/drivers/net/wireless/ath/ath9k/recv.c +@@ -956,6 +956,8 @@ static int ath9k_rx_skb_preprocess(struc + 				   struct ieee80211_rx_status *rx_status, + 				   bool *decrypt_error) + { ++	struct ath_hw *ah = common->ah; ++ + 	memset(rx_status, 0, sizeof(struct ieee80211_rx_status)); +  + 	/* +@@ -976,7 +978,7 @@ static int ath9k_rx_skb_preprocess(struc +  + 	rx_status->band = hw->conf.channel->band; + 	rx_status->freq = hw->conf.channel->center_freq; +-	rx_status->signal = ATH_DEFAULT_NOISE_FLOOR + rx_stats->rs_rssi; ++	rx_status->signal = ah->noise + rx_stats->rs_rssi; + 	rx_status->antenna = rx_stats->rs_antenna; + 	rx_status->flag |= RX_FLAG_MACTIME_MPDU; +   | 
