PERFORCE change 198601 for review
Jakub Wojciech Klama
jceel at FreeBSD.org
Mon Sep 5 23:09:52 UTC 2011
http://p4web.freebsd.org/@@198601?ac=10
Change 198601 by jceel at 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
More information about the p4-projects
mailing list