USB: usbcore: Do not disable USB3 protocol ports in hub_activate()
authorAndiry Xu <andiry.xu@amd.com>
Fri, 7 May 2010 10:09:27 +0000 (18:09 +0800)
committerGreg Kroah-Hartman <gregkh@suse.de>
Thu, 20 May 2010 20:21:43 +0000 (13:21 -0700)
When USB3 protocol port detects an USB3.0 device attach, the port will
automatically transition to the Enabled state upon the completion
of successful link training.

Do not disable USB3 protocol ports in hub_activate(), or USB3.0 device
will fail to be recognized if xHCI bus power management is implemented.

Signed-off-by: Andiry Xu <andiry.xu@amd.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/usb/core/hub.c

index 2a767b3143a4ef8b4ff642024bc6282d8dedb483..83e7bbbe97fa7421c3365f3c749d3c2622817fbb 100644 (file)
@@ -744,8 +744,20 @@ static void hub_activate(struct usb_hub *hub, enum hub_activation_type type)
                                !(portstatus & USB_PORT_STAT_CONNECTION) ||
                                !udev ||
                                udev->state == USB_STATE_NOTATTACHED)) {
-                       clear_port_feature(hdev, port1, USB_PORT_FEAT_ENABLE);
-                       portstatus &= ~USB_PORT_STAT_ENABLE;
+                       /*
+                        * USB3 protocol ports will automatically transition
+                        * to Enabled state when detect an USB3.0 device attach.
+                        * Do not disable USB3 protocol ports.
+                        * FIXME: USB3 root hub and external hubs are treated
+                        * differently here.
+                        */
+                       if (hdev->descriptor.bDeviceProtocol != 3 ||
+                           (!hdev->parent &&
+                            !(portstatus & USB_PORT_STAT_SUPER_SPEED))) {
+                               clear_port_feature(hdev, port1,
+                                                  USB_PORT_FEAT_ENABLE);
+                               portstatus &= ~USB_PORT_STAT_ENABLE;
+                       }
                }
 
                /* Clear status-change flags; we'll debounce later */