Panic during kernel booting on HP Proliant DL180G6 and latest
STABLE
John Baldwin
jhb at freebsd.org
Tue Sep 13 19:03:14 UTC 2011
On Tuesday, September 13, 2011 11:01:21 am Bartosz Stec wrote:
> Hi again list. Here's little update about the issue.
> > Yes, there have been a few times when I have seen something like this, and
issue when the driver is static and not when modulized. I have never been
clear what to make of this. If anyone else here has any thoughts or
enlightening ideas I'd appreciate it.
> Fresh build, 8.2-STABLE #7: Tue Sep 13 14:25:45, problem is still here,
> regardless of igb included in the kernel or loaded as module from
> loader.conf, system panic with msix enabled.
> > Also if it does not even happen when using the GENERIC config then it
would be interesting to see the diff between that and what does cause the
panic.
> Here it is:
Hmm, can you try this patch. I need to come up with a final variant and
get it into the tree:
Index: if_igb.c
===================================================================
--- if_igb.c (.../mirror/FreeBSD/stable/8/sys/dev/e1000) (revision 225344)
+++ if_igb.c (.../stable/8/sys/dev/e1000) (revision 225344)
@@ -600,16 +619,6 @@
goto err_late;
}
- /*
- ** Configure Interrupts
- */
- if ((adapter->msix > 1) && (igb_enable_msix))
- error = igb_allocate_msix(adapter);
- else /* MSI or Legacy */
- error = igb_allocate_legacy(adapter);
- if (error)
- goto err_late;
-
/* Setup OS specific network interface */
if (igb_setup_interface(dev, adapter) != 0)
goto err_late;
@@ -653,6 +662,16 @@
adapter->led_dev = led_create(igb_led_func, adapter,
device_get_nameunit(dev));
+ /*
+ ** Configure Interrupts
+ */
+ if ((adapter->msix > 1) && (igb_enable_msix))
+ error = igb_allocate_msix(adapter);
+ else /* MSI or Legacy */
+ error = igb_allocate_legacy(adapter);
+ if (error)
+ goto err_late;
+
INIT_DEBUGOUT("igb_attach: end");
return (0);
@@ -661,10 +680,10 @@
igb_free_transmit_structures(adapter);
igb_free_receive_structures(adapter);
igb_release_hw_control(adapter);
+err_pci:
+ igb_free_pci_resources(adapter);
if (adapter->ifp != NULL)
if_free(adapter->ifp);
-err_pci:
- igb_free_pci_resources(adapter);
free(adapter->mta, M_DEVBUF);
IGB_CORE_LOCK_DESTROY(adapter);
@@ -2272,6 +2291,8 @@
struct igb_queue *que = adapter->queues;
int error, rid, vector = 0;
+ /* Turn off all interrupts */
+ E1000_WRITE_REG(&adapter->hw, E1000_IMC, 0xffffffff);
for (int i = 0; i < adapter->num_queues; i++, vector++, que++) {
rid = vector +1;
--
John Baldwin
More information about the freebsd-stable
mailing list