Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 31 Jul 2012 02:28:32 +0000 (UTC)
From:      Adrian Chadd <adrian@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r238930 - head/sys/dev/ath
Message-ID:  <201207310228.q6V2SWhl075470@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: adrian
Date: Tue Jul 31 02:28:32 2012
New Revision: 238930
URL: http://svn.freebsd.org/changeset/base/238930

Log:
  Break out the hardware handoff and TX DMA restart code into methods.
  
  These (and a few others) will differ based on the underlying DMA
  implementation.
  
  For the EDMA NICs, simply stub them out in a fashion which will let
  me focus on implementing the necessary descriptor API changes.

Modified:
  head/sys/dev/ath/if_ath_tx.c
  head/sys/dev/ath/if_ath_tx.h
  head/sys/dev/ath/if_ath_tx_edma.c

Modified: head/sys/dev/ath/if_ath_tx.c
==============================================================================
--- head/sys/dev/ath/if_ath_tx.c	Tue Jul 31 02:18:10 2012	(r238929)
+++ head/sys/dev/ath/if_ath_tx.c	Tue Jul 31 02:28:32 2012	(r238930)
@@ -639,8 +639,8 @@ ath_tx_handoff_hw(struct ath_softc *sc, 
  *
  * This must be called whether the queue is empty or not.
  */
-void
-ath_txq_restart_dma(struct ath_softc *sc, struct ath_txq *txq)
+static void
+ath_legacy_tx_dma_restart(struct ath_softc *sc, struct ath_txq *txq)
 {
 	struct ath_hal *ah = sc->sc_ah;
 	struct ath_buf *bf, *bf_last;
@@ -668,7 +668,8 @@ ath_txq_restart_dma(struct ath_softc *sc
  * The relevant hardware txq should be locked.
  */
 static void
-ath_tx_handoff(struct ath_softc *sc, struct ath_txq *txq, struct ath_buf *bf)
+ath_legacy_xmit_handoff(struct ath_softc *sc, struct ath_txq *txq,
+    struct ath_buf *bf)
 {
 	ATH_TXQ_LOCK_ASSERT(txq);
 
@@ -4493,4 +4494,7 @@ ath_xmit_setup_legacy(struct ath_softc *
 
 	sc->sc_tx.xmit_setup = ath_legacy_dma_txsetup;
 	sc->sc_tx.xmit_teardown = ath_legacy_dma_txteardown;
+
+	sc->sc_tx.xmit_dma_restart = ath_legacy_tx_dma_restart;
+	sc->sc_tx.xmit_handoff = ath_legacy_xmit_handoff;
 }

Modified: head/sys/dev/ath/if_ath_tx.h
==============================================================================
--- head/sys/dev/ath/if_ath_tx.h	Tue Jul 31 02:18:10 2012	(r238929)
+++ head/sys/dev/ath/if_ath_tx.h	Tue Jul 31 02:28:32 2012	(r238930)
@@ -79,7 +79,6 @@
 #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);
@@ -131,6 +130,10 @@ extern	void ath_addba_response_timeout(s
 	(_sc)->sc_tx.xmit_setup(_sc)
 #define	ath_txdma_teardown(_sc)			\
 	(_sc)->sc_tx.xmit_teardown(_sc)
+#define	ath_txq_restart_dma(_sc, _txq)		\
+	(_sc)->sc_tx.xmit_dma_restart((_sc), (_txq))
+#define	ath_tx_handoff(_sc, _txq, _bf)		\
+	(_sc)->sc_tx.xmit_handoff((_sc), (_txq), (_bf))
 extern	void ath_xmit_setup_legacy(struct ath_softc *sc);
 
 #endif

Modified: head/sys/dev/ath/if_ath_tx_edma.c
==============================================================================
--- head/sys/dev/ath/if_ath_tx_edma.c	Tue Jul 31 02:18:10 2012	(r238929)
+++ head/sys/dev/ath/if_ath_tx_edma.c	Tue Jul 31 02:28:32 2012	(r238930)
@@ -130,6 +130,62 @@ __FBSDID("$FreeBSD$");
 
 MALLOC_DECLARE(M_ATHDEV);
 
+/*
+ * Re-initialise the DMA FIFO with the current contents of
+ * said FIFO.
+ *
+ * This should only be called as part of the chip reset path, as it
+ * assumes the FIFO is currently empty.
+ *
+ * TODO: verify that a cold/warm reset does clear the TX FIFO, so
+ * writing in a partially-filled FIFO will not cause double-entries
+ * to appear.
+ */
+static void
+ath_edma_dma_restart(struct ath_softc *sc, struct ath_txq *txq)
+{
+
+	device_printf(sc->sc_dev, "%s: called: txq=%p, qnum=%d\n",
+	    __func__,
+	    txq,
+	    txq->axq_qnum);
+}
+
+/*
+ * Handoff this frame to the hardware.
+ *
+ * For the multicast queue, this will treat it as a software queue
+ * and append it to the list, after updating the MORE_DATA flag
+ * in the previous frame.  The cabq processing code will ensure
+ * that the queue contents gets transferred over.
+ *
+ * For the hardware queues, this will queue a frame to the queue
+ * like before, then populate the FIFO from that.  Since the
+ * EDMA hardware has 8 FIFO slots per TXQ, this ensures that
+ * frames such as management frames don't get prematurely dropped.
+ *
+ * This does imply that a similar flush-hwq-to-fifoq method will
+ * need to be called from the processq function, before the
+ * per-node software scheduler is called.
+ */
+static void
+ath_edma_xmit_handoff(struct ath_softc *sc, struct ath_txq *txq,
+    struct ath_buf *bf)
+{
+
+	device_printf(sc->sc_dev, "%s: called; bf=%p, txq=%p, qnum=%d\n",
+	    __func__,
+	    bf,
+	    txq,
+	    txq->axq_qnum);
+
+	/*
+	 * XXX For now this is a placeholder; free the buffer
+	 * and inform the stack that the TX failed.
+	 */
+	ath_tx_default_comp(sc, bf, 1);
+}
+
 static int
 ath_edma_setup_txfifo(struct ath_softc *sc, int qnum)
 {
@@ -217,4 +273,7 @@ ath_xmit_setup_edma(struct ath_softc *sc
 
 	sc->sc_tx.xmit_setup = ath_edma_dma_txsetup;
 	sc->sc_tx.xmit_teardown = ath_edma_dma_txteardown;
+
+	sc->sc_tx.xmit_dma_restart = ath_edma_dma_restart;
+	sc->sc_tx.xmit_handoff = ath_edma_xmit_handoff;
 }



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201207310228.q6V2SWhl075470>