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

ath9k: Fix MCC flush timeout

In MCC mode, the duration for a channel context
is half the beacon interval and having a large
flush timeout will adversely affect GO operation,
since the default value of 200ms will overshoot
the advertised NoA absence duration.

The scheduler initiates a channel context switch
only when the slot duration for the current
context expires, so there is no possibility of
having a fixed timeout for flush.

Since the channel_switch_time is added to the
absence duration when the GO sets up the NoA
attribute, this is the maximum time that we
have to flush the TX queues. The duration is very
small, but we don't have a choice in MCC mode.
Signed-off-by: default avatarSujith Manoharan <c_manoha@qca.qualcomm.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 2fae0d9f
...@@ -199,6 +199,7 @@ static const char *chanctx_state_string(enum ath_chanctx_state state) ...@@ -199,6 +199,7 @@ static const char *chanctx_state_string(enum ath_chanctx_state state)
void ath_chanctx_check_active(struct ath_softc *sc, struct ath_chanctx *ctx) void ath_chanctx_check_active(struct ath_softc *sc, struct ath_chanctx *ctx)
{ {
struct ath_common *common = ath9k_hw_common(sc->sc_ah); struct ath_common *common = ath9k_hw_common(sc->sc_ah);
struct ath_chanctx *ictx;
struct ath_vif *avp; struct ath_vif *avp;
bool active = false; bool active = false;
u8 n_active = 0; u8 n_active = 0;
...@@ -206,6 +207,8 @@ void ath_chanctx_check_active(struct ath_softc *sc, struct ath_chanctx *ctx) ...@@ -206,6 +207,8 @@ void ath_chanctx_check_active(struct ath_softc *sc, struct ath_chanctx *ctx)
if (!ctx) if (!ctx)
return; return;
ictx = ctx;
list_for_each_entry(avp, &ctx->vifs, list) { list_for_each_entry(avp, &ctx->vifs, list) {
struct ieee80211_vif *vif = avp->vif; struct ieee80211_vif *vif = avp->vif;
...@@ -228,12 +231,23 @@ void ath_chanctx_check_active(struct ath_softc *sc, struct ath_chanctx *ctx) ...@@ -228,12 +231,23 @@ void ath_chanctx_check_active(struct ath_softc *sc, struct ath_chanctx *ctx)
n_active++; n_active++;
} }
spin_lock_bh(&sc->chan_lock);
if (n_active <= 1) { if (n_active <= 1) {
ictx->flush_timeout = HZ / 5;
clear_bit(ATH_OP_MULTI_CHANNEL, &common->op_flags); clear_bit(ATH_OP_MULTI_CHANNEL, &common->op_flags);
spin_unlock_bh(&sc->chan_lock);
return; return;
} }
if (test_and_set_bit(ATH_OP_MULTI_CHANNEL, &common->op_flags))
ictx->flush_timeout = usecs_to_jiffies(sc->sched.channel_switch_time);
if (test_and_set_bit(ATH_OP_MULTI_CHANNEL, &common->op_flags)) {
spin_unlock_bh(&sc->chan_lock);
return; return;
}
spin_unlock_bh(&sc->chan_lock);
if (ath9k_is_chanctx_enabled()) { if (ath9k_is_chanctx_enabled()) {
ath_chanctx_event(sc, NULL, ath_chanctx_event(sc, NULL,
......
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