Commit d9092c98 authored by Sujith Manoharan's avatar Sujith Manoharan Committed by John W. Linville

ath9k: Adjust tbtt delta properly

In a GO/STA setup, when we switch to the STA context,
the channel context timer is scheduled with a period of
half the beacon interval. If a beacon is received in
this duration, the timer is adjusted to accommodate
TSF sync done by the HW.

But, if the actual channel switch is delayed for some
reason, we end up rearming the timer every time a new
beacon is received. Avoid this by doing the adjustment
only once.
Signed-off-by: default avatarSujith Manoharan <c_manoha@qca.qualcomm.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 2c3634a8
...@@ -381,6 +381,7 @@ enum ath_chanctx_state { ...@@ -381,6 +381,7 @@ enum ath_chanctx_state {
struct ath_chanctx_sched { struct ath_chanctx_sched {
bool beacon_pending; bool beacon_pending;
bool beacon_adjust;
bool offchannel_pending; bool offchannel_pending;
bool wait_switch; bool wait_switch;
bool force_noa_update; bool force_noa_update;
......
...@@ -659,6 +659,7 @@ void ath_chanctx_event(struct ath_softc *sc, struct ieee80211_vif *vif, ...@@ -659,6 +659,7 @@ void ath_chanctx_event(struct ath_softc *sc, struct ieee80211_vif *vif,
sc->sched.beacon_miss = 0; sc->sched.beacon_miss = 0;
if (sc->sched.state == ATH_CHANCTX_STATE_FORCE_ACTIVE || if (sc->sched.state == ATH_CHANCTX_STATE_FORCE_ACTIVE ||
!sc->sched.beacon_adjust ||
!sc->cur_chan->tsf_val) !sc->cur_chan->tsf_val)
break; break;
...@@ -672,7 +673,7 @@ void ath_chanctx_event(struct ath_softc *sc, struct ieee80211_vif *vif, ...@@ -672,7 +673,7 @@ void ath_chanctx_event(struct ath_softc *sc, struct ieee80211_vif *vif,
ath9k_hw_get_tsf_offset(&sc->cur_chan->tsf_ts, NULL); ath9k_hw_get_tsf_offset(&sc->cur_chan->tsf_ts, NULL);
tsf_time += ath9k_hw_gettsf32(ah); tsf_time += ath9k_hw_gettsf32(ah);
sc->sched.beacon_adjust = false;
ath_chanctx_setup_timer(sc, tsf_time); ath_chanctx_setup_timer(sc, tsf_time);
break; break;
case ATH_CHANCTX_EVENT_AUTHORIZED: case ATH_CHANCTX_EVENT_AUTHORIZED:
...@@ -717,6 +718,7 @@ void ath_chanctx_event(struct ath_softc *sc, struct ieee80211_vif *vif, ...@@ -717,6 +718,7 @@ void ath_chanctx_event(struct ath_softc *sc, struct ieee80211_vif *vif,
ath_chanctx_setup_timer(sc, tsf_time); ath_chanctx_setup_timer(sc, tsf_time);
sc->sched.beacon_pending = true; sc->sched.beacon_pending = true;
sc->sched.beacon_adjust = true;
break; break;
case ATH_CHANCTX_EVENT_ENABLE_MULTICHANNEL: case ATH_CHANCTX_EVENT_ENABLE_MULTICHANNEL:
if (sc->cur_chan == &sc->offchannel.chan || if (sc->cur_chan == &sc->offchannel.chan ||
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment