| From 391016f6e2fe3b9979b4c6880a76e5e434d6947c Mon Sep 17 00:00:00 2001 |
| From: Alan Stern <stern@rowland.harvard.edu> |
| Date: Mon, 16 Mar 2009 14:21:56 -0400 |
| Subject: USB: EHCI: expedite unlinks when the root hub is suspended |
| |
| From: Alan Stern <stern@rowland.harvard.edu> |
| |
| commit 391016f6e2fe3b9979b4c6880a76e5e434d6947c upstream. |
| |
| This patch (as1225) fixes a bug in ehci-hcd. The condition for |
| whether unlinked QHs can become IDLE should not be that the controller |
| is halted, but rather that the controller isn't running. In other |
| words when the root hub is suspended, the hardware doesn't own any |
| QHs. |
| |
| This fixes a problem that can show up during hibernation: If a QH is |
| only partially unlinked when the root hub is frozen, then when the |
| root hub is thawed the QH won't be in the IDLE state. As a result it |
| can't be used properly for new URB submissions. |
| |
| Signed-off-by: Alan Stern <stern@rowland.harvard.edu> |
| Reported-by: Brandon Philips <brandon@ifup.org> |
| Tested-by: Brandon Philips <brandon@ifup.org> |
| Acked-by: David Brownell <dbrownell@users.sourceforge.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/usb/host/ehci-q.c | 3 ++- |
| 1 file changed, 2 insertions(+), 1 deletion(-) |
| |
| --- a/drivers/usb/host/ehci-q.c |
| +++ b/drivers/usb/host/ehci-q.c |
| @@ -1095,7 +1095,8 @@ static void start_unlink_async (struct e |
| prev->qh_next = qh->qh_next; |
| wmb (); |
| |
| - if (unlikely (ehci_to_hcd(ehci)->state == HC_STATE_HALT)) { |
| + /* If the controller isn't running, we don't have to wait for it */ |
| + if (unlikely(!HC_IS_RUNNING(ehci_to_hcd(ehci)->state))) { |
| /* if (unlikely (qh->reclaim != 0)) |
| * this will recurse, probably not much |
| */ |