From 28fb716737c4d45d977d2d19c3d9d73b781b7597 Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Sun, 1 May 2011 18:23:12 +0000 Subject: [PATCH] ath9k: add a new fix for signal strength / noise measurements SVN-Revision: 26798 --- .../patches/570-ath9k_noise_dbm_fixup.patch | 88 +++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 package/mac80211/patches/570-ath9k_noise_dbm_fixup.patch 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 000000000000..1de6b51b489a --- /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; + -- 2.30.2