[PATCH] USB: ehci.patch (earlier irq disable)
authorDavid Brownell <david-b@pacbell.net>
Tue, 27 Sep 2005 17:19:39 +0000 (10:19 -0700)
committerGreg Kroah-Hartman <gregkh@suse.de>
Fri, 28 Oct 2005 23:47:37 +0000 (16:47 -0700)
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 <dbrownell@users.sourceforge.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
 drivers/usb/host/ehci-hcd.c |    8 ++++++++
 1 file changed, 8 insertions(+)

drivers/usb/host/ehci-hcd.c

index f5eb9e7b5b1875ee8178404307ca45be1d5d5693..b3eb02613bffc6e501eb140e2a64115cc96fab15 100644 (file)
@@ -182,6 +182,9 @@ static int ehci_halt (struct ehci_hcd *ehci)
 {
        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;
 
@@ -335,12 +338,17 @@ static int bios_handoff (struct ehci_hcd *ehci, int where, u32 cap)
 
 #endif
 
+/* 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);