From owner-svn-src-user@FreeBSD.ORG Thu Dec 2 16:46:28 2010 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 5A95C1065670; Thu, 2 Dec 2010 16:46:28 +0000 (UTC) (envelope-from nwhitehorn@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 48C978FC18; Thu, 2 Dec 2010 16:46:28 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id oB2GkSLd017547; Thu, 2 Dec 2010 16:46:28 GMT (envelope-from nwhitehorn@svn.freebsd.org) Received: (from nwhitehorn@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id oB2GkSQg017545; Thu, 2 Dec 2010 16:46:28 GMT (envelope-from nwhitehorn@svn.freebsd.org) Message-Id: <201012021646.oB2GkSQg017545@svn.freebsd.org> From: Nathan Whitehorn Date: Thu, 2 Dec 2010 16:46:28 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r216126 - user/nwhitehorn/ps3/powerpc/ps3 X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 02 Dec 2010 16:46:28 -0000 Author: nwhitehorn Date: Thu Dec 2 16:46:28 2010 New Revision: 216126 URL: http://svn.freebsd.org/changeset/base/216126 Log: Add some more error-checking and robustification and interrupt slightly less often. Modified: user/nwhitehorn/ps3/powerpc/ps3/if_glc.c Modified: user/nwhitehorn/ps3/powerpc/ps3/if_glc.c ============================================================================== --- user/nwhitehorn/ps3/powerpc/ps3/if_glc.c Thu Dec 2 16:27:28 2010 (r216125) +++ user/nwhitehorn/ps3/powerpc/ps3/if_glc.c Thu Dec 2 16:46:28 2010 (r216126) @@ -184,8 +184,8 @@ glc_attach(device_t dev) lv1_net_set_interrupt_status_indicator(sc->sc_bus, sc->sc_dev, vtophys(sc->sc_hwirq_status), 0); lv1_net_set_interrupt_mask(sc->sc_bus, sc->sc_dev, - GELIC_INT_RXDONE | GELIC_INT_TXDONE | GELIC_INT_RXFRAME | - GELIC_INT_PHY | GELIC_INT_TX_CHAIN_END, 0); + GELIC_INT_RXDONE | GELIC_INT_RXFRAME | GELIC_INT_PHY | + GELIC_INT_TX_CHAIN_END, 0); /* * Set up DMA. @@ -289,7 +289,7 @@ glc_attach(device_t dev) static void glc_init_locked(struct glc_softc *sc) { - int i; + int i, error; struct glc_rxsoft *rxs; struct glc_txsoft *txs; @@ -318,15 +318,26 @@ glc_init_locked(struct glc_softc *sc) BUS_DMASYNC_PREREAD); } - txs = STAILQ_FIRST(&sc->sc_txdirtyq); - if (txs != NULL) { - lv1_net_start_tx_dma(sc->sc_bus, sc->sc_dev, - sc->sc_txdmadesc_phys + - txs->txs_firstdesc*sizeof(struct glc_dmadesc), 0); + /* Clear TX dirty queue */ + while ((txs = STAILQ_FIRST(&sc->sc_txdirtyq)) != NULL) { + STAILQ_REMOVE_HEAD(&sc->sc_txdirtyq, txs_q); + bus_dmamap_unload(sc->sc_txdma_tag, txs->txs_dmamap); + + if (txs->txs_mbuf != NULL) { + m_freem(txs->txs_mbuf); + txs->txs_mbuf = NULL; + } + + STAILQ_INSERT_TAIL(&sc->sc_txfreeq, txs, txs_q); } + sc->first_used_txdma_slot = -1; + sc->bsy_txdma_slots = 0; - lv1_net_start_rx_dma(sc->sc_bus, sc->sc_dev, + error = lv1_net_start_rx_dma(sc->sc_bus, sc->sc_dev, sc->sc_rxsoft[0].rxs_desc, 0); + if (error != 0) + device_printf(sc->sc_self, + "lv1_net_start_rx_dma error: %d\n", error); sc->sc_ifp->if_drv_flags |= IFF_DRV_RUNNING; sc->sc_ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; @@ -381,6 +392,7 @@ glc_start_locked(struct ifnet *ifp) struct glc_softc *sc = ifp->if_softc; bus_addr_t first, pktdesc; int kickstart = 0; + int error; struct mbuf *mb_head; mtx_assert(&sc->sc_mtx, MA_OWNED); @@ -422,7 +434,10 @@ glc_start_locked(struct ifnet *ifp) } if (kickstart && first != 0) { - lv1_net_start_tx_dma(sc->sc_bus, sc->sc_dev, first, 0); + error = lv1_net_start_tx_dma(sc->sc_bus, sc->sc_dev, first, 0); + if (error != 0) + device_printf(sc->sc_self, + "lv1_net_start_tx_dma error: %d\n", error); sc->sc_wdog_timer = 5; } } @@ -687,7 +702,7 @@ glc_encap(struct glc_softc *sc, struct m static void glc_rxintr(struct glc_softc *sc) { - int i, restart_rxdma; + int i, restart_rxdma, error; struct mbuf *m; struct ifnet *ifp = sc->sc_ifp; @@ -738,9 +753,13 @@ glc_rxintr(struct glc_softc *sc) if (sc->sc_rxdmadesc[i].cmd_stat & GELIC_CMDSTAT_CHAIN_END) restart_rxdma = 1; glc_add_rxbuf_dma(sc, i); - if (restart_rxdma) - lv1_net_start_rx_dma(sc->sc_bus, sc->sc_dev, + if (restart_rxdma) { + error = lv1_net_start_rx_dma(sc->sc_bus, sc->sc_dev, sc->sc_rxsoft[i].rxs_desc, 0); + if (error != 0) + device_printf(sc->sc_self, + "lv1_net_start_rx_dma error: %d\n", error); + } } } @@ -749,7 +768,7 @@ glc_txintr(struct glc_softc *sc) { struct ifnet *ifp = sc->sc_ifp; struct glc_txsoft *txs; - int progress = 0, kickstart = 0; + int progress = 0, kickstart = 0, error; while ((txs = STAILQ_FIRST(&sc->sc_txdirtyq)) != NULL) { if (sc->sc_txdmadesc[txs->txs_lastdesc].cmd_stat @@ -787,9 +806,12 @@ glc_txintr(struct glc_softc *sc) sc->first_used_txdma_slot = -1; if (kickstart && txs != NULL) { - lv1_net_start_tx_dma(sc->sc_bus, sc->sc_dev, + error = lv1_net_start_tx_dma(sc->sc_bus, sc->sc_dev, sc->sc_txdmadesc_phys + txs->txs_firstdesc*sizeof(struct glc_dmadesc), 0); + if (error != 0) + device_printf(sc->sc_self, + "lv1_net_start_tx_dma error: %d\n", error); } if (progress) {