Patchwork [3.5.y.z,extended,stable] Patch "USB: hub: handle claim of enabled remote wakeup after reset" has been added to staging queue

mail settings
Submitter Herton Ronaldo Krzesinski
Date Jan. 23, 2013, 4:44 a.m.
Message ID <>
Download mbox | patch
Permalink /patch/214776/
State New
Headers show


Herton Ronaldo Krzesinski - Jan. 23, 2013, 4:44 a.m.
This is a note to let you know that I have just added a patch titled

    USB: hub: handle claim of enabled remote wakeup after reset

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 21c2d03c2b35f123359fb7580403559c88592761 Mon Sep 17 00:00:00 2001
From: Oliver Neukum <>
Date: Thu, 29 Nov 2012 15:05:57 +0100
Subject: [PATCH] USB: hub: handle claim of enabled remote wakeup after reset

commit 07e72b95f5038cc82304b9a4a2eb7f9fc391ea68 upstream.

Some touchscreens have buggy firmware which claims
remote wakeup to be enabled after a reset. They nevertheless
crash if the feature is cleared by the host.
Add a check for reset resume before checking for
an enabled remote wakeup feature. On compliant
devices the feature must be cleared after a reset anyway.

Signed-off-by: Oliver Neukum <>
Acked-by: Alan Stern <>
Signed-off-by: Greg Kroah-Hartman <>
Signed-off-by: Herton Ronaldo Krzesinski <>
 drivers/usb/core/hub.c |   10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)



diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
index 2532bdc..92c0229 100644
--- a/drivers/usb/core/hub.c
+++ b/drivers/usb/core/hub.c
@@ -2840,7 +2840,7 @@  int usb_port_suspend(struct usb_device *udev, pm_message_t msg)
 static int finish_port_resume(struct usb_device *udev)
 	int	status = 0;
-	u16	devstatus;
+	u16	devstatus = 0;

 	/* caller owns the udev device lock */
 	dev_dbg(&udev->dev, "%s\n",
@@ -2885,7 +2885,13 @@  static int finish_port_resume(struct usb_device *udev)
 	if (status) {
 		dev_dbg(&udev->dev, "gone after usb resume? status %d\n",
-	} else if (udev->actconfig) {
+	/*
+	 * There are a few quirky devices which violate the standard
+	 * by claiming to have remote wakeup enabled after a reset,
+	 * which crash if the feature is cleared, hence check for
+	 * udev->reset_resume
+	 */
+	} else if (udev->actconfig && !udev->reset_resume) {
 		if (devstatus & (1 << USB_DEVICE_REMOTE_WAKEUP)) {
 			status = usb_control_msg(udev,