diff options
author | Felix Fietkau <nbd@openwrt.org> | 2010-07-31 00:12:01 +0200 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2010-08-04 15:27:37 -0400 |
commit | 4254bc1c4d7b53ac10e558dfe015725fdd693da4 (patch) | |
tree | 51c95b3f0f24ff8e1fabf698524c9ddd9f069879 /drivers/net/wireless/ath/ath9k/calib.c | |
parent | 20bd2a0952d01ba82a99b3f22d46e3832c255529 (diff) |
ath9k_hw: fix a noise floor calibration related race condition
On AR5008-AR9002, other forms of calibration must not be started while
the noise floor calibration is running, as this can create invalid
readings which were sometimes not even recoverable by any further
calibration attempts.
This patch also ensures that the result of noise floor measurements
are processed faster and also allows the result of the initial
calibration on reset to make it into the NF history buffer
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/ath/ath9k/calib.c')
-rw-r--r-- | drivers/net/wireless/ath/ath9k/calib.c | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/drivers/net/wireless/ath/ath9k/calib.c b/drivers/net/wireless/ath/ath9k/calib.c index 18b5c0dcc1f..45208690c0e 100644 --- a/drivers/net/wireless/ath/ath9k/calib.c +++ b/drivers/net/wireless/ath/ath9k/calib.c @@ -156,6 +156,9 @@ EXPORT_SYMBOL(ath9k_hw_reset_calvalid); void ath9k_hw_start_nfcal(struct ath_hw *ah, bool update) { + if (ah->caldata) + ah->caldata->nfcal_pending = true; + REG_SET_BIT(ah, AR_PHY_AGC_CONTROL, AR_PHY_AGC_CONTROL_ENABLE_NF); @@ -288,8 +291,7 @@ static void ath9k_hw_nf_sanitize(struct ath_hw *ah, s16 *nf) } } -int16_t ath9k_hw_getnf(struct ath_hw *ah, - struct ath9k_channel *chan) +bool ath9k_hw_getnf(struct ath_hw *ah, struct ath9k_channel *chan) { struct ath_common *common = ath9k_hw_common(ah); int16_t nf, nfThresh; @@ -299,7 +301,7 @@ int16_t ath9k_hw_getnf(struct ath_hw *ah, struct ath9k_hw_cal_data *caldata = ah->caldata; if (!caldata) - return ath9k_hw_get_default_nf(ah, chan); + return false; chan->channelFlags &= (~CHANNEL_CW_INT); if (REG_READ(ah, AR_PHY_AGC_CONTROL) & AR_PHY_AGC_CONTROL_NF) { @@ -307,7 +309,7 @@ int16_t ath9k_hw_getnf(struct ath_hw *ah, "NF did not complete in calibration window\n"); nf = 0; caldata->rawNoiseFloor = nf; - return caldata->rawNoiseFloor; + return false; } else { ath9k_hw_do_getnf(ah, nfarray); ath9k_hw_nf_sanitize(ah, nfarray); @@ -323,11 +325,10 @@ int16_t ath9k_hw_getnf(struct ath_hw *ah, } h = caldata->nfCalHist; - + caldata->nfcal_pending = false; ath9k_hw_update_nfcal_hist_buffer(h, nfarray); caldata->rawNoiseFloor = h[0].privNF; - - return ah->caldata->rawNoiseFloor; + return true; } void ath9k_init_nfcal_hist_buffer(struct ath_hw *ah, |