diff options
author | yongari <yongari@FreeBSD.org> | 2009-03-09 08:17:46 +0000 |
---|---|---|
committer | yongari <yongari@FreeBSD.org> | 2009-03-09 08:17:46 +0000 |
commit | 4e908eaace9a5119393137b8b37a08bd44de36b4 (patch) | |
tree | 96362710ee603e929ab97054b5747ee0d3e10485 /sys/dev/mii | |
parent | d3c51f44fd98c7acbc6c1e89326a6e2cc57bfdbf (diff) | |
download | FreeBSD-src-4e908eaace9a5119393137b8b37a08bd44de36b4.zip FreeBSD-src-4e908eaace9a5119393137b8b37a08bd44de36b4.tar.gz |
For IP1001 PHYs, read auto-negotiation advertisement register to
get default next page configuration. While I'm here explicitly set
IP1000PHY_ANAR_CSMA bit. This bit is read-only and always set
by hardware so setting it has no effect but it would clear the
intention. With this change controllers that couldn't establish
1000baseT link should work.
PR: kern/130846
Diffstat (limited to 'sys/dev/mii')
-rw-r--r-- | sys/dev/mii/ip1000phy.c | 18 | ||||
-rw-r--r-- | sys/dev/mii/ip1000phyreg.h | 1 |
2 files changed, 13 insertions, 6 deletions
diff --git a/sys/dev/mii/ip1000phy.c b/sys/dev/mii/ip1000phy.c index 500156b..8e81d81 100644 --- a/sys/dev/mii/ip1000phy.c +++ b/sys/dev/mii/ip1000phy.c @@ -391,18 +391,24 @@ ip1000phy_status(struct mii_softc *sc) } static int -ip1000phy_mii_phy_auto(struct mii_softc *mii) +ip1000phy_mii_phy_auto(struct mii_softc *sc) { + struct ip1000phy_softc *isc; uint32_t reg; - PHY_WRITE(mii, IP1000PHY_MII_ANAR, - IP1000PHY_ANAR_10T | IP1000PHY_ANAR_10T_FDX | + isc = (struct ip1000phy_softc *)sc; + reg = 0; + if (isc->model == MII_MODEL_ICPLUS_IP1001) + reg = PHY_READ(sc, IP1000PHY_MII_ANAR); + reg |= IP1000PHY_ANAR_10T | IP1000PHY_ANAR_10T_FDX | IP1000PHY_ANAR_100TX | IP1000PHY_ANAR_100TX_FDX | - IP1000PHY_ANAR_PAUSE | IP1000PHY_ANAR_APAUSE); + IP1000PHY_ANAR_PAUSE | IP1000PHY_ANAR_APAUSE; + PHY_WRITE(sc, IP1000PHY_MII_ANAR, reg | IP1000PHY_ANAR_CSMA); + reg = IP1000PHY_1000CR_1000T | IP1000PHY_1000CR_1000T_FDX; reg |= IP1000PHY_1000CR_MASTER; - PHY_WRITE(mii, IP1000PHY_MII_1000CR, reg); - PHY_WRITE(mii, IP1000PHY_MII_BMCR, (IP1000PHY_BMCR_FDX | + PHY_WRITE(sc, IP1000PHY_MII_1000CR, reg); + PHY_WRITE(sc, IP1000PHY_MII_BMCR, (IP1000PHY_BMCR_FDX | IP1000PHY_BMCR_AUTOEN | IP1000PHY_BMCR_STARTNEG)); return (EJUSTRETURN); diff --git a/sys/dev/mii/ip1000phyreg.h b/sys/dev/mii/ip1000phyreg.h index f69ab01..27add4f 100644 --- a/sys/dev/mii/ip1000phyreg.h +++ b/sys/dev/mii/ip1000phyreg.h @@ -61,6 +61,7 @@ /* Autonegotiation advertisement register */ #define IP1000PHY_MII_ANAR 0x04 +#define IP1000PHY_ANAR_CSMA 0x0001 #define IP1000PHY_ANAR_10T 0x0020 #define IP1000PHY_ANAR_10T_FDX 0x0040 #define IP1000PHY_ANAR_100TX 0x0080 |