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>