svn commit: r240926 - head/sys/dev/ath
Adrian Chadd
adrian at FreeBSD.org
Tue Sep 25 20:41:43 UTC 2012
Author: adrian
Date: Tue Sep 25 20:41:43 2012
New Revision: 240926
URL: http://svn.freebsd.org/changeset/base/240926
Log:
Oops - don't do the clrdmask check in ath_tx_xmit_normal() - the wrong
lock may be held.
Kim reported that the TID lock wasn't held when ath_tx_update_clrdmask()
was called. Well, the underlying hardware TXQ for that TID.
I'm betting it's the cabq stuff. ath_tx_xmit_normal() can be called
for both real and software cabq. For software cabq, the real destination
txq is different to the txq. So, the lock check will fail.
Reported by: Kim Culhan <w8hdkim at gmail.com>
Modified:
head/sys/dev/ath/if_ath_tx.c
Modified: head/sys/dev/ath/if_ath_tx.c
==============================================================================
--- head/sys/dev/ath/if_ath_tx.c Tue Sep 25 20:27:42 2012 (r240925)
+++ head/sys/dev/ath/if_ath_tx.c Tue Sep 25 20:41:43 2012 (r240926)
@@ -1356,9 +1356,6 @@ ath_tx_xmit_normal(struct ath_softc *sc,
*/
bf->bf_state.bfs_txflags |= HAL_TXDESC_CLRDMASK;
- /* See if clrdmask needs to be set */
- ath_tx_update_clrdmask(sc, tid, bf);
-
/* Setup the descriptor before handoff */
ath_tx_do_ratelookup(sc, bf);
ath_tx_calc_duration(sc, bf);
@@ -2820,6 +2817,8 @@ ath_tx_swq(struct ath_softc *sc, struct
} else if (txq->axq_depth < sc->sc_hwq_limit) {
/* AMPDU not running, attempt direct dispatch */
DPRINTF(sc, ATH_DEBUG_SW_TX, "%s: xmit_normal\n", __func__);
+ /* See if clrdmask needs to be set */
+ ath_tx_update_clrdmask(sc, atid, bf);
ath_tx_xmit_normal(sc, txq, bf);
} else {
/* Busy; queue */
More information about the svn-src-head
mailing list