Module Name:    src
Committed By:   martin
Date:           Sun Sep 14 18:28:38 UTC 2014

Modified Files:
        src/sys/dev/ic: dwc_gmac.c

Log Message:
Add (disabled) debug code.
Fix DMA descriptor link initialization.


To generate a diff of this commit:
cvs rdiff -u -r1.6 -r1.7 src/sys/dev/ic/dwc_gmac.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/ic/dwc_gmac.c
diff -u src/sys/dev/ic/dwc_gmac.c:1.6 src/sys/dev/ic/dwc_gmac.c:1.7
--- src/sys/dev/ic/dwc_gmac.c:1.6	Sun Sep 14 11:00:52 2014
+++ src/sys/dev/ic/dwc_gmac.c	Sun Sep 14 18:28:37 2014
@@ -39,7 +39,9 @@
 
 #include <sys/cdefs.h>
 
-__KERNEL_RCSID(1, "$NetBSD: dwc_gmac.c,v 1.6 2014/09/14 11:00:52 martin Exp $");
+__KERNEL_RCSID(1, "$NetBSD: dwc_gmac.c,v 1.7 2014/09/14 18:28:37 martin Exp $");
+
+/* #define	DWC_GMAC_DEBUG	1 */
 
 #include "opt_inet.h"
 
@@ -91,6 +93,12 @@ static int dwc_gmac_ioctl(struct ifnet *
 
 #define RX_DESC_OFFSET(N)	((N)*sizeof(struct dwc_gmac_dev_dmadesc))
 
+
+#ifdef DWC_GMAC_DEBUG
+static void dwc_gmac_dump_dma(struct dwc_gmac_softc *sc);
+static void dwc_gmac_dump_tx_desc(struct dwc_gmac_softc *sc);
+#endif
+
 void
 dwc_gmac_attach(struct dwc_gmac_softc *sc, uint32_t mii_clk)
 {
@@ -129,6 +137,10 @@ dwc_gmac_attach(struct dwc_gmac_softc *s
 		enaddr[5] = (machi >> 8) & 0x0ff;
 	}
 
+#ifdef DWC_GMAC_DEBUG
+	dwc_gmac_dump_dma(sc);
+#endif
+
 	/*
 	 * Init chip and do intial setup
 	 */
@@ -352,7 +364,7 @@ dwc_gmac_alloc_rx_ring(struct dwc_gmac_s
 
 		desc = &sc->sc_rxq.r_desc[i];
 		desc->ddesc_data = htole32(physaddr);
-		next = (i+1) & AWGE_RX_RING_COUNT;
+		next = (i+1) % AWGE_RX_RING_COUNT;
 		desc->ddesc_next = htole32(ring->r_physaddr 
 		    + next * sizeof(*desc));
 		desc->ddesc_cntl = htole32(
@@ -516,7 +528,7 @@ dwc_gmac_alloc_tx_ring(struct dwc_gmac_s
 		}
 		ring->t_desc[i].ddesc_next = htole32(
 		    ring->t_physaddr + sizeof(struct dwc_gmac_dev_dmadesc)
-		    *((i+1)&AWGE_TX_RING_COUNT));
+		    *((i+1)%AWGE_TX_RING_COUNT));
 	}
 
 	return 0;
@@ -694,6 +706,11 @@ dwc_gmac_start(struct ifnet *ifp)
 		    bus_space_read_4(sc->sc_bst, sc->sc_bsh,
 		        AWIN_GMAC_DMA_OPMODE) | GMAC_DMA_OP_TXSTART);
 	}
+
+#ifdef DWC_GMAC_DEBUG
+	dwc_gmac_dump_dma(sc);
+	dwc_gmac_dump_tx_desc(sc);
+#endif
 }
 
 static void
