From d4f748eefb6867cd83b8c9d28b819de215857a51 Mon Sep 17 00:00:00 2001 From: Hemant Kumar Date: Tue, 8 Nov 2016 15:42:13 -0800 Subject: [PATCH 1/2] usb: core: Replace msleep with usleep_range Since usleep_range provides better accuracy in comparison to msleep. This helps in reducing the latency of host bus resume. Change-Id: Ie8d5231327fcc27ab2a28542e0d96687abb9aace Signed-off-by: Hemant Kumar Signed-off-by: Pratham Pratap --- drivers/usb/core/hub.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index d459bea0c44f..f9742293ce2b 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c @@ -3568,7 +3568,8 @@ 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); + 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 +3578,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: From 9b04395cecc6a8edec5085cfd90b19c194f9203f Mon Sep 17 00:00:00 2001 From: Pratham Pratap Date: Wed, 20 Jan 2021 01:20:10 +0530 Subject: [PATCH 2/2] usb: core: Reduce resume signalling time for devices behind external hub Squashing commit 28f110a27130("usb: core: Add support to skip extended bus resume delay") and e97aab2199f3("usb: core: Drive resume for 20ms for devices behind external hub") with few modifications. This change removes extra 40ms delay upon bus resume for the exteral hub and reduce the resume signalling time from 40ms to 20ms for devices behind the external hub(s). Skipping extra delay reduces over all bus resume latency. Change-Id: I948626bbaae0c78553543347a1c7d5b8168c08cd Signed-off-by: Pratham Pratap --- drivers/usb/core/hub.c | 5 +++-- include/linux/usb.h | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index f9742293ce2b..b69e8201a197 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c @@ -3568,8 +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-" : "")); - usleep_range(USB_RESUME_TIMEOUT * 1000, - (USB_RESUME_TIMEOUT + 1) * 1000); + 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 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