device.  This is useful to ensure auto probing won't
                match the driver to the device.  For example:
                # echo "046d c315" > /sys/bus/usb/drivers/foo/remove_id
+
+What:          /sys/bus/usb/device/.../avoid_reset
+Date:          December 2009
+Contact:       Oliver Neukum <oliver@neukum.org>
+Description:
+               Writing 1 to this file tells the kernel that this
+               device will morph into another mode when it is reset.
+               Drivers will not use reset for error handling for
+               such devices.
+Users:
+               usb_modeswitch
 
 }
 static DEVICE_ATTR(quirks, S_IRUGO, show_quirks, NULL);
 
+static ssize_t
+show_avoid_reset_quirk(struct device *dev, struct device_attribute *attr, char *buf)
+{
+       struct usb_device *udev;
+
+       udev = to_usb_device(dev);
+       return sprintf(buf, "%d\n", !!(udev->quirks & USB_QUIRK_RESET_MORPHS));
+}
+
+static ssize_t
+set_avoid_reset_quirk(struct device *dev, struct device_attribute *attr,
+               const char *buf, size_t count)
+{
+       struct usb_device       *udev = to_usb_device(dev);
+       int                     config;
+
+       if (sscanf(buf, "%d", &config) != 1 || config < 0 || config > 1)
+               return -EINVAL;
+       usb_lock_device(udev);
+       if (config)
+               udev->quirks |= USB_QUIRK_RESET_MORPHS;
+       else
+               udev->quirks &= ~USB_QUIRK_RESET_MORPHS;
+       usb_unlock_device(udev);
+       return count;
+}
+
+static DEVICE_ATTR(avoid_reset_quirk, S_IRUGO | S_IWUSR,
+               show_avoid_reset_quirk, set_avoid_reset_quirk);
+
 static ssize_t
 show_urbnum(struct device *dev, struct device_attribute *attr, char *buf)
 {
        &dev_attr_version.attr,
        &dev_attr_maxchild.attr,
        &dev_attr_quirks.attr,
+       &dev_attr_avoid_reset_quirk.attr,
        &dev_attr_authorized.attr,
        &dev_attr_remove.attr,
        NULL,