Commit 4b996365 authored by Sarah Sharp's avatar Sarah Sharp Committed by Greg Kroah-Hartman

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

[This is upstream commit 0fe51aa5.
It needs to be backported to kernels as old as 3.2, because it fixes the
buggy commit 65bdac5e "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: default avatarSarah Sharp <sarah.a.sharp@linux.intel.com>
Acked-by: default avatarAlan Stern <stern@rowland.harvard.edu>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 9f677cf2
...@@ -2661,17 +2661,16 @@ static int hub_port_reset(struct usb_hub *hub, int port1, ...@@ -2661,17 +2661,16 @@ static int hub_port_reset(struct usb_hub *hub, int port1,
{ {
int i, status; 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 " dev_err(hub->intfdev, "only USB3 hub support "
"warm reset\n"); "warm reset\n");
return -EINVAL; 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 */ /* Reset the port */
...@@ -2709,7 +2708,7 @@ static int hub_port_reset(struct usb_hub *hub, int port1, ...@@ -2709,7 +2708,7 @@ static int hub_port_reset(struct usb_hub *hub, int port1,
port1); port1);
done: done:
if (!warm) if (!hub_is_superspeed(hub->hdev))
up_read(&ehci_cf_port_reset_rwsem); up_read(&ehci_cf_port_reset_rwsem);
return status; return status;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment