> Date: Sat, 28 Dec 2013 15:42:12 -0500
> From: Brad Smith <b...@comstyle.com>
> 
> This moves rgephy(4) back to using RL_GMEDIASTAT to read the link/media
> status for re(4) attached Realtek PHY as was done before rev 1.25. rev
> 1.25 was to add support for external rgephy(4) attached to other MAC
> such as nfe(4), but the PHY Specific Status register doesn't seem to
> work properly with some integrated PHY with re(4).
> 
> Tested with..
> rgephy0 at re0 phy 7: RTL8169S/8110S PHY, rev. 2
> rgephy0 at re0 phy 7: RTL8169S/8110S PHY, rev. 4
> rgephy0 at re0 phy 7: RTL8169S/8110S PHY, rev. 5
> 
> and some newer PHY where this was problematic but existing 8169 PHY
> rev board combos are affected too.
> 
> >From FreeBSD and matches what the Linux driver does.

I hate mii(4) drivers that look at the name of their parent!

> Index: rgephy.c
> ===================================================================
> RCS file: /home/cvs/src/sys/dev/mii/rgephy.c,v
> retrieving revision 1.30
> diff -u -p -r1.30 rgephy.c
> --- rgephy.c  28 May 2013 09:46:06 -0000      1.30
> +++ rgephy.c  19 Dec 2013 11:13:54 -0000
> @@ -145,6 +145,9 @@ rgephy_service(struct mii_softc *sc, str
>  {
>       struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
>       int anar, reg, speed, gig = 0;
> +     char *devname;
> +
> +     devname = sc->mii_dev.dv_parent->dv_cfdata->cf_driver->cd_name;
>  
>       switch (cmd) {
>       case MII_POLLSTAT:
> @@ -249,7 +252,7 @@ setit:
>                * need to restart the autonegotiation process.  Read
>                * the BMSR twice in case it's latched.
>                */
> -             if (sc->mii_rev < 2) {
> +             if (strcmp(devname, "re") == 0) {
>                       reg = PHY_READ(sc, RL_GMEDIASTAT);
>                       if (reg & RL_GMEDIASTAT_LINK) {
>                               sc->mii_ticks = 0;
> @@ -298,13 +301,15 @@ rgephy_status(struct mii_softc *sc)
>  {
>       struct mii_data *mii = sc->mii_pdata;
>       int bmsr, bmcr, gtsr;
> +     char *devname;
> +
> +     devname = sc->mii_dev.dv_parent->dv_cfdata->cf_driver->cd_name;
>  
>       mii->mii_media_status = IFM_AVALID;
>       mii->mii_media_active = IFM_ETHER;
>  
> -     if (sc->mii_rev < 2) {
> +     if (strcmp(devname, "re") == 0) {
>               bmsr = PHY_READ(sc, RL_GMEDIASTAT);
> -
>               if (bmsr & RL_GMEDIASTAT_LINK)
>                       mii->mii_media_status |= IFM_ACTIVE;
>       } else {
> @@ -328,7 +333,7 @@ rgephy_status(struct mii_softc *sc)
>               }
>       }
>  
> -     if (sc->mii_rev < 2) {
> +     if (strcmp(devname, "re") == 0) {
>               bmsr = PHY_READ(sc, RL_GMEDIASTAT);
>               if (bmsr & RL_GMEDIASTAT_1000MBPS)
>                       mii->mii_media_active |= IFM_1000_T;
> 
> -- 
> This message has been scanned for viruses and
> dangerous content by MailScanner, and is
> believed to be clean.
> 
> 

Reply via email to