There is a new rgepy(4) variant (rev. 6, RTL8211F).  Unfortunately
they moved the status register around on this new chip and also
twiddled the bits.  Here is a diff that handles that.  Somewhat
inspired by FreeBSD but I didn't add some of the workarounds tat
disable EEE and power save mode that are found in their rgephy(4).  So
far it seems I don't really need those for my Rock64 board.

ok?


Index: dev/mii/rgephy.c
===================================================================
RCS file: /cvs/src/sys/dev/mii/rgephy.c,v
retrieving revision 1.39
diff -u -p -r1.39 rgephy.c
--- dev/mii/rgephy.c    11 Mar 2017 13:40:46 -0000      1.39
+++ dev/mii/rgephy.c    26 Feb 2018 20:59:48 -0000
@@ -255,6 +255,11 @@ setit:
                                sc->mii_ticks = 0;
                                break;
                        }
+               } else if (sc->mii_rev == RGEPHY_8211F) {
+                       reg = PHY_READ(sc, RGEPHY_F_SR);
+                       if (reg & RGEPHY_F_SR_LINK) {
+                               sc->mii_ticks = 0;
+                       }
                } else {
                        reg = PHY_READ(sc, RGEPHY_SR);
                        if (reg & RGEPHY_SR_LINK) {
@@ -309,6 +314,10 @@ rgephy_status(struct mii_softc *sc)
                bmsr = PHY_READ(sc, RL_GMEDIASTAT);
                if (bmsr & RL_GMEDIASTAT_LINK)
                        mii->mii_media_status |= IFM_ACTIVE;
+       } else if (sc->mii_rev == RGEPHY_8211F) {
+               bmsr = PHY_READ(sc, RGEPHY_F_SR);
+               if (bmsr & RGEPHY_F_SR_LINK)
+                       mii->mii_media_status |= IFM_ACTIVE;
        } else {
                bmsr = PHY_READ(sc, RGEPHY_SR);
                if (bmsr & RGEPHY_SR_LINK)
@@ -340,6 +349,20 @@ rgephy_status(struct mii_softc *sc)
                        mii->mii_media_active |= IFM_10_T;
 
                if (bmsr & RL_GMEDIASTAT_FDX)
+                       mii->mii_media_active |= mii_phy_flowstatus(sc) |
+                           IFM_FDX;
+               else
+                       mii->mii_media_active |= IFM_HDX;
+       } else if (sc->mii_rev == RGEPHY_8211F) {
+               bmsr = PHY_READ(sc, RGEPHY_F_SR);
+               if (RGEPHY_F_SR_SPEED(bmsr) == RGEPHY_F_SR_SPEED_1000MBPS)
+                       mii->mii_media_active |= IFM_1000_T;
+               else if (RGEPHY_F_SR_SPEED(bmsr) == RGEPHY_F_SR_SPEED_100MBPS)
+                       mii->mii_media_active |= IFM_100_TX;
+               else if (RGEPHY_F_SR_SPEED(bmsr) == RGEPHY_F_SR_SPEED_10MBPS)
+                       mii->mii_media_active |= IFM_10_T;
+
+               if (bmsr & RGEPHY_F_SR_FDX)
                        mii->mii_media_active |= mii_phy_flowstatus(sc) |
                            IFM_FDX;
                else
Index: dev/mii/rgephyreg.h
===================================================================
RCS file: /cvs/src/sys/dev/mii/rgephyreg.h,v
retrieving revision 1.8
diff -u -p -r1.8 rgephyreg.h
--- dev/mii/rgephyreg.h 19 Jul 2015 06:35:18 -0000      1.8
+++ dev/mii/rgephyreg.h 26 Feb 2018 20:59:48 -0000
@@ -36,6 +36,10 @@
 #ifndef _DEV_MII_RGEPHYREG_H_
 #define        _DEV_MII_RGEPHYREG_H_
 
+#define RGEPHY_8211B           2
+#define RGEPHY_8211C           3
+#define RGEPHY_8211F           6
+
 /*
  * Realtek 8169S/8110S gigE PHY registers
  */
@@ -52,6 +56,7 @@
 #define RGEPHY_CR_ALDPS                0x0004  /* RTL8251 only */
 #define RGEPHY_CR_JABBER_DIS   0x0001
 
+/* RTL8211B(L)/RTL8211C(L) */
 #define RGEPHY_SR              0x11    /* PHY Specific Status */
 #define RGEPHY_SR_SPEED_1000MBPS       0x8000
 #define RGEPHY_SR_SPEED_100MBPS                0x4000
@@ -65,6 +70,16 @@
 #define RGEPHY_SR_ALDPS                        0x0008  /* RTL8211C(L) only */
 #define RGEPHY_SR_JABBER               0x0001  /* Jabber */
 #define RGEPHY_SR_SPEED(X)             ((X) & RGEPHY_SR_SPEED_MASK)
+
+/* RTL8211F */
+#define RGEPHY_F_SR            0x1A    /* PHY Specific Status */
+#define RGEPHY_F_SR_SPEED_1000MBPS     0x0020
+#define RGEPHY_F_SR_SPEED_100MBPS      0x0010
+#define RGEPHY_F_SR_SPEED_10MBPS       0x0000
+#define RGEPHY_F_SR_SPEED_MASK         0x0030
+#define RGEPHY_F_SR_FDX                        0x0004
+#define RGEPHY_F_SR_LINK               0x0002
+#define RGEPHY_F_SR_SPEED(X)           ((X) & RGEPHY_F_SR_SPEED_MASK)
 
 #define RGEPHY_LC              0x18    /* PHY LED Control Register */
 #define RGEPHY_LC_P2           0x1A    /* PHY LED Control Register, Page 2 */

Reply via email to