aboutsummaryrefslogtreecommitdiff
path: root/sys/dev
diff options
context:
space:
mode:
authorAdrian Chadd <adrian@FreeBSD.org>2012-06-11 07:29:25 +0000
committerAdrian Chadd <adrian@FreeBSD.org>2012-06-11 07:29:25 +0000
commit39f24578fbf17fb26fbe6f83c6b2548ffc51eb67 (patch)
tree8dad999807948e837ffacee435f09c8e8e0ed44a /sys/dev
parent4547f047bae0cee0555eaebe75a7fa53f6141ca2 (diff)
Notes
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/ath/if_ath_tx.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/sys/dev/ath/if_ath_tx.c b/sys/dev/ath/if_ath_tx.c
index d6dd07e1b795..56c57720a7f8 100644
--- a/sys/dev/ath/if_ath_tx.c
+++ b/sys/dev/ath/if_ath_tx.c
@@ -2402,7 +2402,22 @@ ath_tx_swq(struct ath_softc *sc, struct ieee80211_node *ni, struct ath_txq *txq,
/* XXX sched? */
} else if (ath_tx_ampdu_running(sc, an, tid)) {
/* AMPDU running, attempt direct dispatch if possible */
+
+ /*
+ * Always queue the frame to the tail of the list.
+ */
+ ATH_TXQ_INSERT_TAIL(atid, bf, bf_list);
+
+ /*
+ * If the hardware queue isn't busy, direct dispatch
+ * the head frame in the list. Don't schedule the
+ * TID - let it build some more frames first?
+ *
+ * Otherwise, schedule the TID.
+ */
if (txq->axq_depth < sc->sc_hwq_limit) {
+ bf = TAILQ_FIRST(&atid->axq_q);
+ ATH_TXQ_REMOVE(atid, bf, bf_list);
ath_tx_xmit_aggr(sc, an, bf);
DPRINTF(sc, ATH_DEBUG_SW_TX,
"%s: xmit_aggr\n",
@@ -2411,7 +2426,6 @@ ath_tx_swq(struct ath_softc *sc, struct ieee80211_node *ni, struct ath_txq *txq,
DPRINTF(sc, ATH_DEBUG_SW_TX,
"%s: ampdu; swq'ing\n",
__func__);
- ATH_TXQ_INSERT_TAIL(atid, bf, bf_list);
ath_tx_tid_sched(sc, atid);
}
} else if (txq->axq_depth < sc->sc_hwq_limit) {