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>
This commit is contained in:
David Brownell 2008-04-02 13:40:20 -07:00 committed by Greg Kroah-Hartman
parent 49115b7cb1
commit cdc647a9b7

View file

@ -135,8 +135,6 @@ static int ehci_bus_suspend (struct usb_hcd *hcd)
hcd->state = HC_STATE_QUIESCING; hcd->state = HC_STATE_QUIESCING;
} }
ehci->command = ehci_readl(ehci, &ehci->regs->command); ehci->command = ehci_readl(ehci, &ehci->regs->command);
if (ehci->reclaim)
end_unlink_async(ehci);
ehci_work(ehci); ehci_work(ehci);
/* Unlike other USB host controller types, EHCI doesn't have /* Unlike other USB host controller types, EHCI doesn't have
@ -180,6 +178,9 @@ static int ehci_bus_suspend (struct usb_hcd *hcd)
ehci_halt (ehci); ehci_halt (ehci);
hcd->state = HC_STATE_SUSPENDED; hcd->state = HC_STATE_SUSPENDED;
if (ehci->reclaim)
end_unlink_async(ehci);
/* allow remote wakeup */ /* allow remote wakeup */
mask = INTR_MASK; mask = INTR_MASK;
if (!device_may_wakeup(&hcd->self.root_hub->dev)) if (!device_may_wakeup(&hcd->self.root_hub->dev))