aboutsummaryrefslogtreecommitdiffstats
path: root/package/kernel/mac80211/patches/324-ath9k-Improve-flush-in-mcc-mode.patch
diff options
context:
space:
mode:
Diffstat (limited to 'package/kernel/mac80211/patches/324-ath9k-Improve-flush-in-mcc-mode.patch')
-rw-r--r--package/kernel/mac80211/patches/324-ath9k-Improve-flush-in-mcc-mode.patch95
1 files changed, 0 insertions, 95 deletions
diff --git a/package/kernel/mac80211/patches/324-ath9k-Improve-flush-in-mcc-mode.patch b/package/kernel/mac80211/patches/324-ath9k-Improve-flush-in-mcc-mode.patch
deleted file mode 100644
index 40e095b970..0000000000
--- a/package/kernel/mac80211/patches/324-ath9k-Improve-flush-in-mcc-mode.patch
+++ /dev/null
@@ -1,95 +0,0 @@
-From: Sujith Manoharan <c_manoha@qca.qualcomm.com>
-Date: Fri, 17 Oct 2014 07:40:29 +0530
-Subject: [PATCH] ath9k: Improve flush() in mcc mode
-
-The flush timeout in MCC mode is very small, since
-we are constrained by the time slice for each
-channel context, but since only the HW queues are
-flushed when switching contexts, it is acceptable.
-
-Since the SW queues are also emptied in the mac80211 flush()
-callback, a larger duration is needed. Add an override
-argument to __ath9k_flush() and set it when flush()
-is called in MCC mode. This allows the driver to
-drain both the SW and HW queues.
-
-Signed-off-by: Sujith Manoharan <c_manoha@qca.qualcomm.com>
----
-
---- a/drivers/net/wireless/ath/ath9k/ath9k.h
-+++ b/drivers/net/wireless/ath/ath9k/ath9k.h
-@@ -719,7 +719,7 @@ void ath_update_survey_nf(struct ath_sof
- void ath9k_queue_reset(struct ath_softc *sc, enum ath_reset_type type);
- void ath_ps_full_sleep(unsigned long data);
- void __ath9k_flush(struct ieee80211_hw *hw, u32 queues, bool drop,
-- bool sw_pending);
-+ bool sw_pending, bool timeout_override);
-
- /**********/
- /* BTCOEX */
---- a/drivers/net/wireless/ath/ath9k/channel.c
-+++ b/drivers/net/wireless/ath/ath9k/channel.c
-@@ -1232,11 +1232,11 @@ void ath_chanctx_set_next(struct ath_sof
- ath9k_chanctx_stop_queues(sc, sc->cur_chan);
- queues_stopped = true;
-
-- __ath9k_flush(sc->hw, ~0, true, false);
-+ __ath9k_flush(sc->hw, ~0, true, false, false);
-
- if (ath_chanctx_send_ps_frame(sc, true))
- __ath9k_flush(sc->hw, BIT(IEEE80211_AC_VO),
-- false, false);
-+ false, false, false);
-
- send_ps = true;
- spin_lock_bh(&sc->chan_lock);
---- a/drivers/net/wireless/ath/ath9k/main.c
-+++ b/drivers/net/wireless/ath/ath9k/main.c
-@@ -2031,14 +2031,33 @@ static void ath9k_flush(struct ieee80211
- u32 queues, bool drop)
- {
- struct ath_softc *sc = hw->priv;
-+ struct ath_common *common = ath9k_hw_common(sc->sc_ah);
-+
-+ if (ath9k_is_chanctx_enabled()) {
-+ if (!test_bit(ATH_OP_MULTI_CHANNEL, &common->op_flags))
-+ goto flush;
-
-+ /*
-+ * If MCC is active, extend the flush timeout
-+ * and wait for the HW/SW queues to become
-+ * empty. This needs to be done outside the
-+ * sc->mutex lock to allow the channel scheduler
-+ * to switch channel contexts.
-+ *
-+ * The vif queues have been stopped in mac80211,
-+ * so there won't be any incoming frames.
-+ */
-+ __ath9k_flush(hw, queues, drop, true, true);
-+ return;
-+ }
-+flush:
- mutex_lock(&sc->mutex);
-- __ath9k_flush(hw, queues, drop, true);
-+ __ath9k_flush(hw, queues, drop, true, false);
- mutex_unlock(&sc->mutex);
- }
-
- void __ath9k_flush(struct ieee80211_hw *hw, u32 queues, bool drop,
-- bool sw_pending)
-+ bool sw_pending, bool timeout_override)
- {
- struct ath_softc *sc = hw->priv;
- struct ath_hw *ah = sc->sc_ah;
-@@ -2059,7 +2078,10 @@ void __ath9k_flush(struct ieee80211_hw *
- }
-
- spin_lock_bh(&sc->chan_lock);
-- timeout = sc->cur_chan->flush_timeout;
-+ if (timeout_override)
-+ timeout = HZ / 5;
-+ else
-+ timeout = sc->cur_chan->flush_timeout;
- spin_unlock_bh(&sc->chan_lock);
-
- ath_dbg(common, CHAN_CTX,