ath9k: No need to abort Rx path when autosleep is enabled.
authorVivek Natarajan <vivek.natraj@gmail.com>
Mon, 30 Mar 2009 08:47:00 +0000 (14:17 +0530)
committerJohn W. Linville <linville@tuxdriver.com>
Wed, 22 Apr 2009 20:54:29 +0000 (16:54 -0400)
For chipsets supporting autosleep feature, there is no need to abort
Rx engine since they are capable of automatically going back to sleep
after receiving a packet.

Signed-off-by: Vivek Natarajan <vnatarajan@atheros.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/ath9k/main.c

index 0607df20e497f87f0b4637bed7c6bcd39838da01..97cf83fa8555cc20528bf67bf6540872186e280b 100644 (file)
@@ -2325,26 +2325,33 @@ static int ath9k_config(struct ieee80211_hw *hw, u32 changed)
        struct ath_wiphy *aphy = hw->priv;
        struct ath_softc *sc = aphy->sc;
        struct ieee80211_conf *conf = &hw->conf;
+       struct ath_hw *ah = sc->sc_ah;
 
        mutex_lock(&sc->mutex);
 
        if (changed & IEEE80211_CONF_CHANGE_PS) {
                if (conf->flags & IEEE80211_CONF_PS) {
-                       if ((sc->imask & ATH9K_INT_TIM_TIMER) == 0) {
-                               sc->imask |= ATH9K_INT_TIM_TIMER;
-                               ath9k_hw_set_interrupts(sc->sc_ah,
-                                               sc->imask);
+                       if (!(ah->caps.hw_caps &
+                             ATH9K_HW_CAP_AUTOSLEEP)) {
+                               if ((sc->imask & ATH9K_INT_TIM_TIMER) == 0) {
+                                       sc->imask |= ATH9K_INT_TIM_TIMER;
+                                       ath9k_hw_set_interrupts(sc->sc_ah,
+                                                       sc->imask);
+                               }
+                               ath9k_hw_setrxabort(sc->sc_ah, 1);
                        }
-                       ath9k_hw_setrxabort(sc->sc_ah, 1);
                        ath9k_hw_setpower(sc->sc_ah, ATH9K_PM_NETWORK_SLEEP);
                } else {
                        ath9k_hw_setpower(sc->sc_ah, ATH9K_PM_AWAKE);
-                       ath9k_hw_setrxabort(sc->sc_ah, 0);
-                       sc->sc_flags &= ~SC_OP_WAIT_FOR_BEACON;
-                       if (sc->imask & ATH9K_INT_TIM_TIMER) {
-                               sc->imask &= ~ATH9K_INT_TIM_TIMER;
-                               ath9k_hw_set_interrupts(sc->sc_ah,
-                                               sc->imask);
+                       if (!(ah->caps.hw_caps &
+                             ATH9K_HW_CAP_AUTOSLEEP)) {
+                               ath9k_hw_setrxabort(sc->sc_ah, 0);
+                               sc->sc_flags &= ~SC_OP_WAIT_FOR_BEACON;
+                               if (sc->imask & ATH9K_INT_TIM_TIMER) {
+                                       sc->imask &= ~ATH9K_INT_TIM_TIMER;
+                                       ath9k_hw_set_interrupts(sc->sc_ah,
+                                                       sc->imask);
+                               }
                        }
                }
        }