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