Skip to contentSkip to conversation

e1000 driver failed to call pci_enable_device

DISCUSSION Bjorn Helgaas 2 participants 2 messages Aug 27, 2004 – Aug 30, 2004 1 message not in the archive

lore
Share & tools
lore

A message that is not in the archive (sent off-list or not yet received): [email protected]

#1 lore raw
Quoted 21 lines · you

I tried to boot the linux-2.6.9-rc1-mm1 kernel and it generates an oops
because the e1000 driver failed to call pci_enable_device(). The kernel boots normally with "pci=routeirq" argument sets. I copy the output of "lspci" and also the oops message generated during the boot.
...
----[the oops message]----
Bringing up interface eth0: Unable to handle kernel paging request at virtual ddress c0500eb0
printing eip:
*pde = 00582027

Oops: 0000 [#1]
PREEMPT SMP DEBUG_PAGEALLOC
Modules linked in: e1000
CPU:    0
EIP:    0060:[<c0500eb0>]    Not tainted VLI
EFLAGS: 00010282   (2.6.9-rc1-mm1)

EIP is at assign_irq_vector+0x0/0x87
eax: 00000004 ebx: 00000034 ecx: 00000080 edx: c0545a70
esi: 00000004 edi: 00000002 ebp: 00000001 esp: f7f0dda4
ds: 007b es: 007b ss: 0068
Process modprobe (pid: 1760, threadinfo=f7f0c000 task=f7faeb70)

Quoted 6 lines
Stack: c011751e 00000034 00000002 00000004 00000008 0000000c 00000097 f7f0c000
       00000286 c2223480 00000001 0001a900 03000000 00000004 00000034 00000002
       00000010 c0114d43 00000002 00000004 00000034 00000001 00000001 00000001
Call Trace:
 [<c011751e>] io_apic_set_pci_routing+0x7f/0x222

...

Thanks very much for your testing and detailed problem report. This problem actually isn't in e1000. Can you try the attached patch, please? I thought I'd seen this patch before, but it doesn't seem to be in -mm yet.

Make assign_irq_vector() non-__init always (it's called from io_apic_set_pci_routing(), which is used in the pci_enable_device() path).

===== arch/i386/kernel/io_apic.c 1.109 vs edited =====

arch/i386/kernel/io_apic.c +0 -4
@@ -1120,11 +1120,7 @@
 /* irq_vectors is indexed by the sum of all RTEs in all I/O APICs. */
 u8 irq_vector[NR_IRQ_VECTORS] = { FIRST_DEVICE_VECTOR , 0 };
 
-#ifdef CONFIG_PCI_MSI
 int assign_irq_vector(int irq)
-#else
-int __init assign_irq_vector(int irq)
-#endif
 {
 	static int current_vector = FIRST_DEVICE_VECTOR, offset = 0;
 
#2 lore raw
Quoted 20 lines · Bjorn Helgaas
Quoted 4 lines · you

I tried to boot the linux-2.6.9-rc1-mm1 kernel and it generates an oops
because the e1000 driver failed to call pci_enable_device(). The kernel boots normally with "pci=routeirq" argument sets. I copy the output of "lspci" and also the oops message generated during the boot.

Thanks very much for your testing and detailed problem report. This problem actually isn't in e1000. Can you try the attached patch, please? I thought I'd seen this patch before, but it doesn't seem to be in -mm yet.

Make assign_irq_vector() non-__init always (it's called from io_apic_set_pci_routing(), which is used in the pci_enable_device() path).

===== arch/i386/kernel/io_apic.c 1.109 vs edited =====

arch/i386/kernel/io_apic.c line 1125

Quoted 10 lines
arch/i386/kernel/io_apic.c +0 -4
@@ -1120,11 +1120,7 @@
 /* irq_vectors is indexed by the sum of all RTEs in all I/O APICs. */
 u8 irq_vector[NR_IRQ_VECTORS] = { FIRST_DEVICE_VECTOR , 0 };
 
-#ifdef CONFIG_PCI_MSI
 int assign_irq_vector(int irq)
-#else
-int __init assign_irq_vector(int irq)
-#endif
 {
 	static int current_vector = FIRST_DEVICE_VECTOR, offset = 0;

The patch fixes the problem. Everything works fine. Thank you very much for your help

Best regards,
Guillaume