Commit 527101ce authored by Alan Stern's avatar Alan Stern Committed by Greg Kroah-Hartman

USB: don't lose mode switch events on suspended devices

This patch (as1268) changes the way usbcore handles child devices that
undergo a disconnection and reconnection while the parent hub is
suspended.  Currently, if the child isn't enabled for remote wakeup we
leave it alone, figuring that it will go through a reset-resume when
somebody tries to use it.

However this isn't a good approach if the reason for the disconnection
is that the child decided to switch modes or in some other way alter
its descriptors.  In that case we want to re-enumerate it as soon as
possible, not wait until somebody forces a reset-resume.

To resolve the issue, this patch treats reconnected suspended child
devices as though they had requested a remote wakeup, even if they
weren't enabled for it.  The mode switch or descriptor change will be
detected during the reset part of the reset-resume, and the device
will be re-enumerated immediately.

The disadvantage of this change is that it will cause autosuspended
devices to be resumed when the computer wakes up from a system sleep
during which the root hub was reset or lost power.  This shouldn't
matter much; some people would even argue that autosuspended devices
should _always_ be resumed when the system wakes up!
Signed-off-by: default avatarAlan Stern <stern@rowland.harvard.edu>
Tested-by: default avatar"Yang Fei-AFY095" <fei.yang@motorola.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 25118084
...@@ -2932,14 +2932,7 @@ static void hub_port_connect_change(struct usb_hub *hub, int port1, ...@@ -2932,14 +2932,7 @@ static void hub_port_connect_change(struct usb_hub *hub, int port1,
/* For a suspended device, treat this as a /* For a suspended device, treat this as a
* remote wakeup event. * remote wakeup event.
*/ */
if (udev->do_remote_wakeup) status = remote_wakeup(udev);
status = remote_wakeup(udev);
/* Otherwise leave it be; devices can't tell the
* difference between suspended and disabled.
*/
else
status = 0;
#endif #endif
} else { } else {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment