From: Alan Stern Date: Wed, 28 Jul 2010 21:12:39 +0000 (-0400) Subject: USB: usb-storage: implement autosuspend X-Git-Tag: Ubuntu-5.0.0-8.9~22119^2~17 X-Git-Url: https://git.proxmox.com/?a=commitdiff_plain;h=f283925fe9ef4ee75dc43e4c2bfbbd6b8a70bd0a;p=mirror_ubuntu-disco-kernel.git USB: usb-storage: implement autosuspend This patch (as1400) adds runtime-PM support to usb-storage. It utilizes the SCSI layer's runtime-PM implementation, so its scope is limited. Currently the only effect is that disk-like devices (such as card readers or flash drives) will be autosuspended if they aren't mounted and their device files aren't open. This would apply, for example, to card readers that don't contain a memory card. Unfortunately this won't interact very well with the removable-media polling normally carried out by hal or DeviceKit. Maybe those programs can be changed to use a longer polling interval, or maybe the default autosuspend time for usb-storage should be set to something below 1 second. Signed-off-by: Alan Stern Cc: James Bottomley Cc: Matthew Dharm Signed-off-by: Greg Kroah-Hartman --- diff --git a/drivers/usb/storage/usb.c b/drivers/usb/storage/usb.c index a7d0bf9d92a7..90bb0175a152 100644 --- a/drivers/usb/storage/usb.c +++ b/drivers/usb/storage/usb.c @@ -336,6 +336,7 @@ static int usb_stor_control_thread(void * __us) else { US_DEBUG(usb_stor_show_command(us->srb)); us->proto_handler(us->srb, us); + usb_mark_last_busy(us->pusb_dev); } /* lock access to the state */ @@ -845,6 +846,7 @@ static int usb_stor_scan_thread(void * __us) /* Should we unbind if no devices were detected? */ } + usb_autopm_put_interface(us->pusb_intf); complete_and_exit(&us->scanning_done, 0); } @@ -968,6 +970,7 @@ int usb_stor_probe2(struct us_data *us) goto BadDevice; } + usb_autopm_get_interface_no_resume(us->pusb_intf); wake_up_process(th); return 0; @@ -1040,6 +1043,7 @@ static struct usb_driver usb_storage_driver = { .pre_reset = usb_stor_pre_reset, .post_reset = usb_stor_post_reset, .id_table = usb_storage_usb_ids, + .supports_autosuspend = 1, .soft_unbind = 1, };