Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Alan Stern and committed by
Greg Kroah-Hartman
6bc6cff5 383975d7

+15
+4
drivers/usb/core/driver.c
··· 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" ··· 835 834 status = -ENOTCONN; 836 835 goto done; 837 836 } 837 + 838 + if (udev->quirks & USB_QUIRK_RESET_RESUME) 839 + udev->reset_resume = 1; 838 840 839 841 udriver = to_usb_device_driver(udev->dev.driver); 840 842 status = udriver->resume(udev);
+5
drivers/usb/core/hub.c
··· 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 {
+3
drivers/usb/core/quirks.c
··· 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
+3
include/linux/usb/quirks.h
··· 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