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
  */

Reply via email to