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

Reply via email to