ath9k: move ps helpers onto core driver when reseting tsf
authorLuis R. Rodriguez <lrodriguez@atheros.com>
Thu, 10 Sep 2009 03:05:39 +0000 (20:05 -0700)
committerJohn W. Linville <linville@tuxdriver.com>
Wed, 7 Oct 2009 20:39:23 +0000 (16:39 -0400)
When the TSF is reset power save state is disabled and
then restored. The helpers to disable power save and restore
it use a lock provided by the driver core. Move the callers
of the helpers outside of the hw code.

We reset the TSF when mac80211 tells us and on the beacon.c
helper ath9k_hw_beaconinit() when it is made explicitly required.
Add a helper on beacon.c which will deal with ps awake/restore
if we need to reset the TSF upon ath9k_hw_beaconinit().

Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/ath/ath9k/beacon.c
drivers/net/wireless/ath/ath9k/hw.c
drivers/net/wireless/ath/ath9k/main.c

index 6e7a519d0a9c7c254bb3bdd1a2daa7d429147efb..fb4ff5512360d0ead6ec9d70e2a35e49c015bca1 100644 (file)
@@ -502,6 +502,19 @@ void ath_beacon_tasklet(unsigned long data)
        }
 }
 
+static void ath9k_beacon_init(struct ath_softc *sc,
+                             u32 next_beacon,
+                             u32 beacon_period)
+{
+       if (beacon_period & ATH9K_BEACON_RESET_TSF)
+               ath9k_ps_wakeup(sc);
+
+       ath9k_hw_beaconinit(sc->sc_ah, next_beacon, beacon_period);
+
+       if (beacon_period & ATH9K_BEACON_RESET_TSF)
+               ath9k_ps_restore(sc);
+}
+
 /*
  * For multi-bss ap support beacons are either staggered evenly over N slots or
  * burst together.  For the former arrange for the SWBA to be delivered for each
@@ -534,7 +547,7 @@ static void ath_beacon_config_ap(struct ath_softc *sc,
        /* Set the computed AP beacon timers */
 
        ath9k_hw_set_interrupts(sc->sc_ah, 0);
-       ath9k_hw_beaconinit(sc->sc_ah, nexttbtt, intval);
+       ath9k_beacon_init(sc, nexttbtt, intval);
        sc->beacon.bmisscnt = 0;
        ath9k_hw_set_interrupts(sc->sc_ah, sc->imask);
 
@@ -707,7 +720,7 @@ static void ath_beacon_config_adhoc(struct ath_softc *sc,
        /* Set the computed ADHOC beacon timers */
 
        ath9k_hw_set_interrupts(sc->sc_ah, 0);
-       ath9k_hw_beaconinit(sc->sc_ah, nexttbtt, intval);
+       ath9k_beacon_init(sc, nexttbtt, intval);
        sc->beacon.bmisscnt = 0;
        ath9k_hw_set_interrupts(sc->sc_ah, sc->imask);
 
index de83d3c4b4690f6df83cbdf7d03a7f50d35467a3..0893f23adaa867dedd0b12174842815ec947d174 100644 (file)
@@ -4101,14 +4101,12 @@ void ath9k_hw_settsf64(struct ath_hw *ah, u64 tsf64)
 
 void ath9k_hw_reset_tsf(struct ath_hw *ah)
 {
-       ath9k_ps_wakeup(ah->ah_sc);
        if (!ath9k_hw_wait(ah, AR_SLP32_MODE, AR_SLP32_TSF_WRITE_STATUS, 0,
                           AH_TSF_WRITE_TIMEOUT))
                DPRINTF(ah, ATH_DBG_RESET,
                        "AR_SLP32_TSF_WRITE_STATUS limit exceeded\n");
 
        REG_WRITE(ah, AR_RESET_TSF, AR_RESET_TSF_ONCE);
-       ath9k_ps_restore(ah->ah_sc);
 }
 
 void ath9k_hw_set_tsfadjust(struct ath_hw *ah, u32 setting)
index 42772d25491a47e87ff82be8a72ef88322ae4b60..fe2888e4b8e9f5deea23f57baed99d15eab043f2 100644 (file)
@@ -2893,7 +2893,11 @@ static void ath9k_reset_tsf(struct ieee80211_hw *hw)
        struct ath_softc *sc = aphy->sc;
 
        mutex_lock(&sc->mutex);
+
+       ath9k_ps_wakeup(sc);
        ath9k_hw_reset_tsf(sc->sc_ah);
+       ath9k_ps_restore(sc);
+
        mutex_unlock(&sc->mutex);
 }