aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/core/driver.c
diff options
context:
space:
mode:
authorAlan Stern <stern@rowland.harvard.edu>2007-02-20 15:00:53 -0500
committerGreg Kroah-Hartman <gregkh@suse.de>2007-02-23 18:03:46 -0500
commitb5e795f8df42936590ba9c606edc715fe3593284 (patch)
treeed0f132edc4d050407c4ba0b4582f167db86ba72 /drivers/usb/core/driver.c
parentaa084f3efe5fb7e9c0d5b54ce704f0de69bbf27c (diff)
USB: make autosuspend delay a module parameter
This patch (as859) makes the default USB autosuspend delay a module parameter of usbcore. By setting the delay value at boot time, users will be able to prevent the system from autosuspending devices which for some reason can't handle it. The patch also stores the autosuspend delay as a per-device value. A later patch will allow the user to change the value, tailoring the delay for each individual device. A delay value of 0 will prevent autosuspend. Signed-off-by: Alan Stern <stern@rowland.harvard.edu> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/usb/core/driver.c')
-rw-r--r--drivers/usb/core/driver.c16
1 files changed, 10 insertions, 6 deletions
diff --git a/drivers/usb/core/driver.c b/drivers/usb/core/driver.c
index f9196a0a9412..a420d72a0254 100644
--- a/drivers/usb/core/driver.c
+++ b/drivers/usb/core/driver.c
@@ -963,12 +963,16 @@ static int autosuspend_check(struct usb_device *udev)
963 int i; 963 int i;
964 struct usb_interface *intf; 964 struct usb_interface *intf;
965 965
966 /* For autosuspend, fail fast if anything is in use. 966 /* For autosuspend, fail fast if anything is in use or autosuspend
967 * Also fail if any interfaces require remote wakeup but it 967 * is disabled. Also fail if any interfaces require remote wakeup
968 * isn't available. */ 968 * but it isn't available.
969 */
969 udev->do_remote_wakeup = device_may_wakeup(&udev->dev); 970 udev->do_remote_wakeup = device_may_wakeup(&udev->dev);
970 if (udev->pm_usage_cnt > 0) 971 if (udev->pm_usage_cnt > 0)
971 return -EBUSY; 972 return -EBUSY;
973 if (!udev->autosuspend_delay)
974 return -EPERM;
975
972 if (udev->actconfig) { 976 if (udev->actconfig) {
973 for (i = 0; i < udev->actconfig->desc.bNumInterfaces; i++) { 977 for (i = 0; i < udev->actconfig->desc.bNumInterfaces; i++) {
974 intf = udev->actconfig->interface[i]; 978 intf = udev->actconfig->interface[i];
@@ -991,7 +995,7 @@ static int autosuspend_check(struct usb_device *udev)
991 995
992#define autosuspend_check(udev) 0 996#define autosuspend_check(udev) 0
993 997
994#endif 998#endif /* CONFIG_USB_SUSPEND */
995 999
996/** 1000/**
997 * usb_suspend_both - suspend a USB device and its interfaces 1001 * usb_suspend_both - suspend a USB device and its interfaces
@@ -1186,7 +1190,7 @@ static int usb_autopm_do_device(struct usb_device *udev, int inc_usage_cnt)
1186 udev->pm_usage_cnt -= inc_usage_cnt; 1190 udev->pm_usage_cnt -= inc_usage_cnt;
1187 } else if (inc_usage_cnt <= 0 && autosuspend_check(udev) == 0) 1191 } else if (inc_usage_cnt <= 0 && autosuspend_check(udev) == 0)
1188 queue_delayed_work(ksuspend_usb_wq, &udev->autosuspend, 1192 queue_delayed_work(ksuspend_usb_wq, &udev->autosuspend,
1189 USB_AUTOSUSPEND_DELAY); 1193 udev->autosuspend_delay);
1190 usb_pm_unlock(udev); 1194 usb_pm_unlock(udev);
1191 return status; 1195 return status;
1192} 1196}
@@ -1270,7 +1274,7 @@ static int usb_autopm_do_interface(struct usb_interface *intf,
1270 intf->pm_usage_cnt -= inc_usage_cnt; 1274 intf->pm_usage_cnt -= inc_usage_cnt;
1271 } else if (inc_usage_cnt <= 0 && autosuspend_check(udev) == 0) 1275 } else if (inc_usage_cnt <= 0 && autosuspend_check(udev) == 0)
1272 queue_delayed_work(ksuspend_usb_wq, &udev->autosuspend, 1276 queue_delayed_work(ksuspend_usb_wq, &udev->autosuspend,
1273 USB_AUTOSUSPEND_DELAY); 1277 udev->autosuspend_delay);
1274 } 1278 }
1275 usb_pm_unlock(udev); 1279 usb_pm_unlock(udev);
1276 return status; 1280 return status;