Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/dev/ic Add some driver debugging infrastructure



details:   https://anonhg.NetBSD.org/src/rev/2df733e7f4ed
branches:  trunk
changeset: 368611:2df733e7f4ed
user:      martin <martin%NetBSD.org@localhost>
date:      Thu Jul 21 18:12:24 2022 +0000

description:
Add some driver debugging infrastructure

diffstat:

 sys/dev/ic/dwc_eqos.c |  79 ++++++++++++++++++++++++++++++++------------------
 1 files changed, 51 insertions(+), 28 deletions(-)

diffs (238 lines):

diff -r 5cf245687687 -r 2df733e7f4ed sys/dev/ic/dwc_eqos.c
--- a/sys/dev/ic/dwc_eqos.c     Thu Jul 21 14:41:59 2022 +0000
+++ b/sys/dev/ic/dwc_eqos.c     Thu Jul 21 18:12:24 2022 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: dwc_eqos.c,v 1.7 2022/07/20 18:48:41 martin Exp $ */
+/* $NetBSD: dwc_eqos.c,v 1.8 2022/07/21 18:12:24 martin Exp $ */
 
 /*-
  * Copyright (c) 2022 Jared McNeill <jmcneill%invisible.ca@localhost>
@@ -33,7 +33,7 @@
 #include "opt_net_mpsafe.h"
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: dwc_eqos.c,v 1.7 2022/07/20 18:48:41 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: dwc_eqos.c,v 1.8 2022/07/21 18:12:24 martin Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -60,11 +60,20 @@
 #include <dev/ic/dwc_eqos_var.h>
 
 CTASSERT(MCLBYTES == 2048);
+
 #ifdef EQOS_DEBUG
-#define        DPRINTF(...)    printf(##__VA_ARGS__)
+unsigned int eqos_debug;
+#define        DPRINTF(FLAG, FORMAT, ...)      \
+       if (eqos_debug & FLAG)          \
+               device_printf(sc->sc_dev, "%s: " FORMAT, \
+                   __func__, ##__VA_ARGS__)
 #else
-#define        DPRINTF(...)    ((void)0)
+#define        DPRINTF(FLAG, FORMAT, ...)      ((void)0)
 #endif
+#define        EDEB_NOTE               1U<<0
+#define        EDEB_INTR               1U<<1
+#define        EDEB_RXRING             1U<<2
+#define        EDEB_TXRING             1U<<3
 
 #ifdef NET_MPSAFE
 #define        EQOS_MPSAFE             1
@@ -106,9 +115,6 @@
 #define        WR4(sc, reg, val)               \
        bus_space_write_4((sc)->sc_bst, (sc)->sc_bsh, (reg), (val))
 
-#define STUB(...)                              \
-       printf("%s: TODO\n", __func__); \
-
 static int
 eqos_mii_readreg(device_t dev, int phy, int reg, uint16_t *val)
 {
@@ -232,7 +238,7 @@
        } else {
                bus_dmamap_sync(sc->sc_dmat, map, DESC_OFF(start),
                    DESC_OFF(total) - DESC_OFF(start), flags);
-               if (DESC_OFF(end) - DESC_OFF(0) > 0) {
+               if (end > 0) {
                        bus_dmamap_sync(sc->sc_dmat, map, DESC_OFF(0),
                            DESC_OFF(end) - DESC_OFF(0), flags);
                }
@@ -246,6 +252,8 @@
        uint32_t tdes2, tdes3;
 
        if (paddr == 0 || len == 0) {
+               DPRINTF(EDEB_TXRING,
+                   "tx for desc %u done!\n", index);
                KASSERT(flags == 0);
                tdes2 = 0;
                tdes3 = 0;
@@ -262,6 +270,7 @@
        sc->sc_tx.desc_ring[index].tdes1 = htole32((uint32_t)(paddr >> 32));
        sc->sc_tx.desc_ring[index].tdes2 = htole32(tdes2 | len);
        sc->sc_tx.desc_ring[index].tdes3 = htole32(tdes3 | total_len);
+       DPRINTF(EDEB_TXRING, "preparing desc %u\n", index);
 }
 
 static int
@@ -329,6 +338,9 @@
        bus_dmamap_sync(sc->sc_dmat, sc->sc_tx.desc_map,
            DESC_OFF(index), offsetof(struct eqos_dma_desc, tdes3),
            BUS_DMASYNC_PREWRITE);
+       DPRINTF(EDEB_TXRING, "passing tx desc %u to hardware, cur: %u, "
+           "next: %u, queued: %u\n",
+           index, sc->sc_tx.cur, sc->sc_tx.next, sc->sc_tx.queued);
        sc->sc_tx.desc_ring[index].tdes3 |= htole32(EQOS_TDES3_OWN);
 
        return nsegs;
@@ -484,6 +496,8 @@
        WR4(sc, GMAC_MAC_HASH_TABLE_REG0, hash[1]);
        WR4(sc, GMAC_MAC_HASH_TABLE_REG1, hash[0]);
 
+       DPRINTF(EDEB_NOTE, "writing new packet filter config "
+           "%08x, hash[1]=%08x, hash[0]=%08x\n", pfil, hash[1], hash[0]);
        /* Packet filter config */
        WR4(sc, GMAC_MAC_PACKET_FILTER, pfil);
 }
