summaryrefslogtreecommitdiff
path: root/usr/src/uts/common
diff options
context:
space:
mode:
authoryy150190 <none@none>2007-08-19 02:03:12 -0700
committeryy150190 <none@none>2007-08-19 02:03:12 -0700
commit8bfe3c7bb1fe581a62574aa58af260ffdba7993b (patch)
treea963a9f8e0391e5e3e185eda438c3b3ee6783884 /usr/src/uts/common
parentd75d0dc9a76c4d28c5b421415de169350a8e844d (diff)
downloadillumos-joyent-8bfe3c7bb1fe581a62574aa58af260ffdba7993b.tar.gz
6552853 system panics in e1000g_alloc_dvma_buffer during hotplug testing
Diffstat (limited to 'usr/src/uts/common')
-rw-r--r--usr/src/uts/common/io/e1000g/README5
-rw-r--r--usr/src/uts/common/io/e1000g/e1000g_main.c56
2 files changed, 30 insertions, 31 deletions
diff --git a/usr/src/uts/common/io/e1000g/README b/usr/src/uts/common/io/e1000g/README
index 713adbdc14..04be0d30d1 100644
--- a/usr/src/uts/common/io/e1000g/README
+++ b/usr/src/uts/common/io/e1000g/README
@@ -515,3 +515,8 @@ Notes on packaging:
6490623 Some networking problems with Solaris_b44_64 domU(using solaris_b44_64 dom0)
6510396 system panicked in e1000g_82547_timeout
6554976 e1000g driver does not support 10D5 device - Sun Pentwater PEM quad port
+
+5.1.11
+======
+ This version has the following fix:
+ 6552853 system panics in e1000g_alloc_dvma_buffer during hotplug testing
diff --git a/usr/src/uts/common/io/e1000g/e1000g_main.c b/usr/src/uts/common/io/e1000g/e1000g_main.c
index c081f58724..379427056a 100644
--- a/usr/src/uts/common/io/e1000g/e1000g_main.c
+++ b/usr/src/uts/common/io/e1000g/e1000g_main.c
@@ -53,9 +53,9 @@
#define E1000_RX_INTPT_TIME 128
#define E1000_RX_PKT_CNT 8
-static char ident[] = "Intel PRO/1000 Ethernet 5.1.10";
+static char ident[] = "Intel PRO/1000 Ethernet 5.1.11";
static char e1000g_string[] = "Intel(R) PRO/1000 Network Connection";
-static char e1000g_version[] = "Driver Ver. 5.1.10";
+static char e1000g_version[] = "Driver Ver. 5.1.11";
/*
* Proto types for DDI entry points
@@ -216,9 +216,9 @@ static mac_callbacks_t e1000g_m_callbacks = {
/*
* Global variables
*/
-boolean_t e1000g_force_detach = B_TRUE;
uint32_t e1000g_mblks_pending = 0;
/*
+ * Workaround for Dynamic Reconfiguration support, for x86 platform only.
* Here we maintain a private dev_info list if e1000g_force_detach is
* enabled. If we force the driver to detach while there are still some
* rx buffers retained in the upper layer, we have to keep a copy of the
@@ -226,9 +226,18 @@ uint32_t e1000g_mblks_pending = 0;
* structure will be freed after the driver is detached. However when we
* finally free those rx buffers released by the upper layer, we need to
* refer to the dev_info to free the dma buffers. So we save a copy of
- * the dev_info for this purpose.
+ * the dev_info for this purpose. On x86 platform, we assume this copy
+ * of dev_info is always valid, but on SPARC platform, it could be invalid
+ * after the system board level DR operation. For this reason, the global
+ * variable e1000g_force_detach must be B_FALSE on SPARC platform.
*/
+#ifdef __sparc
+boolean_t e1000g_force_detach = B_FALSE;
+#else
+boolean_t e1000g_force_detach = B_TRUE;
+#endif
private_devi_list_t *e1000g_private_devi_list = NULL;
+
/*
* The rwlock is defined to protect the whole processing of rx recycling
* and the rx packets release in detach processing to make them mutually
@@ -450,36 +459,21 @@ e1000gattach(dev_info_t *devinfo, ddi_attach_cmd_t cmd)
if (e1000g_force_detach) {
private_devi_list_t *devi_node;
- boolean_t devi_existed;
- devi_existed = B_FALSE;
- devi_node = e1000g_private_devi_list;
- while (devi_node != NULL) {
- if (devi_node->dip == devinfo) {
- devi_existed = B_TRUE;
- break;
- }
- devi_node = devi_node->next;
- }
-
- if (devi_existed) {
- Adapter->priv_dip = devi_node->priv_dip;
- } else {
- Adapter->priv_dip =
- kmem_zalloc(sizeof (struct dev_info), KM_SLEEP);
- bcopy(DEVI(devinfo), DEVI(Adapter->priv_dip),
- sizeof (struct dev_info));
+ Adapter->priv_dip =
+ kmem_zalloc(sizeof (struct dev_info), KM_SLEEP);
+ bcopy(DEVI(devinfo), DEVI(Adapter->priv_dip),
+ sizeof (struct dev_info));
- devi_node =
- kmem_zalloc(sizeof (private_devi_list_t), KM_SLEEP);
+ devi_node =
+ kmem_zalloc(sizeof (private_devi_list_t), KM_SLEEP);
- rw_enter(&e1000g_rx_detach_lock, RW_WRITER);
- devi_node->dip = devinfo;
- devi_node->priv_dip = Adapter->priv_dip;
- devi_node->next = e1000g_private_devi_list;
- e1000g_private_devi_list = devi_node;
- rw_exit(&e1000g_rx_detach_lock);
- }
+ rw_enter(&e1000g_rx_detach_lock, RW_WRITER);
+ devi_node->dip = devinfo;
+ devi_node->priv_dip = Adapter->priv_dip;
+ devi_node->next = e1000g_private_devi_list;
+ e1000g_private_devi_list = devi_node;
+ rw_exit(&e1000g_rx_detach_lock);
}
hw = &Adapter->Shared;