svn commit: r242880 - head/sys/dev/ath
Adrian Chadd
adrian at FreeBSD.org
Sat Nov 10 22:37:07 UTC 2012
Author: adrian
Date: Sat Nov 10 22:37:06 2012
New Revision: 242880
URL: http://svnweb.freebsd.org/changeset/base/242880
Log:
Correct some rather weird and broken behaviour observed when doing
actual traffic with an AR9380/AR9382/AR9485.
The sample rate control stats would show impossibly large numbers for
"successful packets transmitted." The number was a tad under 2^^64-1.
So after a bit of digging, I found that the sample rate control code
was making 'tries' turn into a negative number.. and this was because
ts_longretry was too small.
The hardware returns "ts_longretry" at the current rate selection,
not overall for that TX descriptor. So if you setup four TX rate
scenarios and the second one works, ts_longretry is only set for
the number of attempts at that second rate scenario. The FreeBSD HAL
code does the correction in ath_hal_proctxdesc() - however, this isn't
possible with EDMA.
EDMA TX completion is done separate from the original TX descriptor.
So the real solution is to split out "find ts_rate and ts_longretry"
from "complete TX descriptor". Until that's done, put a hack in
the EDMA TX path that uses the rate scenario information in the ath_buf.
Tested: AR9380, AR9382, AR9485 STA mode
Modified:
head/sys/dev/ath/if_ath_tx_edma.c
Modified: head/sys/dev/ath/if_ath_tx_edma.c
==============================================================================
--- head/sys/dev/ath/if_ath_tx_edma.c Sat Nov 10 21:22:10 2012 (r242879)
+++ head/sys/dev/ath/if_ath_tx_edma.c Sat Nov 10 22:37:06 2012 (r242880)
@@ -594,13 +594,26 @@ ath_edma_tx_processq(struct ath_softc *s
* in the TX descriptor. However the TX completion
* FIFO doesn't have this information. So here we
* do a separate HAL call to populate that information.
+ *
+ * The same problem exists with ts_longretry.
+ * The FreeBSD HAL corrects ts_longretry in the HAL layer;
+ * the AR9380 HAL currently doesn't. So until the HAL
+ * is imported and this can be added, we correct for it
+ * here.
*/
-
/* XXX TODO */
/* XXX faked for now. Ew. */
if (ts.ts_finaltsi < 4) {
ts.ts_rate =
bf->bf_state.bfs_rc[ts.ts_finaltsi].ratecode;
+ switch (ts.ts_finaltsi) {
+ case 3: ts.ts_longretry +=
+ bf->bf_state.bfs_rc[2].tries;
+ case 2: ts.ts_longretry +=
+ bf->bf_state.bfs_rc[1].tries;
+ case 1: ts.ts_longretry +=
+ bf->bf_state.bfs_rc[0].tries;
+ }
} else {
device_printf(sc->sc_dev, "%s: finaltsi=%d\n",
__func__,
More information about the svn-src-all
mailing list