changeset 10162:4045f7015dca

6772728 ping with big size packets failed on bge interface after enable the jumbo
author yong tan - Sun Microsystems - Beijing China <Yong.Tan@Sun.COM>
date Thu, 23 Jul 2009 10:37:40 +0800
parents 097dd4cf1d5c
children 18b45b82bc9b
files usr/src/uts/common/io/bge/bge_chip2.c usr/src/uts/common/io/bge/bge_impl.h usr/src/uts/common/io/bge/bge_main2.c usr/src/uts/common/io/bge/bge_mii.c
diffstat 4 files changed, 25 insertions(+), 16 deletions(-) [+]
line wrap: on
line diff
--- a/usr/src/uts/common/io/bge/bge_chip2.c	Thu Jul 23 10:26:32 2009 +0800
+++ b/usr/src/uts/common/io/bge/bge_chip2.c	Thu Jul 23 10:37:40 2009 +0800
@@ -149,8 +149,6 @@
 
 static uint32_t bge_stop_start_on_sync	= 0;
 
-boolean_t bge_jumbo_enable		= B_TRUE;
-
 /*
  * bge_intr_max_loop controls the maximum loop number within bge_intr.
  * When loading NIC with heavy network traffic, it is useful.
@@ -2356,8 +2354,7 @@
 	 * std buffer size should be set to BGE_JUMBO_BUFF_SIZE when jumbo
 	 * feature is enabled.
 	 */
-	if (bge_jumbo_enable &&
-	    !(cidp->flags & CHIP_FLAG_NO_JUMBO) &&
+	if (!(cidp->flags & CHIP_FLAG_NO_JUMBO) &&
 	    (cidp->default_mtu > BGE_DEFAULT_MTU) &&
 	    (cidp->default_mtu <= BGE_MAXIMUM_MTU)) {
 		if (DEVICE_5714_SERIES_CHIPSETS(bgep)) {
--- a/usr/src/uts/common/io/bge/bge_impl.h	Thu Jul 23 10:26:32 2009 +0800
+++ b/usr/src/uts/common/io/bge/bge_impl.h	Thu Jul 23 10:37:40 2009 +0800
@@ -1188,7 +1188,6 @@
 extern uint32_t bge_tx_ticks_norm;
 extern uint32_t bge_rx_count_norm;
 extern uint32_t bge_tx_count_norm;
-extern boolean_t bge_jumbo_enable;
 extern boolean_t bge_relaxed_ordering;
 
 void   bge_chip_msi_trig(bge_t *bgep);
--- a/usr/src/uts/common/io/bge/bge_main2.c	Thu Jul 23 10:26:32 2009 +0800
+++ b/usr/src/uts/common/io/bge/bge_main2.c	Thu Jul 23 10:37:40 2009 +0800
@@ -37,7 +37,7 @@
 /*
  * Make sure you keep the version ID up to date!
  */
-static char bge_version[] = "Broadcom Gb Ethernet v1.08";
+static char bge_version[] = "Broadcom Gb Ethernet v1.09";
 
 /*
  * Property names
@@ -1101,7 +1101,7 @@
 			range.mpr_type = MAC_PROPVAL_UINT32;
 			range.range_uint32[0].mpur_min =
 			    range.range_uint32[0].mpur_max = BGE_DEFAULT_MTU;
-			if (bge_jumbo_enable && !(flags & CHIP_FLAG_NO_JUMBO))
+			if (!(flags & CHIP_FLAG_NO_JUMBO))
 				range.range_uint32[0].mpur_max =
 				    BGE_MAXIMUM_MTU;
 			bcopy(&range, pr_val, sizeof (range));
@@ -3293,14 +3293,6 @@
 	cidp->tx_rings = ddi_prop_get_int(DDI_DEV_T_ANY, devinfo,
 	    DDI_PROP_DONTPASS, txrings_propname, cidp->tx_rings);
 
-	if (bge_jumbo_enable == B_TRUE) {
-		cidp->default_mtu = ddi_prop_get_int(DDI_DEV_T_ANY, devinfo,
-		    DDI_PROP_DONTPASS, default_mtu, BGE_DEFAULT_MTU);
-		if ((cidp->default_mtu < BGE_DEFAULT_MTU)||
-		    (cidp->default_mtu > BGE_MAXIMUM_MTU)) {
-			cidp->default_mtu = BGE_DEFAULT_MTU;
-		}
-	}
 	/*
 	 * Map operating registers
 	 */
@@ -3322,6 +3314,13 @@
 		goto attach_fail;
 	}
 
+	cidp->default_mtu = ddi_prop_get_int(DDI_DEV_T_ANY, devinfo,
+	    DDI_PROP_DONTPASS, default_mtu, BGE_DEFAULT_MTU);
+	if ((cidp->flags & CHIP_FLAG_NO_JUMBO) ||
+	    (cidp->default_mtu < BGE_DEFAULT_MTU) ||
+	    (cidp->default_mtu > BGE_MAXIMUM_MTU)) {
+		cidp->default_mtu = BGE_DEFAULT_MTU;
+	}
 
 	err = bge_alloc_bufs(bgep);
 	if (err != DDI_SUCCESS) {
--- a/usr/src/uts/common/io/bge/bge_mii.c	Thu Jul 23 10:26:32 2009 +0800
+++ b/usr/src/uts/common/io/bge/bge_mii.c	Thu Jul 23 10:37:40 2009 +0800
@@ -531,6 +531,7 @@
 {
 	uint16_t phy_status;
 	boolean_t reset_ok;
+	uint16_t extctrl, auxctrl;
 
 	BGE_TRACE(("bge_restart_copper($%p, %d)", (void *)bgep, powerdown));
 
@@ -590,6 +591,18 @@
 		break;
 	}
 
+	if (bgep->chipid.default_mtu > BGE_DEFAULT_MTU) {
+		/* Set the GMII Fifo Elasticity to high latency */
+		extctrl = bge_mii_get16(bgep, 0x10);
+		bge_mii_put16(bgep, 0x10, extctrl | 0x1);
+
+		/* Allow reception of extended length packets */
+		bge_mii_put16(bgep, MII_AUX_CONTROL, 0x0007);
+		auxctrl = bge_mii_get16(bgep, MII_AUX_CONTROL);
+		auxctrl |= 0x4000;
+		bge_mii_put16(bgep, MII_AUX_CONTROL, auxctrl);
+	}
+
 	/*
 	 * Step 7: read the MII_INTR_STATUS register twice,
 	 * in order to clear any sticky bits (but they should
@@ -812,7 +825,8 @@
 		return (DDI_FAILURE);
 	bge_mii_put16(bgep, MII_AN_ADVERT, anar);
 	bge_mii_put16(bgep, MII_CONTROL, control);
-	bge_mii_put16(bgep, MII_AUX_CONTROL, auxctrl);
+	if (auxctrl & MII_AUX_CTRL_NORM_EXT_LOOPBACK)
+		bge_mii_put16(bgep, MII_AUX_CONTROL, auxctrl);
 	bge_mii_put16(bgep, MII_MSCONTROL, gigctrl);
 
 	BGE_DEBUG(("bge_update_copper: anar <- 0x%x", anar));