aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/host/ohci-hub.c
diff options
context:
space:
mode:
authorMichael Hanselmann <linux-kernel@hansmi.ch>2007-05-31 17:34:27 -0400
committerGreg Kroah-Hartman <gregkh@suse.de>2007-07-12 19:34:29 -0400
commitd576bb9f2769b315a795f77f0c33322a976add7a (patch)
tree56d59afa4d1e96b519e81434bd09598f76bf1fee /drivers/usb/host/ohci-hub.c
parent020363384adfb02f26c1c038a127ed3da3d5cf37 (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.c5
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 *);
55static void finish_unlinks (struct ohci_hcd *, u16); 55static void finish_unlinks (struct ohci_hcd *, u16);
56 56
57#ifdef CONFIG_PM 57#ifdef CONFIG_PM
58static int ohci_restart(struct ohci_hcd *ohci);
59
60static int ohci_rh_suspend (struct ohci_hcd *ohci, int autostop) 58static 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;