diff options
Diffstat (limited to 'package/mac80211/patches/511-ath9k_per_chan_nf.patch')
-rw-r--r-- | package/mac80211/patches/511-ath9k_per_chan_nf.patch | 97 |
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; |