svn commit: r216126 - user/nwhitehorn/ps3/powerpc/ps3

Nathan Whitehorn nwhitehorn at FreeBSD.org
Thu Dec 2 16:46:28 UTC 2010


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) {


More information about the svn-src-user mailing list