diff options
author | Felix Fietkau <nbd@openwrt.org> | 2011-05-19 12:20:25 +0200 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2011-06-01 15:11:00 -0400 |
commit | fce041beb03f93c7a771f0b4b6c45bb71ef90901 (patch) | |
tree | 7946e026ba6e82dd944ce956c9865b06e58d3030 /drivers/net/wireless/ath/ath9k/main.c | |
parent | e62ddec94a1e11ab1043b607e20ae0d142069132 (diff) | |
download | blackbird-op-linux-fce041beb03f93c7a771f0b4b6c45bb71ef90901.tar.gz blackbird-op-linux-fce041beb03f93c7a771f0b4b6c45bb71ef90901.zip |
ath9k: unify edma and non-edma tx code, improve tx fifo handling
EDMA based chips (AR9380+) have 8 Tx FIFO slots, which are used to fix the
tx queue start/stop race conditions which have to be worked around for
earlier chips by keeping the last descriptor in the queue. The current code
stores all frames that do not fit onto the 8 FIFO slots in a separate
list. Whenever a FIFO slot is freed up, the next frame (or A-MPDU) from the
pending queue gets moved to that slot.
This process is not only inefficient, but also unnecessary. The code can
be improved visibly by keeping the pending queue fully linked, and moving
the contents of the entire queue to a FIFO slot as it becomes available.
This patch makes the necessary changes for that and also merges some code
that was duplicated for EDMA vs non-EDMA. It changes txq->axq_link to point
to the last descriptor instead of the link pointer, so that
ath9k_hw_set_desc_link can be used, which works on all chips.
With this patch, a small performance increase for non-aggregated traffic
was observed on AR9380 based embedded hardware.
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/ath/ath9k/main.c')
-rw-r--r-- | drivers/net/wireless/ath/ath9k/main.c | 2 |
1 files changed, 0 insertions, 2 deletions
diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c index 3a6bed0f00b1..05a909443e13 100644 --- a/drivers/net/wireless/ath/ath9k/main.c +++ b/drivers/net/wireless/ath/ath9k/main.c @@ -62,8 +62,6 @@ static bool ath9k_has_pending_frames(struct ath_softc *sc, struct ath_txq *txq) if (txq->axq_depth || !list_empty(&txq->axq_acq)) pending = true; - else if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) - pending = !list_empty(&txq->txq_fifo_pending); spin_unlock_bh(&txq->axq_lock); return pending; |