svn commit: r226017 - user/adrian/if_ath_tx/sys/dev/ath
Adrian Chadd
adrian at FreeBSD.org
Tue Oct 4 17:32:01 UTC 2011
Author: adrian
Date: Tue Oct 4 17:32:01 2011
New Revision: 226017
URL: http://svn.freebsd.org/changeset/base/226017
Log:
Don't bother updating the txq active bitmap every call to ath_intr(),
just do it when HAL_INT_TX is set. This should have the same behaviour.
Modified:
user/adrian/if_ath_tx/sys/dev/ath/if_ath.c
Modified: user/adrian/if_ath_tx/sys/dev/ath/if_ath.c
==============================================================================
--- user/adrian/if_ath_tx/sys/dev/ath/if_ath.c Tue Oct 4 17:27:10 2011 (r226016)
+++ user/adrian/if_ath_tx/sys/dev/ath/if_ath.c Tue Oct 4 17:32:01 2011 (r226017)
@@ -1382,29 +1382,6 @@ ath_intr(void *arg)
ah->ah_intrstate[6]);
status &= sc->sc_imask; /* discard unasked for bits */
- /*
- * This has now updated the txqactive bits, so
- * we should fetch them from the HAL and merge them
- * into sc->sc_txq_active. That way we won't miss out
- * where one CPU clears the txq bit whilst the other CPU
- * sets it.
- *
- * The HAL updates it if the relevant TX status bits are set
- * in the status registers, regardless of whether the status
- * caused the interrupt and/or is set in sc_imask.
- * Hence we update the bits before we check for status == 0.
- */
- ATH_LOCK(sc);
- /*
- * This returns the txq bits in the given mask and blanks them.
- * Since it's only ever set and cleared by the HAL and we are now
- * doing it in ath_intr(), it's effectively non-racey.
- */
- txqs = 0xffffffff;
- ath_hal_gettxintrtxqs(sc->sc_ah, &txqs);
- sc->sc_txq_active |= txqs;
- ATH_UNLOCK(sc);
-
/* Short-circuit un-handled interrupts */
if (status == 0x0)
return;
@@ -1501,6 +1478,17 @@ ath_intr(void *arg)
if (status & HAL_INT_TX) {
sc->sc_stats.ast_tx_intr++;
taskqueue_enqueue_fast(sc->sc_tq, &sc->sc_txtask);
+
+ /*
+ * Grab all the currently set bits in the HAL txq bitmap
+ * and blank them. This is the only place we should be
+ * doing this.
+ */
+ ATH_LOCK(sc);
+ txqs = 0xffffffff;
+ ath_hal_gettxintrtxqs(sc->sc_ah, &txqs);
+ sc->sc_txq_active |= txqs;
+ ATH_UNLOCK(sc);
}
if (status & HAL_INT_BMISS) {
sc->sc_stats.ast_bmiss++;
More information about the svn-src-user
mailing list