Mercurial > illumos > illumos-gate
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));