From owner-p4-projects@FreeBSD.ORG Mon Sep 5 23:09:52 2011 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 09CD51065676; Mon, 5 Sep 2011 23:09:52 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id C0A781065672 for ; Mon, 5 Sep 2011 23:09:51 +0000 (UTC) (envelope-from jceel@freebsd.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:4f8:fff6::2d]) by mx1.freebsd.org (Postfix) with ESMTP id 9484C8FC08 for ; Mon, 5 Sep 2011 23:09:51 +0000 (UTC) Received: from skunkworks.freebsd.org (localhost [127.0.0.1]) by skunkworks.freebsd.org (8.14.4/8.14.4) with ESMTP id p85N9phh038255 for ; Mon, 5 Sep 2011 23:09:51 GMT (envelope-from jceel@freebsd.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.4/8.14.4/Submit) id p85N9pN2038252 for perforce@freebsd.org; Mon, 5 Sep 2011 23:09:51 GMT (envelope-from jceel@freebsd.org) Date: Mon, 5 Sep 2011 23:09:51 GMT Message-Id: <201109052309.p85N9pN2038252@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to jceel@freebsd.org using -f From: Jakub Wojciech Klama To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 198601 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 05 Sep 2011 23:09:52 -0000 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