Patchwork [3.5.y.z,extended,stable] Patch "USB: Don't use EHCI port sempahore for USB 3.0 hubs." has been added to staging queue

login
register
mail settings
Submitter Luis Henriques
Date March 13, 2013, 8:06 p.m.
Message ID <1363205181-8971-1-git-send-email-luis.henriques@canonical.com>
Download mbox | patch
Permalink /patch/227349/
State New
Headers show

Comments

Luis Henriques - March 13, 2013, 8:06 p.m.
This is a note to let you know that I have just added a patch titled

    USB: Don't use EHCI port sempahore for USB 3.0 hubs.

to the linux-3.5.y-queue branch of the 3.5.y.z extended stable tree 
which can be found at:

 http://kernel.ubuntu.com/git?p=ubuntu/linux.git;a=shortlog;h=refs/heads/linux-3.5.y-queue

If you, or anyone else, feels it should not be added to this tree, please 
reply to this email.

For more information about the 3.5.y.z tree, see
https://wiki.ubuntu.com/Kernel/Dev/ExtendedStable

Thanks.
-Luis

------

From 34fe24a23f7f4966b93e7a40159f2af773329d0a Mon Sep 17 00:00:00 2001
From: Sarah Sharp <sarah.a.sharp@linux.intel.com>
Date: Thu, 7 Mar 2013 16:24:19 -0800
Subject: [PATCH] USB: Don't use EHCI port sempahore for USB 3.0 hubs.

commit 0fe51aa5eee51db7c7ecd201d42a977ad79c58b6 upstream.

[This is upstream commit 0fe51aa5eee51db7c7ecd201d42a977ad79c58b6.
It needs to be backported to kernels as old as 3.2, because it fixes the
buggy commit 9dbcaec830cd97f44a0b91b315844e0d7144746b "USB: Handle warm
reset failure on empty port."]

The EHCI host controller needs to prevent EHCI initialization when the
UHCI or OHCI companion controller is in the middle of a port reset.  It
uses ehci_cf_port_reset_rwsem to do this.  USB 3.0 hubs can't be under
an EHCI host controller, so it makes no sense to down the semaphore for
USB 3.0 hubs.  It also makes the warm port reset code more complex.

Don't down ehci_cf_port_reset_rwsem for USB 3.0 hubs.

Signed-off-by: Sarah Sharp <sarah.a.sharp@linux.intel.com>
Acked-by: Alan Stern <stern@rowland.harvard.edu>
Signed-off-by: Luis Henriques <luis.henriques@canonical.com>
---
 drivers/usb/core/hub.c | 15 +++++++--------
 1 file changed, 7 insertions(+), 8 deletions(-)

--
1.8.1.2

Patch

diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
index c9590c6..1a2cd0e 100644
--- a/drivers/usb/core/hub.c
+++ b/drivers/usb/core/hub.c
@@ -2552,17 +2552,16 @@  static int hub_port_reset(struct usb_hub *hub, int port1,
 {
 	int i, status;

-	if (!warm) {
-		/* Block EHCI CF initialization during the port reset.
-		 * Some companion controllers don't like it when they mix.
-		 */
-		down_read(&ehci_cf_port_reset_rwsem);
-	} else {
-		if (!hub_is_superspeed(hub->hdev)) {
+	if (!hub_is_superspeed(hub->hdev)) {
+		if (warm) {
 			dev_err(hub->intfdev, "only USB3 hub support "
 						"warm reset\n");
 			return -EINVAL;
 		}
+		/* Block EHCI CF initialization during the port reset.
+		 * Some companion controllers don't like it when they mix.
+		 */
+		down_read(&ehci_cf_port_reset_rwsem);
 	}

 	/* Reset the port */
@@ -2600,7 +2599,7 @@  static int hub_port_reset(struct usb_hub *hub, int port1,
 		port1);

 done:
-	if (!warm)
+	if (!hub_is_superspeed(hub->hdev))
 		up_read(&ehci_cf_port_reset_rwsem);

 	return status;