diff options
| author | David Brownell <david-b@pacbell.net> | 2008-04-02 16:40:20 -0400 |
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@suse.de> | 2008-04-02 18:06:08 -0400 |
| commit | cdc647a9b75741659bfc6acc44a6b3a646ad53bf (patch) | |
| tree | e5484d020ede1094bc4efd6299b2d14b475c522f | |
| parent | 49115b7cb1483a14c557666b61fe81d3c23780d6 (diff) | |
USB: another ehci_iaa_watchdog fix
This patch, suggested by Alan Stern, fixes the hung USB issues
on my notebook from suspend/resume cycles.
It does so by eliminating some confusion about the internal state
machine associated with unlinking from the EHCI async schedule ring,
which caused a recent regression:
http://bugzilla.kernel.org/show_bug.cgi?id=10345
Signed-off-by: Mark Lord <mlord@pobox.com>
Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
| -rw-r--r-- | drivers/usb/host/ehci-hub.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/drivers/usb/host/ehci-hub.c b/drivers/usb/host/ehci-hub.c index 40e8240b7851..4e065e556e4b 100644 --- a/drivers/usb/host/ehci-hub.c +++ b/drivers/usb/host/ehci-hub.c | |||
| @@ -135,8 +135,6 @@ static int ehci_bus_suspend (struct usb_hcd *hcd) | |||
| 135 | hcd->state = HC_STATE_QUIESCING; | 135 | hcd->state = HC_STATE_QUIESCING; |
| 136 | } | 136 | } |
| 137 | ehci->command = ehci_readl(ehci, &ehci->regs->command); | 137 | ehci->command = ehci_readl(ehci, &ehci->regs->command); |
| 138 | if (ehci->reclaim) | ||
| 139 | end_unlink_async(ehci); | ||
| 140 | ehci_work(ehci); | 138 | ehci_work(ehci); |
| 141 | 139 | ||
| 142 | /* Unlike other USB host controller types, EHCI doesn't have | 140 | /* Unlike other USB host controller types, EHCI doesn't have |
| @@ -180,6 +178,9 @@ static int ehci_bus_suspend (struct usb_hcd *hcd) | |||
| 180 | ehci_halt (ehci); | 178 | ehci_halt (ehci); |
| 181 | hcd->state = HC_STATE_SUSPENDED; | 179 | hcd->state = HC_STATE_SUSPENDED; |
| 182 | 180 | ||
| 181 | if (ehci->reclaim) | ||
| 182 | end_unlink_async(ehci); | ||
| 183 | |||
| 183 | /* allow remote wakeup */ | 184 | /* allow remote wakeup */ |
| 184 | mask = INTR_MASK; | 185 | mask = INTR_MASK; |
| 185 | if (!device_may_wakeup(&hcd->self.root_hub->dev)) | 186 | if (!device_may_wakeup(&hcd->self.root_hub->dev)) |