@@ -749,6 +766,14 @@ dwc_gmac_queue(struct dwc_gmac_softc *sc
 	flags = DDESC_CNTL_TXFIRST|DDESC_CNTL_TXINT|DDESC_CNTL_TXCHAIN;
 	for (i = 0; i < map->dm_nsegs; i++) {
 		data = &sc->sc_txq.t_data[sc->sc_txq.t_cur];
+
+#ifdef DWC_GMAC_DEBUG
+		aprint_normal_dev(sc->sc_dev, "enqueing desc #%d data %08lx "
+		    "len %lu\n", sc->sc_txq.t_cur,
+		    (unsigned long)map->dm_segs[i].ds_addr,
+		    (unsigned long)map->dm_segs[i].ds_len);
+#endif
+
 		desc = &sc->sc_txq.t_desc[sc->sc_txq.t_cur];
 
 		desc->ddesc_data = htole32(map->dm_segs[i].ds_addr);
@@ -845,3 +870,50 @@ if (++cnt > 20)
 
 	return 1;
 }
+
+#ifdef DWC_GMAC_DEBUG
+static void
+dwc_gmac_dump_dma(struct dwc_gmac_softc *sc)
+{
+	aprint_normal_dev(sc->sc_dev, "busmode: %08x\n",
+	    bus_space_read_4(sc->sc_bst, sc->sc_bsh, AWIN_GMAC_DMA_BUSMODE));
+	aprint_normal_dev(sc->sc_dev, "tx poll: %08x\n",
+	    bus_space_read_4(sc->sc_bst, sc->sc_bsh, AWIN_GMAC_DMA_TXPOLL));
+	aprint_normal_dev(sc->sc_dev, "rx poll: %08x\n",
+	    bus_space_read_4(sc->sc_bst, sc->sc_bsh, AWIN_GMAC_DMA_RXPOLL));
+	aprint_normal_dev(sc->sc_dev, "rx descriptors: %08x\n",
+	    bus_space_read_4(sc->sc_bst, sc->sc_bsh, AWIN_GMAC_DMA_RX_ADDR));
+	aprint_normal_dev(sc->sc_dev, "tx descriptors: %08x\n",
+	    bus_space_read_4(sc->sc_bst, sc->sc_bsh, AWIN_GMAC_DMA_TX_ADDR));
+	aprint_normal_dev(sc->sc_dev, "status: %08x\n",
+	    bus_space_read_4(sc->sc_bst, sc->sc_bsh, AWIN_GMAC_DMA_STATUS));
+	aprint_normal_dev(sc->sc_dev, "op mode: %08x\n",
+	    bus_space_read_4(sc->sc_bst, sc->sc_bsh, AWIN_GMAC_DMA_OPMODE));
+	aprint_normal_dev(sc->sc_dev, "int enable: %08x\n",
+	    bus_space_read_4(sc->sc_bst, sc->sc_bsh, AWIN_GMAC_DMA_INTENABLE));
+	aprint_normal_dev(sc->sc_dev, "cur tx: %08x\n",
+	    bus_space_read_4(sc->sc_bst, sc->sc_bsh, AWIN_GMAC_DMA_CUR_TX_DESC));
+	aprint_normal_dev(sc->sc_dev, "cur rx: %08x\n",
+	    bus_space_read_4(sc->sc_bst, sc->sc_bsh, AWIN_GMAC_DMA_CUR_RX_DESC));
+	aprint_normal_dev(sc->sc_dev, "cur tx buffer: %08x\n",
+	    bus_space_read_4(sc->sc_bst, sc->sc_bsh, AWIN_GMAC_DMA_CUR_TX_BUFADDR));
+	aprint_normal_dev(sc->sc_dev, "cur rx buffer: %08x\n",
+	    bus_space_read_4(sc->sc_bst, sc->sc_bsh, AWIN_GMAC_DMA_CUR_RX_BUFADDR));
+}
+
+static void
+dwc_gmac_dump_tx_desc(struct dwc_gmac_softc *sc)
+{
+	int i;
+
+	aprint_normal_dev(sc->sc_dev, " TX DMA descriptors:\n");
+	for (i = 0; i < AWGE_TX_RING_COUNT; i++) {
+		struct dwc_gmac_dev_dmadesc *desc = &sc->sc_txq.t_desc[i];
+		aprint_normal("#%d (%08lx): status: %08x cntl: %08x data: %08x next: %08x\n",
+		    i, sc->sc_txq.t_physaddr + i*sizeof(struct dwc_gmac_dev_dmadesc),
+		    le32toh(desc->ddesc_status), le32toh(desc->ddesc_cntl),
+		    le32toh(desc->ddesc_data), le32toh(desc->ddesc_next));
+
+	}
+}
+#endif

Reply via email to