Skip to content

Commit

Permalink
ath9k: Fix flushing in MCC mode
Browse files Browse the repository at this point in the history
When we are attempting to switch to a new
channel context, the TX queues are flushed, but
the mac80211 queues are not stopped and traffic
can still come down to the driver.

This patch fixes it by stopping the queues
assigned to the current context/vif before
trying to flush.

Signed-off-by: Sujith Manoharan <c_manoha@qca.qualcomm.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
  • Loading branch information
Sujith Manoharan authored and John W. Linville committed Oct 2, 2014
1 parent 5ba8d9d commit e2cba8d
Showing 1 changed file with 16 additions and 0 deletions.
16 changes: 16 additions & 0 deletions drivers/net/wireless/ath/ath9k/channel.c
Original file line number Diff line number Diff line change
Expand Up @@ -1044,9 +1044,11 @@ static void ath_offchannel_channel_change(struct ath_softc *sc)
void ath_chanctx_set_next(struct ath_softc *sc, bool force)
{
struct ath_common *common = ath9k_hw_common(sc->sc_ah);
struct ath_chanctx *old_ctx;
struct timespec ts;
bool measure_time = false;
bool send_ps = false;
bool queues_stopped = false;

spin_lock_bh(&sc->chan_lock);
if (!sc->next_chan) {
Expand Down Expand Up @@ -1076,6 +1078,10 @@ void ath_chanctx_set_next(struct ath_softc *sc, bool force)
getrawmonotonic(&ts);
measure_time = true;
}

ath9k_chanctx_stop_queues(sc, sc->cur_chan);
queues_stopped = true;

__ath9k_flush(sc->hw, ~0, true);

if (ath_chanctx_send_ps_frame(sc, true))
Expand All @@ -1089,6 +1095,7 @@ void ath_chanctx_set_next(struct ath_softc *sc, bool force)
sc->cur_chan->tsf_val = ath9k_hw_gettsf64(sc->sc_ah);
}
}
old_ctx = sc->cur_chan;
sc->cur_chan = sc->next_chan;
sc->cur_chan->stopped = false;
sc->next_chan = NULL;
Expand All @@ -1111,7 +1118,16 @@ void ath_chanctx_set_next(struct ath_softc *sc, bool force)
if (measure_time)
sc->sched.channel_switch_time =
ath9k_hw_get_tsf_offset(&ts, NULL);
/*
* A reset will ensure that all queues are woken up,
* so there is no need to awaken them again.
*/
goto out;
}

if (queues_stopped)
ath9k_chanctx_wake_queues(sc, old_ctx);
out:
if (send_ps)
ath_chanctx_send_ps_frame(sc, false);

Expand Down

0 comments on commit e2cba8d

Please sign in to comment.