summaryrefslogtreecommitdiffstats
path: root/sys/dev/mii
diff options
context:
space:
mode:
authorjkim <jkim@FreeBSD.org>2007-01-15 21:43:43 +0000
committerjkim <jkim@FreeBSD.org>2007-01-15 21:43:43 +0000
commitffb38d52f7b3579a1efb44a06318b0faa572bcc8 (patch)
tree95041596e03942ebeb6200154a4e90f1599203b3 /sys/dev/mii
parent9ca9d354d98eb12e0acd1619a9545f682a7ec672 (diff)
downloadFreeBSD-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.c70
-rw-r--r--sys/dev/mii/miidevs1
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
OpenPOWER on IntegriCloud