Module Name: src Committed By: jmcneill Date: Sat Jun 16 00:15:00 UTC 2018
Modified Files: src/sys/dev/ic: dwc_gmac.c dwc_gmac_reg.h dwc_gmac_var.h Log Message: Add flag for disabling store-and-forward mode, and a callback for notifying bus glue that the link speed has changed. To generate a diff of this commit: cvs rdiff -u -r1.45 -r1.46 src/sys/dev/ic/dwc_gmac.c cvs rdiff -u -r1.15 -r1.16 src/sys/dev/ic/dwc_gmac_reg.h cvs rdiff -u -r1.7 -r1.8 src/sys/dev/ic/dwc_gmac_var.h 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.45 src/sys/dev/ic/dwc_gmac.c:1.46 --- src/sys/dev/ic/dwc_gmac.c:1.45 Thu Dec 21 12:09:43 2017 +++ src/sys/dev/ic/dwc_gmac.c Sat Jun 16 00:15:00 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: dwc_gmac.c,v 1.45 2017/12/21 12:09:43 martin Exp $ */ +/* $NetBSD: dwc_gmac.c,v 1.46 2018/06/16 00:15:00 jmcneill 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.45 2017/12/21 12:09:43 martin Exp $"); +__KERNEL_RCSID(1, "$NetBSD: dwc_gmac.c,v 1.46 2018/06/16 00:15:00 jmcneill Exp $"); /* #define DWC_GMAC_DEBUG 1 */ @@ -124,7 +124,6 @@ static uint32_t bitrev32(uint32_t x); (AWIN_GMAC_MAC_INT_TSI | AWIN_GMAC_MAC_INT_ANEG | \ AWIN_GMAC_MAC_INT_LINKCHG | AWIN_GMAC_MAC_INT_RGSMII) - #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); @@ -734,6 +733,8 @@ dwc_gmac_miibus_statchg(struct ifnet *if case IFM_1000_T: break; } + if (sc->sc_set_speed) + sc->sc_set_speed(sc, IFM_SUBTYPE(mii->mii_media_active)); flow = 0; if (IFM_OPTIONS(mii->mii_media_active) & IFM_FDX) { @@ -822,9 +823,11 @@ dwc_gmac_init_locked(struct ifnet *ifp) /* * Start RX/TX part */ - bus_space_write_4(sc->sc_bst, sc->sc_bsh, - AWIN_GMAC_DMA_OPMODE, GMAC_DMA_OP_RXSTART | GMAC_DMA_OP_TXSTART | - GMAC_DMA_OP_RXSTOREFORWARD | GMAC_DMA_OP_TXSTOREFORWARD); + uint32_t opmode = GMAC_DMA_OP_RXSTART | GMAC_DMA_OP_TXSTART; + if ((sc->sc_flags & DWC_GMAC_FORCE_THRESH_DMA_MODE) == 0) { + opmode |= GMAC_DMA_OP_RXSTOREFORWARD | GMAC_DMA_OP_TXSTOREFORWARD; + } + bus_space_write_4(sc->sc_bst, sc->sc_bsh, AWIN_GMAC_DMA_OPMODE, opmode); sc->sc_stopping = false; Index: src/sys/dev/ic/dwc_gmac_reg.h diff -u src/sys/dev/ic/dwc_gmac_reg.h:1.15 src/sys/dev/ic/dwc_gmac_reg.h:1.16 --- src/sys/dev/ic/dwc_gmac_reg.h:1.15 Sat Nov 21 16:04:11 2015 +++ src/sys/dev/ic/dwc_gmac_reg.h Sat Jun 16 00:15:00 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: dwc_gmac_reg.h,v 1.15 2015/11/21 16:04:11 martin Exp $ */ +/* $NetBSD: dwc_gmac_reg.h,v 1.16 2018/06/16 00:15:00 jmcneill Exp $ */ /*- * Copyright (c) 2013, 2014 The NetBSD Foundation, Inc. @@ -141,7 +141,9 @@ #define GMAC_DMA_OP_TXSTOREFORWARD __BIT(21) /* start TX when a full frame is available */ #define GMAC_DMA_OP_FLUSHTX __BIT(20) /* flush TX fifo */ +#define GMAC_DMA_OP_TTC __BITS(16,14) /* TX thresh control */ #define GMAC_DMA_OP_TXSTART __BIT(13) /* start TX DMA engine */ +#define GMAC_DMA_OP_RTC __BITS(4,3) /* RX thres control */ #define GMAC_DMA_OP_RXSTART __BIT(1) /* start RX DMA engine */ #define GMAC_DMA_INT_NIE __BIT(16) /* Normal/Summary */ Index: src/sys/dev/ic/dwc_gmac_var.h diff -u src/sys/dev/ic/dwc_gmac_var.h:1.7 src/sys/dev/ic/dwc_gmac_var.h:1.8 --- src/sys/dev/ic/dwc_gmac_var.h:1.7 Sat Jan 21 10:30:15 2017 +++ src/sys/dev/ic/dwc_gmac_var.h Sat Jun 16 00:15:00 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: dwc_gmac_var.h,v 1.7 2017/01/21 10:30:15 skrll Exp $ */ +/* $NetBSD: dwc_gmac_var.h,v 1.8 2018/06/16 00:15:00 jmcneill Exp $ */ /*- * Copyright (c) 2013, 2014 The NetBSD Foundation, Inc. @@ -80,6 +80,8 @@ struct dwc_gmac_softc { bus_space_tag_t sc_bst; bus_space_handle_t sc_bsh; bus_dma_tag_t sc_dmat; + uint32_t sc_flags; +#define DWC_GMAC_FORCE_THRESH_DMA_MODE 0x01 /* force DMA to use threshold mode */ struct ethercom sc_ec; struct mii_data sc_mii; kmutex_t sc_mdio_lock; @@ -94,6 +96,8 @@ struct dwc_gmac_softc { kmutex_t *sc_lock; /* lock for softc operations */ struct if_percpuq *sc_ipq; /* softint-based input queues */ + + void (*sc_set_speed)(struct dwc_gmac_softc *, int); }; void dwc_gmac_attach(struct dwc_gmac_softc*, uint32_t /*mii_clk*/);