Module Name: src Committed By: jmcneill Date: Sat Nov 22 18:31:03 UTC 2014
Modified Files: src/sys/dev/ic: dwc_gmac.c dwc_gmac_reg.h dwc_gmac_var.h Log Message: - Add MII flow control support - Set "disable jabber" and "auto padding/CRC stripping" bits in MAC conf - Write intr mask to intr mask register, not status - Setup both TX and RX burst modes - Setup both TX and RX store & forward modes - Correct an issue with the "end" descriptor passed to dwc_gmac_txdesc_sync in dwc_gmac_tx_intr ok martin@ To generate a diff of this commit: cvs rdiff -u -r1.24 -r1.25 src/sys/dev/ic/dwc_gmac.c cvs rdiff -u -r1.12 -r1.13 src/sys/dev/ic/dwc_gmac_reg.h cvs rdiff -u -r1.5 -r1.6 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.24 src/sys/dev/ic/dwc_gmac.c:1.25 --- src/sys/dev/ic/dwc_gmac.c:1.24 Mon Oct 27 09:40:00 2014 +++ src/sys/dev/ic/dwc_gmac.c Sat Nov 22 18:31:03 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: dwc_gmac.c,v 1.24 2014/10/27 09:40:00 skrll Exp $ */ +/* $NetBSD: dwc_gmac.c,v 1.25 2014/11/22 18:31:03 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.24 2014/10/27 09:40:00 skrll Exp $"); +__KERNEL_RCSID(1, "$NetBSD: dwc_gmac.c,v 1.25 2014/11/22 18:31:03 jmcneill Exp $"); /* #define DWC_GMAC_DEBUG 1 */ @@ -225,7 +225,8 @@ dwc_gmac_attach(struct dwc_gmac_softc *s mii->mii_readreg = dwc_gmac_miibus_read_reg; mii->mii_writereg = dwc_gmac_miibus_write_reg; mii->mii_statchg = dwc_gmac_miibus_statchg; - mii_attach(sc->sc_dev, mii, 0xffffffff, MII_PHY_ANY, MII_OFFSET_ANY, 0); + mii_attach(sc->sc_dev, mii, 0xffffffff, MII_PHY_ANY, MII_OFFSET_ANY, + MIIF_DOPAUSE); if (LIST_EMPTY(&mii->mii_phys)) { aprint_error_dev(sc->sc_dev, "no PHY found!\n"); @@ -246,7 +247,7 @@ dwc_gmac_attach(struct dwc_gmac_softc *s * Enable interrupts */ s = splnet(); - bus_space_write_4(sc->sc_bst, sc->sc_bsh, AWIN_GMAC_MAC_INTR, + bus_space_write_4(sc->sc_bst, sc->sc_bsh, AWIN_GMAC_MAC_INTMASK, AWIN_DEF_MAC_INTRMASK); bus_space_write_4(sc->sc_bst, sc->sc_bsh, AWIN_GMAC_DMA_INTENABLE, GMAC_DEF_DMA_INT_MASK); @@ -668,7 +669,7 @@ dwc_gmac_miibus_statchg(struct ifnet *if { struct dwc_gmac_softc * const sc = ifp->if_softc; struct mii_data * const mii = &sc->sc_mii; - uint32_t conf; + uint32_t conf, flow; /* * Set MII or GMII interface based on the speed @@ -679,6 +680,8 @@ dwc_gmac_miibus_statchg(struct ifnet *if |AWIN_GMAC_MAC_CONF_FULLDPLX); conf |= AWIN_GMAC_MAC_CONF_FRAMEBURST | AWIN_GMAC_MAC_CONF_DISABLERXOWN + | AWIN_GMAC_MAC_CONF_DISABLEJABBER + | AWIN_GMAC_MAC_CONF_ACS | AWIN_GMAC_MAC_CONF_RXENABLE | AWIN_GMAC_MAC_CONF_TXENABLE; switch (IFM_SUBTYPE(mii->mii_media_active)) { @@ -692,8 +695,20 @@ dwc_gmac_miibus_statchg(struct ifnet *if case IFM_1000_T: break; } - if (IFM_OPTIONS(mii->mii_media_active) & IFM_FDX) + + flow = 0; + if (IFM_OPTIONS(mii->mii_media_active) & IFM_FDX) { conf |= AWIN_GMAC_MAC_CONF_FULLDPLX; + flow |= __SHIFTIN(0x200, AWIN_GMAC_MAC_FLOWCTRL_PAUSE); + } + if (mii->mii_media_active & IFM_ETH_TXPAUSE) { + flow |= AWIN_GMAC_MAC_FLOWCTRL_TFE; + } + if (mii->mii_media_active & IFM_ETH_RXPAUSE) { + flow |= AWIN_GMAC_MAC_FLOWCTRL_RFE; + } + bus_space_write_4(sc->sc_bst, sc->sc_bsh, + AWIN_GMAC_MAC_FLOWCTRL, flow); #ifdef DWC_GMAC_DEBUG aprint_normal_dev(sc->sc_dev, @@ -720,9 +735,9 @@ dwc_gmac_init(struct ifnet *ifp) * XXX - the GMAC_BUSMODE_PRIORXTX bits are undocumented. */ bus_space_write_4(sc->sc_bst, sc->sc_bsh, AWIN_GMAC_DMA_BUSMODE, - GMAC_BUSMODE_FIXEDBURST | - __SHIFTIN(GMAC_BUSMODE_PRIORXTX_41, GMAC_BUSMODE_PRIORXTX) | - __SHIFTIN(8, GMCA_BUSMODE_PBL)); + GMAC_BUSMODE_FIXEDBURST | GMAC_BUSMODE_4PBL | + __SHIFTIN(2, GMAC_BUSMODE_RPBL) | + __SHIFTIN(2, GMAC_BUSMODE_PBL)); /* * Set up address filter @@ -758,7 +773,7 @@ dwc_gmac_init(struct ifnet *ifp) */ 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_STOREFORWARD); + GMAC_DMA_OP_RXSTOREFORWARD | GMAC_DMA_OP_TXSTOREFORWARD); ifp->if_flags |= IFF_RUNNING; ifp->if_flags &= ~IFF_OACTIVE; @@ -967,7 +982,7 @@ dwc_gmac_tx_intr(struct dwc_gmac_softc * #endif desc = &sc->sc_txq.t_desc[i]; - dwc_gmac_txdesc_sync(sc, i, i+1, + dwc_gmac_txdesc_sync(sc, i, TX_NEXT(i), BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE); flags = le32toh(desc->ddesc_status); Index: src/sys/dev/ic/dwc_gmac_reg.h diff -u src/sys/dev/ic/dwc_gmac_reg.h:1.12 src/sys/dev/ic/dwc_gmac_reg.h:1.13 --- src/sys/dev/ic/dwc_gmac_reg.h:1.12 Sat Oct 25 18:15:18 2014 +++ src/sys/dev/ic/dwc_gmac_reg.h Sat Nov 22 18:31:03 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: dwc_gmac_reg.h,v 1.12 2014/10/25 18:15:18 joerg Exp $ */ +/* $NetBSD: dwc_gmac_reg.h,v 1.13 2014/11/22 18:31:03 jmcneill Exp $ */ /*- * Copyright (c) 2013, 2014 The NetBSD Foundation, Inc. @@ -44,6 +44,7 @@ #define AWIN_GMAC_MAC_ADDR0LO 0x0044 #define AWIN_GMAC_MII_STATUS 0x00D8 +#define AWIN_GMAC_MAC_CONF_DISABLEJABBER __BIT(22) /* jabber disable */ #define AWIN_GMAC_MAC_CONF_FRAMEBURST __BIT(21) /* allow TX frameburst when in half duplex mode */ #define AWIN_GMAC_MAC_CONF_MIISEL __BIT(15) /* select MII phy */ @@ -52,6 +53,7 @@ TX frames in half duplex mode */ #define AWIN_GMAC_MAC_CONF_FULLDPLX __BIT(11) /* select full duplex */ +#define AWIN_GMAC_MAC_CONF_ACS __BIT(7) /* auto pad/CRC stripping */ #define AWIN_GMAC_MAC_CONF_TXENABLE __BIT(3) /* enable TX dma engine */ #define AWIN_GMAC_MAC_CONF_RXENABLE __BIT(2) /* enable RX dma engine */ @@ -72,6 +74,11 @@ #define AWIN_GMAC_MAC_INT_LINKCHG __BIT(1) #define AWIN_GMAC_MAC_INT_RGSMII __BIT(0) +#define AWIN_GMAC_MAC_FLOWCTRL_PAUSE __BITS(31,16) +#define AWIN_GMAC_MAC_FLOWCTRL_RFE __BIT(2) +#define AWIN_GMAC_MAC_FLOWCTRL_TFE __BIT(1) +#define AWIN_GMAC_MAC_FLOWCTRL_BUSY __BIT(0) + #define AWIN_GMAC_DMA_BUSMODE 0x1000 #define AWIN_GMAC_DMA_TXPOLL 0x1004 #define AWIN_GMAC_DMA_RXPOLL 0x1008 @@ -109,20 +116,24 @@ #define GMAC_MII_CLK_DIV18 0xf #define GMAC_MII_CLKMASK __BITS(5,2) +#define GMAC_BUSMODE_4PBL __BIT(24) +#define GMAC_BUSMODE_RPBL __BITS(22,17) #define GMAC_BUSMODE_FIXEDBURST __BIT(16) #define GMAC_BUSMODE_PRIORXTX __BITS(15,14) #define GMAC_BUSMODE_PRIORXTX_41 3 #define GMAC_BUSMODE_PRIORXTX_31 2 #define GMAC_BUSMODE_PRIORXTX_21 1 #define GMAC_BUSMODE_PRIORXTX_11 0 -#define GMCA_BUSMODE_PBL __BITS(13,8) /* possible DMA +#define GMAC_BUSMODE_PBL __BITS(13,8) /* possible DMA burst len */ #define GMAC_BUSMODE_RESET __BIT(0) #define AWIN_GMAC_MII_IRQ __BIT(0) -#define GMAC_DMA_OP_STOREFORWARD __BIT(21) /* start TX when a +#define GMAC_DMA_OP_RXSTOREFORWARD __BIT(24) /* start RX when a + full frame is available */ +#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_TXSTART __BIT(13) /* start TX DMA engine */ Index: src/sys/dev/ic/dwc_gmac_var.h diff -u src/sys/dev/ic/dwc_gmac_var.h:1.5 src/sys/dev/ic/dwc_gmac_var.h:1.6 --- src/sys/dev/ic/dwc_gmac_var.h:1.5 Sun Oct 26 17:39:16 2014 +++ src/sys/dev/ic/dwc_gmac_var.h Sat Nov 22 18:31:03 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: dwc_gmac_var.h,v 1.5 2014/10/26 17:39:16 martin Exp $ */ +/* $NetBSD: dwc_gmac_var.h,v 1.6 2014/11/22 18:31:03 jmcneill Exp $ */ /*- * Copyright (c) 2013, 2014 The NetBSD Foundation, Inc. @@ -44,7 +44,7 @@ #define AWGE_TOTAL_RING_COUNT \ (AWGE_RX_RING_COUNT + AWGE_TX_RING_COUNT) -#define AWGE_MAX_PACKET (ETHER_MAX_LEN + ETHER_VLAN_ENCAP_LEN) +#define AWGE_MAX_PACKET 0x7ff