From: Sujith Manoharan <sujith@msujith.org>
To: John Linville <linville@tuxdriver.com>
Cc: linux-wireless@vger.kernel.org, ath9k-devel@qca.qualcomm.com
Subject: [PATCH v2 11/23] ath9k: Check for pending frames properly
Date: Fri, 17 Oct 2014 07:40:18 +0530 [thread overview]
Message-ID: <1413511830-5536-12-git-send-email-sujith@msujith.org> (raw)
In-Reply-To: <1413511830-5536-1-git-send-email-sujith@msujith.org>
From: Sujith Manoharan <c_manoha@qca.qualcomm.com>
Pending frames in the driver can be present
either in the HW queues or SW. ath9k_has_pending_frames()
currently checks for the HW queues first and then
checks if any ACs are queued in the driver.
In MCC mode, we need to check the HW queues alone, since
the SW queues are just marked as 'stopped' - they will
be processed in the next context switch. But since we
don't differentiate this now, mention whether we want
to check if there are frames in the SW queues.
* The flush() callback checks both HW and SW queues.
* The tx_frames_pending() callback does the same.
* The call to __ath9k_flush() in MCC mode checks HW queues alone.
Signed-off-by: Sujith Manoharan <c_manoha@qca.qualcomm.com>
---
drivers/net/wireless/ath/ath9k/ath9k.h | 3 ++-
drivers/net/wireless/ath/ath9k/channel.c | 5 +++--
drivers/net/wireless/ath/ath9k/main.c | 21 ++++++++++++++-------
3 files changed, 19 insertions(+), 10 deletions(-)
diff --git a/drivers/net/wireless/ath/ath9k/ath9k.h b/drivers/net/wireless/ath/ath9k/ath9k.h
index 43c1987..d4b71ed 100644
--- a/drivers/net/wireless/ath/ath9k/ath9k.h
+++ b/drivers/net/wireless/ath/ath9k/ath9k.h
@@ -715,7 +715,8 @@ int ath_update_survey_stats(struct ath_softc *sc);
void ath_update_survey_nf(struct ath_softc *sc, int channel);
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);
+void __ath9k_flush(struct ieee80211_hw *hw, u32 queues, bool drop,
+ bool sw_pending);
/**********/
/* BTCOEX */
diff --git a/drivers/net/wireless/ath/ath9k/channel.c b/drivers/net/wireless/ath/ath9k/channel.c
index abc3e2e..9c4f872 100644
--- a/drivers/net/wireless/ath/ath9k/channel.c
+++ b/drivers/net/wireless/ath/ath9k/channel.c
@@ -1137,10 +1137,11 @@ void ath_chanctx_set_next(struct ath_softc *sc, bool force)
ath9k_chanctx_stop_queues(sc, sc->cur_chan);
queues_stopped = true;
- __ath9k_flush(sc->hw, ~0, true);
+ __ath9k_flush(sc->hw, ~0, true, false);
if (ath_chanctx_send_ps_frame(sc, true))
- __ath9k_flush(sc->hw, BIT(IEEE80211_AC_VO), false);
+ __ath9k_flush(sc->hw, BIT(IEEE80211_AC_VO),
+ false, false);
send_ps = true;
spin_lock_bh(&sc->chan_lock);
diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c
index 81a20de..2048ef1 100644
--- a/drivers/net/wireless/ath/ath9k/main.c
+++ b/drivers/net/wireless/ath/ath9k/main.c
@@ -54,7 +54,8 @@ u8 ath9k_parse_mpdudensity(u8 mpdudensity)
}
}
-static bool ath9k_has_pending_frames(struct ath_softc *sc, struct ath_txq *txq)
+static bool ath9k_has_pending_frames(struct ath_softc *sc, struct ath_txq *txq,
+ bool sw_pending)
{
bool pending = false;
@@ -65,6 +66,9 @@ static bool ath9k_has_pending_frames(struct ath_softc *sc, struct ath_txq *txq)
goto out;
}
+ if (!sw_pending)
+ goto out;
+
if (txq->mac80211_qnum >= 0) {
struct list_head *list;
@@ -2003,7 +2007,8 @@ static void ath9k_set_coverage_class(struct ieee80211_hw *hw,
mutex_unlock(&sc->mutex);
}
-static bool ath9k_has_tx_pending(struct ath_softc *sc)
+static bool ath9k_has_tx_pending(struct ath_softc *sc,
+ bool sw_pending)
{
int i, npend = 0;
@@ -2011,7 +2016,8 @@ static bool ath9k_has_tx_pending(struct ath_softc *sc)
if (!ATH_TXQ_SETUP(sc, i))
continue;
- npend = ath9k_has_pending_frames(sc, &sc->tx.txq[i]);
+ npend = ath9k_has_pending_frames(sc, &sc->tx.txq[i],
+ sw_pending);
if (npend)
break;
}
@@ -2025,11 +2031,12 @@ static void ath9k_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
struct ath_softc *sc = hw->priv;
mutex_lock(&sc->mutex);
- __ath9k_flush(hw, queues, drop);
+ __ath9k_flush(hw, queues, drop, true);
mutex_unlock(&sc->mutex);
}
-void __ath9k_flush(struct ieee80211_hw *hw, u32 queues, bool drop)
+void __ath9k_flush(struct ieee80211_hw *hw, u32 queues, bool drop,
+ bool sw_pending)
{
struct ath_softc *sc = hw->priv;
struct ath_hw *ah = sc->sc_ah;
@@ -2056,7 +2063,7 @@ void __ath9k_flush(struct ieee80211_hw *hw, u32 queues, bool drop)
ath_dbg(common, CHAN_CTX,
"Flush timeout: %d\n", jiffies_to_msecs(timeout));
- if (wait_event_timeout(sc->tx_wait, !ath9k_has_tx_pending(sc),
+ if (wait_event_timeout(sc->tx_wait, !ath9k_has_tx_pending(sc, sw_pending),
timeout) > 0)
drop = false;
@@ -2079,7 +2086,7 @@ static bool ath9k_tx_frames_pending(struct ieee80211_hw *hw)
{
struct ath_softc *sc = hw->priv;
- return ath9k_has_tx_pending(sc);
+ return ath9k_has_tx_pending(sc, true);
}
static int ath9k_tx_last_beacon(struct ieee80211_hw *hw)
--
2.1.2
next prev parent reply other threads:[~2014-10-17 2:10 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-10-17 2:10 [PATCH v2 00/23] ath9k patches Sujith Manoharan
2014-10-17 2:10 ` [PATCH v2 01/23] ath9k: Use sta_state() callback Sujith Manoharan
2014-10-17 2:10 ` [PATCH v2 02/23] ath9k: Enable multi-channel properly Sujith Manoharan
2014-10-17 2:10 ` [PATCH v2 03/23] ath9k: Process beacons properly Sujith Manoharan
2014-10-17 2:10 ` [PATCH v2 04/23] ath9k: Unify reset API Sujith Manoharan
2014-10-17 2:10 ` [PATCH v2 05/23] ath9k: Set ATH_OP_HW_RESET before HW reset Sujith Manoharan
2014-10-17 2:10 ` [PATCH v2 06/23] ath9k: Disable beacon tasklet during reset Sujith Manoharan
2014-10-17 2:10 ` [PATCH v2 07/23] ath9k: Clear NoA schedule properly Sujith Manoharan
2014-10-17 2:10 ` [PATCH v2 08/23] ath9k: Use configurable timeout for flush Sujith Manoharan
2014-10-17 2:10 ` [PATCH v2 09/23] ath9k: Fix MCC flush timeout Sujith Manoharan
2014-10-17 2:10 ` [PATCH v2 10/23] ath9k: Fix offchannel " Sujith Manoharan
2014-10-17 2:10 ` Sujith Manoharan [this message]
2014-10-17 2:10 ` [PATCH v2 12/23] ath9k: Send AUTHORIZED event only for station mode Sujith Manoharan
2014-10-17 2:10 ` [PATCH v2 13/23] ath9k: Fix address management Sujith Manoharan
2014-10-17 2:10 ` [PATCH v2 14/23] ath9k: Add a function to check for an active GO Sujith Manoharan
2014-10-17 2:10 ` [PATCH v2 15/23] ath9k: Check for active GO in mgd_prepare_tx() Sujith Manoharan
2014-10-17 2:10 ` [PATCH v2 16/23] ath9k: Use a helper function for offchannel NoA Sujith Manoharan
2014-10-17 2:10 ` [PATCH v2 17/23] ath9k: Use a helper function to set NoA Sujith Manoharan
2014-10-17 2:10 ` [PATCH v2 18/23] ath9k: Use a helper function for bmiss Sujith Manoharan
2014-10-17 2:10 ` [PATCH v2 19/23] ath9k: Fix RoC expiration Sujith Manoharan
2014-10-17 2:10 ` [PATCH v2 20/23] ath9k: Send oneshot NoA Sujith Manoharan
2014-10-17 2:10 ` [PATCH v2 21/23] ath9k: Fix HW scan abort Sujith Manoharan
2014-10-17 2:10 ` [PATCH v2 22/23] ath9k: Improve flush() in mcc mode Sujith Manoharan
2014-10-17 2:10 ` [PATCH v2 23/23] ath9k: Do not start BA when scanning Sujith Manoharan
2014-10-20 9:30 ` Johannes Berg
2014-10-20 9:39 ` Sujith Manoharan
2014-10-20 10:38 ` Johannes Berg
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1413511830-5536-12-git-send-email-sujith@msujith.org \
--to=sujith@msujith.org \
--cc=ath9k-devel@qca.qualcomm.com \
--cc=linux-wireless@vger.kernel.org \
--cc=linville@tuxdriver.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox