diff options
author | Felix Fietkau <nbd@openwrt.org> | 2011-01-15 08:30:14 -0500 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2011-01-19 11:36:10 -0500 |
commit | 21f28e6f0061568b2347aa7517249fc034f949b5 (patch) | |
tree | 92bee48dc29fe4afdea80db428f40d37ff5619ae /drivers/net/wireless | |
parent | a4d6e17d3ee0f9d12474b1692f7a0574f1aab53c (diff) |
ath9k: try more than one tid when scheduling a new aggregate
Sometimes the first TID in the first AC's list is not available for forming
a new aggregate (the BAW might not allow it), however other TIDs may have
data available for sending.
Prevent a slowdown of other TIDs by going through multiple entries until
we've either hit the last one or enough AMPDUs are pending in the hardware
queue.
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless')
-rw-r--r-- | drivers/net/wireless/ath/ath9k/xmit.c | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/drivers/net/wireless/ath/ath9k/xmit.c b/drivers/net/wireless/ath/ath9k/xmit.c index ab4f7b4f789f..fffd13d204b5 100644 --- a/drivers/net/wireless/ath/ath9k/xmit.c +++ b/drivers/net/wireless/ath/ath9k/xmit.c | |||
@@ -1224,12 +1224,14 @@ void ath_tx_cleanupq(struct ath_softc *sc, struct ath_txq *txq) | |||
1224 | void ath_txq_schedule(struct ath_softc *sc, struct ath_txq *txq) | 1224 | void ath_txq_schedule(struct ath_softc *sc, struct ath_txq *txq) |
1225 | { | 1225 | { |
1226 | struct ath_atx_ac *ac; | 1226 | struct ath_atx_ac *ac; |
1227 | struct ath_atx_tid *tid; | 1227 | struct ath_atx_tid *tid, *last; |
1228 | 1228 | ||
1229 | if (list_empty(&txq->axq_acq)) | 1229 | if (list_empty(&txq->axq_acq) || |
1230 | txq->axq_ampdu_depth >= ATH_AGGR_MIN_QDEPTH) | ||
1230 | return; | 1231 | return; |
1231 | 1232 | ||
1232 | ac = list_first_entry(&txq->axq_acq, struct ath_atx_ac, list); | 1233 | ac = list_first_entry(&txq->axq_acq, struct ath_atx_ac, list); |
1234 | last = list_entry(ac->tid_q.prev, struct ath_atx_tid, list); | ||
1233 | list_del(&ac->list); | 1235 | list_del(&ac->list); |
1234 | ac->sched = false; | 1236 | ac->sched = false; |
1235 | 1237 | ||
@@ -1253,7 +1255,8 @@ void ath_txq_schedule(struct ath_softc *sc, struct ath_txq *txq) | |||
1253 | if (!list_empty(&tid->buf_q)) | 1255 | if (!list_empty(&tid->buf_q)) |
1254 | ath_tx_queue_tid(txq, tid); | 1256 | ath_tx_queue_tid(txq, tid); |
1255 | 1257 | ||
1256 | break; | 1258 | if (tid == last || txq->axq_ampdu_depth >= ATH_AGGR_MIN_QDEPTH) |
1259 | break; | ||
1257 | } while (!list_empty(&ac->tid_q)); | 1260 | } while (!list_empty(&ac->tid_q)); |
1258 | 1261 | ||
1259 | if (!list_empty(&ac->tid_q)) { | 1262 | if (!list_empty(&ac->tid_q)) { |