Module Name: src Committed By: msaitoh Date: Sun Apr 19 11:10:36 UTC 2009
Modified Files: src/sys/dev/mii: brgphy.c brgphyreg.h files.mii makphy.c makphyreg.h miidevs miidevs.h miidevs_data.h src/sys/dev/pci: if_bge.c if_bgereg.h Log Message: Some fixes and enhancements: Both if_bge* and brgphy.[ch]: Check the parent's MAC and use the quirk code for the bug like OpenBSD and FreeBSD. Some bugs can't identify the PHY ID. For example, 5704 Ax has the ADC bug, but 5704 A3 and 5704 B0 have the same PHY ID and revision. Add BGE_PHY_CRC_BUG, BGE_PHY_ADC_BUG, BGE_PHY_5704_A0_BUG, BGE_PHY_JITTER_BUG, BGE_PHY_ADJUST_TRIM and BGE_PHY_BER_BUG for this flag. Some of the DSP patches are newly taken from OpenBSD and FreeBSD. if_bge*: Remove duplicated BGE_CHIPID_BCM5714_A0 entry in the known CHIPID table. Fix obsolete comments. brgphy.[ch]: Add some PHY IDs. TODO: Add more three quirk code into bge and brgphy (the brgphy side's are currently #if0'ed). Add support for bnx into brgphy (currently #if0'ed) To generate a diff of this commit: cvs rdiff -u -r1.42 -r1.43 src/sys/dev/mii/brgphy.c src/sys/dev/mii/files.mii cvs rdiff -u -r1.3 -r1.4 src/sys/dev/mii/brgphyreg.h \ src/sys/dev/mii/makphyreg.h cvs rdiff -u -r1.29 -r1.30 src/sys/dev/mii/makphy.c cvs rdiff -u -r1.85 -r1.86 src/sys/dev/mii/miidevs cvs rdiff -u -r1.87 -r1.88 src/sys/dev/mii/miidevs.h cvs rdiff -u -r1.77 -r1.78 src/sys/dev/mii/miidevs_data.h cvs rdiff -u -r1.161 -r1.162 src/sys/dev/pci/if_bge.c cvs rdiff -u -r1.50 -r1.51 src/sys/dev/pci/if_bgereg.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/mii/brgphy.c diff -u src/sys/dev/mii/brgphy.c:1.42 src/sys/dev/mii/brgphy.c:1.43 --- src/sys/dev/mii/brgphy.c:1.42 Tue Apr 7 18:05:54 2009 +++ src/sys/dev/mii/brgphy.c Sun Apr 19 11:10:36 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: brgphy.c,v 1.42 2009/04/07 18:05:54 dyoung Exp $ */ +/* $NetBSD: brgphy.c,v 1.43 2009/04/19 11:10:36 msaitoh Exp $ */ /*- * Copyright (c) 1998, 1999, 2000, 2001 The NetBSD Foundation, Inc. @@ -67,7 +67,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: brgphy.c,v 1.42 2009/04/07 18:05:54 dyoung Exp $"); +__KERNEL_RCSID(0, "$NetBSD: brgphy.c,v 1.43 2009/04/19 11:10:36 msaitoh Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -85,6 +85,11 @@ #include <dev/mii/brgphyreg.h> +#include <dev/pci/if_bgereg.h> +#if 0 +#include <dev/pci/if_bnxreg.h> +#endif + static int brgphymatch(device_t, cfdata_t, void *); static void brgphyattach(device_t, device_t, void *); @@ -96,48 +101,21 @@ static void brgphy_status(struct mii_softc *); static int brgphy_mii_phy_auto(struct mii_softc *); static void brgphy_loop(struct mii_softc *); +static void brgphy_reset(struct mii_softc *); +static void brgphy_bcm5401_dspcode(struct mii_softc *); +static void brgphy_bcm5411_dspcode(struct mii_softc *); +static void brgphy_bcm5421_dspcode(struct mii_softc *); +static void brgphy_bcm54k2_dspcode(struct mii_softc *); +static void brgphy_adc_bug(struct mii_softc *); +static void brgphy_5704_a0_bug(struct mii_softc *); +static void brgphy_ber_bug(struct mii_softc *); +static void brgphy_crc_bug(struct mii_softc *); -static void brgphy_5401_reset(struct mii_softc *); -static void brgphy_5411_reset(struct mii_softc *); -static void brgphy_5703_reset(struct mii_softc *); -static void brgphy_5704_reset(struct mii_softc *); -static void brgphy_5705_reset(struct mii_softc *); -static void brgphy_5750_reset(struct mii_softc *); -static void brgphy_5755_reset(struct mii_softc *); static const struct mii_phy_funcs brgphy_funcs = { - brgphy_service, brgphy_status, mii_phy_reset, -}; - -static const struct mii_phy_funcs brgphy_5401_funcs = { - brgphy_service, brgphy_status, brgphy_5401_reset, -}; - -static const struct mii_phy_funcs brgphy_5411_funcs = { - brgphy_service, brgphy_status, brgphy_5411_reset, -}; - -static const struct mii_phy_funcs brgphy_5703_funcs = { - brgphy_service, brgphy_status, brgphy_5703_reset, -}; - -static const struct mii_phy_funcs brgphy_5704_funcs = { - brgphy_service, brgphy_status, brgphy_5704_reset, -}; - -static const struct mii_phy_funcs brgphy_5705_funcs = { - brgphy_service, brgphy_status, brgphy_5705_reset, -}; - -const struct mii_phy_funcs brgphy_5750_funcs = { - brgphy_service, brgphy_status, brgphy_5750_reset, -}; - -const struct mii_phy_funcs brgphy_5755_funcs = { - brgphy_service, brgphy_status, brgphy_5755_reset, + brgphy_service, brgphy_status, brgphy_reset, }; - static const struct mii_phydesc brgphys[] = { { MII_OUI_BROADCOM, MII_MODEL_BROADCOM_BCM5400, MII_STR_BROADCOM_BCM5400 }, @@ -151,6 +129,12 @@ { MII_OUI_BROADCOM, MII_MODEL_BROADCOM_BCM5421, MII_STR_BROADCOM_BCM5421 }, + { MII_OUI_BROADCOM, MII_MODEL_BROADCOM_BCM54K2, + MII_STR_BROADCOM_BCM54K2 }, + + { MII_OUI_BROADCOM, MII_MODEL_BROADCOM_BCM5462, + MII_STR_BROADCOM_BCM5462 }, + { MII_OUI_BROADCOM, MII_MODEL_BROADCOM_BCM5701, MII_STR_BROADCOM_BCM5701 }, @@ -178,6 +162,9 @@ { MII_OUI_BROADCOM, MII_MODEL_BROADCOM_BCM5708C, MII_STR_BROADCOM_BCM5708C }, + { MII_OUI_BROADCOM2, MII_MODEL_BROADCOM2_BCM5722, + MII_STR_BROADCOM2_BCM5722 }, + { MII_OUI_BROADCOM2, MII_MODEL_BROADCOM2_BCM5755, MII_STR_BROADCOM2_BCM5755 }, @@ -191,13 +178,6 @@ NULL }, }; -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 bcm5704_load_dspcode(struct mii_softc *); -static void bcm5750_load_dspcode(struct mii_softc *); -static void bcm5755_load_dspcode(struct mii_softc *); - static int brgphymatch(struct device *parent, struct cfdata *match, void *aux) @@ -226,67 +206,11 @@ sc->mii_inst = mii->mii_instance; sc->mii_phy = ma->mii_phyno; sc->mii_mpd_model = MII_MODEL(ma->mii_id2); + sc->mii_mpd_rev = MII_REV(ma->mii_id2); sc->mii_pdata = mii; sc->mii_flags = ma->mii_flags; sc->mii_anegticks = MII_ANEGTICKS; - - if (MII_OUI(ma->mii_id1, ma->mii_id2) == MII_OUI_xxBROADCOM_ALT1) { - sc->mii_funcs = &brgphy_5750_funcs; - aprint_normal_dev(self, "using BCM5750 DSP patch\n"); - } else { - switch (MII_MODEL(ma->mii_id2)) { - case MII_MODEL_BROADCOM_BCM5400: - sc->mii_funcs = &brgphy_5401_funcs; - aprint_normal_dev(self, "using BCM5401 DSP patch\n"); - break; - - case MII_MODEL_BROADCOM_BCM5401: - if (MII_REV(ma->mii_id2) == 1 || MII_REV(ma->mii_id2) == 3) { - sc->mii_funcs = &brgphy_5401_funcs; - aprint_normal_dev(self, "using BCM5401 DSP patch\n"); - } else - sc->mii_funcs = &brgphy_funcs; - break; - - case MII_MODEL_BROADCOM_BCM5411: - sc->mii_funcs = &brgphy_5411_funcs; - aprint_normal_dev(self, "using BCM5411 DSP patch\n"); - break; - - #ifdef notyet /* unverified, untested */ - case MII_MODEL_BROADCOM_BCM5703: - sc->mii_funcs = &brgphy_5703_funcs; - aprint_normal_dev(self, "using BCM5703 DSP patch\n"); - break; - #endif - - case MII_MODEL_BROADCOM_BCM5704: - sc->mii_funcs = &brgphy_5704_funcs; - aprint_normal_dev(self, "using BCM5704 DSP patch\n"); - break; - - case MII_MODEL_BROADCOM_BCM5705: - sc->mii_funcs = &brgphy_5705_funcs; - break; - - case MII_MODEL_BROADCOM_BCM5714: - case MII_MODEL_BROADCOM_BCM5780: - case MII_MODEL_BROADCOM_BCM5708C: - case MII_MODEL_BROADCOM_BCM5750: - case MII_MODEL_BROADCOM_BCM5752: - sc->mii_funcs = &brgphy_5750_funcs; - break; - - case MII_MODEL_BROADCOM2_BCM5754: - case MII_MODEL_BROADCOM2_BCM5755: - sc->mii_funcs = &brgphy_5755_funcs; - break; - - default: - sc->mii_funcs = &brgphy_funcs; - break; - } - } + sc->mii_funcs = &brgphy_funcs; PHY_RESET(sc); @@ -408,12 +332,22 @@ if (sc->mii_media_active != mii->mii_media_active || sc->mii_media_status != mii->mii_media_status || cmd == MII_MEDIACHG) { - mii_phy_update(sc, cmd); - if (sc->mii_funcs == &brgphy_5401_funcs) - bcm5401_load_dspcode(sc); - else if (sc->mii_funcs == &brgphy_5411_funcs) - bcm5411_load_dspcode(sc); + switch (sc->mii_mpd_model) { + case MII_MODEL_BROADCOM_BCM5400: + brgphy_bcm5401_dspcode(sc); + break; + case MII_MODEL_BROADCOM_BCM5401: + if (sc->mii_mpd_rev == 1 || sc->mii_mpd_rev == 3) + brgphy_bcm5401_dspcode(sc); + break; + case MII_MODEL_BROADCOM_BCM5411: + brgphy_bcm5411_dspcode(sc); + break; + } } + + /* Callback if something changed. */ + mii_phy_update(sc, cmd); return (0); } @@ -540,65 +474,162 @@ } static void -brgphy_5401_reset(struct mii_softc *sc) +brgphy_reset(struct mii_softc *sc) { + struct bge_softc *bge_sc = NULL; +#if 0 + struct bnx_softc *bnx_sc = NULL; +#endif + const char *devname; - mii_phy_reset(sc); - bcm5401_load_dspcode(sc); -} - -static void -brgphy_5411_reset(struct mii_softc *sc) -{ + devname = device_parent(sc->mii_dev)->dv_cfdriver->cd_name; mii_phy_reset(sc); - bcm5411_load_dspcode(sc); -} - - -static void -brgphy_5703_reset(struct mii_softc *sc) -{ - mii_phy_reset(sc); - bcm5703_load_dspcode(sc); -} + switch (sc->mii_mpd_model) { + case MII_MODEL_BROADCOM_BCM5400: + brgphy_bcm5401_dspcode(sc); + break; + case MII_MODEL_BROADCOM_BCM5401: + if (sc->mii_mpd_rev == 1 || sc->mii_mpd_rev == 3) + brgphy_bcm5401_dspcode(sc); + break; + case MII_MODEL_BROADCOM_BCM5411: + brgphy_bcm5411_dspcode(sc); + break; + case MII_MODEL_BROADCOM_BCM5421: + brgphy_bcm5421_dspcode(sc); + break; + case MII_MODEL_BROADCOM_BCM54K2: + brgphy_bcm54k2_dspcode(sc); + break; + } -static void -brgphy_5704_reset(struct mii_softc *sc) -{ + /* Handle any bge (NetXtreme/NetLink) workarounds. */ + if (strcmp(devname, "bge") == 0) { + if (!(sc->mii_flags & MIIF_HAVEFIBER)) { + bge_sc = sc->mii_pdata->mii_ifp->if_softc; + + if (bge_sc->bge_flags & BGE_PHY_ADC_BUG) + brgphy_adc_bug(sc); + if (bge_sc->bge_flags & BGE_PHY_5704_A0_BUG) + brgphy_5704_a0_bug(sc); + if (bge_sc->bge_flags & BGE_PHY_BER_BUG) + brgphy_ber_bug(sc); + else if (bge_sc->bge_flags & BGE_PHY_JITTER_BUG) { + PHY_WRITE(sc, BRGPHY_MII_AUXCTL, 0x0c00); + PHY_WRITE(sc, BRGPHY_MII_DSP_ADDR_REG, + 0x000a); + + if (bge_sc->bge_flags & BGE_PHY_ADJUST_TRIM) { + PHY_WRITE(sc, BRGPHY_MII_DSP_RW_PORT, + 0x110b); + PHY_WRITE(sc, BRGPHY_TEST1, + BRGPHY_TEST1_TRIM_EN | 0x4); + } else { + PHY_WRITE(sc, BRGPHY_MII_DSP_RW_PORT, + 0x010b); + } - mii_phy_reset(sc); - bcm5704_load_dspcode(sc); -} + PHY_WRITE(sc, BRGPHY_MII_AUXCTL, 0x0400); + } + if (bge_sc->bge_flags & BGE_PHY_CRC_BUG) + brgphy_crc_bug(sc); -/* - * Hardware bug workaround. Do nothing since after - * reset the 5705 PHY would get stuck in 10/100 MII mode. - */ +#if 0 + /* Set Jumbo frame settings in the PHY. */ + if (bge_sc->bge_flags & BGE_JUMBO_CAP) + brgphy_jumbo_settings(sc); +#endif + + /* Adjust output voltage */ + if (sc->mii_mpd_model == MII_MODEL_BROADCOM2_BCM5906) + PHY_WRITE(sc, BRGPHY_MII_EPHY_PTEST, 0x12); + +#if 0 + /* Enable ether...@wirespeed */ + if (!(bge_sc->bge_flags & BGE_NO_ETH_WIRE_SPEED)) + brgphy_eth_wirespeed(sc); + + /* Enable Link LED on Dell boxes */ + if (bge_sc->bge_flags & BGE_NO_3LED) { + PHY_WRITE(sc, BRGPHY_MII_PHY_EXTCTL, + PHY_READ(sc, BRGPHY_MII_PHY_EXTCTL) + & ~BRGPHY_PHY_EXTCTL_3_LED); + } +#endif + } +#if 0 /* not yet */ + /* Handle any bnx (NetXtreme II) workarounds. */ + } else if (strcmp(devname, "bnx") == 0) { + bnx_sc = sc->mii_pdata->mii_ifp->if_softc; + + if (sc->mii_mpd_model == MII_MODEL_xxBROADCOM2_BCM5708S) { + /* Store autoneg capabilities/results in digital block (Page 0) */ + PHY_WRITE(sc, BRGPHY_5708S_BLOCK_ADDR, BRGPHY_5708S_DIG3_PG2); + PHY_WRITE(sc, BRGPHY_5708S_PG2_DIGCTL_3_0, + BRGPHY_5708S_PG2_DIGCTL_3_0_USE_IEEE); + PHY_WRITE(sc, BRGPHY_5708S_BLOCK_ADDR, BRGPHY_5708S_DIG_PG0); + + /* Enable fiber mode and autodetection */ + PHY_WRITE(sc, BRGPHY_5708S_PG0_1000X_CTL1, + PHY_READ(sc, BRGPHY_5708S_PG0_1000X_CTL1) | + BRGPHY_5708S_PG0_1000X_CTL1_AUTODET_EN | + BRGPHY_5708S_PG0_1000X_CTL1_FIBER_MODE); + + /* Enable parallel detection */ + PHY_WRITE(sc, BRGPHY_5708S_PG0_1000X_CTL2, + PHY_READ(sc, BRGPHY_5708S_PG0_1000X_CTL2) | + BRGPHY_5708S_PG0_1000X_CTL2_PAR_DET_EN); + + /* Advertise 2.5G support through next page during autoneg */ + if (bnx_sc->bnx_phy_flags & BNX_PHY_2_5G_CAPABLE_FLAG) + PHY_WRITE(sc, BRGPHY_5708S_ANEG_NXT_PG_XMIT1, + PHY_READ(sc, BRGPHY_5708S_ANEG_NXT_PG_XMIT1) | + BRGPHY_5708S_ANEG_NXT_PG_XMIT1_25G); + + /* Increase TX signal amplitude */ + if ((BNX_CHIP_ID(bnx_sc) == BNX_CHIP_ID_5708_A0) || + (BNX_CHIP_ID(bnx_sc) == BNX_CHIP_ID_5708_B0) || + (BNX_CHIP_ID(bnx_sc) == BNX_CHIP_ID_5708_B1)) { + PHY_WRITE(sc, BRGPHY_5708S_BLOCK_ADDR, + BRGPHY_5708S_TX_MISC_PG5); + PHY_WRITE(sc, BRGPHY_5708S_PG5_TXACTL1, + PHY_READ(sc, BRGPHY_5708S_PG5_TXACTL1) & + ~BRGPHY_5708S_PG5_TXACTL1_VCM); + PHY_WRITE(sc, BRGPHY_5708S_BLOCK_ADDR, + BRGPHY_5708S_DIG_PG0); + } -static void -brgphy_5705_reset(struct mii_softc *sc) -{ -} + /* Backplanes use special driver/pre-driver/pre-emphasis values. */ + if ((bnx_sc->bnx_shared_hw_cfg & BNX_SHARED_HW_CFG_PHY_BACKPLANE) && + (bnx_sc->bnx_port_hw_cfg & BNX_PORT_HW_CFG_CFG_TXCTL3_MASK)) { + PHY_WRITE(sc, BRGPHY_5708S_BLOCK_ADDR, + BRGPHY_5708S_TX_MISC_PG5); + PHY_WRITE(sc, BRGPHY_5708S_PG5_TXACTL3, + bnx_sc->bnx_port_hw_cfg & + BNX_PORT_HW_CFG_CFG_TXCTL3_MASK); + PHY_WRITE(sc, BRGPHY_5708S_BLOCK_ADDR, + BRGPHY_5708S_DIG_PG0); + } + } else { + if (!(sc->mii_flags & MIIF_HAVEFIBER)) { + brgphy_ber_bug(sc); -static void -brgphy_5750_reset(struct mii_softc *sc) -{ - mii_phy_reset(sc); - bcm5750_load_dspcode(sc); -} + /* Set Jumbo frame settings in the PHY. */ + brgphy_jumbo_settings(sc); -static void -brgphy_5755_reset(struct mii_softc *sc) -{ - mii_phy_reset(sc); - bcm5755_load_dspcode(sc); + /* Enable ether...@wirespeed */ + brgphy_eth_wirespeed(sc); + } + } +#endif + } } /* Turn off tap power management on 5401. */ static void -bcm5401_load_dspcode(struct mii_softc *sc) +brgphy_bcm5401_dspcode(struct mii_softc *sc) { static const struct { int reg; @@ -625,7 +656,7 @@ } static void -bcm5411_load_dspcode(struct mii_softc *sc) +brgphy_bcm5411_dspcode(struct mii_softc *sc) { static const struct { int reg; @@ -642,8 +673,44 @@ PHY_WRITE(sc, dspcode[i].reg, dspcode[i].val); } +void +brgphy_bcm5421_dspcode(struct mii_softc *sc) +{ + uint16_t data; + + /* Set Class A mode */ + PHY_WRITE(sc, BRGPHY_MII_AUXCTL, 0x1007); + data = PHY_READ(sc, BRGPHY_MII_AUXCTL); + PHY_WRITE(sc, BRGPHY_MII_AUXCTL, data | 0x0400); + + /* Set FFE gamma override to -0.125 */ + PHY_WRITE(sc, BRGPHY_MII_AUXCTL, 0x0007); + data = PHY_READ(sc, BRGPHY_MII_AUXCTL); + PHY_WRITE(sc, BRGPHY_MII_AUXCTL, data | 0x0800); + PHY_WRITE(sc, BRGPHY_MII_DSP_ADDR_REG, 0x000a); + data = PHY_READ(sc, BRGPHY_MII_DSP_RW_PORT); + PHY_WRITE(sc, BRGPHY_MII_DSP_RW_PORT, data | 0x0200); +} + +void +brgphy_bcm54k2_dspcode(struct mii_softc *sc) +{ + static const struct { + int reg; + uint16_t val; + } dspcode[] = { + { 4, 0x01e1 }, + { 9, 0x0300 }, + { 0, 0 }, + }; + int i; + + for (i = 0; dspcode[i].reg != 0; i++) + PHY_WRITE(sc, dspcode[i].reg, dspcode[i].val); +} + static void -bcm5703_load_dspcode(struct mii_softc *sc) +brgphy_adc_bug(struct mii_softc *sc) { static const struct { int reg; @@ -652,6 +719,9 @@ { BRGPHY_MII_AUXCTL, 0x0c00 }, { BRGPHY_MII_DSP_ADDR_REG, 0x201f }, { BRGPHY_MII_DSP_RW_PORT, 0x2aaa }, + { BRGPHY_MII_DSP_ADDR_REG, 0x000a }, + { BRGPHY_MII_DSP_RW_PORT, 0x0323 }, + { BRGPHY_MII_AUXCTL, 0x0400 }, { 0, 0 }, }; int i; @@ -661,7 +731,7 @@ } static void -bcm5704_load_dspcode(struct mii_softc *sc) +brgphy_5704_a0_bug(struct mii_softc *sc) { static const struct { int reg; @@ -678,7 +748,7 @@ } static void -bcm5750_load_dspcode(struct mii_softc *sc) +brgphy_ber_bug(struct mii_softc *sc) { static const struct { int reg; @@ -700,18 +770,18 @@ PHY_WRITE(sc, dspcode[i].reg, dspcode[i].val); } -static void -bcm5755_load_dspcode(struct mii_softc *sc) +/* BCM5701 A0/B0 CRC bug workaround */ +void +brgphy_crc_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 }, + { BRGPHY_MII_DSP_ADDR_REG, 0x0a75 }, + { 0x1c, 0x8c68 }, + { 0x1c, 0x8d68 }, + { 0x1c, 0x8c68 }, { 0, 0 }, }; int i; Index: src/sys/dev/mii/files.mii diff -u src/sys/dev/mii/files.mii:1.42 src/sys/dev/mii/files.mii:1.43 --- src/sys/dev/mii/files.mii:1.42 Fri Jan 16 21:06:24 2009 +++ src/sys/dev/mii/files.mii Sun Apr 19 11:10:36 2009 @@ -1,4 +1,4 @@ -# $NetBSD: files.mii,v 1.42 2009/01/16 21:06:24 cegger Exp $ +# $NetBSD: files.mii,v 1.43 2009/04/19 11:10:36 msaitoh Exp $ defflag opt_mii.h MIIVERBOSE @@ -24,6 +24,10 @@ attach amhphy at mii file dev/mii/amhphy.c amhphy +device bmphy: mii_phy +attach bmphy at mii +file dev/mii/bmphy.c bmphy + device bmtphy: mii_phy attach bmtphy at mii file dev/mii/bmtphy.c bmtphy Index: src/sys/dev/mii/brgphyreg.h diff -u src/sys/dev/mii/brgphyreg.h:1.3 src/sys/dev/mii/brgphyreg.h:1.4 --- src/sys/dev/mii/brgphyreg.h:1.3 Mon Aug 25 08:15:05 2008 +++ src/sys/dev/mii/brgphyreg.h Sun Apr 19 11:10:36 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: brgphyreg.h,v 1.3 2008/08/25 08:15:05 cegger Exp $ */ +/* $NetBSD: brgphyreg.h,v 1.4 2009/04/19 11:10:36 msaitoh Exp $ */ /* * Copyright (c) 2000 @@ -94,6 +94,7 @@ #define BRGPHY_MII_DSP_RW_PORT 0x15 /* DSP coefficient r/w port */ +#define BRGPHY_MII_EPHY_PTEST 0x17 /* 5906 PHY register */ #define BRGPHY_MII_DSP_ADDR_REG 0x17 /* DSP coefficient addr register */ #define BRGPHY_DSP_TAP_NUMBER_MASK 0x00 @@ -195,6 +196,33 @@ #define BRGPHY_IMR_LNK_CHG 0x0002 /* Link status change */ #define BRGPHY_IMR_CRCERR 0x0001 /* CEC error */ +/*******************************************************/ +/* Begin: PHY register values for the 5706 PHY */ +/*******************************************************/ + +/* + * Shadow register 0x1C, bit 15 is write enable, + * bits 14-10 select function (0x00 to 0x1F). + */ +#define BRGPHY_MII_SHADOW_1C 0x1C +#define BRGPHY_SHADOW_1C_WRITE_EN 0x8000 +#define BRGPHY_SHADOW_1C_SELECT_MASK 0x7C00 + +/* Shadow 0x1C Mode Control Register (select value 0x1F) */ +#define BRGPHY_SHADOW_1C_MODE_CTRL (0x1F << 10) +/* When set, Regs 0-0x0F are 1000X, else 1000T */ +#define BRGPHY_SHADOW_1C_ENA_1000X 0x0001 + +#define BRGPHY_TEST1 0x1E +#define BRGPHY_TEST1_TRIM_EN 0x0010 +#define BRGPHY_TEST1_CRC_EN 0x8000 + +#define BRGPHY_MII_TEST2 0x1F + +/*******************************************************/ +/* End: PHY register values for the 5706 PHY */ +/*******************************************************/ + #define BRGPHY_INTRS \ ~(BRGPHY_IMR_LNK_CHG|BRGPHY_IMR_LSP_CHG|BRGPHY_IMR_DUP_CHG) Index: src/sys/dev/mii/makphyreg.h diff -u src/sys/dev/mii/makphyreg.h:1.3 src/sys/dev/mii/makphyreg.h:1.4 --- src/sys/dev/mii/makphyreg.h:1.3 Mon Apr 28 20:23:53 2008 +++ src/sys/dev/mii/makphyreg.h Sun Apr 19 11:10:36 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: makphyreg.h,v 1.3 2008/04/28 20:23:53 martin Exp $ */ +/* $NetBSD: makphyreg.h,v 1.4 2009/04/19 11:10:36 msaitoh Exp $ */ /*- * Copyright (c) 2001 The NetBSD Foundation, Inc. @@ -88,8 +88,14 @@ #define MII_MAKPHY_EPSC 0x14 /* extended PHY specific control */ #define EPSC_TX_CLK(x) ((x) << 4) /* transmit clock */ -#define EPSC_TBI_RCLK_DIS (1U << 12) /* TBI RCLK disable */ -#define EPSC_TBI_RX_CLK125_EN (1U << 13) /* TBI RX_CLK125 enable */ +#define EPSC_TX_CLK_2_5 0x0060 +#define EPSC_TX_CLK_25 0x0070 +#define EPSC_TX_CLK_0 0x0000 +#define EPSC_MASTER_DOWNSHIFT_MASK 0x0c00 +#define EPSC_MASTER_DOWNSHIFT_1X 0x0000 +#define EPSC_SLABE_DOWNSHIFT_MASK 0x0300 +#define EPSC_SLABE_DOWNSHIFT_1X 0x0100 + #define EPSC_LINK_DOWN_NO_IDLES (1U << 15) /* 1 = lost lock detect */ #define MII_MAKPHY_REC 0x15 /* receive error counter */ Index: src/sys/dev/mii/makphy.c diff -u src/sys/dev/mii/makphy.c:1.29 src/sys/dev/mii/makphy.c:1.30 --- src/sys/dev/mii/makphy.c:1.29 Mon Nov 17 03:04:27 2008 +++ src/sys/dev/mii/makphy.c Sun Apr 19 11:10:36 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: makphy.c,v 1.29 2008/11/17 03:04:27 dyoung Exp $ */ +/* $NetBSD: makphy.c,v 1.30 2009/04/19 11:10:36 msaitoh Exp $ */ /*- * Copyright (c) 1998, 1999, 2000, 2001 The NetBSD Foundation, Inc. @@ -64,7 +64,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: makphy.c,v 1.29 2008/11/17 03:04:27 dyoung Exp $"); +__KERNEL_RCSID(0, "$NetBSD: makphy.c,v 1.30 2009/04/19 11:10:36 msaitoh Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -167,10 +167,24 @@ makphy_reset(struct mii_softc *sc) { uint16_t pscr; +#if 0 + uint16_t reg; +#endif /* Assert CRS on transmit */ pscr = PHY_READ(sc, MII_MAKPHY_PSCR); - PHY_WRITE(sc, MII_MAKPHY_PSCR, pscr | PSCR_CRS_ON_TX); + pscr |= PSCR_CRS_ON_TX; +#if 0 + pscr &= ~PSCR_MDI_XOVER_MODE(XOVER_MODE_AUTO | XOVER_MODE_MDIX); +#endif + PHY_WRITE(sc, MII_MAKPHY_PSCR, pscr); +#if 0 + reg = PHY_READ(sc, MII_MAKPHY_EPSC); + reg &= ~(EPSC_MASTER_DOWNSHIFT_MASK | EPSC_SLABE_DOWNSHIFT_MASK); + reg |= EPSC_MASTER_DOWNSHIFT_1X | EPSC_SLABE_DOWNSHIFT_1X; + reg |= EPSC_TX_CLK_25; + PHY_WRITE(sc, MII_MAKPHY_EPSC, reg); +#endif mii_phy_reset(sc); } Index: src/sys/dev/mii/miidevs diff -u src/sys/dev/mii/miidevs:1.85 src/sys/dev/mii/miidevs:1.86 --- src/sys/dev/mii/miidevs:1.85 Sun Apr 19 10:25:25 2009 +++ src/sys/dev/mii/miidevs Sun Apr 19 11:10:36 2009 @@ -1,4 +1,4 @@ -$NetBSD: miidevs,v 1.85 2009/04/19 10:25:25 msaitoh Exp $ +$NetBSD: miidevs,v 1.86 2009/04/19 11:10:36 msaitoh Exp $ /*- * Copyright (c) 1998, 1999 The NetBSD Foundation, Inc. @@ -199,6 +199,7 @@ model yyINTEL I82553 0x0035 i82553 10/100 media interface model yyINTEL I82566 0x0039 i82566 10/100/1000 media interface model xxMARVELL I82563 0x000a i82563 10/100/1000 media interface +model xxMARVELL I82567 0x000b i82567 10/100/1000 media interface model yyINTEL IGP01E1000 0x0038 Intel IGP01E1000 Gigabit PHY Index: src/sys/dev/mii/miidevs.h diff -u src/sys/dev/mii/miidevs.h:1.87 src/sys/dev/mii/miidevs.h:1.88 --- src/sys/dev/mii/miidevs.h:1.87 Sun Apr 19 10:25:49 2009 +++ src/sys/dev/mii/miidevs.h Sun Apr 19 11:10:36 2009 @@ -1,10 +1,10 @@ -/* $NetBSD: miidevs.h,v 1.87 2009/04/19 10:25:49 msaitoh Exp $ */ +/* $NetBSD: miidevs.h,v 1.88 2009/04/19 11:10:36 msaitoh Exp $ */ /* * THIS FILE AUTOMATICALLY GENERATED. DO NOT EDIT. * * generated from: - * NetBSD: miidevs,v 1.85 2009/04/19 10:25:25 msaitoh Exp + * NetBSD: miidevs,v 1.84 2009/03/25 06:49:56 cegger Exp */ /*- @@ -270,6 +270,8 @@ #define MII_STR_yyINTEL_I82566 "i82566 10/100/1000 media interface" #define MII_MODEL_xxMARVELL_I82563 0x000a #define MII_STR_xxMARVELL_I82563 "i82563 10/100/1000 media interface" +#define MII_MODEL_xxMARVELL_I82567 0x000b +#define MII_STR_xxMARVELL_I82567 "i82567 10/100/1000 media interface" #define MII_MODEL_yyINTEL_IGP01E1000 0x0038 #define MII_STR_yyINTEL_IGP01E1000 "Intel IGP01E1000 Gigabit PHY" Index: src/sys/dev/mii/miidevs_data.h diff -u src/sys/dev/mii/miidevs_data.h:1.77 src/sys/dev/mii/miidevs_data.h:1.78 --- src/sys/dev/mii/miidevs_data.h:1.77 Sun Apr 19 10:25:48 2009 +++ src/sys/dev/mii/miidevs_data.h Sun Apr 19 11:10:36 2009 @@ -1,10 +1,10 @@ -/* $NetBSD: miidevs_data.h,v 1.77 2009/04/19 10:25:48 msaitoh Exp $ */ +/* $NetBSD: miidevs_data.h,v 1.78 2009/04/19 11:10:36 msaitoh Exp $ */ /* * THIS FILE AUTOMATICALLY GENERATED. DO NOT EDIT. * * generated from: - * NetBSD: miidevs,v 1.85 2009/04/19 10:25:25 msaitoh Exp + * NetBSD: miidevs,v 1.84 2009/03/25 06:49:56 cegger Exp */ /*- @@ -101,6 +101,7 @@ { MII_OUI_yyINTEL, MII_MODEL_yyINTEL_I82553, MII_STR_yyINTEL_I82553 }, { MII_OUI_yyINTEL, MII_MODEL_yyINTEL_I82566, MII_STR_yyINTEL_I82566 }, { MII_OUI_xxMARVELL, MII_MODEL_xxMARVELL_I82563, MII_STR_xxMARVELL_I82563 }, + { MII_OUI_xxMARVELL, MII_MODEL_xxMARVELL_I82567, MII_STR_xxMARVELL_I82567 }, { MII_OUI_yyINTEL, MII_MODEL_yyINTEL_IGP01E1000, MII_STR_yyINTEL_IGP01E1000 }, { MII_OUI_JMICRON, MII_MODEL_JMICRON_JMC250, MII_STR_JMICRON_JMC250 }, { MII_OUI_JMICRON, MII_MODEL_JMICRON_JMC260, MII_STR_JMICRON_JMC260 }, Index: src/sys/dev/pci/if_bge.c diff -u src/sys/dev/pci/if_bge.c:1.161 src/sys/dev/pci/if_bge.c:1.162 --- src/sys/dev/pci/if_bge.c:1.161 Thu Apr 16 01:38:34 2009 +++ src/sys/dev/pci/if_bge.c Sun Apr 19 11:10:36 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: if_bge.c,v 1.161 2009/04/16 01:38:34 msaitoh Exp $ */ +/* $NetBSD: if_bge.c,v 1.162 2009/04/19 11:10:36 msaitoh Exp $ */ /* * Copyright (c) 2001 Wind River Systems @@ -79,7 +79,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_bge.c,v 1.161 2009/04/16 01:38:34 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_bge.c,v 1.162 2009/04/19 11:10:36 msaitoh Exp $"); #include "bpfilter.h" #include "vlan.h" @@ -536,7 +536,6 @@ { BGE_CHIPID_BCM5750_C0, "BCM5750 C0" }, { BGE_CHIPID_BCM5750_C1, "BCM5750 C1" }, { BGE_CHIPID_BCM5750_C2, "BCM5750 C2" }, - { BGE_CHIPID_BCM5714_A0, "BCM5714 A0" }, { BGE_CHIPID_BCM5752_A0, "BCM5752 A0" }, { BGE_CHIPID_BCM5752_A1, "BCM5752 A1" }, { BGE_CHIPID_BCM5752_A2, "BCM5752 A2" }, @@ -568,13 +567,14 @@ { BGE_ASICREV_BCM5703, "unknown BCM5703" }, { BGE_ASICREV_BCM5704, "unknown BCM5704" }, { BGE_ASICREV_BCM5705, "unknown BCM5705" }, - { BGE_ASICREV_BCM5750, "unknown BCM575x family" }, + { BGE_ASICREV_BCM5750, "unknown BCM5750" }, { BGE_ASICREV_BCM5714_A0, "unknown BCM5714" }, { BGE_ASICREV_BCM5714, "unknown BCM5714" }, { BGE_ASICREV_BCM5752, "unknown BCM5752 family" }, { BGE_ASICREV_BCM5755, "unknown BCM5755" }, { BGE_ASICREV_BCM5780, "unknown BCM5780" }, - { BGE_ASICREV_BCM5787, "unknown BCM5787" }, + /* 5754 and 5787 share the same ASIC ID */ + { BGE_ASICREV_BCM5787, "unknown BCM5787/5787" }, { BGE_ASICREV_BCM5906, "unknown BCM5906" }, { 0, NULL } }; @@ -2423,8 +2423,7 @@ DELAY(1000); /* 27 usec is allegedly sufficent */ /* - * Save ASIC rev. Look up any quirks associated with this - * ASIC. + * Save ASIC rev. */ sc->bge_chipid = pci_conf_read(sc->sc_pc, sc->sc_pcitag, BGE_PCI_MISC_CTL) & @@ -2445,6 +2444,27 @@ BGE_PCISTATE_PCI_BUSMODE) == 0) sc->bge_flags |= BGE_PCIX; + if (sc->bge_chipid == BGE_CHIPID_BCM5701_A0 || + sc->bge_chipid == BGE_CHIPID_BCM5701_B0) + sc->bge_flags |= BGE_PHY_CRC_BUG; + if (BGE_CHIPREV(sc->bge_chipid) == BGE_CHIPREV_5703_AX || + BGE_CHIPREV(sc->bge_chipid) == BGE_CHIPREV_5704_AX) + sc->bge_flags |= BGE_PHY_ADC_BUG; + if (sc->bge_chipid == BGE_CHIPID_BCM5704_A0) + sc->bge_flags |= BGE_PHY_5704_A0_BUG; + + if (BGE_IS_5705_OR_BEYOND(sc)) { + if (BGE_ASICREV(sc->bge_chipid) == BGE_ASICREV_BCM5755 || + BGE_ASICREV(sc->bge_chipid) == BGE_ASICREV_BCM5787) { + if (PCI_PRODUCT(pa->pa_id) != PCI_PRODUCT_BROADCOM_BCM5722 && + PCI_PRODUCT(pa->pa_id) != PCI_PRODUCT_BROADCOM_BCM5756) + sc->bge_flags |= BGE_PHY_JITTER_BUG; + if (PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_BROADCOM_BCM5755M) + sc->bge_flags |= BGE_PHY_ADJUST_TRIM; + } else if (BGE_ASICREV(sc->bge_chipid) != BGE_ASICREV_BCM5906) + sc->bge_flags |= BGE_PHY_BER_BUG; + } + /* Try to reset the chip. */ DPRINTFN(5, ("bge_reset\n")); bge_reset(sc); @@ -2617,8 +2637,7 @@ ifmedia_add(&sc->bge_ifmedia, IFM_ETHER|IFM_AUTO, 0, NULL); ifmedia_set(&sc->bge_ifmedia, IFM_ETHER|IFM_AUTO); /* Pretend the user requested this setting */ - sc->bge_ifmedia.ifm_media = - sc->bge_ifmedia.ifm_cur->ifm_media; + sc->bge_ifmedia.ifm_media = sc->bge_ifmedia.ifm_cur->ifm_media; } else { /* * Do transceiver setup. @@ -2737,10 +2756,7 @@ BGE_PCIMISCCTL_INDIRECT_ACCESS|BGE_PCIMISCCTL_MASK_PCI_INTR| BGE_HIF_SWAP_OPTIONS|BGE_PCIMISCCTL_PCISTATE_RW); - /* - * Disable the firmware fastboot feature on 5752 ASIC - * to avoid firmware timeout. - */ + /* Disable fastboot on controllers that support it. */ if (BGE_ASICREV(sc->bge_chipid) == BGE_ASICREV_BCM5752 || BGE_ASICREV(sc->bge_chipid) == BGE_ASICREV_BCM5755 || BGE_ASICREV(sc->bge_chipid) == BGE_ASICREV_BCM5787) Index: src/sys/dev/pci/if_bgereg.h diff -u src/sys/dev/pci/if_bgereg.h:1.50 src/sys/dev/pci/if_bgereg.h:1.51 --- src/sys/dev/pci/if_bgereg.h:1.50 Thu Apr 16 01:38:34 2009 +++ src/sys/dev/pci/if_bgereg.h Sun Apr 19 11:10:36 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: if_bgereg.h,v 1.50 2009/04/16 01:38:34 msaitoh Exp $ */ +/* $NetBSD: if_bgereg.h,v 1.51 2009/04/19 11:10:36 msaitoh Exp $ */ /* * Copyright (c) 2001 Wind River Systems * Copyright (c) 1997, 1998, 1999, 2001 @@ -62,6 +62,11 @@ * Flat mode consumes so much host address space that it is not * recommended. */ + +#include <machine/bus.h> +#include <net/if_ether.h> +#include <dev/pci/pcivar.h> + #define BGE_PAGE_ZERO 0x00000000 #define BGE_PAGE_ZERO_END 0x000000FF #define BGE_SEND_RING_RCB 0x00000100 @@ -2466,6 +2471,12 @@ #define BGE_PCIE 0x00000040 #define BGE_PHY_FIBER_TBI 0x00000800 #define BGE_PHY_FIBER_MII 0x00001000 +#define BGE_PHY_CRC_BUG 0x00002000 +#define BGE_PHY_ADC_BUG 0x00004000 +#define BGE_PHY_5704_A0_BUG 0x00008000 +#define BGE_PHY_JITTER_BUG 0x00010000 +#define BGE_PHY_BER_BUG 0x00020000 +#define BGE_PHY_ADJUST_TRIM 0x00040000 #define BGE_IS_5788 0x00100000 struct bge_softc {