Module Name: src Committed By: martin Date: Thu Oct 24 15:54:46 UTC 2019
Modified Files: src/sys/dev/mii [netbsd-8]: rgephy.c rgephyreg.h Log Message: Pull up the following revisions, requested by msaitoh in ticket #1413: sys/dev/mii/rgephy.c 1.43, 1.47, 1.49, 1.54-1.57 sys/dev/mii/rgephyreg.h 1.10, 1.12 (both via patch) - It seems EEE support is not only on 8211F but on 8211D and newer. - Indicate master mode if the negotiated result say so. - Use symbolic names for chip revision. - Cosmetic changes. - KNF. To generate a diff of this commit: cvs rdiff -u -r1.40.10.2 -r1.40.10.3 src/sys/dev/mii/rgephy.c cvs rdiff -u -r1.9 -r1.9.10.1 src/sys/dev/mii/rgephyreg.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/mii/rgephy.c diff -u src/sys/dev/mii/rgephy.c:1.40.10.2 src/sys/dev/mii/rgephy.c:1.40.10.3 --- src/sys/dev/mii/rgephy.c:1.40.10.2 Mon May 13 12:40:13 2019 +++ src/sys/dev/mii/rgephy.c Thu Oct 24 15:54:46 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: rgephy.c,v 1.40.10.2 2019/05/13 12:40:13 martin Exp $ */ +/* $NetBSD: rgephy.c,v 1.40.10.3 2019/10/24 15:54:46 martin Exp $ */ /* * Copyright (c) 2003 @@ -33,7 +33,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: rgephy.c,v 1.40.10.2 2019/05/13 12:40:13 martin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rgephy.c,v 1.40.10.3 2019/10/24 15:54:46 martin Exp $"); /* @@ -73,6 +73,7 @@ static int rgephy_service(struct mii_sof static void rgephy_status(struct mii_softc *); static int rgephy_mii_phy_auto(struct mii_softc *); static void rgephy_reset(struct mii_softc *); +static bool rgephy_linkup(struct mii_softc *); static void rgephy_loop(struct mii_softc *); static void rgephy_load_dspcode(struct mii_softc *); @@ -116,13 +117,9 @@ rgephy_attach(device_t parent, device_t int rev; const char *sep = ""; - ma = aux; - mii = ma->mii_data; - rev = MII_REV(ma->mii_id2); mpd = mii_phy_match(ma, rgephys); aprint_naive(": Media interface\n"); - aprint_normal(": %s, rev. %d\n", mpd->mpd_name, rev); sc->mii_dev = self; sc->mii_inst = mii->mii_instance; @@ -130,6 +127,15 @@ rgephy_attach(device_t parent, device_t sc->mii_mpd_oui = MII_OUI(ma->mii_id1, ma->mii_id2); sc->mii_mpd_model = MII_MODEL(ma->mii_id2); sc->mii_mpd_rev = MII_REV(ma->mii_id2); + + if (sc->mii_mpd_model == MII_MODEL_REALTEK_RTL8169S) { + aprint_normal(": RTL8211"); + if (sc->mii_mpd_rev != 0) + aprint_normal("%c",'@' + sc->mii_mpd_rev); + aprint_normal(" 1000BASE-T media interface\n"); + } else + aprint_normal(": %s, rev. %d\n", mpd->mpd_name, rev); + sc->mii_pdata = mii; sc->mii_flags = ma->mii_flags; sc->mii_anegticks = MII_ANEGTICKS_GIGE; @@ -152,9 +158,9 @@ rgephy_attach(device_t parent, device_t * media explicitly. Why? */ aprint_normal_dev(self, ""); - if (sc->mii_capabilities & BMSR_EXTSTAT) { + if (sc->mii_capabilities & BMSR_EXTSTAT) sc->mii_extcapabilities = PHY_READ(sc, MII_EXTSR); - } + mii_phy_add_media(sc); /* rtl8169S does not report auto-sense; add manually. */ @@ -257,9 +263,8 @@ rgephy_service(struct mii_softc *sc, str if ((mii->mii_ifp->if_flags & IFF_LINK0)) { PHY_WRITE(sc, MII_100T2CR, gig|GTCR_MAN_MS|GTCR_ADV_MS); - } else { - PHY_WRITE(sc, MII_100T2CR, gig|GTCR_MAN_MS); - } + } else + PHY_WRITE(sc, MII_100T2CR, gig | GTCR_MAN_MS); PHY_WRITE(sc, MII_BMCR, speed | BMCR_AUTOEN | BMCR_STARTNEG); break; @@ -303,26 +308,9 @@ rgephy_service(struct mii_softc *sc, str * need to restart the autonegotiation process. Read * the BMSR twice in case it's latched. */ - if (sc->mii_mpd_rev >= 6) { - /* RTL8211F */ - reg = PHY_READ(sc, RGEPHY_MII_PHYSR); - if (reg & RGEPHY_PHYSR_LINK) { - sc->mii_ticks = 0; - break; - } - } else if (sc->mii_mpd_rev >= 2) { - /* RTL8211B(L) */ - reg = PHY_READ(sc, RGEPHY_MII_SSR); - if (reg & RGEPHY_SSR_LINK) { - sc->mii_ticks = 0; - break; - } - } else { - reg = PHY_READ(sc, RTK_GMEDIASTAT); - if ((reg & RTK_GMEDIASTAT_LINK) != 0) { - sc->mii_ticks = 0; - break; - } + if (rgephy_linkup(sc)) { + sc->mii_ticks = 0; + break; } /* Announce link loss right after it happens. */ @@ -343,7 +331,6 @@ rgephy_service(struct mii_softc *sc, str /* * Callback if something changed. Note that we need to poke * the DSP on the RealTek PHYs if the media changes. - * */ if (sc->mii_media_active != mii->mii_media_active || sc->mii_media_status != mii->mii_media_status || @@ -354,29 +341,41 @@ rgephy_service(struct mii_softc *sc, str return 0; } +static bool +rgephy_linkup(struct mii_softc *sc) +{ + bool linkup = false; + u_int reg; + + if (sc->mii_mpd_rev >= RGEPHY_8211F) { + reg = PHY_READ(sc, RGEPHY_MII_PHYSR); + if (reg & RGEPHY_PHYSR_LINK) + linkup = true; + } else if (sc->mii_mpd_rev >= RGEPHY_8211B) { + reg = PHY_READ(sc, RGEPHY_MII_SSR); + if (reg & RGEPHY_SSR_LINK) + linkup = true; + } else { + reg = PHY_READ(sc, RTK_GMEDIASTAT); + if ((reg & RTK_GMEDIASTAT_LINK) != 0) + linkup = true; + } + + return linkup; +} + static void rgephy_status(struct mii_softc *sc) { struct mii_data *mii = sc->mii_pdata; - int gstat, bmsr, bmcr, physr; + int gstat, bmsr, bmcr, gtsr, physr; uint16_t ssr; mii->mii_media_status = IFM_AVALID; mii->mii_media_active = IFM_ETHER; - if (sc->mii_mpd_rev >= 6) { - physr = PHY_READ(sc, RGEPHY_MII_PHYSR); - if (physr & RGEPHY_PHYSR_LINK) - mii->mii_media_status |= IFM_ACTIVE; - } else if (sc->mii_mpd_rev >= 2) { - ssr = PHY_READ(sc, RGEPHY_MII_SSR); - if (ssr & RGEPHY_SSR_LINK) - mii->mii_media_status |= IFM_ACTIVE; - } else { - gstat = PHY_READ(sc, RTK_GMEDIASTAT); - if ((gstat & RTK_GMEDIASTAT_LINK) != 0) - mii->mii_media_status |= IFM_ACTIVE; - } + if (rgephy_linkup(sc)) + mii->mii_media_status |= IFM_ACTIVE; bmsr = PHY_READ(sc, MII_BMSR); bmcr = PHY_READ(sc, MII_BMCR); @@ -398,7 +397,7 @@ rgephy_status(struct mii_softc *sc) } } - if (sc->mii_mpd_rev >= 6) { + if (sc->mii_mpd_rev >= RGEPHY_8211F) { physr = PHY_READ(sc, RGEPHY_MII_PHYSR); switch (__SHIFTOUT(physr, RGEPHY_PHYSR_SPEED)) { case RGEPHY_PHYSR_SPEED_1000: @@ -419,7 +418,7 @@ rgephy_status(struct mii_softc *sc) IFM_FDX; else mii->mii_media_active |= IFM_HDX; - } else if (sc->mii_mpd_rev >= 2) { + } else if (sc->mii_mpd_rev >= RGEPHY_8211B) { ssr = PHY_READ(sc, RGEPHY_MII_SSR); switch (ssr & RGEPHY_SSR_SPD_MASK) { case RGEPHY_SSR_S1000: @@ -456,6 +455,12 @@ rgephy_status(struct mii_softc *sc) else mii->mii_media_active |= IFM_HDX; } + + if (IFM_SUBTYPE(mii->mii_media_active) == IFM_1000_T) { + gtsr = PHY_READ(sc, MII_100T2SR); + if ((gtsr & GTSR_MS_RES) != 0) + mii->mii_media_active |= IFM_ETH_MASTER; + } } @@ -489,7 +494,7 @@ rgephy_loop(struct mii_softc *sc) int i; if (sc->mii_mpd_model != MII_MODEL_REALTEK_RTL8251 && - sc->mii_mpd_rev < 2) { + sc->mii_mpd_rev < RGEPHY_8211B) { PHY_WRITE(sc, MII_BMCR, BMCR_PDOWN); DELAY(1000); } @@ -524,7 +529,7 @@ rgephy_load_dspcode(struct mii_softc *sc int val; if (sc->mii_mpd_model == MII_MODEL_REALTEK_RTL8251 || - sc->mii_mpd_rev >= 2) + sc->mii_mpd_rev >= RGEPHY_8211B) return; #if 1 @@ -625,16 +630,16 @@ rgephy_reset(struct mii_softc *sc) DELAY(1000); if (sc->mii_mpd_model != MII_MODEL_REALTEK_RTL8251 && - sc->mii_mpd_rev < 2) { + sc->mii_mpd_rev < RGEPHY_8211B) { rgephy_load_dspcode(sc); - } else if (sc->mii_mpd_rev == 3) { + } else if (sc->mii_mpd_rev == RGEPHY_8211C) { /* RTL8211C(L) */ ssr = PHY_READ(sc, RGEPHY_MII_SSR); if ((ssr & RGEPHY_SSR_ALDPS) != 0) { ssr &= ~RGEPHY_SSR_ALDPS; PHY_WRITE(sc, RGEPHY_MII_SSR, ssr); } - } else if (sc->mii_mpd_rev == 6) { + } else if (sc->mii_mpd_rev == RGEPHY_8211F) { /* RTL8211F */ phycr1 = PHY_READ(sc, RGEPHY_MII_PHYCR1); phycr1 &= ~RGEPHY_PHYCR1_MDI_MMCE; @@ -657,7 +662,7 @@ rgephy_reset(struct mii_softc *sc) /* NWay enable and Restart NWay */ PHY_WRITE(sc, MII_BMCR, BMCR_RESET | BMCR_AUTOEN | BMCR_STARTNEG); - if (sc->mii_mpd_rev == 6) { + if (sc->mii_mpd_rev >= RGEPHY_8211D) { /* RTL8211F */ delay(10000); /* disable EEE */ Index: src/sys/dev/mii/rgephyreg.h diff -u src/sys/dev/mii/rgephyreg.h:1.9 src/sys/dev/mii/rgephyreg.h:1.9.10.1 --- src/sys/dev/mii/rgephyreg.h:1.9 Fri Aug 21 16:29:48 2015 +++ src/sys/dev/mii/rgephyreg.h Thu Oct 24 15:54:46 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: rgephyreg.h,v 1.9 2015/08/21 16:29:48 jmcneill Exp $ */ +/* $NetBSD: rgephyreg.h,v 1.9.10.1 2019/10/24 15:54:46 martin Exp $ */ /* * Copyright (c) 2003 @@ -37,6 +37,12 @@ #ifndef _DEV_MII_RGEPHYREG_H_ #define _DEV_MII_RGEPHYREG_H_ +#define RGEPHY_8211B 2 +#define RGEPHY_8211C 3 +#define RGEPHY_8211D 4 +#define RGEPHY_8211E 5 +#define RGEPHY_8211F 6 + /* * RealTek 8169S/8110S gigE PHY registers */