Module Name: src
Committed By: skrll
Date: Sun Jul 14 09:38:42 UTC 2024
Modified Files:
src/sys/dev/ic: dwc_gmac.c
Log Message:
Improve and add new debug output
To generate a diff of this commit:
cvs rdiff -u -r1.89 -r1.90 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.89 src/sys/dev/ic/dwc_gmac.c:1.90
--- src/sys/dev/ic/dwc_gmac.c:1.89 Sun Jul 14 09:31:55 2024
+++ src/sys/dev/ic/dwc_gmac.c Sun Jul 14 09:38:41 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: dwc_gmac.c,v 1.89 2024/07/14 09:31:55 skrll Exp $ */
+/* $NetBSD: dwc_gmac.c,v 1.90 2024/07/14 09:38:41 skrll Exp $ */
/*-
* Copyright (c) 2013, 2014 The NetBSD Foundation, Inc.
@@ -41,7 +41,7 @@
#include <sys/cdefs.h>
-__KERNEL_RCSID(1, "$NetBSD: dwc_gmac.c,v 1.89 2024/07/14 09:31:55 skrll Exp $");
+__KERNEL_RCSID(1, "$NetBSD: dwc_gmac.c,v 1.90 2024/07/14 09:38:41 skrll Exp $");
/* #define DWC_GMAC_DEBUG 1 */
@@ -923,6 +923,10 @@ dwc_gmac_init_locked(struct ifnet *ifp)
opmode |= GMAC_DMA_OP_RXSTOREFORWARD | GMAC_DMA_OP_TXSTOREFORWARD;
}
bus_space_write_4(sc->sc_bst, sc->sc_bsh, AWIN_GMAC_DMA_OPMODE, opmode);
+#ifdef DWC_GMAC_DEBUG
+ aprint_normal_dev(sc->sc_dev,
+ "setting DMA opmode register: %08x\n", opmode);
+#endif
sc->sc_stopping = false;
@@ -1189,7 +1193,7 @@ dwc_gmac_tx_intr(struct dwc_gmac_softc *
for (i = sc->sc_txq.t_next; sc->sc_txq.t_queued > 0; i = TX_NEXT(i)) {
#ifdef DWC_GMAC_DEBUG
aprint_normal_dev(sc->sc_dev,
- "dwc_gmac_tx_intr: checking desc #%d (t_queued: %d)\n",
+ "%s: checking desc #%d (t_queued: %d)\n", __func__,
i, sc->sc_txq.t_queued);
#endif
@@ -1217,8 +1221,8 @@ dwc_gmac_tx_intr(struct dwc_gmac_softc *
#ifdef DWC_GMAC_DEBUG
aprint_normal_dev(sc->sc_dev,
- "dwc_gmac_tx_intr: done with packet at desc #%d, "
- "freeing mbuf %p\n", i, data->td_m);
+ "%s: done with packet at desc #%d, freeing mbuf %p\n",
+ __func__, i, data->td_m);
#endif
m_freem(data->td_m);
@@ -1247,6 +1251,10 @@ dwc_gmac_rx_intr(struct dwc_gmac_softc *
mutex_enter(&sc->sc_rxq.r_mtx);
for (i = sc->sc_rxq.r_cur; ; i = RX_NEXT(i)) {
+#ifdef DWC_GMAC_DEBUG
+ aprint_normal_dev(sc->sc_dev, "%s: checking desc #%d\n",
+ __func__, i);
+#endif
bus_dmamap_sync(sc->sc_dmat, sc->sc_dma_ring_map,
RX_DESC_OFFSET(i), sizeof(*desc),
BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
@@ -1259,8 +1267,8 @@ dwc_gmac_rx_intr(struct dwc_gmac_softc *
if (sc->sc_descm->rx_has_error(desc)) {
#ifdef DWC_GMAC_DEBUG
aprint_normal_dev(sc->sc_dev,
- "RX error: descriptor status %08x, skipping\n",
- le32toh(desc->ddesc_status0));
+ "%s: RX error: status %08x, skipping\n",
+ __func__, le32toh(desc->ddesc_status0));
#endif
if_statinc(ifp, if_ierrors);
goto skip;
@@ -1270,8 +1278,8 @@ dwc_gmac_rx_intr(struct dwc_gmac_softc *
#ifdef DWC_GMAC_DEBUG
aprint_normal_dev(sc->sc_dev,
- "rx int: device is done with descriptor #%d, len: %d\n",
- i, len);
+ "%s: device is done with descriptor #%d, len: %d\n",
+ __func__, i, len);
#endif
/*
@@ -1317,6 +1325,11 @@ dwc_gmac_rx_intr(struct dwc_gmac_softc *
}
physaddr = data->rd_map->dm_segs[0].ds_addr;
+#ifdef DWC_GMAC_DEBUG
+ aprint_normal_dev(sc->sc_dev,
+ "%s: receiving packet at desc #%d, using mbuf %p\n",
+ __func__, i, data->rd_m);
+#endif
/*
* New mbuf loaded, update RX ring and continue
*/
@@ -1626,19 +1639,19 @@ dwc_gmac_dump_dma(struct dwc_gmac_softc
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",
+ 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",
+ aprint_normal_dev(sc->sc_dev, "int en.: %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",
+ 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",
+ 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",
+ aprint_normal_dev(sc->sc_dev, "cur txb: %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",
+ aprint_normal_dev(sc->sc_dev, "cur rxb: %08x\n",
bus_space_read_4(sc->sc_bst, sc->sc_bsh, AWIN_GMAC_DMA_CUR_RX_BUFADDR));
}
@@ -1646,7 +1659,6 @@ static void
dwc_gmac_dump_tx_desc(struct dwc_gmac_softc *sc)
{
const size_t descsz = sizeof(struct dwc_gmac_dev_dmadesc);
- int i;
aprint_normal_dev(sc->sc_dev, "TX queue: cur=%d, next=%d, queued=%d\n",
sc->sc_txq.t_cur, sc->sc_txq.t_next, sc->sc_txq.t_queued);
@@ -1656,12 +1668,11 @@ dwc_gmac_dump_tx_desc(struct dwc_gmac_so
TX_DESC_OFFSET(0), AWGE_TX_RING_COUNT * descsz,
BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
- for (i = 0; i < AWGE_TX_RING_COUNT; i++) {
+ for (size_t 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 "
+ aprint_normal("#%3zu (%08lx): status: %08x cntl: %08x "
"data: %08x next: %08x\n",
- i, sc->sc_txq.t_physaddr +
- i * sizeof(struct dwc_gmac_dev_dmadesc),
+ i, sc->sc_txq.t_physaddr + i * descsz,
le32toh(desc->ddesc_status0), le32toh(desc->ddesc_cntl1),
le32toh(desc->ddesc_data), le32toh(desc->ddesc_next));
}
@@ -1671,7 +1682,6 @@ static void
dwc_gmac_dump_rx_desc(struct dwc_gmac_softc *sc)
{
const size_t descsz = sizeof(struct dwc_gmac_dev_dmadesc);
- int i;
aprint_normal_dev(sc->sc_dev, "RX queue: cur=%d, next=%d\n",
sc->sc_rxq.r_cur, sc->sc_rxq.r_next);
@@ -1681,14 +1691,40 @@ dwc_gmac_dump_rx_desc(struct dwc_gmac_so
RX_DESC_OFFSET(0), AWGE_RX_RING_COUNT * descsz,
BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
- for (i = 0; i < AWGE_RX_RING_COUNT; i++) {
+ for (size_t i = 0; i < AWGE_RX_RING_COUNT; i++) {
struct dwc_gmac_dev_dmadesc *desc = &sc->sc_rxq.r_desc[i];
- aprint_normal("#%d (%08lx): status: %08x cntl: %08x "
- "data: %08x next: %08x\n",
- i, sc->sc_rxq.r_physaddr +
- i * sizeof(struct dwc_gmac_dev_dmadesc),
+ char buf[200];
+
+ if (!sc->sc_descm->rx_is_owned_by_dev(desc)) {
+ /* print interrupt state */
+ snprintb(buf, sizeof(buf),
+ "\177\20"
+ "b\x1e" "daff\0"
+ "f\x10\xe" "frlen\0"
+ "b\x0f" "error\0"
+ "b\x0e" "rxtrunc\0" /* descriptor error? */
+ "b\x0d" "saff\0"
+ "b\x0c" "giantframe\0" /* length error? */
+ "b\x0b" "damaged\0"
+ "b\x0a" "vlan\0"
+ "b\x09" "first\0"
+ "b\x08" "last\0"
+ "b\x07" "giant\0"
+ "b\x06" "collison\0"
+ "b\x05" "ether\0"
+ "b\x04" "watchdog\0"
+ "b\x03" "miierror\0"
+ "b\x02" "dribbling\0"
+ "b\x01" "crc\0"
+ "\0", le32toh(desc->ddesc_status0));
+ }
+
+ aprint_normal("#%3zu (%08lx): status: %08x cntl: %08x "
+ "data: %08x next: %08x %s\n",
+ i, sc->sc_rxq.r_physaddr + i * descsz,
le32toh(desc->ddesc_status0), le32toh(desc->ddesc_cntl1),
- le32toh(desc->ddesc_data), le32toh(desc->ddesc_next));
+ le32toh(desc->ddesc_data), le32toh(desc->ddesc_next),
+ sc->sc_descm->rx_is_owned_by_dev(desc) ? "" : buf);
}
}
@@ -1702,22 +1738,29 @@ dwc_dump_status(struct dwc_gmac_softc *s
char buf[200];
/* print interrupt state */
- snprintb(buf, sizeof(buf), "\177\20"
- "b\x10""NI\0"
- "b\x0f""AI\0"
- "b\x0e""ER\0"
- "b\x0d""FB\0"
- "b\x0a""ET\0"
- "b\x09""RW\0"
- "b\x08""RS\0"
- "b\x07""RU\0"
- "b\x06""RI\0"
- "b\x05""UN\0"
- "b\x04""OV\0"
- "b\x03""TJ\0"
- "b\x02""TU\0"
- "b\x01""TS\0"
- "b\x00""TI\0"
+ snprintb(buf, sizeof(buf),
+ "\177\20"
+ "b\x1c" "GPI\0"
+ "b\x1b" "GMC\0"
+ "b\x1a" "GLI\0"
+ "f\x17\x3" "EB\0"
+ "f\x14\x3" "TPS\0"
+ "f\x11\x3" "RPS\0"
+ "b\x10" "NI\0"
+ "b\x0f" "AI\0"
+ "b\x0e" "ER\0"
+ "b\x0d" "FB\0"
+ "b\x0a" "ET\0"
+ "b\x09" "RW\0"
+ "b\x08" "RS\0"
+ "b\x07" "RU\0"
+ "b\x06" "RI\0"
+ "b\x05" "UN\0"
+ "b\x04" "OV\0"
+ "b\x03" "TJ\0"
+ "b\x02" "TU\0"
+ "b\x01" "TS\0"
+ "b\x00" "TI\0"
"\0", dma_status);
aprint_normal_dev(sc->sc_dev, "INTR status: %08x, DMA status: %s\n",
status, buf);