summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoradrian <adrian@FreeBSD.org>2012-05-15 04:55:15 +0000
committeradrian <adrian@FreeBSD.org>2012-05-15 04:55:15 +0000
commiteceb1cf926d1a7e09a1764c6ce294ddd67a651f2 (patch)
treebffc4914fb31b3a0d30e7b115218f1db292105cc
parenta059a0e086bd1de7928ae8b3f87dfb0a15f5ae0e (diff)
downloadFreeBSD-src-eceb1cf926d1a7e09a1764c6ce294ddd67a651f2.zip
FreeBSD-src-eceb1cf926d1a7e09a1764c6ce294ddd67a651f2.tar.gz
Handle non-xretry errors the same as xretry errors for now.
Although I _should_ handle the other errors in various ways (specifically errors like FILT), treating them as having transmitted successfully is completely wrong. Here, they'd be counted as successful and the BAW would be advanced.. but the RX side wouldn't have received them. The specific errors I've been seeing here are HAL_TXERR_FILT. This patch does fix the issue - I've tested it using -i 0.001 pings (enough to start aggregation) and now the behaviour is correct: * The RX side never sees a "moved window" error, and * The TX side sends BARs as needed, with the RX side correctly handling them. PR: kern/167902
-rw-r--r--sys/dev/ath/if_ath_tx.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/sys/dev/ath/if_ath_tx.c b/sys/dev/ath/if_ath_tx.c
index 1e011f1..876d680 100644
--- a/sys/dev/ath/if_ath_tx.c
+++ b/sys/dev/ath/if_ath_tx.c
@@ -3597,9 +3597,16 @@ ath_tx_aggr_comp_aggr(struct ath_softc *sc, struct ath_buf *bf_first,
pktlen = bf_first->bf_state.bfs_pktlen;
/*
- * handle errors first
+ * Handle errors first!
+ *
+ * Here, handle _any_ error as a "exceeded retries" error.
+ * Later on (when filtered frames are to be specially handled)
+ * it'll have to be expanded.
*/
+#if 0
if (ts.ts_status & HAL_TXERR_XRETRY) {
+#endif
+ if (ts.ts_status != 0) {
ATH_TXQ_UNLOCK(sc->sc_ac2q[atid->ac]);
ath_tx_comp_aggr_error(sc, bf_first, atid);
return;
@@ -3839,7 +3846,10 @@ ath_tx_aggr_comp_unaggr(struct ath_softc *sc, struct ath_buf *bf, int fail)
* Don't bother with the retry check if all frames
* are being failed (eg during queue deletion.)
*/
+#if 0
if (fail == 0 && ts->ts_status & HAL_TXERR_XRETRY) {
+#endif
+ if (fail == 0 && ts->ts_status != 0) {
ATH_TXQ_UNLOCK(sc->sc_ac2q[atid->ac]);
DPRINTF(sc, ATH_DEBUG_SW_TX, "%s: retry_unaggr\n",
__func__);
OpenPOWER on IntegriCloud