Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 5 Sep 2011 23:09:51 GMT
From:      Jakub Wojciech Klama <jceel@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 198601 for review
Message-ID:  <201109052309.p85N9pN2038252@skunkworks.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://p4web.freebsd.org/@@198601?ac=10

Change 198601 by jceel@jceel_cyclone on 2011/09/05 23:09:26

	Implement lpe_txintr() allowing to properly free unused mbufs
	and unload DMA maps.

Affected files ...

.. //depot/projects/soc2011/jceel_lpc/sys/arm/lpc/if_lpe.c#8 edit

Differences ...

==== //depot/projects/soc2011/jceel_lpc/sys/arm/lpc/if_lpe.c#8 (text+ko) ====

@@ -103,9 +103,8 @@
 	struct lpe_rxdesc	lpe_rx_desc[LPE_RXDESC_NUM];
 	struct lpe_txdesc	lpe_tx_desc[LPE_TXDESC_NUM];
 	int			lpe_tx_prod;
-	int			lpe_tx_cons;
+	int			lpe_tx_last;
 	int			lpe_tx_used;
-	int			lpe_rx_cons;
 };
 
 struct lpe_ring_data {
@@ -454,9 +453,8 @@
 	    LPE_INT_TXERROR | LPE_INT_TXFINISH | LPE_INT_TXDONE);
 
 	sc->lpe_cdata.lpe_tx_prod = 0;
-	sc->lpe_cdata.lpe_tx_cons = 0;
+	sc->lpe_cdata.lpe_tx_last = 0;
 	sc->lpe_cdata.lpe_tx_used = 0;
-	sc->lpe_cdata.lpe_rx_cons = 0;
 
 	lpe_init_rx(sc);
 
@@ -571,6 +569,9 @@
 			hwd->lhr_control |= LPE_HWDESC_INTERRUPT;
 			hwd->lhr_control |= LPE_HWDESC_CRC;
 			hwd->lhr_control |= LPE_HWDESC_PAD;
+
+			txd = &sc->lpe_cdata.lpe_tx_desc[prod];
+			txd->lpe_txdesc_mbuf = *m_head;
 		}
 
 		LPE_INC(prod, LPE_TXDESC_NUM);
@@ -654,6 +655,7 @@
 	for (;;) {
 		prod = lpe_read_4(sc, LPE_RXDESC_PROD);
 		cons = lpe_read_4(sc, LPE_RXDESC_CONS);
+		
 		if (prod == cons)
 			break;
 
@@ -677,9 +679,37 @@
 static void
 lpe_txintr(struct lpe_softc *sc)
 {
+	struct lpe_hwdesc *hwd;
+	struct lpe_hwstatus *hws;
+	struct lpe_txdesc *txd;
+	int cons, last;
 
-	/* XXX add TX error handling */
 	debugf("transmit interrupt\n");
+
+	for (;;) {
+		cons = lpe_read_4(sc, LPE_TXDESC_CONS);
+		last = sc->lpe_cdata.lpe_tx_last;
+		
+		if (cons == last)
+			break;
+
+		txd = &sc->lpe_cdata.lpe_tx_desc[last];
+		hwd = &sc->lpe_rdata.lpe_tx_ring[last];
+		hws = &sc->lpe_rdata.lpe_tx_status[last];
+
+		bus_dmamap_sync(sc->lpe_cdata.lpe_tx_buf_tag,
+		    txd->lpe_txdesc_dmamap, BUS_DMASYNC_POSTWRITE);
+
+		if (txd->lpe_txdesc_mbuf != NULL) {
+			bus_dmamap_unload(sc->lpe_cdata.lpe_tx_buf_tag,
+			    txd->lpe_txdesc_dmamap);	
+
+			m_freem(txd->lpe_txdesc_mbuf);
+			txd->lpe_txdesc_mbuf = NULL;
+		}
+
+		LPE_INC(sc->lpe_cdata.lpe_tx_last, LPE_TXDESC_NUM);
+	}
 }
 
 static void



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