aboutsummaryrefslogtreecommitdiffstats
path: root/package/kernel/mac80211/patches/323-ath9k-Fix-HW-scan-abort.patch
diff options
context:
space:
mode:
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.patch68
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) {