ath9k: Update channel switch timer
authorFelix Fietkau <nbd@openwrt.org>
Wed, 11 Jun 2014 10:48:13 +0000 (16:18 +0530)
committerJohn W. Linville <linville@tuxdriver.com>
Thu, 19 Jun 2014 19:49:20 +0000 (15:49 -0400)
TSF time might have been updated by the incoming beacon,
need update the channel switch timer to reflect the change.

Signed-off-by: Felix Fietkau <nbd@openwrt.org>
Signed-off-by: Rajkumar Manoharan <rmanohar@qti.qualcomm.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/ath/ath9k/channel.c

index 55165d5a7ed123f1d92a4af3e0e81fe25df53428..0a38eea278704a49defb157864e21d61694d72bc 100644 (file)
@@ -589,6 +589,17 @@ void ath_chanctx_event(struct ath_softc *sc, struct ieee80211_vif *vif,
                ath_chanctx_adjust_tbtt_delta(sc);
                sc->sched.beacon_pending = false;
                sc->sched.beacon_miss = 0;
+
+               /* TSF time might have been updated by the incoming beacon,
+                * need update the channel switch timer to reflect the change.
+                */
+               tsf_time = sc->sched.switch_start_time;
+               tsf_time -= (u32) sc->cur_chan->tsf_val +
+                       ath9k_hw_get_tsf_offset(&sc->cur_chan->tsf_ts, NULL);
+               tsf_time += ath9k_hw_gettsf32(ah);
+
+               ath9k_hw_gen_timer_start(ah, sc->p2p_ps_timer,
+                                        tsf_time, 1000000);
                break;
        case ATH_CHANCTX_EVENT_ASSOC:
                if (sc->sched.state != ATH_CHANCTX_STATE_FORCE_ACTIVE ||