ath9k_hw: keep calibrated noise floor values per channel
authorFelix Fietkau <nbd@openwrt.org>
Wed, 29 Sep 2010 15:15:27 +0000 (17:15 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Tue, 5 Oct 2010 17:35:21 +0000 (13:35 -0400)
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/ath/ath9k/calib.c
drivers/net/wireless/ath/ath9k/hw.c
drivers/net/wireless/ath/ath9k/hw.h

index 67ee5d735cc12a30b5f642c0d0860531a4242ed1..6351e76792a629c0b592976824267f0434a07584 100644 (file)
@@ -346,34 +346,34 @@ bool ath9k_hw_getnf(struct ath_hw *ah, struct ath9k_channel *chan)
        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 ath_hw *ah,
 
 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);
 
index 25ed65ac992c66069d23ec83f30c69ea73726f38..1b066043d6cb64a7325f95ffc546ddfd8d30e96d 100644 (file)
@@ -1239,7 +1239,7 @@ int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,
        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;
index df47f792cf4ed3835d2f4f3715f386e184ce4827..1b6739bd93ff1b87fc4bc7fedfc41098cb5352c4 100644 (file)
@@ -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) || \