ath9k: use config.enable_ani to check if ani should be performed
authorNikolay Martynov <mar.kolya@gmail.com>
Sat, 3 Dec 2011 03:39:16 +0000 (22:39 -0500)
committerJohn W. Linville <linville@tuxdriver.com>
Wed, 7 Dec 2011 20:19:38 +0000 (15:19 -0500)
  Currently in ath9k code there is an attempt which is meant to
disable ANI for ar9100 and ar9340. But it doesn't really achieve
this. All it does is disable ANI init and setup (i.e. calls to
ath9k_hw_ani_setup and ath9k_hw_ani_init). Since ath9k_hw_ani_setup is
not called ah->config.ani_poll_interval is never initialized (i.e. it
is always zero) and ath_ani_calibrate always executes ANI procedures
(over uninitialized ANI parameters).
  Moreover, ath_ani_calibrate is being called each 1ms because
common->ani.timer is set to zero interval because
ah->config.ani_poll_interval==0 (and thus smallest value of all
intervals). Normally it should not be called this often.
  This patch changes the code so config.enable_ani is used to check if
ANI should be performed.
  config.enable_ani is initialized to true by default. This patch sets
it to false for ar9100 and ar9340.

Signed-off-by: Nikolay Martynov <mar.kolya@gmail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/ath/ath9k/htc_drv_main.c
drivers/net/wireless/ath/ath9k/hw.c
drivers/net/wireless/ath/ath9k/main.c

index 0b9a0e8a4958cf4dbb58736c940928ffd34d8891..f8ce4ea6f65cae43efd304e030bd088bd83e39a1 100644 (file)
@@ -808,7 +808,8 @@ void ath9k_htc_ani_work(struct work_struct *work)
        }
 
        /* Verify whether we must check ANI */
-       if ((timestamp - common->ani.checkani_timer) >= ATH_ANI_POLLINTERVAL) {
+       if (ah->config.enable_ani &&
+           (timestamp - common->ani.checkani_timer) >= ATH_ANI_POLLINTERVAL) {
                aniflag = true;
                common->ani.checkani_timer = timestamp;
        }
@@ -838,7 +839,7 @@ set_timer:
        * short calibration and long calibration.
        */
        cal_interval = ATH_LONG_CALINTERVAL;
-       if (priv->ah->config.enable_ani)
+       if (ah->config.enable_ani)
                cal_interval = min(cal_interval, (u32)ATH_ANI_POLLINTERVAL);
        if (!common->ani.caldone)
                cal_interval = min(cal_interval, (u32)short_cal_interval);
index caf572cf270fa7cb0395521279c1907b7eeafe96..9871072bbf0172c47cf02164784f95ab1278d49b 100644 (file)
@@ -504,7 +504,7 @@ static int ath9k_hw_post_init(struct ath_hw *ah)
                return ecode;
        }
 
-       if (!AR_SREV_9100(ah) && !AR_SREV_9340(ah)) {
+       if (ah->config.enable_ani) {
                ath9k_hw_ani_setup(ah);
                ath9k_hw_ani_init(ah);
        }
@@ -610,6 +610,10 @@ static int __ath9k_hw_init(struct ath_hw *ah)
        if (!AR_SREV_9300_20_OR_LATER(ah))
                ah->ani_function &= ~ATH9K_ANI_MRC_CCK;
 
+       /* disable ANI for 9100 and 9340 */
+       if (AR_SREV_9100(ah) || AR_SREV_9340(ah))
+               ah->config.enable_ani = false;
+
        ath9k_hw_init_mode_regs(ah);
 
        if (!ah->is_pciexpress)
index 8c36362da1eafefa6d9682ba34fe1158699930f6..5007297c9447a63131e23e35ca5fc33f1c43a8ec 100644 (file)
@@ -582,8 +582,9 @@ void ath_ani_calibrate(unsigned long data)
        }
 
        /* Verify whether we must check ANI */
-       if ((timestamp - common->ani.checkani_timer) >=
-            ah->config.ani_poll_interval) {
+       if (sc->sc_ah->config.enable_ani
+           && (timestamp - common->ani.checkani_timer) >=
+           ah->config.ani_poll_interval) {
                aniflag = true;
                common->ani.checkani_timer = timestamp;
        }