ath9k: fix beacon timer restart after a card reset
authorFelix Fietkau <nbd@openwrt.org>
Fri, 19 Feb 2010 17:21:42 +0000 (18:21 +0100)
committerJohn W. Linville <linville@tuxdriver.com>
Fri, 19 Feb 2010 20:52:50 +0000 (15:52 -0500)
In AP mode, ath_beacon_config_ap only restarts the timer if a TSF
restart is requested. Apparently this was added, because this function
unconditionally sets the flag for TSF reset.

The problem with this is, that ath9k_hw_reset() clobbers the timer
registers (specified in the initvals), thus effectively disabling the
SWBA interrupt whenever a card reset without TSF reset is issued
(happens in a few places in the code).

This patch fixes ath_beacon_config_ap to only issue the TSF reset flag
when necessary, but reinitialize the timer unconditionally. Tests show,
that this is enough to keep the SWBA interrupt going after a call to
ath_reset()

Signed-off-by: Felix Fietkau <nbd@openwrt.org>
Cc: stable@kernel.org
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/ath/ath9k/beacon.c

index 42171d0..b4a31a4 100644 (file)
@@ -526,16 +526,13 @@ static void ath_beacon_config_ap(struct ath_softc *sc,
 {
        u32 nexttbtt, intval;
 
-       /* Configure the timers only when the TSF has to be reset */
-
-       if (!(sc->sc_flags & SC_OP_TSF_RESET))
-               return;
-
        /* NB: the beacon interval is kept internally in TU's */
        intval = conf->beacon_interval & ATH9K_BEACON_PERIOD;
        intval /= ATH_BCBUF;    /* for staggered beacons */
        nexttbtt = intval;
-       intval |= ATH9K_BEACON_RESET_TSF;
+
+       if (sc->sc_flags & SC_OP_TSF_RESET)
+               intval |= ATH9K_BEACON_RESET_TSF;
 
        /*
         * In AP mode we enable the beacon timers and SWBA interrupts to