svn commit: r226691 - user/adrian/if_ath_tx/sys/dev/ath
Adrian Chadd
adrian at FreeBSD.org
Mon Oct 24 14:37:26 UTC 2011
Author: adrian
Date: Mon Oct 24 14:37:26 2011
New Revision: 226691
URL: http://svn.freebsd.org/changeset/base/226691
Log:
Add a function to restart TX DMA after it's been stopped - ath_txq_restart_dma().
This restarts DMA for a queue with frames in it.
Modified:
user/adrian/if_ath_tx/sys/dev/ath/if_ath_tx.c
user/adrian/if_ath_tx/sys/dev/ath/if_ath_tx.h
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 Mon Oct 24 14:35:31 2011 (r226690)
+++ user/adrian/if_ath_tx/sys/dev/ath/if_ath_tx.c Mon Oct 24 14:37:26 2011 (r226691)
@@ -582,6 +582,31 @@ ath_tx_handoff_hw(struct ath_softc *sc,
}
/*
+ * Restart TX DMA for the given TXQ.
+ *
+ * This must be called whether the queue is empty or not.
+ */
+void
+ath_txq_restart_dma(struct ath_softc *sc, struct ath_txq *txq)
+{
+ struct ath_hal *ah = sc->sc_ah;
+ struct ath_buf *bf;
+
+ ATH_TXQ_LOCK_ASSERT(txq);
+
+ /* This is always going to be cleared, empty or not */
+ txq->axq_flags &= ~ATH_TXQ_PUTPENDING;
+
+ bf = TAILQ_FIRST(&txq->axq_q);
+ if (bf == NULL)
+ return;
+
+ ath_hal_puttxbuf(ah, txq->axq_qnum, bf->bf_daddr);
+ txq->axq_link = &bf->bf_lastds->ds_link;
+ ath_hal_txstart(ah, txq->axq_qnum);
+}
+
+/*
* Hand off a packet to the hardware (or mcast queue.)
*
* The relevant hardware txq should be locked.
Modified: user/adrian/if_ath_tx/sys/dev/ath/if_ath_tx.h
==============================================================================
--- user/adrian/if_ath_tx/sys/dev/ath/if_ath_tx.h Mon Oct 24 14:35:31 2011 (r226690)
+++ user/adrian/if_ath_tx/sys/dev/ath/if_ath_tx.h Mon Oct 24 14:37:26 2011 (r226691)
@@ -79,6 +79,7 @@
#define BAW_WITHIN(_start, _bawsz, _seqno) \
((((_seqno) - (_start)) & 4095) < (_bawsz))
+extern void ath_txq_restart_dma(struct ath_softc *sc, struct ath_txq *txq);
extern void ath_freetx(struct mbuf *m);
extern void ath_tx_node_flush(struct ath_softc *sc, struct ath_node *an);
extern void ath_tx_txq_drain(struct ath_softc *sc, struct ath_txq *txq);
More information about the svn-src-user
mailing list