diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2013-11-06 16:20:21 +0100 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2013-11-11 10:08:08 +0100 |
commit | 66659ff1ad6831b0ea7425fa6ecd8a8687523658 (patch) | |
tree | 48e22b475fa8854128e0861a33fed6f78c8094b5 /freebsd/sys/dev/mii/brgphy.c | |
parent | Define __GLOBL1() and __GLOBL() (diff) | |
download | rtems-libbsd-66659ff1ad6831b0ea7425fa6ecd8a8687523658.tar.bz2 |
Update to FreeBSD 9.2
Diffstat (limited to 'freebsd/sys/dev/mii/brgphy.c')
-rw-r--r-- | freebsd/sys/dev/mii/brgphy.c | 186 |
1 files changed, 82 insertions, 104 deletions
diff --git a/freebsd/sys/dev/mii/brgphy.c b/freebsd/sys/dev/mii/brgphy.c index e21e783e..de1249c3 100644 --- a/freebsd/sys/dev/mii/brgphy.c +++ b/freebsd/sys/dev/mii/brgphy.c @@ -70,9 +70,6 @@ static int brgphy_attach(device_t); struct brgphy_softc { struct mii_softc mii_sc; - int mii_oui; - int mii_model; - int mii_rev; int serdes_flags; /* Keeps track of the serdes type used */ #define BRGPHY_5706S 0x0001 #define BRGPHY_5708S 0x0002 @@ -119,39 +116,49 @@ static void brgphy_ethernet_wirespeed(struct mii_softc *); static void brgphy_jumbo_settings(struct mii_softc *, u_long); static const struct mii_phydesc brgphys[] = { - MII_PHY_DESC(xxBROADCOM, BCM5400), - MII_PHY_DESC(xxBROADCOM, BCM5401), - MII_PHY_DESC(xxBROADCOM, BCM5411), - MII_PHY_DESC(xxBROADCOM, BCM54K2), - MII_PHY_DESC(xxBROADCOM, BCM5701), - MII_PHY_DESC(xxBROADCOM, BCM5703), - MII_PHY_DESC(xxBROADCOM, BCM5704), - MII_PHY_DESC(xxBROADCOM, BCM5705), - MII_PHY_DESC(xxBROADCOM, BCM5706), - MII_PHY_DESC(xxBROADCOM, BCM5714), - MII_PHY_DESC(xxBROADCOM, BCM5750), - MII_PHY_DESC(xxBROADCOM, BCM5752), - MII_PHY_DESC(xxBROADCOM, BCM5754), - MII_PHY_DESC(xxBROADCOM, BCM5780), - MII_PHY_DESC(xxBROADCOM, BCM5708C), - MII_PHY_DESC(xxBROADCOM_ALT1, BCM5755), - MII_PHY_DESC(xxBROADCOM_ALT1, BCM5787), - MII_PHY_DESC(xxBROADCOM_ALT1, BCM5708S), - MII_PHY_DESC(xxBROADCOM_ALT1, BCM5709CAX), - MII_PHY_DESC(xxBROADCOM_ALT1, BCM5722), - MII_PHY_DESC(xxBROADCOM_ALT1, BCM5784), - MII_PHY_DESC(xxBROADCOM_ALT1, BCM5709C), - MII_PHY_DESC(xxBROADCOM_ALT1, BCM5761), - MII_PHY_DESC(xxBROADCOM_ALT1, BCM5709S), - MII_PHY_DESC(xxBROADCOM_ALT2, BCM5717C), - MII_PHY_DESC(xxBROADCOM_ALT2, BCM5719C), - MII_PHY_DESC(xxBROADCOM_ALT2, BCM5720C), - MII_PHY_DESC(xxBROADCOM_ALT2, BCM57765), - MII_PHY_DESC(xxBROADCOM_ALT2, BCM57780), - MII_PHY_DESC(BROADCOM2, BCM5906), + MII_PHY_DESC(BROADCOM, BCM5400), + MII_PHY_DESC(BROADCOM, BCM5401), + MII_PHY_DESC(BROADCOM, BCM5411), + MII_PHY_DESC(BROADCOM, BCM54K2), + MII_PHY_DESC(BROADCOM, BCM5701), + MII_PHY_DESC(BROADCOM, BCM5703), + MII_PHY_DESC(BROADCOM, BCM5704), + MII_PHY_DESC(BROADCOM, BCM5705), + MII_PHY_DESC(BROADCOM, BCM5706), + MII_PHY_DESC(BROADCOM, BCM5714), + MII_PHY_DESC(BROADCOM, BCM5421), + MII_PHY_DESC(BROADCOM, BCM5750), + MII_PHY_DESC(BROADCOM, BCM5752), + MII_PHY_DESC(BROADCOM, BCM5780), + MII_PHY_DESC(BROADCOM, BCM5708C), + MII_PHY_DESC(BROADCOM2, BCM5482), + MII_PHY_DESC(BROADCOM2, BCM5708S), + MII_PHY_DESC(BROADCOM2, BCM5709C), + MII_PHY_DESC(BROADCOM2, BCM5709S), + MII_PHY_DESC(BROADCOM2, BCM5709CAX), + MII_PHY_DESC(BROADCOM2, BCM5722), + MII_PHY_DESC(BROADCOM2, BCM5755), + MII_PHY_DESC(BROADCOM2, BCM5754), + MII_PHY_DESC(BROADCOM2, BCM5761), + MII_PHY_DESC(BROADCOM2, BCM5784), +#ifdef notyet /* better handled by ukphy(4) until WARs are implemented */ + MII_PHY_DESC(BROADCOM2, BCM5785), +#endif + MII_PHY_DESC(BROADCOM3, BCM5717C), + MII_PHY_DESC(BROADCOM3, BCM5719C), + MII_PHY_DESC(BROADCOM3, BCM5720C), + MII_PHY_DESC(BROADCOM3, BCM57765), + MII_PHY_DESC(BROADCOM3, BCM57780), + MII_PHY_DESC(xxBROADCOM_ALT1, BCM5906), MII_PHY_END }; +static const struct mii_phy_funcs brgphy_funcs = { + brgphy_service, + brgphy_status, + brgphy_reset +}; + #define HS21_PRODUCT_ID "IBM eServer BladeCenter HS21" #define HS21_BCM_CHIPID 0x57081021 @@ -190,41 +197,17 @@ brgphy_attach(device_t dev) struct bge_softc *bge_sc = NULL; struct bce_softc *bce_sc = NULL; struct mii_softc *sc; - struct mii_attach_args *ma; - struct mii_data *mii; struct ifnet *ifp; bsc = device_get_softc(dev); sc = &bsc->mii_sc; - ma = device_get_ivars(dev); - sc->mii_dev = device_get_parent(dev); - mii = ma->mii_data; - LIST_INSERT_HEAD(&mii->mii_phys, sc, mii_list); - - /* Initialize mii_softc structure */ - sc->mii_flags = miibus_get_flags(dev); - sc->mii_inst = mii->mii_instance++; - sc->mii_phy = ma->mii_phyno; - sc->mii_service = brgphy_service; - sc->mii_pdata = mii; - /* - * At least some variants wedge when isolating, at least some also - * don't support loopback. - */ - sc->mii_flags |= MIIF_NOISOLATE | MIIF_NOLOOP | MIIF_NOMANPAUSE; + mii_phy_dev_attach(dev, MIIF_NOISOLATE | MIIF_NOMANPAUSE, + &brgphy_funcs, 0); - /* Initialize brgphy_softc structure */ - bsc->mii_oui = MII_OUI(ma->mii_id1, ma->mii_id2); - bsc->mii_model = MII_MODEL(ma->mii_id2); - bsc->mii_rev = MII_REV(ma->mii_id2); bsc->serdes_flags = 0; ifp = sc->mii_pdata->mii_ifp; - if (bootverbose) - device_printf(dev, "OUI 0x%06x, model 0x%04x, rev. %d\n", - bsc->mii_oui, bsc->mii_model, bsc->mii_rev); - /* Find the MAC driver associated with this PHY. */ if (strcmp(ifp->if_dname, "bge") == 0) bge_sc = ifp->if_softc; @@ -232,11 +215,11 @@ brgphy_attach(device_t dev) bce_sc = ifp->if_softc; /* Handle any special cases based on the PHY ID */ - switch (bsc->mii_oui) { - case MII_OUI_xxBROADCOM: - switch (bsc->mii_model) { - case MII_MODEL_xxBROADCOM_BCM5706: - case MII_MODEL_xxBROADCOM_BCM5714: + switch (sc->mii_mpd_oui) { + case MII_OUI_BROADCOM: + switch (sc->mii_mpd_model) { + case MII_MODEL_BROADCOM_BCM5706: + case MII_MODEL_BROADCOM_BCM5714: /* * The 5464 PHY used in the 5706 supports both copper * and fiber interfaces over GMII. Need to check the @@ -254,13 +237,13 @@ brgphy_attach(device_t dev) break; } break; - case MII_OUI_xxBROADCOM_ALT1: - switch (bsc->mii_model) { - case MII_MODEL_xxBROADCOM_ALT1_BCM5708S: + case MII_OUI_BROADCOM2: + switch (sc->mii_mpd_model) { + case MII_MODEL_BROADCOM2_BCM5708S: bsc->serdes_flags |= BRGPHY_5708S; sc->mii_flags |= MIIF_HAVEFIBER; break; - case MII_MODEL_xxBROADCOM_ALT1_BCM5709S: + case MII_MODEL_BROADCOM2_BCM5709S: /* * XXX * 5720S and 5709S shares the same PHY id. @@ -276,15 +259,15 @@ brgphy_attach(device_t dev) break; } - brgphy_reset(sc); + PHY_RESET(sc); /* Read the PHY's capabilities. */ - sc->mii_capabilities = PHY_READ(sc, MII_BMSR) & ma->mii_capmask; + sc->mii_capabilities = PHY_READ(sc, MII_BMSR) & sc->mii_capmask; if (sc->mii_capabilities & BMSR_EXTSTAT) sc->mii_extcapabilities = PHY_READ(sc, MII_EXTSR); device_printf(dev, " "); -#define ADD(m, c) ifmedia_add(&mii->mii_media, (m), (c), NULL) +#define ADD(m, c) ifmedia_add(&sc->mii_pdata->mii_media, (m), (c), NULL) /* Add the supported media types */ if ((sc->mii_flags & MIIF_HAVEFIBER) == 0) { @@ -325,7 +308,6 @@ brgphy_attach(device_t dev) static int brgphy_service(struct mii_softc *sc, struct mii_data *mii, int cmd) { - struct brgphy_softc *bsc = (struct brgphy_softc *)sc; struct ifmedia_entry *ife = mii->mii_media.ifm_cur; int val; @@ -338,7 +320,7 @@ brgphy_service(struct mii_softc *sc, struct mii_data *mii, int cmd) break; /* Todo: Why is this here? Is it really needed? */ - brgphy_reset(sc); /* XXX hardware bug work-around */ + PHY_RESET(sc); /* XXX hardware bug work-around */ switch (IFM_SUBTYPE(ife->ifm_media)) { case IFM_AUTO: @@ -393,7 +375,7 @@ brgphy_service(struct mii_softc *sc, struct mii_data *mii, int cmd) } /* Update the media status. */ - brgphy_status(sc); + PHY_STATUS(sc); /* * Callback if something changed. Note that we need to poke @@ -402,20 +384,20 @@ brgphy_service(struct mii_softc *sc, struct mii_data *mii, int cmd) if (sc->mii_media_active != mii->mii_media_active || sc->mii_media_status != mii->mii_media_status || cmd == MII_MEDIACHG) { - switch (bsc->mii_oui) { - case MII_OUI_xxBROADCOM: - switch (bsc->mii_model) { - case MII_MODEL_xxBROADCOM_BCM5400: + switch (sc->mii_mpd_oui) { + case MII_OUI_BROADCOM: + switch (sc->mii_mpd_model) { + case MII_MODEL_BROADCOM_BCM5400: bcm5401_load_dspcode(sc); break; - case MII_MODEL_xxBROADCOM_BCM5401: - if (bsc->mii_rev == 1 || bsc->mii_rev == 3) + case MII_MODEL_BROADCOM_BCM5401: + if (sc->mii_mpd_rev == 1 || sc->mii_mpd_rev == 3) bcm5401_load_dspcode(sc); break; - case MII_MODEL_xxBROADCOM_BCM5411: + case MII_MODEL_BROADCOM_BCM5411: bcm5411_load_dspcode(sc); break; - case MII_MODEL_xxBROADCOM_BCM54K2: + case MII_MODEL_BROADCOM_BCM54K2: bcm54k2_load_dspcode(sc); break; } @@ -474,8 +456,7 @@ brgphy_setmedia(struct mii_softc *sc, int media) if (IFM_SUBTYPE(media) == IFM_1000_T) { gig |= BRGPHY_1000CTL_MSE; - if ((media & IFM_ETH_MASTER) != 0 || - (sc->mii_pdata->mii_ifp->if_flags & IFF_LINK0) != 0) + if ((media & IFM_ETH_MASTER) != 0) gig |= BRGPHY_1000CTL_MSC; } PHY_WRITE(sc, BRGPHY_MII_1000CTL, gig); @@ -625,10 +606,9 @@ brgphy_status(struct mii_softc *sc) static void brgphy_mii_phy_auto(struct mii_softc *sc, int media) { - struct brgphy_softc *bsc = (struct brgphy_softc *)sc; int anar, ktcr = 0; - brgphy_reset(sc); + PHY_RESET(sc); if ((sc->mii_flags & MIIF_HAVEFIBER) == 0) { anar = BMSR_MEDIA_TO_ANAR(sc->mii_capabilities) | ANAR_CSMA; @@ -637,7 +617,7 @@ brgphy_mii_phy_auto(struct mii_softc *sc, int media) anar |= BRGPHY_ANAR_PC | BRGPHY_ANAR_ASP; PHY_WRITE(sc, BRGPHY_MII_ANAR, anar); ktcr = BRGPHY_1000CTL_AFD | BRGPHY_1000CTL_AHD; - if (bsc->mii_model == MII_MODEL_xxBROADCOM_BCM5701) + if (sc->mii_mpd_model == MII_MODEL_BROADCOM_BCM5701) ktcr |= BRGPHY_1000CTL_MSE | BRGPHY_1000CTL_MSC; PHY_WRITE(sc, BRGPHY_MII_1000CTL, ktcr); PHY_READ(sc, BRGPHY_MII_1000CTL); @@ -874,12 +854,11 @@ brgphy_ethernet_wirespeed(struct mii_softc *sc) static void brgphy_jumbo_settings(struct mii_softc *sc, u_long mtu) { - struct brgphy_softc *bsc = (struct brgphy_softc *)sc; uint32_t val; /* Set or clear jumbo frame settings in the PHY. */ if (mtu > ETHER_MAX_LEN) { - if (bsc->mii_model == MII_MODEL_xxBROADCOM_BCM5401) { + if (sc->mii_mpd_model == MII_MODEL_BROADCOM_BCM5401) { /* BCM5401 PHY cannot read-modify-write. */ PHY_WRITE(sc, BRGPHY_MII_AUXCTL, 0x4c20); } else { @@ -907,7 +886,6 @@ brgphy_jumbo_settings(struct mii_softc *sc, u_long mtu) static void brgphy_reset(struct mii_softc *sc) { - struct brgphy_softc *bsc = (struct brgphy_softc *)sc; struct bge_softc *bge_sc = NULL; struct bce_softc *bce_sc = NULL; struct ifnet *ifp; @@ -929,30 +907,30 @@ brgphy_reset(struct mii_softc *sc) } /* Handle any PHY specific procedures following the reset. */ - switch (bsc->mii_oui) { - case MII_OUI_xxBROADCOM: - switch (bsc->mii_model) { - case MII_MODEL_xxBROADCOM_BCM5400: + switch (sc->mii_mpd_oui) { + case MII_OUI_BROADCOM: + switch (sc->mii_mpd_model) { + case MII_MODEL_BROADCOM_BCM5400: bcm5401_load_dspcode(sc); break; - case MII_MODEL_xxBROADCOM_BCM5401: - if (bsc->mii_rev == 1 || bsc->mii_rev == 3) + case MII_MODEL_BROADCOM_BCM5401: + if (sc->mii_mpd_rev == 1 || sc->mii_mpd_rev == 3) bcm5401_load_dspcode(sc); break; - case MII_MODEL_xxBROADCOM_BCM5411: + case MII_MODEL_BROADCOM_BCM5411: bcm5411_load_dspcode(sc); break; - case MII_MODEL_xxBROADCOM_BCM54K2: + case MII_MODEL_BROADCOM_BCM54K2: bcm54k2_load_dspcode(sc); break; } break; - case MII_OUI_xxBROADCOM_ALT2: - switch (bsc->mii_model) { - case MII_MODEL_xxBROADCOM_ALT2_BCM5717C: - case MII_MODEL_xxBROADCOM_ALT2_BCM5719C: - case MII_MODEL_xxBROADCOM_ALT2_BCM5720C: - case MII_MODEL_xxBROADCOM_ALT2_BCM57765: + case MII_OUI_BROADCOM3: + switch (sc->mii_mpd_model) { + case MII_MODEL_BROADCOM3_BCM5717C: + case MII_MODEL_BROADCOM3_BCM5719C: + case MII_MODEL_BROADCOM3_BCM5720C: + case MII_MODEL_BROADCOM3_BCM57765: return; } break; |