USB: EHCI: keep better track of resuming ports
authorAlan Stern <stern@rowland.harvard.edu>
Thu, 1 Aug 2013 21:09:23 +0000 (17:09 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 1 Aug 2013 21:37:07 +0000 (05:37 +0800)
The ehci-hcd driver isn't as careful as it should be about the way it
uses ehci->resuming_ports.  One of the omissions was fixed recently by
commit 47a64a13d54 (USB: EHCI: Fix resume signalling on remote
wakeup), but there are other places that need attention:

When a port's suspend feature is explicitly cleared, the
corresponding bit in resuming_ports should be set and the core
should be notified about the port resume.

We don't need to clear a resuming_ports bit when a reset
completes.

Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/host/ehci-hub.c

index 6dce37555c4f6303b5efa657af88096db2b2140e..6d0e59306ed9c98640b4406cd55c907b31952c72 100644 (file)
@@ -801,6 +801,8 @@ static int ehci_hub_control (
                        ehci_writel(ehci, temp | PORT_RESUME, status_reg);
                        ehci->reset_done[wIndex] = jiffies
                                        + msecs_to_jiffies(20);
+                       set_bit(wIndex, &ehci->resuming_ports);
+                       usb_hcd_start_port_resume(&hcd->self, wIndex);
                        break;
                case USB_PORT_FEAT_C_SUSPEND:
                        clear_bit(wIndex, &ehci->port_c_suspend);
@@ -911,7 +913,6 @@ static int ehci_hub_control (
                                        ehci->reset_done[wIndex])) {
                        status |= USB_PORT_STAT_C_RESET << 16;
                        ehci->reset_done [wIndex] = 0;
-                       clear_bit(wIndex, &ehci->resuming_ports);
 
                        /* force reset to complete */
                        ehci_writel(ehci, temp & ~(PORT_RWC_BITS | PORT_RESET),
This page took 0.027027 seconds and 5 git commands to generate.