Skip to content

Commit

Permalink
USB: obey the sysfs power/wakeup setting
Browse files Browse the repository at this point in the history
This patch (as1403) is a partial reversion of an earlier change
(commit 5f677f1 "USB: fix remote
wakeup settings during system sleep").  After hearing from a user, I
realized that remote wakeup should be enabled during system sleep
whenever userspace allows it, and not only if a driver requests it
too.

Indeed, there could be a device with no driver, that does nothing but
generate a wakeup request when the user presses a button.  Such a
device should be allowed to do its job.

The problem fixed by the earlier patch -- device generating a wakeup
request for no reason, causing system suspend to abort -- was also
addressed by a later patch ("USB: don't enable remote wakeup by
default", accepted but not yet merged into mainline).  The device
won't be able to generate the bogus wakeup requests because it will be
disabled for remote wakeup by default.  Hence this reversion will not
re-introduce any old problems.

Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
Cc: stable <stable@kernel.org> [.34]
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
  • Loading branch information
Alan Stern authored and Greg Kroah-Hartman committed Jun 30, 2010
1 parent 03ab746 commit 4882662
Showing 1 changed file with 3 additions and 10 deletions.
13 changes: 3 additions & 10 deletions drivers/usb/core/driver.c
Original file line number Diff line number Diff line change
Expand Up @@ -1272,8 +1272,7 @@ static int usb_resume_both(struct usb_device *udev, pm_message_t msg)

static void choose_wakeup(struct usb_device *udev, pm_message_t msg)
{
int w, i;
struct usb_interface *intf;
int w;

/* Remote wakeup is needed only when we actually go to sleep.
* For things like FREEZE and QUIESCE, if the device is already
Expand All @@ -1285,16 +1284,10 @@ static void choose_wakeup(struct usb_device *udev, pm_message_t msg)
return;
}

/* If remote wakeup is permitted, see whether any interface drivers
/* Enable remote wakeup if it is allowed, even if no interface drivers
* actually want it.
*/
w = 0;
if (device_may_wakeup(&udev->dev) && udev->actconfig) {
for (i = 0; i < udev->actconfig->desc.bNumInterfaces; i++) {
intf = udev->actconfig->interface[i];
w |= intf->needs_remote_wakeup;
}
}
w = device_may_wakeup(&udev->dev);

/* If the device is autosuspended with the wrong wakeup setting,
* autoresume now so the setting can be changed.
Expand Down

0 comments on commit 4882662

Please sign in to comment.