diff options
Diffstat (limited to 'package/kernel/mac80211/patches/323-ath9k-Fix-HW-scan-abort.patch')
-rw-r--r-- | package/kernel/mac80211/patches/323-ath9k-Fix-HW-scan-abort.patch | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/package/kernel/mac80211/patches/323-ath9k-Fix-HW-scan-abort.patch b/package/kernel/mac80211/patches/323-ath9k-Fix-HW-scan-abort.patch new file mode 100644 index 0000000000..56c0489bd1 --- /dev/null +++ b/package/kernel/mac80211/patches/323-ath9k-Fix-HW-scan-abort.patch @@ -0,0 +1,68 @@ +From: Sujith Manoharan <c_manoha@qca.qualcomm.com> +Date: Fri, 17 Oct 2014 07:40:28 +0530 +Subject: [PATCH] ath9k: Fix HW scan abort + +Instead of using ATH_CHANCTX_EVENT_ASSIGN to abort +a HW scan when a new interface becomes active, use the +mgd_prepare_tx() callback. This allows us to make +sure that the GO's channel becomes operational by +using flush_work(). + +Signed-off-by: Sujith Manoharan <c_manoha@qca.qualcomm.com> +--- + +--- a/drivers/net/wireless/ath/ath9k/channel.c ++++ b/drivers/net/wireless/ath/ath9k/channel.c +@@ -743,22 +743,6 @@ void ath_chanctx_event(struct ath_softc + ieee80211_queue_work(sc->hw, &sc->chanctx_work); + break; + case ATH_CHANCTX_EVENT_ASSIGN: +- /* +- * When adding a new channel context, check if a scan +- * is in progress and abort it since the addition of +- * a new channel context is usually followed by VIF +- * assignment, in which case we have to start multi-channel +- * operation. +- */ +- if (test_bit(ATH_OP_SCANNING, &common->op_flags)) { +- ath_dbg(common, CHAN_CTX, +- "Aborting HW scan to add new context\n"); +- +- spin_unlock_bh(&sc->chan_lock); +- del_timer_sync(&sc->offchannel.timer); +- ath_scan_complete(sc, true); +- spin_lock_bh(&sc->chan_lock); +- } + break; + case ATH_CHANCTX_EVENT_CHANGE: + break; +--- a/drivers/net/wireless/ath/ath9k/main.c ++++ b/drivers/net/wireless/ath/ath9k/main.c +@@ -2365,7 +2365,6 @@ static int ath9k_add_chanctx(struct ieee + conf->def.chan->center_freq); + + ath_chanctx_set_channel(sc, ctx, &conf->def); +- ath_chanctx_event(sc, NULL, ATH_CHANCTX_EVENT_ASSIGN); + + mutex_unlock(&sc->mutex); + return 0; +@@ -2496,6 +2495,19 @@ static void ath9k_mgd_prepare_tx(struct + if (!changed) + goto out; + ++ if (test_bit(ATH_OP_SCANNING, &common->op_flags)) { ++ ath_dbg(common, CHAN_CTX, ++ "%s: Aborting HW scan\n", __func__); ++ ++ mutex_unlock(&sc->mutex); ++ ++ del_timer_sync(&sc->offchannel.timer); ++ ath_scan_complete(sc, true); ++ flush_work(&sc->chanctx_work); ++ ++ mutex_lock(&sc->mutex); ++ } ++ + go_ctx = ath_is_go_chanctx_present(sc); + + if (go_ctx) { |