summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--usr/src/pkgdefs/SUNWbge/postinstall1
-rw-r--r--usr/src/uts/common/io/bge/bge.conf4
-rw-r--r--usr/src/uts/common/io/bge/bge_chip2.c44
-rw-r--r--usr/src/uts/common/io/bge/bge_hw.h3
-rw-r--r--usr/src/uts/common/io/bge/bge_impl.h5
-rw-r--r--usr/src/uts/common/io/bge/bge_kstats.c71
-rw-r--r--usr/src/uts/common/io/bge/bge_main2.c7
-rw-r--r--usr/src/uts/common/io/bge/bge_ndd.c4
8 files changed, 105 insertions, 34 deletions
diff --git a/usr/src/pkgdefs/SUNWbge/postinstall b/usr/src/pkgdefs/SUNWbge/postinstall
index 4409b22319..60981ead43 100644
--- a/usr/src/pkgdefs/SUNWbge/postinstall
+++ b/usr/src/pkgdefs/SUNWbge/postinstall
@@ -161,6 +161,7 @@ then
"pciex14e4,1677"
"pci14e4,1678"
"pci14e4,1679"
+ "pciex14e4,1673"
"pciex14e4,167a"
"pciex14e4,167b"
"pci14e4,167d"
diff --git a/usr/src/uts/common/io/bge/bge.conf b/usr/src/uts/common/io/bge/bge.conf
index adcf60a8cf..efe66bcfc1 100644
--- a/usr/src/uts/common/io/bge/bge.conf
+++ b/usr/src/uts/common/io/bge/bge.conf
@@ -20,7 +20,7 @@
#
#########################################################################
#
-# Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
#ident "%Z%%M% %I% %E% SMI"
@@ -105,7 +105,7 @@
# adv_10fdx_cap = 1;
# adv_10hdx_cap = 1;
# adv_asym_pause_cap = 0;
-# adv_pause_cap = 1;
+# adv_pause_cap = 0;
#
# All of these parameters can can also be queried and modified at run-time
# by use of the ndd(1m) command.
diff --git a/usr/src/uts/common/io/bge/bge_chip2.c b/usr/src/uts/common/io/bge/bge_chip2.c
index 8b104ea9e0..51c5cc3cab 100644
--- a/usr/src/uts/common/io/bge/bge_chip2.c
+++ b/usr/src/uts/common/io/bge/bge_chip2.c
@@ -799,6 +799,28 @@ bge_mbx_put(bge_t *bgep, bge_regno_t regno, uint64_t data)
BGE_PCICHK(bgep);
}
+uint32_t bge_mbx_get(bge_t *bgep, bge_regno_t regno);
+#pragma inline(bge_mbx_get)
+
+uint32_t
+bge_mbx_get(bge_t *bgep, bge_regno_t regno)
+{
+ uint32_t val32;
+
+ BGE_TRACE(("bge_mbx_get($%p, 0x%lx)",
+ (void *)bgep, regno));
+
+#ifdef _BIG_ENDIAN
+ val32 = ddi_get32(bgep->io_handle, PIO_ADDR(bgep, regno+4));
+#else
+ val32 = ddi_get32(bgep->io_handle, PIO_ADDR(bgep, regno));
+#endif /* _BIG_ENDIAN */
+ BGE_PCICHK(bgep);
+
+ return (val32);
+}
+
+
#if BGE_DEBUGGING
void bge_led_mark(bge_t *bgep);
@@ -1857,6 +1879,7 @@ bge_nvmem_id(bge_t *bgep)
case DEVICE_ID_5752M:
case DEVICE_ID_5754:
case DEVICE_ID_5755:
+ case DEVICE_ID_5755M:
case DEVICE_ID_5721:
case DEVICE_ID_5714C:
case DEVICE_ID_5714S:
@@ -2061,6 +2084,7 @@ bge_chip_id_init(bge_t *bgep)
break;
case DEVICE_ID_5755:
+ case DEVICE_ID_5755M:
cidp->chip_label = 5755;
cidp->pci_type = BGE_PCI_E;
cidp->mbuf_lo_water_rdma = RDMA_MBUF_LOWAT_5705;
@@ -2788,6 +2812,9 @@ bge_chip_sync(bge_t *bgep)
* Reprogram the hashed multicast address table ...
*/
for (i = 0; i < BGE_HASH_TABLE_SIZE/32; ++i)
+ bge_reg_put32(bgep, MAC_HASH_REG(i), 0);
+
+ for (i = 0; i < BGE_HASH_TABLE_SIZE/32; ++i)
bge_reg_put32(bgep, MAC_HASH_REG(i),
bgep->mcast_hash[i] | fill);
@@ -4069,6 +4096,8 @@ bge_intr(caddr_t arg1, caddr_t arg2)
*/
bge_mbx_put(bgep, INTERRUPT_MBOX_0_REG,
INTERRUPT_MBOX_ENABLE(flags));
+ if (bgep->chipid.pci_type == BGE_PCI_E)
+ (void) bge_mbx_get(bgep, INTERRUPT_MBOX_0_REG);
bgep->missed_dmas = 0;
}
@@ -4504,8 +4533,17 @@ bge_chip_factotum(caddr_t arg)
* If the link state changed, tell the world about it.
* Note: can't do this while still holding the mutex.
*/
- if (linkchg)
+ if (bgep->link_update_timer == BGE_LINK_UPDATE_TIMEOUT &&
+ bgep->link_state != LINK_STATE_UNKNOWN)
+ linkchg = B_TRUE;
+ else if (bgep->link_update_timer < BGE_LINK_UPDATE_TIMEOUT &&
+ bgep->link_state == LINK_STATE_DOWN)
+ linkchg = B_FALSE;
+
+ if (linkchg) {
mac_link_update(bgep->mh, bgep->link_state);
+ bgep->link_update_timer = BGE_LINK_UPDATE_DONE;
+ }
if (bgep->manual_reset) {
bgep->manual_reset = B_FALSE;
}
@@ -4539,6 +4577,10 @@ bge_chip_cyclic(void *arg)
if (bge_check_acc_handle(bgep, bgep->io_handle) != DDI_FM_OK)
ddi_fm_service_impact(bgep->devinfo,
DDI_SERVICE_UNAFFECTED);
+
+ if (bgep->link_update_timer < BGE_LINK_UPDATE_TIMEOUT)
+ bgep->link_update_timer++;
+
break;
case BGE_CHIP_FAULT:
diff --git a/usr/src/uts/common/io/bge/bge_hw.h b/usr/src/uts/common/io/bge/bge_hw.h
index 8a5186fdc1..457b9826ce 100644
--- a/usr/src/uts/common/io/bge/bge_hw.h
+++ b/usr/src/uts/common/io/bge/bge_hw.h
@@ -20,7 +20,7 @@
*/
/*
- * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -80,6 +80,7 @@ extern "C" {
#define DEVICE_ID_5753 0x16fd
#define DEVICE_ID_5754 0x167a
#define DEVICE_ID_5755 0x167b
+#define DEVICE_ID_5755M 0x1673
#define DEVICE_ID_5721 0x1659
#define DEVICE_ID_5714C 0x1668
#define DEVICE_ID_5714S 0x1669
diff --git a/usr/src/uts/common/io/bge/bge_impl.h b/usr/src/uts/common/io/bge/bge_impl.h
index f801f7f305..53cf329e12 100644
--- a/usr/src/uts/common/io/bge/bge_impl.h
+++ b/usr/src/uts/common/io/bge/bge_impl.h
@@ -934,6 +934,8 @@ typedef struct bge {
uint64_t param_link_speed;
link_duplex_t param_link_duplex;
+
+ uint32_t link_update_timer;
} bge_t;
/*
@@ -1252,6 +1254,9 @@ uint32_t bge_atomic_shl32(uint32_t *sp, uint_t count);
#define BGE_ASF_HEARTBEAT_INTERVAL 1500000
+#define BGE_LINK_UPDATE_TIMEOUT 10 /* ~ 5 sec */
+#define BGE_LINK_UPDATE_DONE (BGE_LINK_UPDATE_TIMEOUT+1)
+
#ifdef __cplusplus
}
#endif
diff --git a/usr/src/uts/common/io/bge/bge_kstats.c b/usr/src/uts/common/io/bge/bge_kstats.c
index 32af1a2b13..2da60f96f9 100644
--- a/usr/src/uts/common/io/bge/bge_kstats.c
+++ b/usr/src/uts/common/io/bge/bge_kstats.c
@@ -669,14 +669,6 @@ bge_m_stat(void *arg, uint_t stat, uint64_t *val)
return (EINVAL);
}
- /*
- * The MII/GMII physical layer 802.3 stats are not supported by the
- * bge optical interface.
- */
- if ((bgep->chipid.flags & CHIP_FLAG_SERDES) && ETHER_STAT_ISMII(stat)) {
- return (ENOTSUP);
- }
-
if (bgep->chipid.statistic_type == BGE_STAT_BLK)
bstp = DMA_VPTR(bgep->statistics);
else {
@@ -950,7 +942,10 @@ bge_m_stat(void *arg, uint_t stat, uint64_t *val)
break;
case ETHER_STAT_XCVR_INUSE:
- *val = XCVR_1000T;
+ if (bgep->chipid.flags & CHIP_FLAG_SERDES)
+ *val = XCVR_1000X;
+ else
+ *val = XCVR_1000T;
break;
case ETHER_STAT_CAP_1000FDX:
@@ -962,19 +957,31 @@ bge_m_stat(void *arg, uint_t stat, uint64_t *val)
break;
case ETHER_STAT_CAP_100FDX:
- *val = 1;
+ if (bgep->chipid.flags & CHIP_FLAG_SERDES)
+ *val = 0;
+ else
+ *val = 1;
break;
case ETHER_STAT_CAP_100HDX:
- *val = 1;
+ if (bgep->chipid.flags & CHIP_FLAG_SERDES)
+ *val = 0;
+ else
+ *val = 1;
break;
case ETHER_STAT_CAP_10FDX:
- *val = 1;
+ if (bgep->chipid.flags & CHIP_FLAG_SERDES)
+ *val = 0;
+ else
+ *val = 1;
break;
case ETHER_STAT_CAP_10HDX:
- *val = 1;
+ if (bgep->chipid.flags & CHIP_FLAG_SERDES)
+ *val = 0;
+ else
+ *val = 1;
break;
case ETHER_STAT_CAP_ASMPAUSE:
@@ -1030,14 +1037,19 @@ bge_m_stat(void *arg, uint_t stat, uint64_t *val)
break;
case ETHER_STAT_ADV_REMFAULT:
- mutex_enter(bgep->genlock);
- *val = bge_mii_get16(bgep, MII_AN_ADVERT) &
- MII_AN_ADVERT_REMFAULT ? 1 : 0;
- if (bge_check_acc_handle(bgep, bgep->io_handle) != DDI_FM_OK) {
- ddi_fm_service_impact(bgep->devinfo,
- DDI_SERVICE_UNAFFECTED);
+ if (bgep->chipid.flags & CHIP_FLAG_SERDES)
+ *val = 0;
+ else {
+ mutex_enter(bgep->genlock);
+ *val = bge_mii_get16(bgep, MII_AN_ADVERT) &
+ MII_AN_ADVERT_REMFAULT ? 1 : 0;
+ if (bge_check_acc_handle(bgep, bgep->io_handle) !=
+ DDI_FM_OK) {
+ ddi_fm_service_impact(bgep->devinfo,
+ DDI_SERVICE_UNAFFECTED);
+ }
+ mutex_exit(bgep->genlock);
}
- mutex_exit(bgep->genlock);
break;
case ETHER_STAT_LP_CAP_1000FDX:
@@ -1077,14 +1089,19 @@ bge_m_stat(void *arg, uint_t stat, uint64_t *val)
break;
case ETHER_STAT_LP_REMFAULT:
- mutex_enter(bgep->genlock);
- *val = bge_mii_get16(bgep, MII_AN_LPABLE) &
- MII_AN_ADVERT_REMFAULT ? 1 : 0;
- if (bge_check_acc_handle(bgep, bgep->io_handle) != DDI_FM_OK) {
- ddi_fm_service_impact(bgep->devinfo,
- DDI_SERVICE_UNAFFECTED);
+ if (bgep->chipid.flags & CHIP_FLAG_SERDES)
+ *val = 0;
+ else {
+ mutex_enter(bgep->genlock);
+ *val = bge_mii_get16(bgep, MII_AN_LPABLE) &
+ MII_AN_ADVERT_REMFAULT ? 1 : 0;
+ if (bge_check_acc_handle(bgep, bgep->io_handle) !=
+ DDI_FM_OK) {
+ ddi_fm_service_impact(bgep->devinfo,
+ DDI_SERVICE_UNAFFECTED);
+ }
+ mutex_exit(bgep->genlock);
}
- mutex_exit(bgep->genlock);
break;
case ETHER_STAT_LINK_ASMPAUSE:
diff --git a/usr/src/uts/common/io/bge/bge_main2.c b/usr/src/uts/common/io/bge/bge_main2.c
index a5ec142b25..55c5b1df44 100644
--- a/usr/src/uts/common/io/bge/bge_main2.c
+++ b/usr/src/uts/common/io/bge/bge_main2.c
@@ -34,7 +34,7 @@
* This is the string displayed by modinfo, etc.
* Make sure you keep the version ID up to date!
*/
-static char bge_ident[] = "Broadcom Gb Ethernet";
+static char bge_ident[] = "Broadcom Gb Ethernet v0.62";
/*
* Property names
@@ -499,6 +499,11 @@ bge_m_stop(void *arg)
return;
}
bge_stop(bgep);
+
+ bgep->link_update_timer = 0;
+ bgep->link_state = LINK_STATE_UNKNOWN;
+ mac_link_update(bgep->mh, bgep->link_state);
+
/*
* Free the possible tx buffers allocated in tx process.
*/
diff --git a/usr/src/uts/common/io/bge/bge_ndd.c b/usr/src/uts/common/io/bge/bge_ndd.c
index e70b894d2b..0a17782086 100644
--- a/usr/src/uts/common/io/bge/bge_ndd.c
+++ b/usr/src/uts/common/io/bge/bge_ndd.c
@@ -98,8 +98,8 @@ bge_nd_param_init(bge_t *bgep)
BGE_INIT_PROP("adv_autoneg_cap", param_adv_autoneg, 1);
BGE_INIT_PROP("adv_1000fdx_cap", param_adv_1000fdx, 1);
BGE_INIT_PROP("adv_1000hdx_cap", param_adv_1000hdx, 1);
- BGE_INIT_PROP("adv_pause_cap", param_adv_pause, 1);
- BGE_INIT_PROP("adv_asym_pause_cap", param_adv_asym_pause, 1);
+ BGE_INIT_PROP("adv_pause_cap", param_adv_pause, 0);
+ BGE_INIT_PROP("adv_asym_pause_cap", param_adv_asym_pause, 0);
if (flags & CHIP_FLAG_SERDES) {
bgep->param_adv_100fdx = 0;