diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index d459bea0c44f..b69e8201a197 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c @@ -3568,7 +3568,9 @@ int usb_port_resume(struct usb_device *udev, pm_message_t msg) /* drive resume for USB_RESUME_TIMEOUT msec */ dev_dbg(&udev->dev, "usb %sresume\n", (PMSG_IS_AUTO(msg) ? "auto-" : "")); - msleep(USB_RESUME_TIMEOUT); + if (udev->parent != udev->bus->root_hub) + usleep_range(USB_RESUME_TIMEOUT * 1000, + (USB_RESUME_TIMEOUT + 1) * 1000); /* Virtual root hubs can trigger on GET_PORT_STATUS to * stop resume signaling. Then finish the resume @@ -3577,7 +3579,7 @@ int usb_port_resume(struct usb_device *udev, pm_message_t msg) status = hub_port_status(hub, port1, &portstatus, &portchange); /* TRSMRCY = 10 msec */ - msleep(10); + usleep_range(10000, 10500); } SuspendCleared: diff --git a/include/linux/usb.h b/include/linux/usb.h index a39eb4f608fe..1c5a14eea213 100644 --- a/include/linux/usb.h +++ b/include/linux/usb.h @@ -309,7 +309,7 @@ void usb_put_intf(struct usb_interface *intf); * should cope with both LPJ calibration errors and devices not following every * detail of the USB Specification. */ -#define USB_RESUME_TIMEOUT 40 /* ms */ +#define USB_RESUME_TIMEOUT 20 /* ms */ /** * struct usb_interface_cache - long-term representation of a device interface