summaryrefslogtreecommitdiffstats
path: root/sys/dev/mii
diff options
context:
space:
mode:
authoryongari <yongari@FreeBSD.org>2009-03-09 08:17:46 +0000
committeryongari <yongari@FreeBSD.org>2009-03-09 08:17:46 +0000
commit4e908eaace9a5119393137b8b37a08bd44de36b4 (patch)
tree96362710ee603e929ab97054b5747ee0d3e10485 /sys/dev/mii
parentd3c51f44fd98c7acbc6c1e89326a6e2cc57bfdbf (diff)
downloadFreeBSD-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.c18
-rw-r--r--sys/dev/mii/ip1000phyreg.h1
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
OpenPOWER on IntegriCloud