diff options
author | David Brownell <david-b@pacbell.net> | 2005-09-27 13:19:39 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2005-10-28 19:47:37 -0400 |
commit | 72f30b6f2f5f68dd426e9fe83817b882c2d04e50 (patch) | |
tree | 21f2785ff8dbd4c612f1f01cd9d2f8c6baef3dd5 /drivers/usb | |
parent | 7efe5d7c3e3a82e43b0f8fb29c6797317bce7a9a (diff) |
[PATCH] USB: ehci.patch (earlier irq disable)
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(+)
Diffstat (limited to 'drivers/usb')
-rw-r--r-- | drivers/usb/host/ehci-hcd.c | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c index f5eb9e7b5b18..b3eb02613bff 100644 --- a/drivers/usb/host/ehci-hcd.c +++ b/drivers/usb/host/ehci-hcd.c | |||
@@ -182,6 +182,9 @@ static int ehci_halt (struct ehci_hcd *ehci) | |||
182 | { | 182 | { |
183 | u32 temp = readl (&ehci->regs->status); | 183 | u32 temp = readl (&ehci->regs->status); |
184 | 184 | ||
185 | /* disable any irqs left enabled by previous code */ | ||
186 | writel (0, &ehci->regs->intr_enable); | ||
187 | |||
185 | if ((temp & STS_HALT) != 0) | 188 | if ((temp & STS_HALT) != 0) |
186 | return 0; | 189 | return 0; |
187 | 190 | ||
@@ -335,12 +338,17 @@ static int bios_handoff (struct ehci_hcd *ehci, int where, u32 cap) | |||
335 | 338 | ||
336 | #endif | 339 | #endif |
337 | 340 | ||
341 | /* Reboot notifiers kick in for silicon on any bus (not just pci, etc). | ||
342 | * This forcibly disables dma and IRQs, helping kexec and other cases | ||
343 | * where the next system software may expect clean state. | ||
344 | */ | ||
338 | static int | 345 | static int |
339 | ehci_reboot (struct notifier_block *self, unsigned long code, void *null) | 346 | ehci_reboot (struct notifier_block *self, unsigned long code, void *null) |
340 | { | 347 | { |
341 | struct ehci_hcd *ehci; | 348 | struct ehci_hcd *ehci; |
342 | 349 | ||
343 | ehci = container_of (self, struct ehci_hcd, reboot_notifier); | 350 | ehci = container_of (self, struct ehci_hcd, reboot_notifier); |
351 | (void) ehci_halt (ehci); | ||
344 | 352 | ||
345 | /* make BIOS/etc use companion controller during reboot */ | 353 | /* make BIOS/etc use companion controller during reboot */ |
346 | writel (0, &ehci->regs->configured_flag); | 354 | writel (0, &ehci->regs->configured_flag); |