diff options
author | Adrian Chadd <adrian@FreeBSD.org> | 2016-06-20 02:04:40 +0000 |
---|---|---|
committer | Adrian Chadd <adrian@FreeBSD.org> | 2016-06-20 02:04:40 +0000 |
commit | 1a9bf047c2c4a3bd5c5c0fe1603e33a282b5dc01 (patch) | |
tree | 78f9f60289f902cb54a0162b312dbcca9bc78f52 /sys/dev/ath | |
parent | ced91c3c20f6697c7f17b9281bb92bfc3a6745ee (diff) | |
download | src-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.c | 3 |
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++; } |