@@ -510,20 +524,17 @@
 static void
 eqos_init_rings(struct eqos_softc *sc, int qid)
 {
-       /*
-        * We reset the rings paddr, this implicitly resets
-        * the hardwares current descriptor pointer.
-        * Adjust our internal state accordingly.
-        */
        sc->sc_tx.cur = sc->sc_tx.next = sc->sc_tx.queued = 0;
-       sc->sc_rx.cur = sc->sc_rx.next = sc->sc_rx.queued = 0;
 
        WR4(sc, GMAC_DMA_CHAN0_TX_BASE_ADDR_HI,
            (uint32_t)(sc->sc_tx.desc_ring_paddr >> 32));
        WR4(sc, GMAC_DMA_CHAN0_TX_BASE_ADDR,
            (uint32_t)sc->sc_tx.desc_ring_paddr);
        WR4(sc, GMAC_DMA_CHAN0_TX_RING_LEN, TX_DESC_COUNT - 1);
+       DPRINTF(EDEB_TXRING, "tx ring paddr %lx with %u decriptors\n",
+           sc->sc_tx.desc_ring_paddr, TX_DESC_COUNT);
 
+       sc->sc_rx.cur = sc->sc_rx.next = sc->sc_rx.queued = 0;
        WR4(sc, GMAC_DMA_CHAN0_RX_BASE_ADDR_HI,
            (uint32_t)(sc->sc_rx.desc_ring_paddr >> 32));
        WR4(sc, GMAC_DMA_CHAN0_RX_BASE_ADDR,
@@ -532,6 +543,8 @@
        WR4(sc, GMAC_DMA_CHAN0_RX_END_ADDR,
            (uint32_t)sc->sc_rx.desc_ring_paddr +
            DESC_OFF((sc->sc_rx.cur - 1) % RX_DESC_COUNT));
+       DPRINTF(EDEB_RXRING, "rx ring paddr %lx with %u decriptors\n",
+           sc->sc_rx.desc_ring_paddr, RX_DESC_COUNT);
 }
 
 static int
@@ -770,6 +783,8 @@
        uint32_t tdes3;
        int i, pkts = 0;
 
+       DPRINTF(EDEB_INTR, "qid: %u\n", qid);
+
        EQOS_ASSERT_LOCKED(sc);
 
        for (i = sc->sc_tx.next; sc->sc_tx.queued > 0; i = TX_NEXT(i)) {
@@ -842,16 +857,19 @@
        for (cnt = 0, start = sc->sc_tx.cur; ; cnt++) {
                if (sc->sc_tx.queued >= TX_DESC_COUNT - TX_MAX_SEGS) {
                        ifp->if_flags |= IFF_OACTIVE;
+                       DPRINTF(EDEB_TXRING, "%u sc_tx.queued, ring full\n",
+                           sc->sc_tx.queued);
                        break;
                }
 
                IFQ_POLL(&ifp->if_snd, m);
-               if (m == NULL) {
+               if (m == NULL)
                        break;
-               }
 
                nsegs = eqos_setup_txbuf(sc, sc->sc_tx.cur, m);
                if (nsegs <= 0) {
+                       DPRINTF(EDEB_TXRING, "eqos_setup_txbuf failed "
+                           "with %d\n", nsegs);
                        if (nsegs == -1) {
                                ifp->if_flags |= IFF_OACTIVE;
                        } else if (nsegs == -2) {
@@ -867,12 +885,24 @@
                sc->sc_tx.cur = TX_SKIP(sc->sc_tx.cur, nsegs);
        }
 
+       DPRINTF(EDEB_TXRING, "tx loop -> cnt = %u, cur: %u, next: %u, "
+           "queued: %u\n", cnt, sc->sc_tx.cur, sc->sc_tx.next,
+           sc->sc_tx.queued);
+
        if (cnt != 0) {
                eqos_dma_sync(sc, sc->sc_tx.desc_map,
                    start, sc->sc_tx.cur, TX_DESC_COUNT,
                    BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
 
                /* Start and run TX DMA */
+               DPRINTF(EDEB_TXRING, "sending desc %u at %lx upto "
+                   "%u-1 at %lx cur tx desc: %x cur tx buf: %x\n", start,
+                   (uint32_t)sc->sc_tx.desc_ring_paddr + DESC_OFF(start),
+                   sc->sc_tx.cur,
+                   (uint32_t)sc->sc_tx.desc_ring_paddr +
+                   DESC_OFF(sc->sc_tx.cur),
+                   RD4(sc, GMAC_DMA_CHAN0_CUR_TX_DESC),
+                   RD4(sc, GMAC_DMA_CHAN0_CUR_TX_BUF_ADDR));
                WR4(sc, GMAC_DMA_CHAN0_TX_END_ADDR,
                    (uint32_t)sc->sc_tx.desc_ring_paddr +
                    DESC_OFF(sc->sc_tx.cur));
@@ -923,13 +953,11 @@
                        WR4(sc, GMAC_MTL_Q0_INTERRUPT_CTRL_STATUS, new_status);
                }
        }
-#ifdef DEBUG_LOUD
-       device_printf(sc->sc_dev,
+       DPRINTF(EDEB_INTR,
            "GMAC_MTL_INTERRUPT_STATUS = 0x%08X, "
            "GMAC_MTL_FIFO_DEBUG_DATA = 0x%08X, "
            "GMAC_MTL_INTERRUPT_STATUS_Q0IS = 0x%08X\n",
            mtl_status, debug_data, ictrl);
-#endif
 }
 
 int
@@ -946,10 +974,8 @@
 
        if (mac_status) {
                sc->sc_ev_mac.ev_count++;
-#ifdef DEBUG_LOUD
-               device_printf(sc->sc_dev,
+               DPRINTF(EDEB_INTR,
                    "GMAC_MAC_INTERRUPT_STATUS = 0x%08X\n", mac_status);
-#endif
        }
 
        mtl_status = RD4(sc, GMAC_MTL_INTERRUPT_STATUS);
@@ -974,11 +1000,9 @@
        }
        EQOS_UNLOCK(sc);
 
-#ifdef DEBUG_LOUD
        if ((mac_status | mtl_status | dma_status) == 0) {
-               device_printf(sc->sc_dev, "spurious interrupt?!\n");
+               DPRINTF(EDEB_NOTE, "spurious interrupt?!\n");
        }
-#endif
 
        rx_tx_status = RD4(sc, GMAC_MAC_RX_TX_STATUS);
        if (rx_tx_status) {
@@ -997,10 +1021,9 @@
                        sc->sc_ev_ncarr.ev_count++;
                if ((rx_tx_status & GMAC_MAC_RX_TX_STATUS_TJT) != 0)
                        sc->sc_ev_tjt.ev_count++;
-#ifdef DEBUG_LOUD
-               device_printf(sc->sc_dev, "GMAC_MAC_RX_TX_STATUS = 0x%08x\n",
+
+               DPRINTF(EDEB_INTR, "GMAC_MAC_RX_TX_STATUS = 0x%08x\n",
                    rx_tx_status);
-#endif
        }
 
        return 1;



Home | Main Index | Thread Index | Old Index