Re: 2.6.14-rc2-ge484585e: kexec into same kernel: irq 11 nobody cared; but ehci_hcd should

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



> when i kexec into the same kernel i get this error message:
>
> [17179593.108000] ACPI: PCI Interrupt Link [LNKD] enabled at IRQ 11
> [17179593.108000] PCI: setting IRQ 11 as level-triggered
> [17179593.108000] ACPI: PCI Interrupt 0000:00:10.3[D] -> Link [LNKD] -> GSI 11 (level, low) -> IRQ 11
> [17179593.108000] ehci_hcd 0000:00:10.3: EHCI Host Controller
> [17179593.124000] ehci_hcd 0000:00:10.3: new USB bus registered, assigned bus number 4
> [17179593.936000] irq 11: nobody cared (try booting with the "irqpoll" option)
> ...
>
> any ideas? 

This patch (compile-tested only) ought to do it.  Alternatively,
try the "usb-handoff" kernel parameter; it happens that will also
forcibly disable the IRQs.

(And notice how far that "usb-handoff" code has gotten out of sync
with the HCDs ... for EHCI the bug is that only that "pci quirks"
clone of the handoff code disables the IRQs, but for OHCI the bug
is the other way around:  only the HCD disables them.  Bleech.)

- Dave


This tweaks the EHCI reboot notifier to also halt the EHCI controller, and
makes that halt code force IRQs off.  Both should always have been done.

Signed-off-by: David Brownell <[email protected]>

--- g26.orig/drivers/usb/host/ehci-hcd.c	2005-09-23 10:40:21.000000000 -0700
+++ g26/drivers/usb/host/ehci-hcd.c	2005-09-25 09:17:01.000000000 -0700
@@ -182,6 +182,9 @@
 {
 	u32	temp = readl (&ehci->regs->status);
 
+	/* disable any irqs left enabled by previous code */
+	writel (0, &ehci->regs->intr_enable);
+
 	if ((temp & STS_HALT) != 0)
 		return 0;
 
@@ -297,12 +300,17 @@
 	spin_unlock_irqrestore (&ehci->lock, flags);
 }
 
+/* Reboot notifiers kick in for silicon on any bus (not just pci, etc).
+ * This forcibly disables dma and IRQs, helping kexec and other cases
+ * where the next system software may expect clean state.
+ */
 static int
 ehci_reboot (struct notifier_block *self, unsigned long code, void *null)
 {
 	struct ehci_hcd		*ehci;
 
 	ehci = container_of (self, struct ehci_hcd, reboot_notifier);
+	(void) ehci_halt (ehci);
 
 	/* make BIOS/etc use companion controller during reboot */
 	writel (0, &ehci->regs->configured_flag);
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[Index of Archives]     [Kernel Newbies]     [Netfilter]     [Bugtraq]     [Photo]     [Gimp]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Video 4 Linux]     [Linux for the blind]
  Powered by Linux