void atphy_attach(struct device *parent, struct device *self, void *aux) { struct mii_softc *sc = (struct mii_softc *)self; struct mii_attach_args *ma = aux; struct mii_data *mii = ma->mii_data; const struct mii_phydesc *mpd; mpd = mii_phy_match(ma, atphys); printf(": %s, rev. %d\n", mpd->mpd_name, MII_REV(ma->mii_id2)); sc->mii_inst = mii->mii_instance; sc->mii_phy = ma->mii_phyno; sc->mii_funcs = &atphy_funcs; sc->mii_pdata = mii; sc->mii_flags = ma->mii_flags; sc->mii_anegticks = MII_ANEGTICKS_GIGE; sc->mii_flags |= MIIF_NOLOOP; PHY_RESET(sc); sc->mii_capabilities = PHY_READ(sc, MII_BMSR) & ma->mii_capmask; if (sc->mii_capabilities & BMSR_EXTSTAT) sc->mii_extcapabilities = PHY_READ(sc, MII_EXTSR); mii_phy_add_media(sc); }
void etphy_attach(struct device *parent, struct device *self, void *aux) { struct mii_softc *sc = (struct mii_softc *)self; struct mii_attach_args *ma = aux; struct mii_data *mii = ma->mii_data; const struct mii_phydesc *mpd; mpd = mii_phy_match(ma, etphys); printf(": %s, rev. %d\n", mpd->mpd_name, MII_REV(ma->mii_id2)); sc->mii_inst = mii->mii_instance; sc->mii_phy = ma->mii_phyno; sc->mii_funcs = &etphy_funcs; sc->mii_model = MII_MODEL(ma->mii_id2); sc->mii_pdata = mii; sc->mii_flags = ma->mii_flags; sc->mii_flags |= MIIF_NOISOLATE | MIIF_NOLOOP; PHY_RESET(sc); sc->mii_capabilities = PHY_READ(sc, MII_BMSR) & ma->mii_capmask; if (sc->mii_capabilities & BMSR_EXTSTAT) { sc->mii_extcapabilities = PHY_READ(sc, MII_EXTSR); /* No 1000baseT half-duplex support */ sc->mii_extcapabilities &= ~EXTSR_1000THDX; } mii_phy_add_media(sc); }
int rlphymatch(device_t parent, cfdata_t match, void *aux) { struct mii_attach_args *ma = aux; struct mii_data *mii = ma->mii_data; if (mii->mii_instance != 0) return 0; if (mii_phy_match(ma, rlphys) != NULL) return (10); if (MII_OUI(ma->mii_id1, ma->mii_id2) != 0 || MII_MODEL(ma->mii_id2) != 0) return 0; if (!device_is_a(parent, "rtk") && !device_is_a(parent, "re")) return 0; /* * A "real" phy should get preference, but on the 8139 there * is no phyid register. */ return 5; }
static void nsphyattach(device_t parent, device_t self, void *aux) { struct mii_softc *sc = device_private(self); struct mii_attach_args *ma = aux; struct mii_data *mii = ma->mii_data; const struct mii_phydesc *mpd; mpd = mii_phy_match(ma, nsphys); aprint_naive(": Media interface\n"); aprint_normal(": %s, rev. %d\n", mpd->mpd_name, MII_REV(ma->mii_id2)); sc->mii_dev = self; sc->mii_inst = mii->mii_instance; sc->mii_phy = ma->mii_phyno; sc->mii_funcs = &nsphy_funcs; sc->mii_pdata = mii; sc->mii_flags = ma->mii_flags; sc->mii_anegticks = MII_ANEGTICKS; PHY_RESET(sc); sc->mii_capabilities = PHY_READ(sc, MII_BMSR) & ma->mii_capmask; aprint_normal_dev(self, ""); if ((sc->mii_capabilities & BMSR_MEDIAMASK) == 0) aprint_error("no media present"); else mii_phy_add_media(sc); aprint_normal("\n"); if (!pmf_device_register(self, NULL, mii_phy_resume)) aprint_error_dev(self, "couldn't establish power handler\n"); }
void bmtphyattach(struct device *parent, struct device *self, void *aux) { struct mii_softc *sc = (struct mii_softc *)self; struct mii_attach_args *ma = aux; struct mii_data *mii = ma->mii_data; const struct mii_phydesc *mpd; mpd = mii_phy_match(ma, bmtphys); printf(": %s, rev. %d\n", mpd->mpd_name, MII_REV(ma->mii_id2)); sc->mii_model = MII_MODEL(ma->mii_id2); sc->mii_inst = mii->mii_instance; sc->mii_phy = ma->mii_phyno; sc->mii_funcs = &bmtphy_funcs; sc->mii_pdata = mii; sc->mii_flags = ma->mii_flags; sc->mii_anegticks = MII_ANEGTICKS; PHY_RESET(sc); /* * XXX Check AUX_STS_FX_MODE to set MIIF_HAVE_FIBER? */ sc->mii_capabilities = PHY_READ(sc, MII_BMSR) & ma->mii_capmask; if (sc->mii_capabilities & BMSR_MEDIAMASK) mii_phy_add_media(sc); }
int rlphymatch(struct device *parent, void *match, void *aux) { struct mii_attach_args *ma = aux; char *devname; devname = parent->dv_cfdata->cf_driver->cd_name; if (mii_phy_match(ma, rlphys) != NULL) return (10); if (MII_OUI(ma->mii_id1, ma->mii_id2) != 0 || MII_MODEL(ma->mii_id2) != 0) return (0); if ((strcmp(devname, "re") != 0) && (strcmp(devname, "rl") != 0)) return (0); /* * A "real" phy should get preference, but on the 8139 there * is no phyid register. */ return (5); }
void rlphyattach(struct device *parent, struct device *self, void *aux) { struct mii_softc *sc = (struct mii_softc *)self; struct mii_attach_args *ma = aux; struct mii_data *mii = ma->mii_data; const struct mii_phydesc *mpd; mpd = mii_phy_match(ma, rlphys); if (mpd != NULL) { printf(": %s, rev. %d\n", mpd->mpd_name, MII_REV(ma->mii_id2)); } else printf(": RTL internal PHY\n"); sc->mii_inst = mii->mii_instance; sc->mii_phy = ma->mii_phyno; sc->mii_funcs = &rlphy_funcs; sc->mii_pdata = mii; sc->mii_flags = ma->mii_flags; sc->mii_flags |= MIIF_NOISOLATE; PHY_RESET(sc); sc->mii_capabilities = PHY_READ(sc, MII_BMSR) & ma->mii_capmask; if (sc->mii_capabilities & BMSR_MEDIAMASK) mii_phy_add_media(sc); }
static void glxtphyattach(device_t parent, device_t self, void *aux) { struct mii_softc *sc = device_private(self); struct mii_attach_args *ma = aux; struct mii_data *mii = ma->mii_data; const struct mii_phydesc *mpd; mpd = mii_phy_match(ma, glxtphys); aprint_naive(": Media interface\n"); aprint_normal(": %s, rev. %d\n", mpd->mpd_name, MII_REV(ma->mii_id2)); sc->mii_dev = self; sc->mii_inst = mii->mii_instance; sc->mii_phy = ma->mii_phyno; sc->mii_funcs = &glxtphy_funcs; sc->mii_pdata = mii; sc->mii_flags = ma->mii_flags; sc->mii_anegticks = MII_ANEGTICKS; PHY_RESET(sc); sc->mii_capabilities = PHY_READ(sc, MII_BMSR) & ma->mii_capmask; if (sc->mii_capabilities & BMSR_EXTSTAT) sc->mii_extcapabilities = PHY_READ(sc, MII_EXTSR); aprint_normal_dev(self, ""); if ((sc->mii_capabilities & BMSR_MEDIAMASK) == 0 && (sc->mii_extcapabilities & EXTSR_MEDIAMASK) == 0) aprint_error("no media present"); else mii_phy_add_media(sc); aprint_normal("\n"); }
void xmphy_attach(struct device *parent, struct device *self, void *aux) { struct mii_softc *sc = (struct mii_softc *)self; struct mii_attach_args *ma = aux; struct mii_data *mii = ma->mii_data; const struct mii_phydesc *mpd; mpd = mii_phy_match(ma, xmphys); printf(": %s, rev. %d\n", mpd->mpd_name, MII_REV(ma->mii_id2)); sc->mii_inst = mii->mii_instance; sc->mii_phy = ma->mii_phyno; sc->mii_funcs = &xmphy_funcs; sc->mii_pdata = mii; sc->mii_flags = ma->mii_flags; sc->mii_anegticks = MII_ANEGTICKS; sc->mii_flags |= MIIF_NOISOLATE; #define ADD(m, c) ifmedia_add(&mii->mii_media, (m), (c), NULL) ADD(IFM_MAKEWORD(IFM_ETHER, IFM_NONE, 0, sc->mii_inst), BMCR_ISO); PHY_RESET(sc); ADD(IFM_MAKEWORD(IFM_ETHER, IFM_1000_SX, 0, sc->mii_inst), XMPHY_BMCR_FDX); ADD(IFM_MAKEWORD(IFM_ETHER, IFM_1000_SX, IFM_FDX, sc->mii_inst), 0); ADD(IFM_MAKEWORD(IFM_ETHER, IFM_AUTO, 0, sc->mii_inst), 0); #undef ADD }
int xmphy_probe(struct device *parent, void *match, void *aux) { struct mii_attach_args *ma = aux; if (mii_phy_match(ma, xmphys) != NULL) return (10); return (0); }
static void gphyterattach(device_t parent, device_t self, void *aux) { struct mii_softc *sc = device_private(self); struct mii_attach_args *ma = aux; struct mii_data *mii = ma->mii_data; const struct mii_phydesc *mpd; int anar, strap; mpd = mii_phy_match(ma, gphyters); aprint_naive(": Media interface\n"); aprint_normal(": %s, rev. %d\n", mpd->mpd_name, MII_REV(ma->mii_id2)); sc->mii_dev = self; sc->mii_inst = mii->mii_instance; sc->mii_phy = ma->mii_phyno; sc->mii_funcs = &gphyter_funcs; sc->mii_pdata = mii; sc->mii_flags = ma->mii_flags; sc->mii_anegticks = MII_ANEGTICKS; PHY_RESET(sc); sc->mii_capabilities = PHY_READ(sc, MII_BMSR) & ma->mii_capmask; if (sc->mii_capabilities & BMSR_EXTSTAT) sc->mii_extcapabilities = PHY_READ(sc, MII_EXTSR); /* * The Gig PHYTER seems to have the 10baseT BMSR bits * hard-wired to 0, even though the device supports * 10baseT. What we do instead is read the post-reset * ANAR, who's 10baseT-related bits are set by strapping * pin 180, and fake the BMSR bits. */ anar = PHY_READ(sc, MII_ANAR); if (anar & ANAR_10) sc->mii_capabilities |= (BMSR_10THDX & ma->mii_capmask); if (anar & ANAR_10_FD) sc->mii_capabilities |= (BMSR_10TFDX & ma->mii_capmask); aprint_normal_dev(self, ""); if ((sc->mii_capabilities & BMSR_MEDIAMASK) == 0 && (sc->mii_extcapabilities & EXTSR_MEDIAMASK) == 0) aprint_error("no media present"); else mii_phy_add_media(sc); aprint_normal("\n"); strap = PHY_READ(sc, MII_GPHYTER_STRAP); aprint_normal_dev(self, "strapped to %s mode", (strap & STRAP_MS_VAL) ? "master" : "slave"); if (strap & STRAP_NC_MODE) aprint_normal(", pre-C5 BCM5400 compat enabled"); aprint_normal("\n"); }
static int igphymatch(device_t parent, cfdata_t match, void *aux) { struct mii_attach_args *ma = aux; if (mii_phy_match(ma, igphys) != NULL) return 10; return 0; }
static int sqphymatch(device_t parent, cfdata_t match, void *aux) { struct mii_attach_args *ma = aux; if (mii_phy_match(ma, sqphys) != NULL) return (10); return (0); }
int mii_phy_dev_probe(device_t dev, const struct mii_phydesc *mpd, int mrv) { mpd = mii_phy_match(device_get_ivars(dev), mpd); if (mpd != NULL) { device_set_desc(dev, mpd->mpd_name); return (mrv); } return (ENXIO); }
static int ciphymatch(struct device *parent, struct cfdata *match, void *aux) { struct mii_attach_args *ma = aux; if (mii_phy_match(ma, ciphys) != NULL) return (10); return (0); }
static int tlphy_probe(device_t dev) { struct mii_attach_args *ma = device_get_ivars(dev); const struct mii_phydesc *mpd; mpd = mii_phy_match(ma, tlphys); if (mpd != NULL) { device_set_desc(dev, mpd->mpd_name); return (0); } return (ENXIO); }
static void lxtphyattach(device_t parent, device_t self, void *aux) { struct mii_softc *sc = device_private(self); struct mii_attach_args *ma = aux; struct mii_data *mii = ma->mii_data; const struct mii_phydesc *mpd; mpd = mii_phy_match(ma, lxtphys); aprint_naive(": Media interface\n"); aprint_normal(": %s, rev. %d\n", mpd->mpd_name, MII_REV(ma->mii_id2)); sc->mii_dev = self; sc->mii_inst = mii->mii_instance; sc->mii_phy = ma->mii_phyno; if (mpd->mpd_model == MII_MODEL_LEVEL1_LXT971) sc->mii_funcs = &lxtphy971_funcs; else sc->mii_funcs = &lxtphy_funcs; sc->mii_pdata = mii; sc->mii_flags = ma->mii_flags; sc->mii_anegticks = MII_ANEGTICKS; PHY_RESET(sc); sc->mii_capabilities = PHY_READ(sc, MII_BMSR) & ma->mii_capmask; aprint_normal_dev(self, ""); if (sc->mii_flags & MIIF_HAVEFIBER) { #define ADD(m, c) ifmedia_add(&mii->mii_media, (m), (c), NULL) ADD(IFM_MAKEWORD(IFM_ETHER, IFM_100_FX, 0, sc->mii_inst), MII_MEDIA_100_TX); aprint_normal("100baseFX, "); ADD(IFM_MAKEWORD(IFM_ETHER, IFM_100_FX, IFM_FDX, sc->mii_inst), MII_MEDIA_100_TX_FDX); aprint_normal("100baseFX-FDX, "); #undef ADD } if ((sc->mii_capabilities & BMSR_MEDIAMASK) == 0) aprint_error("no media present"); else mii_phy_add_media(sc); aprint_normal("\n"); if (!pmf_device_register(self, NULL, mii_phy_resume)) aprint_error_dev(self, "couldn't establish power handler\n"); }
static int tqphymatch(device_t parent, cfdata_t match, void *aux) { struct mii_attach_args *ma = aux; if (mii_phy_match(ma, tqphys) != NULL) { /* The DIAG register is unreliable on early revisions. */ if (MII_MODEL(ma->mii_id2) == MII_MODEL_xxTSC_78Q2120 && MII_REV(ma->mii_id2) <= 3) return (0); return (10); } return (0); }
void nsgphyattach(struct device *parent, struct device *self, void *aux) { struct mii_softc *sc = (struct mii_softc *)self; struct mii_attach_args *ma = aux; struct mii_data *mii = ma->mii_data; const struct mii_phydesc *mpd; int anar; mpd = mii_phy_match(ma, nsgphys); printf(": %s, rev. %d\n", mpd->mpd_name, MII_REV(ma->mii_id2)); sc->mii_inst = mii->mii_instance; sc->mii_phy = ma->mii_phyno; sc->mii_funcs = &nsgphy_funcs; sc->mii_pdata = mii; sc->mii_flags = ma->mii_flags; sc->mii_anegticks = MII_ANEGTICKS; PHY_RESET(sc); sc->mii_capabilities = PHY_READ(sc, MII_BMSR) & ma->mii_capmask; if (sc->mii_capabilities & BMSR_EXTSTAT) sc->mii_extcapabilities = PHY_READ(sc, MII_EXTSR); /* * The PHY seems to have the 10baseT BMSR bits * hard-wired to 0, even though the device supports * 10baseT. What we do instead is read the post-reset * ANAR, who's 10baseT-related bits are set by strapping * pin 180, and fake the BMSR bits. */ anar = PHY_READ(sc, MII_ANAR); if (anar & ANAR_10) sc->mii_capabilities |= (BMSR_10THDX & ma->mii_capmask); if (anar & ANAR_10_FD) sc->mii_capabilities |= (BMSR_10TFDX & ma->mii_capmask); if ((sc->mii_capabilities & BMSR_MEDIAMASK) || (sc->mii_extcapabilities & EXTSR_MEDIAMASK)) mii_phy_add_media(sc); }
static void ihphyattach(device_t parent, device_t self, void *aux) { struct mii_softc *sc = device_private(self); struct mii_attach_args *ma = aux; struct mii_data *mii = ma->mii_data; const struct mii_phydesc *mpd; int reg; mpd = mii_phy_match(ma, ihphys); aprint_naive(": Media interface\n"); aprint_normal(": %s, rev. %d\n", mpd->mpd_name, MII_REV(ma->mii_id2)); sc->mii_dev = self; sc->mii_inst = mii->mii_instance; sc->mii_phy = ma->mii_phyno; sc->mii_funcs = &ihphy_funcs; sc->mii_pdata = mii; sc->mii_flags = ma->mii_flags; sc->mii_anegticks = MII_ANEGTICKS; PHY_RESET(sc); sc->mii_capabilities = PHY_READ(sc, MII_BMSR) & ma->mii_capmask; if (sc->mii_capabilities & BMSR_EXTSTAT) sc->mii_extcapabilities = PHY_READ(sc, MII_EXTSR); aprint_normal_dev(self, ""); if ((sc->mii_capabilities & BMSR_MEDIAMASK) == 0 && (sc->mii_extcapabilities & EXTSR_MEDIAMASK) == 0) aprint_error("no media present"); else mii_phy_add_media(sc); aprint_normal("\n"); /* * Link setup (as done by Intel's Linux driver for the 82577). */ reg = PHY_READ(sc, IHPHY_MII_CFG); reg |= IHPHY_CFG_TX_CRS; reg |= IHPHY_CFG_DOWN_SHIFT; PHY_WRITE(sc, IHPHY_MII_CFG, reg); }
static void mvphyattach(device_t parent, device_t self, void *aux) { struct mii_softc *sc = device_private(self); struct mii_attach_args *ma = aux; struct mii_data *mii = ma->mii_data; const struct mii_phydesc *mpd; mpd = mii_phy_match(ma, mvphys); aprint_naive(": Media interface\n"); aprint_normal(": %s, rev. %d\n", mpd->mpd_name, MII_REV(ma->mii_id2)); sc->mii_dev = self; sc->mii_inst = mii->mii_instance; sc->mii_phy = ma->mii_phyno; sc->mii_funcs = &mvphy_funcs; sc->mii_pdata = mii; sc->mii_flags = ma->mii_flags; sc->mii_anegticks = MII_ANEGTICKS; if (MV_PORT(sc) == 0) { /* NB: only when attaching first PHY */ /* * Set the global switch settings and configure the * CPU port since it does not probe as a visible PHY. */ MV_WRITE(sc, MII_MV_SWITCH_GLOBAL_ADDR, MV_ATU_CONTROL, SM(MV_ATUCTRL_AGE_TIME_DEFAULT, MV_ATUCTRL_AGE_TIME) | SM(MV_ATUCTRL_ATU_SIZE_DEFAULT, MV_ATUCTRL_ATU_SIZE)); mvphy_switchconfig(sc, MV_CPU_PORT); } PHY_RESET(sc); sc->mii_capabilities = PHY_READ(sc, MII_BMSR) & ma->mii_capmask; aprint_normal_dev(self, ""); if ((sc->mii_capabilities & BMSR_MEDIAMASK) == 0) aprint_error("no media present"); else mii_phy_add_media(sc); aprint_normal("\n"); if (!pmf_device_register(self, NULL, mii_phy_resume)) aprint_error_dev(self, "couldn't establish power handler\n"); }
void ipgphy_attach(struct device *parent, struct device *self, void *aux) { struct mii_softc *sc = (struct mii_softc *)self; struct mii_attach_args *ma = aux; struct mii_data *mii = ma->mii_data; const struct mii_phydesc *mpd; mpd = mii_phy_match(ma, ipgphys); printf(": %s, rev. %d\n", mpd->mpd_name, MII_REV(ma->mii_id2)); sc->mii_inst = mii->mii_instance; sc->mii_phy = ma->mii_phyno; sc->mii_funcs = &ipgphy_funcs; sc->mii_pdata = mii; sc->mii_anegticks = MII_ANEGTICKS_GIGE; sc->mii_flags |= MIIF_NOISOLATE; #define ADD(m, c) ifmedia_add(&mii->mii_media, (m), (c), NULL) ADD(IFM_MAKEWORD(IFM_ETHER, IFM_NONE, 0, sc->mii_inst), BMCR_ISO); ADD(IFM_MAKEWORD(IFM_ETHER, IFM_10_T, 0, sc->mii_inst), IPGPHY_BMCR_10); ADD(IFM_MAKEWORD(IFM_ETHER, IFM_10_T, IFM_FDX, sc->mii_inst), IPGPHY_BMCR_10 | IPGPHY_BMCR_FDX); ADD(IFM_MAKEWORD(IFM_ETHER, IFM_100_TX, 0, sc->mii_inst), IPGPHY_BMCR_100); ADD(IFM_MAKEWORD(IFM_ETHER, IFM_100_TX, IFM_FDX, sc->mii_inst), IPGPHY_BMCR_100 | IPGPHY_BMCR_FDX); /* 1000baseT half-duplex, really supported? */ ADD(IFM_MAKEWORD(IFM_ETHER, IFM_1000_T, 0, sc->mii_inst), IPGPHY_BMCR_1000); ADD(IFM_MAKEWORD(IFM_ETHER, IFM_1000_T, IFM_FDX, sc->mii_inst), IPGPHY_BMCR_1000 | IPGPHY_BMCR_FDX); ADD(IFM_MAKEWORD(IFM_ETHER, IFM_AUTO, 0, sc->mii_inst), 0); #undef ADD PHY_RESET(sc); }
static void igphyattach(device_t parent, device_t self, void *aux) { struct mii_softc *sc = device_private(self); struct mii_attach_args *ma = aux; struct mii_data *mii = ma->mii_data; const struct mii_phydesc *mpd; struct igphy_softc *igsc = (struct igphy_softc *) sc; prop_dictionary_t dict; mpd = mii_phy_match(ma, igphys); aprint_naive(": Media interface\n"); aprint_normal(": %s, rev. %d\n", mpd->mpd_name, MII_REV(ma->mii_id2)); dict = device_properties(parent); if (!prop_dictionary_get_uint32(dict, "mactype", &igsc->sc_mactype)) aprint_error("WARNING! Failed to get mactype\n"); if (!prop_dictionary_get_uint32(dict, "macflags", &igsc->sc_macflags)) aprint_error("WARNING! Failed to get macflags\n"); sc->mii_dev = self; sc->mii_inst = mii->mii_instance; sc->mii_phy = ma->mii_phyno; sc->mii_funcs = &igphy_funcs; sc->mii_pdata = mii; sc->mii_flags = ma->mii_flags; sc->mii_anegticks = MII_ANEGTICKS_GIGE; PHY_RESET(sc); sc->mii_capabilities = PHY_READ(sc, MII_BMSR) & ma->mii_capmask; if (sc->mii_capabilities & BMSR_EXTSTAT) sc->mii_extcapabilities = PHY_READ(sc, MII_EXTSR); aprint_normal_dev(self, ""); if ((sc->mii_capabilities & BMSR_MEDIAMASK) == 0 && (sc->mii_extcapabilities & EXTSR_MEDIAMASK) == 0) aprint_error("no media present"); else mii_phy_add_media(sc); aprint_normal("\n"); }
static void sqphyattach(device_t parent, device_t self, void *aux) { struct mii_softc *sc = device_private(self); struct mii_attach_args *ma = aux; struct mii_data *mii = ma->mii_data; const struct mii_phydesc *mpd; mpd = mii_phy_match(ma, sqphys); aprint_naive(": Media interface\n"); aprint_normal(": %s, rev. %d\n", mpd->mpd_name, MII_REV(ma->mii_id2)); sc->mii_dev = self; sc->mii_inst = mii->mii_instance; sc->mii_phy = ma->mii_phyno; sc->mii_pdata = mii; sc->mii_flags = ma->mii_flags; sc->mii_anegticks = MII_ANEGTICKS; switch (MII_MODEL(ma->mii_id2)) { case MII_MODEL_SEEQ_84220: sc->mii_funcs = &sqphy_84220_funcs; aprint_normal_dev(self, "using Seeq 84220 isolate/reset hack\n"); break; default: sc->mii_funcs = &sqphy_funcs; } PHY_RESET(sc); sc->mii_capabilities = PHY_READ(sc, MII_BMSR) & ma->mii_capmask; aprint_normal_dev(self, ""); if ((sc->mii_capabilities & BMSR_MEDIAMASK) == 0) aprint_error("no media present"); else mii_phy_add_media(sc); aprint_normal("\n"); }
void atphy_attach(device_t parent, device_t self, void *aux) { struct mii_softc *sc = device_private(self); struct mii_attach_args *ma = aux; struct mii_data *mii = ma->mii_data; const struct mii_phydesc *mpd; uint16_t bmsr; mpd = mii_phy_match(ma, etphys); aprint_naive(": Media interface\n"); aprint_normal(": %s, rev. %d\n", mpd->mpd_name, MII_REV(ma->mii_id2)); sc->mii_dev = self; sc->mii_inst = mii->mii_instance; sc->mii_phy = ma->mii_phyno; sc->mii_mpd_oui = MII_OUI(ma->mii_id1, ma->mii_id2); sc->mii_mpd_model = MII_MODEL(ma->mii_id2); sc->mii_mpd_rev = MII_REV(ma->mii_id2); sc->mii_funcs = &atphy_funcs; sc->mii_pdata = mii; sc->mii_flags = ma->mii_flags; if (atphy_is_gige(mpd)) sc->mii_anegticks = MII_ANEGTICKS_GIGE; else sc->mii_anegticks = MII_ANEGTICKS; sc->mii_flags |= MIIF_NOLOOP; PHY_RESET(sc); bmsr = PHY_READ(sc, MII_BMSR) | PHY_READ(sc, MII_BMSR); sc->mii_capabilities = bmsr & ma->mii_capmask; if (atphy_is_gige(mpd) && (sc->mii_capabilities & BMSR_EXTSTAT)) sc->mii_extcapabilities = PHY_READ(sc, MII_EXTSR); aprint_normal_dev(self, ""); mii_phy_add_media(sc); aprint_normal("\n"); }
void acphyattach(struct device *parent, struct device *self, void *aux) { struct mii_softc *sc = (struct mii_softc *)self; struct mii_attach_args *ma = aux; struct mii_data *mii = ma->mii_data; const struct mii_phydesc *mpd; mpd = mii_phy_match(ma, acphys); printf(": %s, rev. %d\n", mpd->mpd_name, MII_REV(ma->mii_id2)); sc->mii_inst = mii->mii_instance; sc->mii_phy = ma->mii_phyno; sc->mii_funcs = &acphy_funcs; sc->mii_pdata = mii; sc->mii_flags = ma->mii_flags; sc->mii_anegticks = MII_ANEGTICKS; PHY_RESET(sc); /* * XXX Check MCR_FX_SEL to set MIIF_HAVE_FIBER? */ sc->mii_capabilities = PHY_READ(sc, MII_BMSR) & ma->mii_capmask; #define ADD(m, c) ifmedia_add(&mii->mii_media, (m), (c), NULL) if (sc->mii_flags & MIIF_HAVEFIBER) { ADD(IFM_MAKEWORD(IFM_ETHER, IFM_100_FX, 0, sc->mii_inst), MII_MEDIA_100_TX); ADD(IFM_MAKEWORD(IFM_ETHER, IFM_100_FX, IFM_FDX, sc->mii_inst), MII_MEDIA_100_TX); } #undef ADD if (sc->mii_capabilities & BMSR_MEDIAMASK) mii_phy_add_media(sc); }
static int nsgphy_attach(device_t dev) { struct mii_softc *sc; struct mii_attach_args *ma; struct mii_data *mii; const struct mii_phydesc *mpd; sc = device_get_softc(dev); ma = device_get_ivars(dev); mpd = mii_phy_match(ma, gphyters); if (bootverbose) device_printf(dev, "<rev. %d>\n", MII_REV(ma->mii_id2)); device_printf(dev, " "); sc->mii_dev = device_get_parent(dev); mii = device_get_softc(sc->mii_dev); LIST_INSERT_HEAD(&mii->mii_phys, sc, mii_list); sc->mii_inst = mii->mii_instance; sc->mii_phy = ma->mii_phyno; sc->mii_service = nsgphy_service; sc->mii_pdata = mii; sc->mii_anegticks = 5; mii->mii_instance++; sc->mii_capabilities = (PHY_READ(sc, MII_BMSR) | (BMSR_10TFDX|BMSR_10THDX)) & ma->mii_capmask; if (sc->mii_capabilities & BMSR_EXTSTAT) sc->mii_extcapabilities = PHY_READ(sc, MII_EXTSR); mii_phy_add_media(sc); printf("\n"); MIIBUS_MEDIAINIT(sc->mii_dev); return(0); }
static void bmtphyattach(device_t parent, device_t self, void *aux) { struct mii_softc *sc = device_private(self); struct mii_attach_args *ma = aux; struct mii_data *mii = ma->mii_data; const struct mii_phydesc *mpd; mpd = mii_phy_match(ma, bmtphys); aprint_naive(": Media interface\n"); aprint_normal(": %s, rev. %d\n", mpd->mpd_name, MII_REV(ma->mii_id2)); sc->mii_dev = self; sc->mii_mpd_model = MII_MODEL(ma->mii_id2); sc->mii_inst = mii->mii_instance; sc->mii_phy = ma->mii_phyno; sc->mii_funcs = &bmtphy_funcs; sc->mii_pdata = mii; sc->mii_flags = ma->mii_flags; sc->mii_anegticks = MII_ANEGTICKS; PHY_RESET(sc); /* * XXX Check AUX_STS_FX_MODE to set MIIF_HAVE_FIBER? */ sc->mii_capabilities = PHY_READ(sc, MII_BMSR) & ma->mii_capmask; aprint_normal_dev(self, ""); if ((sc->mii_capabilities & BMSR_MEDIAMASK) == 0) aprint_error("no media present"); else mii_phy_add_media(sc); aprint_normal("\n"); }
void eephyattach(struct device *parent, struct device *self, void *aux) { struct mii_softc *sc = (struct mii_softc *)self; struct mii_attach_args *ma = aux; struct mii_data *mii = ma->mii_data; const struct mii_phydesc *mpd; int reg, page; mpd = mii_phy_match(ma, eephys); printf(": %s, rev. %d\n", mpd->mpd_name, MII_REV(ma->mii_id2)); sc->mii_inst = mii->mii_instance; sc->mii_phy = ma->mii_phyno; sc->mii_funcs = &eephy_funcs; sc->mii_model = MII_MODEL(ma->mii_id2); sc->mii_pdata = mii; sc->mii_flags = ma->mii_flags; /* XXX No loopback support yet, although the hardware can do it. */ sc->mii_flags |= MIIF_NOLOOP; /* Switch to fiber-only mode if necessary. */ if (sc->mii_model == MII_MODEL_MARVELL_E1112 && sc->mii_flags & MIIF_HAVEFIBER) { page = PHY_READ(sc, E1000_EADR); PHY_WRITE(sc, E1000_EADR, 2); reg = PHY_READ(sc, E1000_SCR); reg &= ~E1000_SCR_MODE_MASK; reg |= E1000_SCR_MODE_1000BX; PHY_WRITE(sc, E1000_SCR, reg); PHY_WRITE(sc, E1000_EADR, page); PHY_RESET(sc); } sc->mii_capabilities = PHY_READ(sc, E1000_SR) & ma->mii_capmask; if (sc->mii_capabilities & BMSR_EXTSTAT) sc->mii_extcapabilities = PHY_READ(sc, E1000_ESR); mii_phy_add_media(sc); /* * Initialize PHY Specific Control Register. */ reg = PHY_READ(sc, E1000_SCR); /* Assert CRS on transmit. */ reg |= E1000_SCR_ASSERT_CRS_ON_TX; /* Enable auto crossover. */ switch (sc->mii_model) { case MII_MODEL_MARVELL_E3082: /* Bits are in a different position. */ reg |= (E1000_SCR_AUTO_X_MODE >> 1); break; default: /* Automatic crossover causes problems for 1000baseX. */ if (sc->mii_flags & MIIF_IS_1000X) reg &= ~E1000_SCR_AUTO_X_MODE; else reg |= E1000_SCR_AUTO_X_MODE; } /* Disable energy detect; only available on some models. */ switch(sc->mii_model) { case MII_MODEL_MARVELL_E1011: case MII_MODEL_MARVELL_E1111: case MII_MODEL_MARVELL_E1112: /* Disable energy detect. */ reg &= ~E1000_SCR_EN_DETECT_MASK; break; } PHY_WRITE(sc, E1000_SCR, reg); /* 25 MHz TX_CLK should always work. */ reg = PHY_READ(sc, E1000_ESCR); reg |= E1000_ESCR_TX_CLK_25; PHY_WRITE(sc, E1000_ESCR, reg); /* * Do a software reset for these settings to take effect. * Disable autonegotiation, such that all capabilities get * advertised when it is switched back on. */ reg = PHY_READ(sc, E1000_CR); reg &= ~E1000_CR_AUTO_NEG_ENABLE; PHY_WRITE(sc, E1000_CR, reg | E1000_CR_RESET); }
static void tlphyattach(device_t parent, device_t self, void *aux) { struct tlphy_softc *tsc = device_private(self); struct mii_softc *sc = &tsc->sc_mii; struct tl_softc *tlsc = device_private(device_parent(self)); struct mii_attach_args *ma = aux; struct mii_data *mii = ma->mii_data; const struct mii_phydesc *mpd; const char *sep = ""; mpd = mii_phy_match(ma, tlphys); aprint_naive(": Media interface\n"); aprint_normal(": %s, rev. %d\n", mpd->mpd_name, MII_REV(ma->mii_id2)); sc->mii_dev = self; sc->mii_inst = mii->mii_instance; sc->mii_phy = ma->mii_phyno; sc->mii_funcs = &tlphy_funcs; sc->mii_pdata = mii; sc->mii_flags = ma->mii_flags; sc->mii_anegticks = MII_ANEGTICKS; PHY_RESET(sc); /* * Note that if we're on a device that also supports 100baseTX, * we are not going to want to use the built-in 10baseT port, * since there will be another PHY on the MII wired up to the * UTP connector. The parent indicates this to us by specifying * the TLPHY_MEDIA_NO_10_T bit. */ tsc->sc_tlphycap = tlsc->tl_product->tp_tlphymedia; if ((tsc->sc_tlphycap & TLPHY_MEDIA_NO_10_T) == 0) sc->mii_capabilities = PHY_READ(sc, MII_BMSR) & ma->mii_capmask; else sc->mii_capabilities = 0; #define ADD(m, c) ifmedia_add(&mii->mii_media, (m), (c), NULL) #define PRINT(str) aprint_normal("%s%s", sep, str); sep = ", " aprint_normal_dev(self, ""); if (tsc->sc_tlphycap) { if (tsc->sc_tlphycap & TLPHY_MEDIA_10_2) { ADD(IFM_MAKEWORD(IFM_ETHER, IFM_10_2, 0, sc->mii_inst), 0); PRINT("10base2"); } else if (tsc->sc_tlphycap & TLPHY_MEDIA_10_5) { ADD(IFM_MAKEWORD(IFM_ETHER, IFM_10_5, 0, sc->mii_inst), 0); PRINT("10base5"); } } if (sc->mii_capabilities & BMSR_MEDIAMASK) { aprint_normal("%s", sep); mii_phy_add_media(sc); } else if ((tsc->sc_tlphycap & (TLPHY_MEDIA_10_2 | TLPHY_MEDIA_10_5)) == 0) aprint_error("no media present"); aprint_normal("\n"); #undef ADD #undef PRINT if (!pmf_device_register(self, NULL, mii_phy_resume)) aprint_error_dev(self, "couldn't establish power handler\n"); }