diff options
author | marius <marius@FreeBSD.org> | 2011-01-14 19:29:53 +0000 |
---|---|---|
committer | marius <marius@FreeBSD.org> | 2011-01-14 19:29:53 +0000 |
commit | cfca51bb67689eaf0c3b6b31501c6dd28ac3f1b0 (patch) | |
tree | dc8d4cfb175320bd42ead1837e44df41ab18484d /sys/dev/mii/ciphy.c | |
parent | 0ea473c75dcd3a00de2311af816135520b29f4c9 (diff) | |
download | FreeBSD-src-cfca51bb67689eaf0c3b6b31501c6dd28ac3f1b0.zip FreeBSD-src-cfca51bb67689eaf0c3b6b31501c6dd28ac3f1b0.tar.gz |
- Even after masking the media with IFM_GMASK the result may have bits
besides the duplex ones set so just comparing it with IFM_FDX may lead
to false negatives.
- Simplify ciphy_service() to only set the manual configuration bits
once after we have figured them all out. This also means we no longer
unnecessarily update the hardware along the road.
MFC after: 1 week
Diffstat (limited to 'sys/dev/mii/ciphy.c')
-rw-r--r-- | sys/dev/mii/ciphy.c | 25 |
1 files changed, 11 insertions, 14 deletions
diff --git a/sys/dev/mii/ciphy.c b/sys/dev/mii/ciphy.c index 3f320fb..919680b 100644 --- a/sys/dev/mii/ciphy.c +++ b/sys/dev/mii/ciphy.c @@ -176,26 +176,23 @@ ciphy_service(struct mii_softc *sc, struct mii_data *mii, int cmd) case IFM_10_T: speed = CIPHY_S10; setit: - if ((ife->ifm_media & IFM_GMASK) == IFM_FDX) { + if ((ife->ifm_media & IFM_FDX) != 0) { speed |= CIPHY_BMCR_FDX; gig = CIPHY_1000CTL_AFD; - } else { + } else gig = CIPHY_1000CTL_AHD; - } - PHY_WRITE(sc, CIPHY_MII_1000CTL, 0); + if (IFM_SUBTYPE(ife->ifm_media) == IFM_1000_T) { + gig |= CIPHY_1000CTL_MSE; + if ((ife->ifm_media & IFM_ETH_MASTER) != 0) + gig |= CIPHY_1000CTL_MSC; + speed |= + CIPHY_BMCR_AUTOEN | CIPHY_BMCR_STARTNEG; + } else + gig = 0; + PHY_WRITE(sc, CIPHY_MII_1000CTL, gig); PHY_WRITE(sc, CIPHY_MII_BMCR, speed); PHY_WRITE(sc, CIPHY_MII_ANAR, CIPHY_SEL_TYPE); - - if (IFM_SUBTYPE(ife->ifm_media) != IFM_1000_T) - break; - - gig |= CIPHY_1000CTL_MSE; - if ((ife->ifm_media & IFM_ETH_MASTER) != 0) - gig |= CIPHY_1000CTL_MSC; - PHY_WRITE(sc, CIPHY_MII_1000CTL, gig); - PHY_WRITE(sc, CIPHY_MII_BMCR, - speed | CIPHY_BMCR_AUTOEN | CIPHY_BMCR_STARTNEG); break; case IFM_NONE: PHY_WRITE(sc, MII_BMCR, BMCR_ISO | BMCR_PDOWN); |