peterj created this revision. peterj added a reviewer: network. peterj requested review of this revision.
REVISION SUMMARY The RTL8211F-VD is a replacement/upgrade for the RTL8211F. Based on https://github.com/torvalds/linux/commit/bb726b753f75a4eeda291438f89dfd9b94783569, the only difference is the lack of the PCR2 register, which FreeBSD doesn't use. At least on my Radxa ROCK 4C Plus, the fallback ukphy(4) is unable to manage autonegotiation, whereas the attached patch allows rgephy(4) to attach and autonegotiation then works. TEST PLAN Tested on my Radxa ROCK 4C Plus REVISION DETAIL https://reviews.freebsd.org/D45109 AFFECTED FILES sys/dev/mii/miidevs sys/dev/mii/rgephy.c sys/dev/mii/rgephyreg.h EMAIL PREFERENCES https://reviews.freebsd.org/settings/panel/emailpreferences/ To: peterj, #network Cc: freebsd-net-list
diff --git a/sys/dev/mii/rgephyreg.h b/sys/dev/mii/rgephyreg.h --- a/sys/dev/mii/rgephyreg.h +++ b/sys/dev/mii/rgephyreg.h @@ -38,6 +38,7 @@ #define RGEPHY_8211B 2 #define RGEPHY_8211C 3 #define RGEPHY_8211F 6 +#define RGEPHY_8211FVD 8 /* * RealTek 8169S/8110S gigE PHY registers diff --git a/sys/dev/mii/rgephy.c b/sys/dev/mii/rgephy.c --- a/sys/dev/mii/rgephy.c +++ b/sys/dev/mii/rgephy.c @@ -93,6 +93,7 @@ static const struct mii_phydesc rgephys[] = { MII_PHY_DESC(REALTEK, RTL8169S), MII_PHY_DESC(REALTEK, RTL8251), + MII_PHY_DESC(REALTEK, RTL8211FVD), MII_PHY_END }; @@ -283,7 +284,7 @@ linkup = 0; if ((sc->mii_flags & MIIF_PHYPRIV0) == 0 && sc->mii_mpd_rev >= RGEPHY_8211B) { - if (sc->mii_mpd_rev == RGEPHY_8211F) { + if (sc->mii_mpd_rev >= RGEPHY_8211F) { reg = PHY_READ(sc, RGEPHY_F_MII_SSR); if (reg & RGEPHY_F_SSR_LINK) linkup++; @@ -338,7 +339,7 @@ if ((sc->mii_flags & MIIF_PHYPRIV0) == 0 && sc->mii_mpd_rev >= RGEPHY_8211B) { - if (sc->mii_mpd_rev == RGEPHY_8211F) { + if (sc->mii_mpd_rev >= RGEPHY_8211F) { ssr = PHY_READ(sc, RGEPHY_F_MII_SSR); switch (ssr & RGEPHY_F_SSR_SPD_MASK) { case RGEPHY_F_SSR_S1000: @@ -523,6 +524,7 @@ switch (sc->mii_mpd_rev) { case RGEPHY_8211F: + case RGEPHY_8211FVD: pcr = PHY_READ(sc, RGEPHY_F_MII_PCR1); pcr &= ~(RGEPHY_F_PCR1_MDI_MM | RGEPHY_F_PCR1_ALDPS_EN); PHY_WRITE(sc, RGEPHY_F_MII_PCR1, pcr); diff --git a/sys/dev/mii/miidevs b/sys/dev/mii/miidevs --- a/sys/dev/mii/miidevs +++ b/sys/dev/mii/miidevs @@ -330,6 +330,7 @@ model REALTEK RTL8201E 0x0008 RTL8201E 10/100 media interface model REALTEK RTL8251 0x0000 RTL8251/8153 1000BASE-T media interface model REALTEK RTL8169S 0x0011 RTL8169S/8110S/8211 1000BASE-T media interface +model REALTEK RTL8211FVD 0x0007 RTL8211F-VD 1000BASE-T media interface /* Seeq Seeq PHYs */ model SEEQ 80220 0x0003 Seeq 80220 10/100 media interface