aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb
diff options
context:
space:
mode:
authorDavid Brownell <david-b@pacbell.net>2008-04-02 16:40:20 -0400
committerGreg Kroah-Hartman <gregkh@suse.de>2008-04-02 18:06:08 -0400
commitcdc647a9b75741659bfc6acc44a6b3a646ad53bf (patch)
treee5484d020ede1094bc4efd6299b2d14b475c522f /drivers/usb
parent49115b7cb1483a14c557666b61fe81d3c23780d6 (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>
Diffstat (limited to 'drivers/usb')
-rw-r--r--drivers/usb/host/ehci-hub.c5
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))