From: Alan Stern <stern@rowland.harvard.edu>
Date: Thu, 1 Aug 2013 21:09:23 +0000 (-0400)
Subject: USB: EHCI: keep better track of resuming ports
X-Git-Tag: firefly_0821_release~176^2~5474^2~122
X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=3a20446f02bfb71d68ae9ec673268bb7823f878c;p=firefly-linux-kernel-4.4.55.git

USB: EHCI: keep better track of resuming ports

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>
---

diff --git a/drivers/usb/host/ehci-hub.c b/drivers/usb/host/ehci-hub.c
index 6dce37555c4f..6d0e59306ed9 100644
--- a/drivers/usb/host/ehci-hub.c
+++ b/drivers/usb/host/ehci-hub.c
@@ -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),