Commit 6bc6cff52e0c4c4c876b1b8a5750041da61ad42b

Authored by Alan Stern
Committed by Greg Kroah-Hartman
1 parent 383975d765

USB: add RESET_RESUME device quirk

This patch (as888) adds a new USB device quirk for devices which are
unable to resume correctly.  By using the new code added for the
USB-persist facility, it is a simple matter to reset these devices
instead of resuming them.  To get things kicked off, a quirk entry is
added for the Philips PSC805.

Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

Showing 4 changed files with 15 additions and 0 deletions Side-by-side Diff

drivers/usb/core/driver.c
... ... @@ -24,6 +24,7 @@
24 24  
25 25 #include <linux/device.h>
26 26 #include <linux/usb.h>
  27 +#include <linux/usb/quirks.h>
27 28 #include <linux/workqueue.h>
28 29 #include "hcd.h"
29 30 #include "usb.h"
... ... @@ -834,6 +835,9 @@
834 835 status = -ENOTCONN;
835 836 goto done;
836 837 }
  838 +
  839 + if (udev->quirks & USB_QUIRK_RESET_RESUME)
  840 + udev->reset_resume = 1;
837 841  
838 842 udriver = to_usb_device_driver(udev->dev.driver);
839 843 status = udriver->resume(udev);
drivers/usb/core/hub.c
... ... @@ -2939,6 +2939,11 @@
2939 2939 * this from a driver probe() routine after downloading new firmware.
2940 2940 * For calls that might not occur during probe(), drivers should lock
2941 2941 * the device using usb_lock_device_for_reset().
  2942 + *
  2943 + * Locking exception: This routine may also be called from within an
  2944 + * autoresume handler. Such usage won't conflict with other tasks
  2945 + * holding the device lock because these tasks should always call
  2946 + * usb_autopm_resume_device(), thereby preventing any unwanted autoresume.
2942 2947 */
2943 2948 int usb_reset_device(struct usb_device *udev)
2944 2949 {
drivers/usb/core/quirks.c
... ... @@ -35,6 +35,9 @@
35 35 /* Elsa MicroLink 56k (V.250) */
36 36 { USB_DEVICE(0x05cc, 0x2267), .driver_info = USB_QUIRK_NO_AUTOSUSPEND },
37 37  
  38 + /* Philips PSC805 audio device */
  39 + { USB_DEVICE(0x0471, 0x0155), .driver_info = USB_QUIRK_RESET_RESUME },
  40 +
38 41 { } /* terminating entry must be last */
39 42 };
40 43  
include/linux/usb/quirks.h
... ... @@ -9,4 +9,7 @@
9 9  
10 10 /* string descriptors must not be fetched using a 255-byte read */
11 11 #define USB_QUIRK_STRING_FETCH_255 0x00000002
  12 +
  13 +/* device can't resume correctly so reset it instead */
  14 +#define USB_QUIRK_RESET_RESUME 0x00000004