--- //depot/yahoo/ybsd_6/src/sys/dev/mii/brgphy.c 2007/02/13 20:04:20 +++ //depot/jhb/bsd6/src/sys/dev/mii/brgphy.c 2007/02/15 12:30:27 @@ -93,6 +93,7 @@ static int brgphy_mii_phy_auto(struct mii_softc *); static void brgphy_reset(struct mii_softc *); static void brgphy_loop(struct mii_softc *); +static int bcm5706_is_tbi(device_t); static void bcm5401_load_dspcode(struct mii_softc *); static void bcm5411_load_dspcode(struct mii_softc *); static void bcm5703_load_dspcode(struct mii_softc *); @@ -174,10 +175,26 @@ if (MII_OUI(ma->mii_id1, ma->mii_id2) == MII_OUI_xxBROADCOM && MII_MODEL(ma->mii_id2) == MII_MODEL_xxBROADCOM_BCM5706C) { + /* + * Broadcom uses the same MII model ID on two different types + * of phys. The first is found on the BCM 5706 and is supported + * by this driver. The other is found on the BCM 5706S and + * 5708S and is supported by the gentbi(4) driver, so we check + * to see if this phy is supported by gentbi(4) and fail the + * probe if so. + */ + if (bcm5706_is_tbi(dev)) + return (ENXIO); device_set_desc(dev, MII_STR_xxBROADCOM_BCM5706C); return(BUS_PROBE_DEFAULT); } + if (MII_OUI(ma->mii_id1, ma->mii_id2) == MII_OUI_xxBROADCOM && + MII_MODEL(ma->mii_id2) == MII_MODEL_xxBROADCOM_BCM5708C) { + device_set_desc(dev, MII_STR_xxBROADCOM_BCM5708C); + return(BUS_PROBE_DEFAULT); + } + return(ENXIO); } @@ -529,6 +546,34 @@ } } +/* + * Check to see if a 5706 phy is really a SerDes phy. Copied from + * gentbi_probe(). + */ +static int +bcm5706_is_tbi(device_t dev) +{ + device_t parent; + struct mii_attach_args *ma; + int bmsr, extsr; + + parent = device_get_parent(dev); + ma = device_get_ivars(dev); + + bmsr = MIIBUS_READREG(parent, ma->mii_phyno, MII_BMSR); + if ((bmsr & BMSR_EXTSTAT) == 0 || (bmsr & BMSR_MEDIAMASK) != 0) + return (0); + + extsr = MIIBUS_READREG(parent, ma->mii_phyno, MII_EXTSR); + if (extsr & (EXTSR_1000TFDX|EXTSR_1000THDX)) + return (0); + + if (extsr & (EXTSR_1000XFDX|EXTSR_1000XHDX)) + return (1); + + return (0); +} + /* Turn off tap power management on 5401. */ static void bcm5401_load_dspcode(struct mii_softc *sc) @@ -662,6 +707,7 @@ case MII_MODEL_xxBROADCOM_BCM5714: case MII_MODEL_xxBROADCOM_BCM5780: case MII_MODEL_xxBROADCOM_BCM5706C: + case MII_MODEL_xxBROADCOM_BCM5708C: bcm5750_load_dspcode(sc); break; } --- //depot/yahoo/ybsd_6/src/sys/dev/mii/miidevs 2007/02/12 11:35:33 +++ //depot/jhb/bsd6/src/sys/dev/mii/miidevs 2007/02/15 12:12:02 @@ -120,13 +120,14 @@ model xxBROADCOM BCM5411 0x0007 BCM5411 10/100/1000baseTX PHY model xxBROADCOM BCM5752 0x0010 BCM5752 10/100/1000baseTX PHY model xxBROADCOM BCM5701 0x0011 BCM5701 10/100/1000baseTX PHY +model xxBROADCOM BCM5706C 0x0015 BCM5706C 10/100/1000baseTX PHY model xxBROADCOM BCM5703 0x0016 BCM5703 10/100/1000baseTX PHY model xxBROADCOM BCM5704 0x0019 BCM5704 10/100/1000baseTX PHY model xxBROADCOM BCM5705 0x001a BCM5705 10/100/1000baseTX PHY model xxBROADCOM BCM5750 0x0018 BCM5750 10/100/1000baseTX PHY model xxBROADCOM BCM5714 0x0034 BCM5714 10/100/1000baseTX PHY model xxBROADCOM BCM5780 0x0035 BCM5780 10/100/1000baseTX PHY -model xxBROADCOM BCM5706C 0x0036 BCM5706C/5708C 10/100/1000baseTX PHY +model xxBROADCOM BCM5708C 0x0036 BCM5708C 10/100/1000baseTX PHY /* Cicada Semiconductor PHYs (now owned by Vitesse?) */ model CICADA CS8201 0x0001 Cicada CS8201 10/100/1000TX PHY