Date: Fri, 19 Aug 2011 06:33:41 +0000 (UTC) From: Adrian Chadd <adrian@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r224995 - user/adrian/if_ath_tx/sys/dev/ath Message-ID: <201108190633.p7J6Xflp090849@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: adrian Date: Fri Aug 19 06:33:40 2011 New Revision: 224995 URL: http://svn.freebsd.org/changeset/base/224995 Log: * Disable BAR sending for now, I'm still not entirely convinced that it's all setup correctly and the right BAW left edge value is being sent (ie, I think I need to add some locking to ensure that new values aren't allocated by the TX send context, as completion and TX occur in different thread/processes.) I'll revisit correct BAR TX'ing later on. * Add/change some debugging around to make tracking down strange sequence number issues easier. And the actual bugfix: * re-schedule the TID for more TX scheduling after the aggregate completion handler is run - either the error handler (which retries all subframes if possible) or after the completion handler itself. In both instances, since packets may be requeued on the software queue, the TID needs rescheduling. Without this, I noticed the throughput would drop immediately when any retries occured, and lots of frames were being scheduled later on when I was issuing a single ICMP ping. That ping was causing the software queue to be scheduled, and lots of frames were thus being re-scheduled to the hardware (and updating the BAW in the process.) With this, things are stable. Slow (same as non-aggregate speed) and the software retry rate is too high for my liking, but packets now seem to zip along. Modified: user/adrian/if_ath_tx/sys/dev/ath/if_ath_tx.c Modified: user/adrian/if_ath_tx/sys/dev/ath/if_ath_tx.c ============================================================================== --- user/adrian/if_ath_tx/sys/dev/ath/if_ath_tx.c Fri Aug 19 02:37:13 2011 (r224994) +++ user/adrian/if_ath_tx/sys/dev/ath/if_ath_tx.c Fri Aug 19 06:33:40 2011 (r224995) @@ -395,8 +395,9 @@ ath_tx_setds_11n(struct ath_softc *sc, s bf = bf_first; while (bf != NULL) { DPRINTF(sc, ATH_DEBUG_SW_TX_AGGR, - "%s: bf=%p, nseg=%d, pktlen=%d\n", - __func__, bf, bf->bf_nseg, bf->bf_state.bfs_pktlen); + "%s: bf=%p, nseg=%d, pktlen=%d, seqno=%d\n", + __func__, bf, bf->bf_nseg, bf->bf_state.bfs_pktlen, + SEQNO(bf->bf_state.bfs_seqno)); /* Sub-frame setup */ ath_tx_chaindesclist_subframe(sc, bf); @@ -2322,6 +2323,7 @@ ath_tx_aggr_retry_unaggr(struct ath_soft * This'll end up going into net80211 and back out * again, via ic->ic_raw_xmit(). */ +#if 0 DPRINTF(sc, ATH_DEBUG_SW_TX_CTRL, "%s: TID %d: send BAR\n", __func__, tid); if (ieee80211_send_bar(ni, tap, ni->ni_txseqs[tid]) == 0) { @@ -2337,6 +2339,7 @@ ath_tx_aggr_retry_unaggr(struct ath_soft "%s: TID %d: BAR TX failed\n", __func__, tid); } +#endif /* Free buffer, bf is free after this call */ ath_tx_default_comp(sc, bf, 0); @@ -2438,6 +2441,7 @@ ath_tx_comp_aggr_error(struct ath_softc ath_bufhead bf_q; int drops = 0; struct ieee80211_tx_ampdu *tap; + struct ath_txq *txq = sc->sc_ac2q[tid->ac]; tap = ath_tx_get_tx_tid(an, tid->tid); @@ -2482,6 +2486,13 @@ ath_tx_comp_aggr_error(struct ath_softc ATH_TXQ_INSERT_HEAD(tid, bf, bf_list); } ATH_TXQ_UNLOCK(tid); + + /* + * Kick the queue + */ + ATH_TXQ_LOCK(txq); + ath_tx_tid_sched(sc, an, tid->tid); + ATH_TXQ_UNLOCK(txq); } /* @@ -2541,6 +2552,7 @@ ath_tx_aggr_comp_aggr(struct ath_softc * struct ath_buf *bf, *bf_next; int ba_index; int drops = 0; + struct ath_txq *txq = sc->sc_ac2q[atid->ac]; DPRINTF(sc, ATH_DEBUG_SW_TX_AGGR, "%s: called\n", __func__); @@ -2596,12 +2608,14 @@ ath_tx_aggr_comp_aggr(struct ath_softc * bf = bf_first; while (bf) { - DPRINTF(sc, ATH_DEBUG_SW_TX_AGGR, "%s: checking bf=%p seqno=%d\n", - __func__, bf, SEQNO(bf->bf_state.bfs_seqno)); - ba_index = ATH_BA_INDEX(seq_st, SEQNO(bf->bf_state.bfs_seqno)); bf_next = bf->bf_next; + DPRINTF(sc, ATH_DEBUG_SW_TX_AGGR, + "%s: checking bf=%p seqno=%d; ack=%d\n", + __func__, bf, SEQNO(bf->bf_state.bfs_seqno), + ATH_BA_ISSET(ba, ba_index)); + /* * For now, ACK all packets */ @@ -2648,6 +2662,14 @@ ath_tx_aggr_comp_aggr(struct ath_softc * } ATH_TXQ_UNLOCK(atid); + /* + * Kick the queue if it needs it + * XXX too aggressive? + */ + ATH_TXQ_LOCK(txq); + ath_tx_tid_sched(sc, an, atid->tid); + ATH_TXQ_UNLOCK(txq); + DPRINTF(sc, ATH_DEBUG_SW_TX_AGGR, "%s: finished; txa_start now %d\n", __func__, tap->txa_start); }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201108190633.p7J6Xflp090849>