X-Git-Url: http://git.cascardo.eti.br/?a=blobdiff_plain;f=drivers%2Fusb%2Fhost%2Fehci-hub.c;h=4adfe771c51823aaaa1d2c283ff9a004386843a7;hb=2b2443e0c7e4dc5fa47f3e67026293d908aee227;hp=71f98081844ff362dcad5d9cec7d2b1f44723e73;hpb=7ecb1cc1462ef33a4cbfd62e14ebc6efc18635f6;p=cascardo%2Flinux.git diff --git a/drivers/usb/host/ehci-hub.c b/drivers/usb/host/ehci-hub.c index 71f98081844f..4adfe771c518 100644 --- a/drivers/usb/host/ehci-hub.c +++ b/drivers/usb/host/ehci-hub.c @@ -42,6 +42,13 @@ 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 +63,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; + /* Give the connections some time to appear */ msleep(20);