aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/ath
diff options
context:
space:
mode:
authorAdrian Chadd <adrian@FreeBSD.org>2016-06-20 02:04:40 +0000
committerAdrian Chadd <adrian@FreeBSD.org>2016-06-20 02:04:40 +0000
commit1a9bf047c2c4a3bd5c5c0fe1603e33a282b5dc01 (patch)
tree78f9f60289f902cb54a0162b312dbcca9bc78f52 /sys/dev/ath
parentced91c3c20f6697c7f17b9281bb92bfc3a6745ee (diff)
downloadsrc-1a9bf047c2c4a3bd5c5c0fe1603e33a282b5dc01.tar.gz
src-1a9bf047c2c4a3bd5c5c0fe1603e33a282b5dc01.zip
[ath] fix EDMA TX buffer flags for use when retransmitting frames.
This started showing up when doing lots of aggregate traffic. For TDMA it's always no-ACK traffic and I didn't notice this, and I didn't notice it when doing 11abg traffic as it didn't fail enough in a bad way to trigger this. This showed up as the fifo depth being < 0. Eg: Jun 19 09:23:07 gertrude kernel: ath0: ath_tx_edma_push_staging_list: queued 2 packets; depth=2, fifo depth=1 Jun 19 09:23:07 gertrude kernel: ath0: ath_edma_tx_processq: Q1, bf=0xfffffe000385f068, start=1, end=1 Jun 19 09:23:07 gertrude kernel: ath0: ath_edma_tx_processq: Q1: FIFO depth is now 0 (1) Jun 19 09:23:07 gertrude kernel: ath0: ath_edma_tx_processq: Q1, bf=0xfffffe0003866fe8, start=0, end=1 Jun 19 09:23:07 gertrude kernel: ath0: ath_edma_tx_processq: Q1: FIFO depth is now -1 (0) So, clear the flags before adding them to a TX queue, so if they're re-added for the retransmit path it'll clear whatever they were and not double-account the FIFOEND flag. Oops. Tested: * AR9380, STA mode, 11n iperf testing (~130mbit) Approved by: re (delphij)
Notes
Notes: svn path=/head/; revision=302024
Diffstat (limited to 'sys/dev/ath')
-rw-r--r--sys/dev/ath/if_ath_tx_edma.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/sys/dev/ath/if_ath_tx_edma.c b/sys/dev/ath/if_ath_tx_edma.c
index c9720199fc6f..4cad0ce5cefe 100644
--- a/sys/dev/ath/if_ath_tx_edma.c
+++ b/sys/dev/ath/if_ath_tx_edma.c
@@ -192,6 +192,9 @@ ath_tx_edma_push_staging_list(struct ath_softc *sc, struct ath_txq *txq,
/* Queue it into our staging list */
TAILQ_INSERT_TAIL(&sq, bf, bf_list);
+
+ /* Ensure the flags are cleared */
+ bf->bf_flags &= ~(ATH_BUF_FIFOPTR | ATH_BUF_FIFOEND);
sqdepth++;
}