Module Name: src Committed By: msaitoh Date: Tue Jun 17 21:37:20 UTC 2014
Modified Files: src/sys/dev/mii: brgphy.c brgphyreg.h src/sys/dev/pci: if_bge.c if_bnx.c if_bnxreg.h Log Message: - Fix detection of BGEPHYF_FIBER_{MII|TBI} - Add BCM5708S support in brgphy(4). The auto negotiation may have some bugs. - Add 2500SX support (not tested). - Fix bit definition of BRGPHY_MRBE_MSG_PG5_NP_T2 from FreeBSD. To generate a diff of this commit: cvs rdiff -u -r1.70 -r1.71 src/sys/dev/mii/brgphy.c cvs rdiff -u -r1.8 -r1.9 src/sys/dev/mii/brgphyreg.h cvs rdiff -u -r1.268 -r1.269 src/sys/dev/pci/if_bge.c cvs rdiff -u -r1.52 -r1.53 src/sys/dev/pci/if_bnx.c cvs rdiff -u -r1.14 -r1.15 src/sys/dev/pci/if_bnxreg.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.70 src/sys/dev/mii/brgphy.c:1.71 --- src/sys/dev/mii/brgphy.c:1.70 Mon Jun 16 16:48:16 2014 +++ src/sys/dev/mii/brgphy.c Tue Jun 17 21:37:20 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: brgphy.c,v 1.70 2014/06/16 16:48:16 msaitoh Exp $ */ +/* $NetBSD: brgphy.c,v 1.71 2014/06/17 21:37:20 msaitoh Exp $ */ /*- * Copyright (c) 1998, 1999, 2000, 2001 The NetBSD Foundation, Inc. @@ -62,7 +62,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: brgphy.c,v 1.70 2014/06/16 16:48:16 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: brgphy.c,v 1.71 2014/06/17 21:37:20 msaitoh Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -90,8 +90,10 @@ struct brgphy_softc { struct mii_softc sc_mii; bool sc_isbge; bool sc_isbnx; - uint32_t sc_chipid; /* parent's chipid */ - uint32_t sc_phyflags; /* parent's phyflags */ + uint32_t sc_chipid; /* parent's chipid */ + uint32_t sc_phyflags; /* parent's phyflags */ + uint32_t sc_shared_hwcfg; /* shared hw config */ + uint32_t sc_port_hwcfg; /* port specific hw config */ }; CFATTACH_DECL3_NEW(brgphy, sizeof(struct brgphy_softc), @@ -99,7 +101,10 @@ CFATTACH_DECL3_NEW(brgphy, sizeof(struct DVF_DETACH_SHUTDOWN); static int brgphy_service(struct mii_softc *, struct mii_data *, int); -static void brgphy_status(struct mii_softc *); +static void brgphy_copper_status(struct mii_softc *); +static void brgphy_fiber_status(struct mii_softc *); +static void brgphy_5708s_status(struct mii_softc *); +static void brgphy_5709s_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 *); @@ -116,8 +121,20 @@ static void brgphy_jumbo_settings(struct static void brgphy_eth_wirespeed(struct mii_softc *); -static const struct mii_phy_funcs brgphy_funcs = { - brgphy_service, brgphy_status, brgphy_reset, +static const struct mii_phy_funcs brgphy_copper_funcs = { + brgphy_service, brgphy_copper_status, brgphy_reset, +}; + +static const struct mii_phy_funcs brgphy_fiber_funcs = { + brgphy_service, brgphy_fiber_status, brgphy_reset, +}; + +static const struct mii_phy_funcs brgphy_5708s_funcs = { + brgphy_service, brgphy_5708s_status, brgphy_reset, +}; + +static const struct mii_phy_funcs brgphy_5709s_funcs = { + brgphy_service, brgphy_5709s_status, brgphy_reset, }; static const struct mii_phydesc brgphys[] = { @@ -178,6 +195,9 @@ static const struct mii_phydesc brgphys[ { MII_OUI_BROADCOM2, MII_MODEL_BROADCOM2_BCM5482, MII_STR_BROADCOM2_BCM5482 }, + { MII_OUI_BROADCOM2, MII_MODEL_BROADCOM2_BCM5708S, + MII_STR_BROADCOM2_BCM5708S }, + { MII_OUI_BROADCOM2, MII_MODEL_BROADCOM2_BCM5709C, MII_STR_BROADCOM2_BCM5709C }, @@ -264,7 +284,6 @@ brgphyattach(device_t parent, device_t s sc->mii_pdata = mii; sc->mii_flags = ma->mii_flags; sc->mii_anegticks = MII_ANEGTICKS; - sc->mii_funcs = &brgphy_funcs; if (device_is_a(parent, "bge")) bsc->sc_isbge = true; @@ -281,10 +300,29 @@ brgphyattach(device_t parent, device_t s aprint_error_dev(self, "failed to get chipid\n"); } + if (bsc->sc_isbnx) { + /* Currently, only bnx use sc_shared_hwcfg and sc_port_hwcfg */ + if (!prop_dictionary_get_uint32(dict, "shared_hwcfg", + &bsc->sc_shared_hwcfg)) + aprint_error_dev(self, "failed to get shared_hwcfg\n"); + if (!prop_dictionary_get_uint32(dict, "port_hwcfg", + &bsc->sc_port_hwcfg)) + aprint_error_dev(self, "failed to get port_hwcfg\n"); + } + + if (sc->mii_flags & MIIF_HAVEFIBER) { + if (_BNX_CHIP_NUM(bsc->sc_chipid) == BNX_CHIP_NUM_5708) + sc->mii_funcs = &brgphy_5708s_funcs; + else if (_BNX_CHIP_NUM(bsc->sc_chipid) == BNX_CHIP_NUM_5709) + sc->mii_funcs = &brgphy_5709s_funcs; + else + sc->mii_funcs = &brgphy_fiber_funcs; + } else + sc->mii_funcs = &brgphy_copper_funcs; + PHY_RESET(sc); - sc->mii_capabilities = - PHY_READ(sc, MII_BMSR) & ma->mii_capmask; + sc->mii_capabilities = PHY_READ(sc, MII_BMSR) & ma->mii_capmask; if (sc->mii_capabilities & BMSR_EXTSTAT) sc->mii_extcapabilities = PHY_READ(sc, MII_EXTSR); @@ -363,6 +401,10 @@ brgphy_service(struct mii_softc *sc, str case IFM_AUTO: (void) brgphy_mii_phy_auto(sc); break; + case IFM_2500_SX: + speed = BRGPHY_5708S_BMCR_2500; + goto setit; + case IFM_1000_SX: case IFM_1000_T: speed = BMCR_S1000; goto setit; @@ -383,7 +425,9 @@ setit: PHY_WRITE(sc, MII_ANAR, ANAR_CSMA); PHY_WRITE(sc, MII_BMCR, speed); - if (IFM_SUBTYPE(ife->ifm_media) != IFM_1000_T) + if ((IFM_SUBTYPE(ife->ifm_media) != IFM_1000_T) && + (IFM_SUBTYPE(ife->ifm_media) != IFM_1000_SX) && + (IFM_SUBTYPE(ife->ifm_media) != IFM_2500_SX)) break; PHY_WRITE(sc, MII_100T2CR, gig); @@ -492,7 +536,7 @@ setit: } static void -brgphy_status(struct mii_softc *sc) +brgphy_copper_status(struct mii_softc *sc) { struct mii_data *mii = sc->mii_pdata; struct ifmedia_entry *ife = mii->mii_media.ifm_cur; @@ -526,90 +570,233 @@ brgphy_status(struct mii_softc *sc) return; } - if ((sc->mii_mpd_oui == MII_OUI_BROADCOM2) - && (sc->mii_mpd_model == MII_MODEL_BROADCOM2_BCM5709S)) { - /* - * 5709S has its own general purpose status registers - */ - PHY_WRITE(sc, BRGPHY_BLOCK_ADDR, - BRGPHY_BLOCK_ADDR_GP_STATUS); + auxsts = PHY_READ(sc, BRGPHY_MII_AUXSTS); - auxsts = PHY_READ(sc, BRGPHY_GP_STATUS_TOP_ANEG_STATUS); + switch (auxsts & BRGPHY_AUXSTS_AN_RES) { + case BRGPHY_RES_1000FD: + mii->mii_media_active |= IFM_1000_T | IFM_FDX; + gtsr = PHY_READ(sc, MII_100T2SR); + if (gtsr & GTSR_MS_RES) + mii->mii_media_active |= IFM_ETH_MASTER; + break; - PHY_WRITE(sc, BRGPHY_BLOCK_ADDR, - BRGPHY_BLOCK_ADDR_COMBO_IEEE0); + case BRGPHY_RES_1000HD: + mii->mii_media_active |= IFM_1000_T | IFM_HDX; + gtsr = PHY_READ(sc, MII_100T2SR); + if (gtsr & GTSR_MS_RES) + mii->mii_media_active |= IFM_ETH_MASTER; + break; - switch (auxsts & BRGPHY_GP_STATUS_TOP_ANEG_SPEED_MASK) { - case BRGPHY_GP_STATUS_TOP_ANEG_SPEED_10: - mii->mii_media_active |= IFM_10_FL; - break; - case BRGPHY_GP_STATUS_TOP_ANEG_SPEED_100: - mii->mii_media_active |= IFM_100_FX; - break; - case BRGPHY_GP_STATUS_TOP_ANEG_SPEED_1G: - mii->mii_media_active |= IFM_1000_SX; - break; - case BRGPHY_GP_STATUS_TOP_ANEG_SPEED_25G: - mii->mii_media_active |= IFM_2500_SX; - break; - default: - mii->mii_media_active |= IFM_NONE; - mii->mii_media_status = 0; - break; - } + case BRGPHY_RES_100FD: + mii->mii_media_active |= IFM_100_TX | IFM_FDX; + break; - if (auxsts & BRGPHY_GP_STATUS_TOP_ANEG_FDX) - mii->mii_media_active |= IFM_FDX; - else - mii->mii_media_active |= IFM_HDX; + case BRGPHY_RES_100T4: + mii->mii_media_active |= IFM_100_T4 | IFM_HDX; + break; - } else { - auxsts = PHY_READ(sc, BRGPHY_MII_AUXSTS); + case BRGPHY_RES_100HD: + mii->mii_media_active |= IFM_100_TX | IFM_HDX; + break; - switch (auxsts & BRGPHY_AUXSTS_AN_RES) { - case BRGPHY_RES_1000FD: - mii->mii_media_active |= IFM_1000_T | IFM_FDX; - gtsr = PHY_READ(sc, MII_100T2SR); - if (gtsr & GTSR_MS_RES) - mii->mii_media_active |= IFM_ETH_MASTER; - break; + case BRGPHY_RES_10FD: + mii->mii_media_active |= IFM_10_T | IFM_FDX; + break; - case BRGPHY_RES_1000HD: - mii->mii_media_active |= IFM_1000_T | IFM_HDX; - gtsr = PHY_READ(sc, MII_100T2SR); - if (gtsr & GTSR_MS_RES) - mii->mii_media_active |= IFM_ETH_MASTER; - break; + case BRGPHY_RES_10HD: + mii->mii_media_active |= IFM_10_T | IFM_HDX; + break; - case BRGPHY_RES_100FD: - mii->mii_media_active |= IFM_100_TX | IFM_FDX; - break; + default: + mii->mii_media_active |= IFM_NONE; + mii->mii_media_status = 0; + } - case BRGPHY_RES_100T4: - mii->mii_media_active |= IFM_100_T4 | IFM_HDX; - break; + if (mii->mii_media_active & IFM_FDX) + mii->mii_media_active |= mii_phy_flowstatus(sc); - case BRGPHY_RES_100HD: - mii->mii_media_active |= IFM_100_TX | IFM_HDX; - break; + } else + mii->mii_media_active = ife->ifm_media; +} - case BRGPHY_RES_10FD: - mii->mii_media_active |= IFM_10_T | IFM_FDX; - break; +void +brgphy_fiber_status(struct mii_softc *sc) +{ + struct mii_data *mii = sc->mii_pdata; + struct ifmedia_entry *ife = mii->mii_media.ifm_cur; + int bmcr, bmsr; - case BRGPHY_RES_10HD: - mii->mii_media_active |= IFM_10_T | IFM_HDX; - break; + mii->mii_media_status = IFM_AVALID; + mii->mii_media_active = IFM_ETHER; + + bmsr = PHY_READ(sc, MII_BMSR) | PHY_READ(sc, MII_BMSR); + if (bmsr & BMSR_LINK) + mii->mii_media_status |= IFM_ACTIVE; + + bmcr = PHY_READ(sc, MII_BMCR); + if (bmcr & BMCR_LOOP) + mii->mii_media_active |= IFM_LOOP; + + if (bmcr & BMCR_AUTOEN) { + int val; + + if ((bmsr & BMSR_ACOMP) == 0) { + /* Erg, still trying, I guess... */ + mii->mii_media_active |= IFM_NONE; + return; + } + + mii->mii_media_active |= IFM_1000_SX; + + val = PHY_READ(sc, MII_ANAR) & + PHY_READ(sc, MII_ANLPAR); + + if (val & ANAR_X_FD) + mii->mii_media_active |= IFM_FDX; + else + mii->mii_media_active |= IFM_HDX; + + if (mii->mii_media_active & IFM_FDX) + mii->mii_media_active |= mii_phy_flowstatus(sc); + } else + mii->mii_media_active = ife->ifm_media; +} - default: +void +brgphy_5708s_status(struct mii_softc *sc) +{ + struct mii_data *mii = sc->mii_pdata; + struct ifmedia_entry *ife = mii->mii_media.ifm_cur; + int bmcr, bmsr; + + mii->mii_media_status = IFM_AVALID; + mii->mii_media_active = IFM_ETHER; + + bmsr = PHY_READ(sc, MII_BMSR) | PHY_READ(sc, MII_BMSR); + if (bmsr & BMSR_LINK) + mii->mii_media_status |= IFM_ACTIVE; + + bmcr = PHY_READ(sc, MII_BMCR); + if (bmcr & BMCR_LOOP) + mii->mii_media_active |= IFM_LOOP; + + if (bmcr & BMCR_AUTOEN) { + int xstat; + + if ((bmsr & BMSR_ACOMP) == 0) { + PHY_WRITE(sc, BRGPHY_5708S_BLOCK_ADDR, + BRGPHY_5708S_DIG_PG0); + xstat = PHY_READ(sc, BRGPHY_5708S_PG0_1000X_STAT1); + if ((xstat & BRGPHY_5708S_PG0_1000X_STAT1_LINK) == 0) { + /* Erg, still trying, I guess... */ mii->mii_media_active |= IFM_NONE; - mii->mii_media_status = 0; + return; } } + PHY_WRITE(sc, BRGPHY_5708S_BLOCK_ADDR, + BRGPHY_5708S_DIG_PG0); + xstat = PHY_READ(sc, BRGPHY_5708S_PG0_1000X_STAT1); + + switch (xstat & BRGPHY_5708S_PG0_1000X_STAT1_SPEED_MASK) { + case BRGPHY_5708S_PG0_1000X_STAT1_SPEED_10: + mii->mii_media_active |= IFM_10_FL; + break; + case BRGPHY_5708S_PG0_1000X_STAT1_SPEED_100: + mii->mii_media_active |= IFM_100_FX; + break; + case BRGPHY_5708S_PG0_1000X_STAT1_SPEED_1G: + mii->mii_media_active |= IFM_1000_SX; + break; + case BRGPHY_5708S_PG0_1000X_STAT1_SPEED_25G: + mii->mii_media_active |= IFM_2500_SX; + break; + } + + if (xstat & BRGPHY_5708S_PG0_1000X_STAT1_FDX) + mii->mii_media_active |= IFM_FDX; + else + mii->mii_media_active |= IFM_HDX; + + if (mii->mii_media_active & IFM_FDX) { + if (xstat & BRGPHY_5708S_PG0_1000X_STAT1_TX_PAUSE) + mii->mii_media_active |= IFM_FLOW | IFM_ETH_TXPAUSE; + if (xstat & BRGPHY_5708S_PG0_1000X_STAT1_RX_PAUSE) + mii->mii_media_active |= IFM_FLOW | IFM_ETH_RXPAUSE; + } + } else + mii->mii_media_active = ife->ifm_media; +} + +static void +brgphy_5709s_status(struct mii_softc *sc) +{ + struct mii_data *mii = sc->mii_pdata; + struct ifmedia_entry *ife = mii->mii_media.ifm_cur; + int bmcr, bmsr, auxsts; + + mii->mii_media_status = IFM_AVALID; + mii->mii_media_active = IFM_ETHER; + + bmsr = PHY_READ(sc, MII_BMSR) | PHY_READ(sc, MII_BMSR); + if (bmsr & BMSR_LINK) + mii->mii_media_status |= IFM_ACTIVE; + + bmcr = PHY_READ(sc, MII_BMCR); + if (bmcr & BMCR_ISO) { + mii->mii_media_active |= IFM_NONE; + mii->mii_media_status = 0; + return; + } + + if (bmcr & BMCR_LOOP) + mii->mii_media_active |= IFM_LOOP; + + if (bmcr & BMCR_AUTOEN) { + /* + * The media status bits are only valid of autonegotiation + * has completed (or it's disabled). + */ + if ((bmsr & BMSR_ACOMP) == 0) { + /* Erg, still trying, I guess... */ + mii->mii_media_active |= IFM_NONE; + return; + } + + /* 5709S has its own general purpose status registers */ + PHY_WRITE(sc, BRGPHY_BLOCK_ADDR, + BRGPHY_BLOCK_ADDR_GP_STATUS); + auxsts = PHY_READ(sc, BRGPHY_GP_STATUS_TOP_ANEG_STATUS); + + PHY_WRITE(sc, BRGPHY_BLOCK_ADDR, + BRGPHY_BLOCK_ADDR_COMBO_IEEE0); + + switch (auxsts & BRGPHY_GP_STATUS_TOP_ANEG_SPEED_MASK) { + case BRGPHY_GP_STATUS_TOP_ANEG_SPEED_10: + mii->mii_media_active |= IFM_10_FL; + break; + case BRGPHY_GP_STATUS_TOP_ANEG_SPEED_100: + mii->mii_media_active |= IFM_100_FX; + break; + case BRGPHY_GP_STATUS_TOP_ANEG_SPEED_1G: + mii->mii_media_active |= IFM_1000_SX; + break; + case BRGPHY_GP_STATUS_TOP_ANEG_SPEED_25G: + mii->mii_media_active |= IFM_2500_SX; + break; + default: + mii->mii_media_active |= IFM_NONE; + mii->mii_media_status = 0; + break; + } + + if (auxsts & BRGPHY_GP_STATUS_TOP_ANEG_FDX) + mii->mii_media_active |= IFM_FDX; + else + mii->mii_media_active |= IFM_HDX; + if (mii->mii_media_active & IFM_FDX) mii->mii_media_active |= mii_phy_flowstatus(sc); - } else mii->mii_media_active = ife->ifm_media; } @@ -623,14 +810,6 @@ brgphy_mii_phy_auto(struct mii_softc *sc brgphy_loop(sc); PHY_RESET(sc); - ktcr = GTCR_ADV_1000TFDX | GTCR_ADV_1000THDX; - if ((sc->mii_mpd_oui == MII_OUI_BROADCOM) - && (sc->mii_mpd_model == MII_MODEL_BROADCOM_BCM5701)) - ktcr |= GTCR_MAN_MS | GTCR_ADV_MS; - PHY_WRITE(sc, MII_100T2CR, ktcr); - ktcr = PHY_READ(sc, MII_100T2CR); - DELAY(1000); - if (sc->mii_flags & MIIF_HAVEFIBER) { anar = ANAR_X_FD | ANAR_X_HD; if (sc->mii_flags & MIIF_DOPAUSE) @@ -639,6 +818,13 @@ brgphy_mii_phy_auto(struct mii_softc *sc anar = BMSR_MEDIA_TO_ANAR(sc->mii_capabilities) | ANAR_CSMA; if (sc->mii_flags & MIIF_DOPAUSE) anar |= ANAR_FC | ANAR_PAUSE_ASYM; + ktcr = GTCR_ADV_1000TFDX | GTCR_ADV_1000THDX; + if ((sc->mii_mpd_oui == MII_OUI_BROADCOM) + && (sc->mii_mpd_model == MII_MODEL_BROADCOM_BCM5701)) + ktcr |= GTCR_MAN_MS | GTCR_ADV_MS; + PHY_WRITE(sc, MII_100T2CR, ktcr); + ktcr = PHY_READ(sc, MII_100T2CR); + DELAY(1000); } PHY_WRITE(sc, MII_ANAR, anar); DELAY(1000); @@ -760,7 +946,6 @@ brgphy_reset(struct mii_softc *sc) } /* Handle any bnx (NetXtreme II) workarounds. */ } else if (bsc->sc_isbnx) { -#if 0 /* not yet */ if ((sc->mii_mpd_oui == MII_OUI_BROADCOM2) && sc->mii_mpd_model == MII_MODEL_BROADCOM2_BCM5708S) { /* Store autoneg capabilities/results in digital block (Page 0) */ @@ -781,15 +966,15 @@ brgphy_reset(struct mii_softc *sc) 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) + if (bsc->sc_phyflags & 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)) { + if ((_BNX_CHIP_ID(bsc->sc_chipid) == BNX_CHIP_ID_5708_A0) || + (_BNX_CHIP_ID(bsc->sc_chipid) == BNX_CHIP_ID_5708_B0) || + (_BNX_CHIP_ID(bsc->sc_chipid) == BNX_CHIP_ID_5708_B1)) { PHY_WRITE(sc, BRGPHY_5708S_BLOCK_ADDR, BRGPHY_5708S_TX_MISC_PG5); PHY_WRITE(sc, BRGPHY_5708S_PG5_TXACTL1, @@ -800,19 +985,17 @@ brgphy_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)) { + if ((bsc->sc_shared_hwcfg & BNX_SHARED_HW_CFG_PHY_BACKPLANE) && + (bsc->sc_port_hwcfg & 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 & + bsc->sc_port_hwcfg & BNX_PORT_HW_CFG_CFG_TXCTL3_MASK); PHY_WRITE(sc, BRGPHY_5708S_BLOCK_ADDR, BRGPHY_5708S_DIG_PG0); } - } else -#endif - if ((sc->mii_mpd_oui == MII_OUI_BROADCOM2) + } else if ((sc->mii_mpd_oui == MII_OUI_BROADCOM2) && (sc->mii_mpd_model == MII_MODEL_BROADCOM2_BCM5709S)) { /* Select the SerDes Digital block of the AN MMD. */ PHY_WRITE(sc, BRGPHY_BLOCK_ADDR, Index: src/sys/dev/mii/brgphyreg.h diff -u src/sys/dev/mii/brgphyreg.h:1.8 src/sys/dev/mii/brgphyreg.h:1.9 --- src/sys/dev/mii/brgphyreg.h:1.8 Mon Jun 16 14:43:22 2014 +++ src/sys/dev/mii/brgphyreg.h Tue Jun 17 21:37:20 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: brgphyreg.h,v 1.8 2014/06/16 14:43:22 msaitoh Exp $ */ +/* $NetBSD: brgphyreg.h,v 1.9 2014/06/17 21:37:20 msaitoh Exp $ */ /* * Copyright (c) 2000 @@ -244,6 +244,9 @@ #define BRGPHY_5708S_PG0_1000X_CTL1_FIBER_MODE 0x0001 #define BRGPHY_5708S_PG0_1000X_CTL1_AUTODET_EN 0x0010 +#define BRGPHY_5708S_PG0_1000X_CTL2 0x11 +#define BRGPHY_5708S_PG0_1000X_CTL2_PAR_DET_EN 0x0001 + #define BRGPHY_5708S_PG0_1000X_STAT1 0x14 #define BRGPHY_5708S_PG0_1000X_STAT1_SGMII 0x0001 #define BRGPHY_5708S_PG0_1000X_STAT1_LINK 0x0002 @@ -253,9 +256,8 @@ #define BRGPHY_5708S_PG0_1000X_STAT1_SPEED_100 (0x1 << 3) #define BRGPHY_5708S_PG0_1000X_STAT1_SPEED_1G (0x2 << 3) #define BRGPHY_5708S_PG0_1000X_STAT1_SPEED_25G (0x3 << 3) - -#define BRGPHY_5708S_PG0_1000X_CTL2 0x11 -#define BRGPHY_5708S_PG0_1000X_CTL2_PAR_DET_EN 0x0001 +#define BRGPHY_5708S_PG0_1000X_STAT1_TX_PAUSE 0x0020 +#define BRGPHY_5708S_PG0_1000X_STAT1_RX_PAUSE 0x0040 /* 5708S SerDes "Digital 3" Registers (page 2) */ #define BRGPHY_5708S_PG2_DIGCTL_3_0 0x10 @@ -304,7 +306,7 @@ #define BRGPHY_BLOCK_ADDR_MRBE 0x8350 #define BRGPHY_MRBE_MSG_PG5_NP 0x10 #define BRGPHY_MRBE_MSG_PG5_NP_MBRE 0x0001 -#define BRGPHY_MRBE_MSG_PG5_NP_T2 0x0001 +#define BRGPHY_MRBE_MSG_PG5_NP_T2 0x0002 /* 5709S SerDes "IEEE Clause 73 User B0" Registers */ #define BRGPHY_BLOCK_ADDR_CL73_USER_B0 0x8370 Index: src/sys/dev/pci/if_bge.c diff -u src/sys/dev/pci/if_bge.c:1.268 src/sys/dev/pci/if_bge.c:1.269 --- src/sys/dev/pci/if_bge.c:1.268 Tue Jun 17 18:18:51 2014 +++ src/sys/dev/pci/if_bge.c Tue Jun 17 21:37:20 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: if_bge.c,v 1.268 2014/06/17 18:18:51 msaitoh Exp $ */ +/* $NetBSD: if_bge.c,v 1.269 2014/06/17 21:37:20 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.268 2014/06/17 18:18:51 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_bge.c,v 1.269 2014/06/17 21:37:20 msaitoh Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -3304,6 +3304,7 @@ bge_attach(device_t parent, device_t sel uint32_t pm_ctl; bool no_seeprom; int capmask; + int mii_flags; char intrbuf[PCI_INTRSTR_LEN]; bp = bge_lookup(pa); @@ -3864,7 +3865,7 @@ bge_attach(device_t parent, device_t sel */ if (PCI_PRODUCT(pa->pa_id) == SK_SUBSYSID_9D41 || (hwcfg & BGE_HWCFG_MEDIA) == BGE_MEDIA_FIBER) { - if (BGE_IS_5714_FAMILY(sc)) + if (BGE_IS_5705_PLUS(sc)) sc->bge_flags |= BGEF_FIBER_MII; else sc->bge_flags |= BGEF_FIBER_TBI; @@ -3902,9 +3903,11 @@ bge_attach(device_t parent, device_t sel ifmedia_init(&sc->bge_mii.mii_media, 0, bge_ifmedia_upd, bge_ifmedia_sts); - mii_attach(sc->bge_dev, &sc->bge_mii, capmask, - sc->bge_phy_addr, MII_OFFSET_ANY, - MIIF_DOPAUSE); + mii_flags = MIIF_DOPAUSE; + if (sc->bge_flags & BGEF_FIBER_MII) + mii_flags |= MIIF_HAVEFIBER; + mii_attach(sc->bge_dev, &sc->bge_mii, capmask, sc->bge_phy_addr, + MII_OFFSET_ANY, mii_flags); if (LIST_EMPTY(&sc->bge_mii.mii_phys)) { aprint_error_dev(sc->bge_dev, "no PHY found!\n"); Index: src/sys/dev/pci/if_bnx.c diff -u src/sys/dev/pci/if_bnx.c:1.52 src/sys/dev/pci/if_bnx.c:1.53 --- src/sys/dev/pci/if_bnx.c:1.52 Thu Jun 12 12:09:47 2014 +++ src/sys/dev/pci/if_bnx.c Tue Jun 17 21:37:20 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: if_bnx.c,v 1.52 2014/06/12 12:09:47 msaitoh Exp $ */ +/* $NetBSD: if_bnx.c,v 1.53 2014/06/17 21:37:20 msaitoh Exp $ */ /* $OpenBSD: if_bnx.c,v 1.85 2009/11/09 14:32:41 dlg Exp $ */ /*- @@ -35,7 +35,7 @@ #if 0 __FBSDID("$FreeBSD: src/sys/dev/bce/if_bce.c,v 1.3 2006/04/13 14:12:26 ru Exp $"); #endif -__KERNEL_RCSID(0, "$NetBSD: if_bnx.c,v 1.52 2014/06/12 12:09:47 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_bnx.c,v 1.53 2014/06/17 21:37:20 msaitoh Exp $"); /* * The following controllers are supported by this driver: @@ -729,6 +729,8 @@ bnx_attach(device_t parent, device_t sel dict = device_properties(self); prop_dictionary_set_uint32(dict, "phyflags", sc->bnx_phy_flags); prop_dictionary_set_uint32(dict, "chipid", sc->bnx_chipid); + prop_dictionary_set_uint32(dict, "shared_hwcfg",sc->bnx_shared_hw_cfg); + prop_dictionary_set_uint32(dict, "port_hwcfg", sc->bnx_port_hw_cfg); if (sc->bnx_phy_flags & BNX_PHY_SERDES_FLAG) mii_flags |= MIIF_HAVEFIBER; Index: src/sys/dev/pci/if_bnxreg.h diff -u src/sys/dev/pci/if_bnxreg.h:1.14 src/sys/dev/pci/if_bnxreg.h:1.15 --- src/sys/dev/pci/if_bnxreg.h:1.14 Mon May 2 09:03:10 2011 +++ src/sys/dev/pci/if_bnxreg.h Tue Jun 17 21:37:20 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: if_bnxreg.h,v 1.14 2011/05/02 09:03:10 jym Exp $ */ +/* $NetBSD: if_bnxreg.h,v 1.15 2014/06/17 21:37:20 msaitoh Exp $ */ /* $OpenBSD: if_bnxreg.h,v 1.33 2009/09/05 16:02:28 claudio Exp $ */ /*- @@ -210,7 +210,8 @@ #define BNX_CHIP_METAL(sc) (((sc)->bnx_chipid) & 0x00000ff0) #define BNX_CHIP_BOND(bp) (((sc)->bnx_chipid) & 0x0000000f) -#define BNX_CHIP_ID(sc) (((sc)->bnx_chipid) & 0xfffffff0) +#define _BNX_CHIP_ID(chipid) ((chipid) & 0xfffffff0) +#define BNX_CHIP_ID(sc) _BNX_CHIP_ID((sc)->bnx_chipid) #define BNX_CHIP_ID_5706_A0 0x57060000 #define BNX_CHIP_ID_5706_A1 0x57060010