From f7d49a87f7d24ac26b1a75b2268f62da89d4e0ef Mon Sep 17 00:00:00 2001 From: Alan Stern Date: Thu, 8 Feb 2007 16:40:43 -0500 Subject: [PATCH] --- yaml --- r: 48751 b: refs/heads/master c: 3f141e2aed586c41c2666d49c70c1c1bbb6d6abd h: refs/heads/master i: 48749: bb740ccf2c545647ee0ed7328e8dc553a9f0dbc2 48747: c3056e49cac92b8e70b160fe458e3c9ba1a4ecf3 48743: d4ad60d5b157d0fa88b5d12d0f6e268b87a976a7 48735: 50bdc07228ad4d035b5681a245308f2589318da2 v: v3 --- [refs] | 2 +- trunk/drivers/usb/core/devio.c | 4 ++-- trunk/drivers/usb/core/generic.c | 2 +- trunk/drivers/usb/core/message.c | 22 ++++++++++++++++++---- trunk/drivers/usb/core/sysfs.c | 2 +- 5 files changed, 23 insertions(+), 9 deletions(-) diff --git a/[refs] b/[refs] index 558e6acffca6..05bc5d202f34 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: d1bbb60007597b920beca72cd0b413d10290310a +refs/heads/master: 3f141e2aed586c41c2666d49c70c1c1bbb6d6abd diff --git a/trunk/drivers/usb/core/devio.c b/trunk/drivers/usb/core/devio.c index 2087766f9e88..274f14f1633e 100644 --- a/trunk/drivers/usb/core/devio.c +++ b/trunk/drivers/usb/core/devio.c @@ -857,11 +857,11 @@ static int proc_setintf(struct dev_state *ps, void __user *arg) static int proc_setconfig(struct dev_state *ps, void __user *arg) { - unsigned int u; + int u; int status = 0; struct usb_host_config *actconfig; - if (get_user(u, (unsigned int __user *)arg)) + if (get_user(u, (int __user *)arg)) return -EFAULT; actconfig = ps->dev->actconfig; diff --git a/trunk/drivers/usb/core/generic.c b/trunk/drivers/usb/core/generic.c index b531a4fd30c2..9bbcb20e2d94 100644 --- a/trunk/drivers/usb/core/generic.c +++ b/trunk/drivers/usb/core/generic.c @@ -184,7 +184,7 @@ static void generic_disconnect(struct usb_device *udev) /* if this is only an unbind, not a physical disconnect, then * unconfigure the device */ if (udev->actconfig) - usb_set_configuration(udev, 0); + usb_set_configuration(udev, -1); usb_remove_sysfs_dev_files(udev); } diff --git a/trunk/drivers/usb/core/message.c b/trunk/drivers/usb/core/message.c index 8aca3574c2b5..74edaea5665d 100644 --- a/trunk/drivers/usb/core/message.c +++ b/trunk/drivers/usb/core/message.c @@ -1316,6 +1316,14 @@ static void release_interface(struct device *dev) * use this kind of configurability; many devices only have one * configuration. * + * @configuration is the value of the configuration to be installed. + * According to the USB spec (e.g. section 9.1.1.5), configuration values + * must be non-zero; a value of zero indicates that the device in + * unconfigured. However some devices erroneously use 0 as one of their + * configuration values. To help manage such devices, this routine will + * accept @configuration = -1 as indicating the device should be put in + * an unconfigured state. + * * USB device configurations may affect Linux interoperability, * power consumption and the functionality available. For example, * the default configuration is limited to using 100mA of bus power, @@ -1347,10 +1355,15 @@ int usb_set_configuration(struct usb_device *dev, int configuration) struct usb_interface **new_interfaces = NULL; int n, nintf; - for (i = 0; i < dev->descriptor.bNumConfigurations; i++) { - if (dev->config[i].desc.bConfigurationValue == configuration) { - cp = &dev->config[i]; - break; + if (configuration == -1) + configuration = 0; + else { + for (i = 0; i < dev->descriptor.bNumConfigurations; i++) { + if (dev->config[i].desc.bConfigurationValue == + configuration) { + cp = &dev->config[i]; + break; + } } } if ((!cp && configuration != 0)) @@ -1359,6 +1372,7 @@ int usb_set_configuration(struct usb_device *dev, int configuration) /* The USB spec says configuration 0 means unconfigured. * But if a device includes a configuration numbered 0, * we will accept it as a correctly configured state. + * Use -1 if you really want to unconfigure the device. */ if (cp && configuration == 0) dev_warn(&dev->dev, "config 0 descriptor??\n"); diff --git a/trunk/drivers/usb/core/sysfs.c b/trunk/drivers/usb/core/sysfs.c index 4eaa0ee8e72f..0edfbafd702c 100644 --- a/trunk/drivers/usb/core/sysfs.c +++ b/trunk/drivers/usb/core/sysfs.c @@ -63,7 +63,7 @@ set_bConfigurationValue(struct device *dev, struct device_attribute *attr, struct usb_device *udev = to_usb_device(dev); int config, value; - if (sscanf(buf, "%u", &config) != 1 || config > 255) + if (sscanf(buf, "%d", &config) != 1 || config < -1 || config > 255) return -EINVAL; usb_lock_device(udev); value = usb_set_configuration(udev, config);