diff options
author | jkim <jkim@FreeBSD.org> | 2007-01-15 21:43:43 +0000 |
---|---|---|
committer | jkim <jkim@FreeBSD.org> | 2007-01-15 21:43:43 +0000 |
commit | ffb38d52f7b3579a1efb44a06318b0faa572bcc8 (patch) | |
tree | 95041596e03942ebeb6200154a4e90f1599203b3 /sys/dev/mii | |
parent | 9ca9d354d98eb12e0acd1619a9545f682a7ec672 (diff) | |
download | FreeBSD-src-ffb38d52f7b3579a1efb44a06318b0faa572bcc8.zip FreeBSD-src-ffb38d52f7b3579a1efb44a06318b0faa572bcc8.tar.gz |
- Fix BCM5754 support found in Dell PowerEdge SC440.
- Move some PHY bug detections from brgphy.c to if_bge.c.
- Do not penalize working PHYs.
- Re-arrange bge_flags roughly by their categories.
- Fix minor style(9) nits.
PR: kern/107257
Obtained from: OpenBSD
Tested by: Mike Hibler <mike at flux dot utah dot edu>
Diffstat (limited to 'sys/dev/mii')
-rw-r--r-- | sys/dev/mii/brgphy.c | 70 | ||||
-rw-r--r-- | sys/dev/mii/miidevs | 1 |
2 files changed, 49 insertions, 22 deletions
diff --git a/sys/dev/mii/brgphy.c b/sys/dev/mii/brgphy.c index 3feae31..8c44ea5 100644 --- a/sys/dev/mii/brgphy.c +++ b/sys/dev/mii/brgphy.c @@ -93,9 +93,12 @@ static void brgphy_reset(struct mii_softc *); static void brgphy_loop(struct mii_softc *); static void bcm5401_load_dspcode(struct mii_softc *); static void bcm5411_load_dspcode(struct mii_softc *); -static void bcm5703_load_dspcode(struct mii_softc *); -static void bcm5750_load_dspcode(struct mii_softc *); +static void brgphy_fixup_adc_bug(struct mii_softc *); +static void brgphy_fixup_5704_a0_bug(struct mii_softc *); +static void brgphy_fixup_ber_bug(struct mii_softc *); +static void brgphy_fixup_jitter_bug(struct mii_softc *); static int brgphy_mii_model; +static int brgphy_mii_rev; static const struct mii_phydesc brgphys[] = { MII_PHY_DESC(xxBROADCOM, BCM5400), @@ -112,6 +115,7 @@ static const struct mii_phydesc brgphys[] = { MII_PHY_DESC(xxBROADCOM, BCM5752), MII_PHY_DESC(xxBROADCOM, BCM5754), MII_PHY_DESC(xxBROADCOM, BCM5780), + MII_PHY_DESC(xxBROADCOM_ALT1, BCM5787), MII_PHY_END }; @@ -158,6 +162,7 @@ brgphy_attach(device_t dev) #endif brgphy_mii_model = MII_MODEL(ma->mii_id2); + brgphy_mii_rev = MII_REV(ma->mii_id2); brgphy_reset(sc); sc->mii_capabilities = PHY_READ(sc, MII_BMSR) & ma->mii_capmask; @@ -303,9 +308,12 @@ brgphy_service(struct mii_softc *sc, struct mii_data *mii, int cmd) cmd == MII_MEDIACHG) { switch (brgphy_mii_model) { case MII_MODEL_xxBROADCOM_BCM5400: - case MII_MODEL_xxBROADCOM_BCM5401: bcm5401_load_dspcode(sc); break; + case MII_MODEL_xxBROADCOM_BCM5401: + if (brgphy_mii_rev == 1 || brgphy_mii_rev == 3) + bcm5401_load_dspcode(sc); + break; case MII_MODEL_xxBROADCOM_BCM5411: bcm5411_load_dspcode(sc); break; @@ -515,7 +523,7 @@ bcm5411_load_dspcode(struct mii_softc *sc) } static void -bcm5703_load_dspcode(struct mii_softc *sc) +brgphy_fixup_adc_bug(struct mii_softc *sc) { static const struct { int reg; @@ -533,7 +541,7 @@ bcm5703_load_dspcode(struct mii_softc *sc) } static void -bcm5704_load_dspcode(struct mii_softc *sc) +brgphy_fixup_5704_a0_bug(struct mii_softc *sc) { static const struct { int reg; @@ -550,7 +558,7 @@ bcm5704_load_dspcode(struct mii_softc *sc) } static void -bcm5750_load_dspcode(struct mii_softc *sc) +brgphy_fixup_ber_bug(struct mii_softc *sc) { static const struct { int reg; @@ -573,6 +581,25 @@ bcm5750_load_dspcode(struct mii_softc *sc) } static void +brgphy_fixup_jitter_bug(struct mii_softc *sc) +{ + static const struct { + int reg; + uint16_t val; + } dspcode[] = { + { BRGPHY_MII_AUXCTL, 0x0c00 }, + { BRGPHY_MII_DSP_ADDR_REG, 0x000a }, + { BRGPHY_MII_DSP_RW_PORT, 0x010b }, + { BRGPHY_MII_AUXCTL, 0x0400 }, + { 0, 0 }, + }; + int i; + + for (i = 0; dspcode[i].reg != 0; i++) + PHY_WRITE(sc, dspcode[i].reg, dspcode[i].val); +} + +static void brgphy_reset(struct mii_softc *sc) { u_int32_t val; @@ -584,26 +611,15 @@ brgphy_reset(struct mii_softc *sc) switch (brgphy_mii_model) { case MII_MODEL_xxBROADCOM_BCM5400: - case MII_MODEL_xxBROADCOM_BCM5401: bcm5401_load_dspcode(sc); break; + case MII_MODEL_xxBROADCOM_BCM5401: + if (brgphy_mii_rev == 1 || brgphy_mii_rev == 3) + bcm5401_load_dspcode(sc); + break; case MII_MODEL_xxBROADCOM_BCM5411: bcm5411_load_dspcode(sc); break; - case MII_MODEL_xxBROADCOM_BCM5703: - bcm5703_load_dspcode(sc); - break; - case MII_MODEL_xxBROADCOM_BCM5704: - bcm5704_load_dspcode(sc); - break; - case MII_MODEL_xxBROADCOM_BCM5750: - case MII_MODEL_xxBROADCOM_BCM5752: - 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; } ifp = sc->mii_pdata->mii_ifp; @@ -634,11 +650,21 @@ brgphy_reset(struct mii_softc *sc) PHY_WRITE(sc, BRGPHY_MII_AUXCTL, val | (1 << 15) | (1 << 4)); /* Enable Link LED on Dell boxes */ - if (bge_sc->bge_flags & BGE_FLAG_NO3LED) { + if (bge_sc->bge_flags & BGE_FLAG_NO_3LED) { PHY_WRITE(sc, BRGPHY_MII_PHY_EXTCTL, PHY_READ(sc, BRGPHY_MII_PHY_EXTCTL) & ~BRGPHY_PHY_EXTCTL_3_LED); } + + /* Fix up various bugs */ + if (bge_sc->bge_flags & BGE_FLAG_ADC_BUG) + brgphy_fixup_adc_bug(sc); + if (bge_sc->bge_flags & BGE_FLAG_5704_A0_BUG) + brgphy_fixup_5704_a0_bug(sc); + if (bge_sc->bge_flags & BGE_FLAG_BER_BUG) + brgphy_fixup_ber_bug(sc); + if (bge_sc->bge_flags & BGE_FLAG_JITTER_BUG) + brgphy_fixup_jitter_bug(sc); } else if (bce_sc) { /* Set or clear jumbo frame settings in the PHY. */ if (ifp->if_mtu > ETHER_MAX_LEN) { diff --git a/sys/dev/mii/miidevs b/sys/dev/mii/miidevs index 8e6fd0d..ca3fb3f 100644 --- a/sys/dev/mii/miidevs +++ b/sys/dev/mii/miidevs @@ -131,6 +131,7 @@ model xxBROADCOM BCM5714 0x0034 BCM5714 10/100/1000baseTX PHY model xxBROADCOM BCM5780 0x0035 BCM5780 10/100/1000baseTX PHY model xxBROADCOM BCM5706C 0x0015 BCM5706C 10/100/1000baseTX PHY model xxBROADCOM BCM5708C 0x0036 BCM5708C 10/100/1000baseTX PHY +model xxBROADCOM_ALT1 BCM5787 0x000e BCM5787 10/100/1000baseTX PHY /* Cicada Semiconductor PHYs (now owned by Vitesse?) */ model CICADA CS8201 0x0001 Cicada CS8201 10/100/1000TX PHY |