diff options
author | Alan Stern <stern@rowland.harvard.edu> | 2007-03-27 13:33:59 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2007-04-27 16:28:39 -0400 |
commit | 1941044aa9632aa8debbb94a3c8a5ed0ebddade8 (patch) | |
tree | ea885677876b793a26cf684eca6f8639478eb222 /drivers/usb/core/hub.c | |
parent | 38c3cb5b677cf551cd93a494dc5c551271d90ac1 (diff) |
USB: add "last_busy" field for use in autosuspend
This patch (as877) adds a "last_busy" field to struct usb_device, for
use by the autosuspend framework. Now if an autosuspend call comes at
a time when the device isn't busy but hasn't yet been idle for long
enough, the timer can be set to exactly the desired value. And we
will be ready to handle things like HID drivers, which can't maintain
a useful usage count and must rely on the time-of-last-use to decide
when to autosuspend.
The patch also makes some related minor improvements:
Move the calls to the autosuspend condition-checking routine
into usb_suspend_both(), which is the only place where it
really matters.
If the autosuspend timer is already running, don't stop
and restart it.
Replace immediate returns with gotos so that the optional
debugging ouput won't be bypassed.
If autoresume is disabled but the device is already awake,
don't return an error for an autoresume call.
Don't try to autoresume a device if it isn't suspended.
(Yes, this undercuts the previous change -- so sue me.)
Don't duplicate existing code in the autosuspend work routine.
Fix the kerneldoc in usb_autopm_put_interface(): If an
autoresume call fails, the usage counter is left unchanged.
Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/usb/core/hub.c')
-rw-r--r-- | drivers/usb/core/hub.c | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index 2a0b15e42bc..bde29ab2b50 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c | |||
@@ -1859,6 +1859,7 @@ static int remote_wakeup(struct usb_device *udev) | |||
1859 | usb_lock_device(udev); | 1859 | usb_lock_device(udev); |
1860 | if (udev->state == USB_STATE_SUSPENDED) { | 1860 | if (udev->state == USB_STATE_SUSPENDED) { |
1861 | dev_dbg(&udev->dev, "usb %sresume\n", "wakeup-"); | 1861 | dev_dbg(&udev->dev, "usb %sresume\n", "wakeup-"); |
1862 | usb_mark_last_busy(udev); | ||
1862 | status = usb_external_resume_device(udev); | 1863 | status = usb_external_resume_device(udev); |
1863 | } | 1864 | } |
1864 | usb_unlock_device(udev); | 1865 | usb_unlock_device(udev); |