diff options
author | Michael Hanselmann <linux-kernel@hansmi.ch> | 2007-05-31 17:34:27 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2007-07-12 19:34:29 -0400 |
commit | d576bb9f2769b315a795f77f0c33322a976add7a (patch) | |
tree | 56d59afa4d1e96b519e81434bd09598f76bf1fee /drivers/usb/host/ohci-hub.c | |
parent | 020363384adfb02f26c1c038a127ed3da3d5cf37 (diff) |
USB: Fix NEC OHCI chip silicon bug
This patch fixes a silicon bug in some NEC OHCI chips. The bug appears
at random times and is very, very difficult to reproduce. Without the
following patch, Linux would shut the chip and its associated devices
down. In Apple PowerBooks this leads to an unusable keyboard and mouse
(SSH still working). The idea of restarting the chip is taken from
public Darwin code.
Signed-off-by: Michael Hanselmann <linux-kernel@hansmi.ch>
Cc: David Brownell <dbrownell@users.sourceforge.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/usb/host/ohci-hub.c')
-rw-r--r-- | drivers/usb/host/ohci-hub.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/drivers/usb/host/ohci-hub.c b/drivers/usb/host/ohci-hub.c index bb9cc595219e..48e4b11f4d3e 100644 --- a/drivers/usb/host/ohci-hub.c +++ b/drivers/usb/host/ohci-hub.c | |||
@@ -55,8 +55,6 @@ static void dl_done_list (struct ohci_hcd *); | |||
55 | static void finish_unlinks (struct ohci_hcd *, u16); | 55 | static void finish_unlinks (struct ohci_hcd *, u16); |
56 | 56 | ||
57 | #ifdef CONFIG_PM | 57 | #ifdef CONFIG_PM |
58 | static int ohci_restart(struct ohci_hcd *ohci); | ||
59 | |||
60 | static int ohci_rh_suspend (struct ohci_hcd *ohci, int autostop) | 58 | static int ohci_rh_suspend (struct ohci_hcd *ohci, int autostop) |
61 | __releases(ohci->lock) | 59 | __releases(ohci->lock) |
62 | __acquires(ohci->lock) | 60 | __acquires(ohci->lock) |
@@ -191,6 +189,9 @@ __acquires(ohci->lock) | |||
191 | spin_unlock_irq (&ohci->lock); | 189 | spin_unlock_irq (&ohci->lock); |
192 | (void) ohci_init (ohci); | 190 | (void) ohci_init (ohci); |
193 | status = ohci_restart (ohci); | 191 | status = ohci_restart (ohci); |
192 | |||
193 | usb_root_hub_lost_power(hcd->self.root_hub); | ||
194 | |||
194 | spin_lock_irq (&ohci->lock); | 195 | spin_lock_irq (&ohci->lock); |
195 | } | 196 | } |
196 | return status; | 197 | return status; |