diff options
-rw-r--r-- | sys/dev/mii/miidevs | 4 | ||||
-rw-r--r-- | sys/dev/mii/xmphy.c | 26 | ||||
-rw-r--r-- | sys/dev/mii/xmphyreg.h | 1 |
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 */ |