Patchwork [3.5.y.z,extended,stable] Patch "USB: EHCI: fix timer bug affecting port resume" has been added to staging queue

mail settings
Submitter Herton Ronaldo Krzesinski
Date Feb. 12, 2013, 9:17 p.m.
Message ID <>
Download mbox | patch
Permalink /patch/219959/
State New
Headers show


Herton Ronaldo Krzesinski - Feb. 12, 2013, 9:17 p.m.
This is a note to let you know that I have just added a patch titled

    USB: EHCI: fix timer bug affecting port resume

to the linux-3.5.y-queue branch of the 3.5.y.z extended stable tree 
which can be found at:;a=shortlog;h=refs/heads/linux-3.5.y-queue

If you, or anyone else, feels it should not be added to this tree, please 
reply to this email.

For more information about the 3.5.y.z tree, see



From 1aaccca64540fae77592f881506f7590e26b4874 Mon Sep 17 00:00:00 2001
From: Alan Stern <>
Date: Fri, 25 Jan 2013 17:17:43 -0500
Subject: [PATCH] USB: EHCI: fix timer bug affecting port resume

commit ee74290b7853db9d5fd64db70e5c175241c59fba upstream.

This patch (as1652) fixes a long-standing bug in ehci-hcd.  The driver
relies on status polls to know when to stop port-resume signalling.
It uses the root-hub status timer to schedule these status polls.  But
when the driver for the root hub is resumed, the timer is rescheduled
to go off immediately -- before the port is ready.  When this happens
the timer does not get re-enabled, which prevents the port resume from
finishing until some other event occurs.

The symptom is that when a new device is plugged in, it doesn't get
recognized or enumerated until lsusb is run or something else happens.

The solution is to re-enable the root-hub status timer after every
status poll while a port resume is in progress.

This bug hasn't surfaced before now because we never used to try to
suspend the root hub in the middle of a port resume (except by

Signed-off-by: Alan Stern <>
Reported-and-tested-by: Norbert Preining <>
Tested-by: Ming Lei <>
Signed-off-by: Greg Kroah-Hartman <>
Signed-off-by: Herton Ronaldo Krzesinski <>
 drivers/usb/host/ehci-hub.c |    6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)



diff --git a/drivers/usb/host/ehci-hub.c b/drivers/usb/host/ehci-hub.c
index fc9e7cc..349d3fe 100644
--- a/drivers/usb/host/ehci-hub.c
+++ b/drivers/usb/host/ehci-hub.c
@@ -613,7 +613,11 @@  ehci_hub_status_data (struct usb_hcd *hcd, char *buf)
 			status = STS_PCD;
-	/* FIXME autosuspend idle root hubs */
+	/* If a resume is in progress, make sure it can finish */
+	if (ehci->resuming_ports)
+		mod_timer(&hcd->rh_timer, jiffies + msecs_to_jiffies(25));
 	spin_unlock_irqrestore (&ehci->lock, flags);
 	return status ? retval : 0;