static int miibus_readreg(device_t dev, int phy, int reg) { device_t parent; parent = device_get_parent(dev); return(MIIBUS_READREG(parent, phy, reg)); }
/* * Check to see if there is a PHY at this address. Note, * many braindead PHYs report 0/0 in their ID registers, * so we test for media in the BMSR. */ static __inline int miibus_no_phy(device_t dev, int phyno) { int bmsr; bmsr = MIIBUS_READREG(dev, phyno, MII_BMSR); return (bmsr == 0 || bmsr == 0xffff || (bmsr & (BMSR_MEDIAMASK | BMSR_EXTSTAT)) == 0); }
int miibus_probe(device_t dev) { struct mii_attach_args ma, *args; struct mii_data *mii; device_t child = NULL, parent; int capmask = 0xFFFFFFFF; mii = device_get_softc(dev); parent = device_get_parent(dev); LIST_INIT(&mii->mii_phys); bzero(&ma, sizeof(ma)); for (ma.mii_phyno = 0; ma.mii_phyno < MII_NPHY; ma.mii_phyno++) { if (miibus_no_phy(parent, ma.mii_phyno)) continue; /* * Extract the IDs. Braindead PHYs will be handled by * the `ukphy' driver, as we have no ID information to * match on. */ ma.mii_id1 = MIIBUS_READREG(parent, ma.mii_phyno, MII_PHYIDR1); ma.mii_id2 = MIIBUS_READREG(parent, ma.mii_phyno, MII_PHYIDR2); ma.mii_data = mii; ma.mii_capmask = capmask; args = kmalloc(sizeof(struct mii_attach_args), M_DEVBUF, M_INTWAIT); *args = ma; child = device_add_child(dev, NULL, -1); device_set_ivars(child, args); } if (child == NULL) return(ENXIO); device_set_desc(dev, "MII bus"); return(0); }
static int gentbi_probe(device_t dev) { device_t parent; struct mii_attach_args *ma; int bmsr, extsr; parent = device_get_parent(dev); ma = device_get_ivars(dev); /* * We match as a generic TBI if: * * - There is no media in the BMSR. * - EXTSR has only 1000X. */ bmsr = MIIBUS_READREG(parent, ma->mii_phyno, MII_BMSR); if ((bmsr & BMSR_EXTSTAT) == 0 || (bmsr & BMSR_MEDIAMASK) != 0) return (ENXIO); extsr = MIIBUS_READREG(parent, ma->mii_phyno, MII_EXTSR); if (extsr & (EXTSR_1000TFDX|EXTSR_1000THDX)) return (ENXIO); if (extsr & (EXTSR_1000XFDX|EXTSR_1000XHDX)) { /* * We think this is a generic TBI. Return a match * priority higher than ukphy, but lower than what * specific drivers will return. */ device_set_desc(dev, "Generic ten-bit interface"); return (BUS_PROBE_LOW_PRIORITY); } return (ENXIO); }
static void rlswitch_phydump(device_t dev) { int phy, reg, val; struct mii_softc *sc; sc = device_get_softc(dev); device_printf(dev, "rlswitchphydump\n"); for (phy = 0; phy <= 5; phy++) { printf("PHY%i:", phy); for (reg = 0; reg <= 31; reg++) { val = MIIBUS_READREG(sc->mii_dev, phy, reg); printf(" 0x%x", val); } printf("\n"); } }