summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/dev/mii/miidevs4
-rw-r--r--sys/dev/mii/xmphy.c26
-rw-r--r--sys/dev/mii/xmphyreg.h1
3 files changed, 23 insertions, 8 deletions
diff --git a/sys/dev/mii/miidevs b/sys/dev/mii/miidevs
index 1d20d86..9dba1b8 100644
--- a/sys/dev/mii/miidevs
+++ b/sys/dev/mii/miidevs
@@ -55,6 +55,7 @@ oui BROADCOM 0x001018 Broadcom Corporation
oui DAVICOM 0x00606e Davicom Semiconductor
oui ICS 0x00a0be Integrated Circuit Systems
oui INTEL 0x00aa00 Intel
+oui JATO 0x00e083 Jato Technologies
oui LEVEL1 0x00207b Level 1
oui NATSEMI 0x080017 National Semiconductor
oui QUALSEMI 0x006051 Quality Semiconductor
@@ -118,6 +119,9 @@ model INTEL I82562EM 0x0032 i82562EM 10/100 media interface
model INTEL I82562ET 0x0033 i82562ET 10/100 media interface
model INTEL I82553C 0x0035 i82553 10/100 media interface
+/* Jato Technologies PHYs */
+model JATO BASEX 0x0000 Jato 1000baseX media interface
+
/* Level 1 PHYs */
model xxLEVEL1 LXT970 0x0000 LXT970 10/100 media interface
diff --git a/sys/dev/mii/xmphy.c b/sys/dev/mii/xmphy.c
index d312ac2..c147da0 100644
--- a/sys/dev/mii/xmphy.c
+++ b/sys/dev/mii/xmphy.c
@@ -98,13 +98,19 @@ static int xmphy_probe(dev)
ma = device_get_ivars(dev);
- if (MII_OUI(ma->mii_id1, ma->mii_id2) != MII_OUI_xxXAQTI ||
- MII_MODEL(ma->mii_id2) != MII_MODEL_XAQTI_XMACII)
- return(ENXIO);
+ if (MII_OUI(ma->mii_id1, ma->mii_id2) == MII_OUI_xxXAQTI &&
+ MII_MODEL(ma->mii_id2) == MII_MODEL_XAQTI_XMACII) {
+ device_set_desc(dev, MII_STR_XAQTI_XMACII);
+ return(0);
+ }
- device_set_desc(dev, MII_STR_XAQTI_XMACII);
+ if (MII_OUI(ma->mii_id1, ma->mii_id2) == MII_OUI_JATO &&
+ MII_MODEL(ma->mii_id2) == MII_MODEL_JATO_BASEX) {
+ device_set_desc(dev, MII_STR_JATO_BASEX);
+ return(0);
+ }
- return(0);
+ return(ENXIO);
}
static int xmphy_attach(dev)
@@ -210,11 +216,13 @@ xmphy_service(sc, mii, cmd)
switch (IFM_SUBTYPE(ife->ifm_media)) {
case IFM_AUTO:
+#ifdef foo
/*
* If we're already in auto mode, just return.
*/
if (PHY_READ(sc, XMPHY_MII_BMCR) & XMPHY_BMCR_AUTOEN)
return (0);
+#endif
(void) xmphy_mii_phy_auto(sc, 1);
break;
case IFM_1000_SX:
@@ -349,11 +357,13 @@ xmphy_mii_phy_auto(mii, waitfor)
struct mii_softc *mii;
int waitfor;
{
- int bmsr, i;
+ int bmsr, anar = 0, i;
if ((mii->mii_flags & MIIF_DOINGAUTO) == 0) {
- PHY_WRITE(mii, XMPHY_MII_ANAR,
- XMPHY_ANAR_FDX|XMPHY_ANAR_HDX);
+ anar = PHY_READ(mii, XMPHY_MII_ANAR);
+ anar |= XMPHY_ANAR_FDX|XMPHY_ANAR_HDX;
+ PHY_WRITE(mii, XMPHY_MII_ANAR, anar);
+ DELAY(1000);
PHY_WRITE(mii, XMPHY_MII_BMCR,
XMPHY_BMCR_AUTOEN | XMPHY_BMCR_STARTNEG);
}
diff --git a/sys/dev/mii/xmphyreg.h b/sys/dev/mii/xmphyreg.h
index 1dff3a5..51fc4a1 100644
--- a/sys/dev/mii/xmphyreg.h
+++ b/sys/dev/mii/xmphyreg.h
@@ -44,6 +44,7 @@
#define XMPHY_BMCR_LOOP 0x4000
#define XMPHY_BMCR_AUTOEN 0x1000 /* Autoneg enabled */
#define XMPHY_BMCR_PDOWN 0x0800 /* Power down */
+#define XMPHY_BMCR_ISO 0x0400 /* Isolate */
#define XMPHY_BMCR_STARTNEG 0x0200 /* Restart autoneg */
#define XMPHY_BMCR_FDX 0x0100 /* Duplex mode */
OpenPOWER on IntegriCloud