summaryrefslogtreecommitdiffstats
path: root/freebsd/sys/dev/mii/brgphy.c
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2013-11-06 16:20:21 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2013-11-11 10:08:08 +0100
commit66659ff1ad6831b0ea7425fa6ecd8a8687523658 (patch)
tree48e22b475fa8854128e0861a33fed6f78c8094b5 /freebsd/sys/dev/mii/brgphy.c
parentDefine __GLOBL1() and __GLOBL() (diff)
downloadrtems-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.c186
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;