diff options
| -rw-r--r-- | drivers/net/wireless/ath/ath9k/ath9k.h | 1 | ||||
| -rw-r--r-- | drivers/net/wireless/ath/ath9k/channel.c | 4 |
2 files changed, 4 insertions, 1 deletions
diff --git a/drivers/net/wireless/ath/ath9k/ath9k.h b/drivers/net/wireless/ath/ath9k/ath9k.h index 46a1d2e24dae..0c071b094010 100644 --- a/drivers/net/wireless/ath/ath9k/ath9k.h +++ b/drivers/net/wireless/ath/ath9k/ath9k.h | |||
| @@ -378,6 +378,7 @@ enum ath_chanctx_state { | |||
| 378 | struct ath_chanctx_sched { | 378 | struct ath_chanctx_sched { |
| 379 | bool beacon_pending; | 379 | bool beacon_pending; |
| 380 | bool offchannel_pending; | 380 | bool offchannel_pending; |
| 381 | bool wait_switch; | ||
| 381 | enum ath_chanctx_state state; | 382 | enum ath_chanctx_state state; |
| 382 | u8 beacon_miss; | 383 | u8 beacon_miss; |
| 383 | 384 | ||
diff --git a/drivers/net/wireless/ath/ath9k/channel.c b/drivers/net/wireless/ath/ath9k/channel.c index a31f526ba852..522894ba727a 100644 --- a/drivers/net/wireless/ath/ath9k/channel.c +++ b/drivers/net/wireless/ath/ath9k/channel.c | |||
| @@ -333,7 +333,7 @@ void ath_chanctx_event(struct ath_softc *sc, struct ieee80211_vif *vif, | |||
| 333 | break; | 333 | break; |
| 334 | } | 334 | } |
| 335 | 335 | ||
| 336 | if (sc->sched.offchannel_pending) { | 336 | if (sc->sched.offchannel_pending && !sc->sched.wait_switch) { |
| 337 | sc->sched.offchannel_pending = false; | 337 | sc->sched.offchannel_pending = false; |
| 338 | sc->next_chan = &sc->offchannel.chan; | 338 | sc->next_chan = &sc->offchannel.chan; |
| 339 | sc->sched.state = ATH_CHANCTX_STATE_WAIT_FOR_BEACON; | 339 | sc->sched.state = ATH_CHANCTX_STATE_WAIT_FOR_BEACON; |
| @@ -490,6 +490,7 @@ void ath_chanctx_event(struct ath_softc *sc, struct ieee80211_vif *vif, | |||
| 490 | "Move chanctx state to WAIT_FOR_TIMER (event SWITCH)\n"); | 490 | "Move chanctx state to WAIT_FOR_TIMER (event SWITCH)\n"); |
| 491 | 491 | ||
| 492 | sc->sched.state = ATH_CHANCTX_STATE_WAIT_FOR_TIMER; | 492 | sc->sched.state = ATH_CHANCTX_STATE_WAIT_FOR_TIMER; |
| 493 | sc->sched.wait_switch = false; | ||
| 493 | 494 | ||
| 494 | tsf_time = TU_TO_USEC(cur_conf->beacon_interval) / 2; | 495 | tsf_time = TU_TO_USEC(cur_conf->beacon_interval) / 2; |
| 495 | if (sc->sched.beacon_miss >= 2) { | 496 | if (sc->sched.beacon_miss >= 2) { |
| @@ -588,6 +589,7 @@ static void ath_chanctx_switch(struct ath_softc *sc, struct ath_chanctx *ctx, | |||
| 588 | if (test_bit(ATH_OP_MULTI_CHANNEL, &common->op_flags) && | 589 | if (test_bit(ATH_OP_MULTI_CHANNEL, &common->op_flags) && |
| 589 | (sc->cur_chan != ctx) && (ctx == &sc->offchannel.chan)) { | 590 | (sc->cur_chan != ctx) && (ctx == &sc->offchannel.chan)) { |
| 590 | sc->sched.offchannel_pending = true; | 591 | sc->sched.offchannel_pending = true; |
| 592 | sc->sched.wait_switch = true; | ||
| 591 | if (chandef) | 593 | if (chandef) |
| 592 | ctx->chandef = *chandef; | 594 | ctx->chandef = *chandef; |
| 593 | spin_unlock_bh(&sc->chan_lock); | 595 | spin_unlock_bh(&sc->chan_lock); |
