summaryrefslogtreecommitdiffstats
path: root/package/mac80211/patches/511-ath9k_per_chan_nf.patch
diff options
context:
space:
mode:
Diffstat (limited to 'package/mac80211/patches/511-ath9k_per_chan_nf.patch')
-rw-r--r--package/mac80211/patches/511-ath9k_per_chan_nf.patch97
1 files changed, 97 insertions, 0 deletions
diff --git a/package/mac80211/patches/511-ath9k_per_chan_nf.patch b/package/mac80211/patches/511-ath9k_per_chan_nf.patch
new file mode 100644
index 000000000..cbf44e640
--- /dev/null
+++ b/package/mac80211/patches/511-ath9k_per_chan_nf.patch
@@ -0,0 +1,97 @@
+--- a/drivers/net/wireless/ath/ath9k/hw.h
++++ b/drivers/net/wireless/ath/ath9k/hw.h
+@@ -342,7 +342,6 @@ struct ath9k_hw_cal_data {
+ int32_t CalValid;
+ int8_t iCoff;
+ int8_t qCoff;
+- int16_t rawNoiseFloor;
+ bool paprd_done;
+ bool nfcal_pending;
+ bool nfcal_interference;
+@@ -356,6 +355,7 @@ struct ath9k_channel {
+ u16 channel;
+ u32 channelFlags;
+ u32 chanmode;
++ s16 noisefloor;
+ };
+
+ #define IS_CHAN_G(_c) ((((_c)->channelFlags & (CHANNEL_G)) == CHANNEL_G) || \
+--- a/drivers/net/wireless/ath/ath9k/calib.c
++++ b/drivers/net/wireless/ath/ath9k/calib.c
+@@ -346,34 +346,34 @@ bool ath9k_hw_getnf(struct ath_hw *ah, s
+ struct ieee80211_channel *c = chan->chan;
+ struct ath9k_hw_cal_data *caldata = ah->caldata;
+
+- if (!caldata)
+- return false;
+-
+ chan->channelFlags &= (~CHANNEL_CW_INT);
+ if (REG_READ(ah, AR_PHY_AGC_CONTROL) & AR_PHY_AGC_CONTROL_NF) {
+ ath_print(common, ATH_DBG_CALIBRATE,
+ "NF did not complete in calibration window\n");
+- nf = 0;
+- caldata->rawNoiseFloor = nf;
+ return false;
+- } else {
+- ath9k_hw_do_getnf(ah, nfarray);
+- ath9k_hw_nf_sanitize(ah, nfarray);
+- nf = nfarray[0];
+- if (ath9k_hw_get_nf_thresh(ah, c->band, &nfThresh)
+- && nf > nfThresh) {
+- ath_print(common, ATH_DBG_CALIBRATE,
+- "noise floor failed detected; "
+- "detected %d, threshold %d\n",
+- nf, nfThresh);
+- chan->channelFlags |= CHANNEL_CW_INT;
+- }
++ }
++
++ ath9k_hw_do_getnf(ah, nfarray);
++ ath9k_hw_nf_sanitize(ah, nfarray);
++ nf = nfarray[0];
++ if (ath9k_hw_get_nf_thresh(ah, c->band, &nfThresh)
++ && nf > nfThresh) {
++ ath_print(common, ATH_DBG_CALIBRATE,
++ "noise floor failed detected; "
++ "detected %d, threshold %d\n",
++ nf, nfThresh);
++ chan->channelFlags |= CHANNEL_CW_INT;
++ }
++
++ if (!caldata) {
++ chan->noisefloor = nf;
++ return false;
+ }
+
+ h = caldata->nfCalHist;
+ caldata->nfcal_pending = false;
+ ath9k_hw_update_nfcal_hist_buffer(ah, caldata, nfarray);
+- caldata->rawNoiseFloor = h[0].privNF;
++ chan->noisefloor = h[0].privNF;
+ return true;
+ }
+
+@@ -401,10 +401,10 @@ void ath9k_init_nfcal_hist_buffer(struct
+
+ s16 ath9k_hw_getchan_noise(struct ath_hw *ah, struct ath9k_channel *chan)
+ {
+- if (!ah->caldata || !ah->caldata->rawNoiseFloor)
++ if (!ah->curchan || !ah->curchan->noisefloor)
+ return ath9k_hw_get_default_nf(ah, chan);
+
+- return ah->caldata->rawNoiseFloor;
++ return ah->curchan->noisefloor;
+ }
+ EXPORT_SYMBOL(ath9k_hw_getchan_noise);
+
+--- a/drivers/net/wireless/ath/ath9k/hw.c
++++ b/drivers/net/wireless/ath/ath9k/hw.c
+@@ -1251,7 +1251,7 @@ int ath9k_hw_reset(struct ath_hw *ah, st
+ if (!ath9k_hw_setpower(ah, ATH9K_PM_AWAKE))
+ return -EIO;
+
+- if (curchan && !ah->chip_fullsleep && ah->caldata)
++ if (curchan && !ah->chip_fullsleep)
+ ath9k_hw_getnf(ah, curchan);
+
+ ah->caldata = caldata;