]> Pileus Git - ~andy/linux/blobdiff - drivers/usb/host/ehci-hub.c
usb: ehci: Only sleep for post-resume handover if devices use persist
[~andy/linux] / drivers / usb / host / ehci-hub.c
index 9ab4a4d9768a5a3ed3fa791746e01977445ba840..b2f64506840bea5795bc3192d62fbf47e58e0af8 100644 (file)
@@ -42,6 +42,12 @@ static int ehci_hub_control(
        u16             wLength
 );
 
+static int persist_enabled_on_companion(struct usb_device *udev, void *unused)
+{
+       return !udev->maxchild && udev->persist_enabled &&
+               udev->bus->root_hub->speed < USB_SPEED_HIGH;
+}
+
 /* After a power loss, ports that were owned by the companion must be
  * reset so that the companion can still own them.
  */
@@ -56,6 +62,16 @@ static void ehci_handover_companion_ports(struct ehci_hcd *ehci)
        if (!ehci->owned_ports)
                return;
 
+       /*
+        * USB 1.1 devices are mostly HIDs, which don't need to persist across
+        * suspends. If we ensure that none of our companion's devices have
+        * persist_enabled (by looking through all USB 1.1 buses in the system),
+        * we can skip this and avoid slowing resume down. Devices without
+        * persist will just get reenumerated shortly after resume anyway.
+        */
+       if (!usb_for_each_dev(NULL, persist_enabled_on_companion))
+               return;
+
        /* Make sure the ports are powered */
        port = HCS_N_PORTS(ehci->hcs_params);
        while (port--) {