mirror of
https://github.com/proski/madwifi
synced 2025-02-19 16:54:18 +03:00
The RX tasklet must process the CABQ when it is setup and non-empty, even if the HAL says it is not "active".
HAL will say the CABQ is not active if the trigger has fired and the CABQ has been serviced. Therefore, the conditions under which we were skipping CABQ are EXACTLY when we need to check it. This was leading to large numbers of rx buffers consumed in the CABQ (multicast, etc) and thus the RX queue would deteriorate over time until RX overruns would eventually start to be a big problem. I also include better diagnostics. git-svn-id: http://madwifi-project.org/svn/madwifi/trunk@3502 0192ed92-7a03-0410-a25b-9323aeb14dbd
This commit is contained in:
parent
7c6997619e
commit
9148c7a79a
27
ath/if_ath.c
27
ath/if_ath.c
@ -8357,8 +8357,17 @@ ath_tx_tasklet_q0123(TQUEUE_ARG data)
|
||||
ath_tx_processq(sc, &sc->sc_txq[2]);
|
||||
if (txqactive(sc->sc_ah, 3))
|
||||
ath_tx_processq(sc, &sc->sc_txq[3]);
|
||||
if (txqactive(sc->sc_ah, sc->sc_cabq->axq_qnum))
|
||||
if (ATH_TXQ_SETUP(sc, sc->sc_cabq->axq_qnum)
|
||||
&& sc->sc_cabq->axq_depth) {
|
||||
DPRINTF(sc, ATH_DEBUG_BEACON,
|
||||
"Processing CABQ... it is active in HAL.\n");
|
||||
ath_tx_processq(sc, sc->sc_cabq);
|
||||
}
|
||||
else {
|
||||
DPRINTF(sc, ATH_DEBUG_BEACON,
|
||||
"NOT processing CABQ... it is %s.\n",
|
||||
sc->sc_cabq->axq_depth ? "not setup" : "empty");
|
||||
}
|
||||
#ifdef ATH_SUPERG_XR
|
||||
if (sc->sc_xrtxq && txqactive(sc->sc_ah, sc->sc_xrtxq->axq_qnum))
|
||||
ath_tx_processq(sc, sc->sc_xrtxq);
|
||||
@ -8384,10 +8393,20 @@ ath_tx_tasklet(TQUEUE_ARG data)
|
||||
|
||||
/* Process each active queue. This includes sc_cabq, sc_xrtq and
|
||||
* sc_uapsdq */
|
||||
for (i = 0; i < HAL_NUM_TX_QUEUES; i++)
|
||||
if (ATH_TXQ_SETUP(sc, i) && txqactive(sc->sc_ah, i))
|
||||
for (i = 0; i < HAL_NUM_TX_QUEUES; i++) {
|
||||
if (ATH_TXQ_SETUP(sc, i) && (txqactive(sc->sc_ah, i) ||
|
||||
(sc->sc_cabq->axq_qnum == i))) {
|
||||
if (sc->sc_cabq->axq_qnum == i)
|
||||
DPRINTF(sc, ATH_DEBUG_BEACON,
|
||||
"Processing CABQ... it is setup and active in HAL.\n");
|
||||
ath_tx_processq(sc, &sc->sc_txq[i]);
|
||||
|
||||
}
|
||||
else if (sc->sc_cabq->axq_qnum == i) { /* is CABQ */
|
||||
DPRINTF(sc, ATH_DEBUG_BEACON,
|
||||
"NOT processing CABQ... it is %s.\n",
|
||||
sc->sc_cabq->axq_depth ? "not setup" : "empty");
|
||||
}
|
||||
}
|
||||
netif_wake_queue(dev);
|
||||
|
||||
if (sc->sc_softled)
|
||||
|
Loading…
x
Reference in New Issue
Block a user