From 902afa1bc1c9b53649daa234db0bbda4882f0136 Mon Sep 17 00:00:00 2001 From: Alan Stern Date: Fri, 8 Jan 2010 12:57:02 -0500 Subject: [PATCH] --- yaml --- r: 185321 b: refs/heads/master c: 5899f1e020c8d53b2b6fbd6a6cf39c891ccdfade h: refs/heads/master i: 185319: 86e7b0d63839a9fab3d614c8860f5d1482d05f6a v: v3 --- [refs] | 2 +- trunk/drivers/usb/core/quirks.c | 10 ++++++++++ trunk/drivers/usb/core/sysfs.c | 22 +++++++++++++++++----- 3 files changed, 28 insertions(+), 6 deletions(-) diff --git a/[refs] b/[refs] index d555bbfb2540..2d7ef4914220 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 088f7fec8a0e683db72fd8826c5d3ab914e197b1 +refs/heads/master: 5899f1e020c8d53b2b6fbd6a6cf39c891ccdfade diff --git a/trunk/drivers/usb/core/quirks.c b/trunk/drivers/usb/core/quirks.c index 4314f259524b..f073c5cb4e7b 100644 --- a/trunk/drivers/usb/core/quirks.c +++ b/trunk/drivers/usb/core/quirks.c @@ -103,11 +103,21 @@ void usb_detect_quirks(struct usb_device *udev) dev_dbg(&udev->dev, "USB quirks for this device: %x\n", udev->quirks); +#ifdef CONFIG_USB_SUSPEND + /* By default, disable autosuspend for all devices. The hub driver * will enable it for hubs. */ usb_disable_autosuspend(udev); + /* Autosuspend can also be disabled if the initial autosuspend_delay + * is negative. + */ + if (udev->autosuspend_delay < 0) + usb_autoresume_device(udev); + +#endif + /* For the present, all devices default to USB-PERSIST enabled */ #if 0 /* was: #ifdef CONFIG_PM */ /* Hubs are automatically enabled for USB-PERSIST */ diff --git a/trunk/drivers/usb/core/sysfs.c b/trunk/drivers/usb/core/sysfs.c index 313e241f5ccc..43c002e3a9aa 100644 --- a/trunk/drivers/usb/core/sysfs.c +++ b/trunk/drivers/usb/core/sysfs.c @@ -346,7 +346,8 @@ set_autosuspend(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct usb_device *udev = to_usb_device(dev); - int value; + int value, old_delay; + int rc; if (sscanf(buf, "%d", &value) != 1 || value >= INT_MAX/HZ || value <= - INT_MAX/HZ) @@ -354,13 +355,24 @@ set_autosuspend(struct device *dev, struct device_attribute *attr, value *= HZ; usb_lock_device(udev); + old_delay = udev->autosuspend_delay; udev->autosuspend_delay = value; - if (value >= 0) - usb_try_autosuspend_device(udev); - else { - if (usb_autoresume_device(udev) == 0) + + if (old_delay < 0) { /* Autosuspend wasn't allowed */ + if (value >= 0) usb_autosuspend_device(udev); + } else { /* Autosuspend was allowed */ + if (value < 0) { + rc = usb_autoresume_device(udev); + if (rc < 0) { + count = rc; + udev->autosuspend_delay = old_delay; + } + } else { + usb_try_autosuspend_device(udev); + } } + usb_unlock_device(udev); return count; }