| From linux-usb-devel-admin@lists.sourceforge.net Fri Oct 28 20:19:30 2005 |
| Date: Fri, 28 Oct 2005 20:09:17 -0700 |
| From: Greg Kroah-Hartman <gregkh@suse.de> |
| Subject: USB: always export interface information for modalias |
| |
| This fixes a problem with some cdc acm devices that were not getting |
| automatically loaded as the module alias was not being reported |
| properly. |
| |
| This check was for back in the days when we only reported hotplug events |
| for the main usb device, not the interfaces. We should always give the |
| interface information for MODALIAS/modalias as it can be needed. |
| |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/usb/core/sysfs.c | 33 +++++++++--------------- |
| drivers/usb/core/usb.c | 63 +++++++++++++++++------------------------------ |
| 2 files changed, 36 insertions(+), 60 deletions(-) |
| |
| --- linux-2.6.14.1.orig/drivers/usb/core/sysfs.c |
| +++ linux-2.6.14.1/drivers/usb/core/sysfs.c |
| @@ -292,30 +292,23 @@ static ssize_t show_modalias(struct devi |
| { |
| struct usb_interface *intf; |
| struct usb_device *udev; |
| - int len; |
| + struct usb_host_interface *alt; |
| |
| intf = to_usb_interface(dev); |
| udev = interface_to_usbdev(intf); |
| + alt = intf->cur_altsetting; |
| |
| - len = sprintf(buf, "usb:v%04Xp%04Xd%04Xdc%02Xdsc%02Xdp%02Xic", |
| - le16_to_cpu(udev->descriptor.idVendor), |
| - le16_to_cpu(udev->descriptor.idProduct), |
| - le16_to_cpu(udev->descriptor.bcdDevice), |
| - udev->descriptor.bDeviceClass, |
| - udev->descriptor.bDeviceSubClass, |
| - udev->descriptor.bDeviceProtocol); |
| - buf += len; |
| - |
| - if (udev->descriptor.bDeviceClass == 0) { |
| - struct usb_host_interface *alt = intf->cur_altsetting; |
| - |
| - return len + sprintf(buf, "%02Xisc%02Xip%02X\n", |
| - alt->desc.bInterfaceClass, |
| - alt->desc.bInterfaceSubClass, |
| - alt->desc.bInterfaceProtocol); |
| - } else { |
| - return len + sprintf(buf, "*isc*ip*\n"); |
| - } |
| + return sprintf(buf, "usb:v%04Xp%04Xd%04Xdc%02Xdsc%02Xdp%02X" |
| + "ic%02Xisc%02Xip%02X\n", |
| + le16_to_cpu(udev->descriptor.idVendor), |
| + le16_to_cpu(udev->descriptor.idProduct), |
| + le16_to_cpu(udev->descriptor.bcdDevice), |
| + udev->descriptor.bDeviceClass, |
| + udev->descriptor.bDeviceSubClass, |
| + udev->descriptor.bDeviceProtocol, |
| + alt->desc.bInterfaceClass, |
| + alt->desc.bInterfaceSubClass, |
| + alt->desc.bInterfaceProtocol); |
| } |
| static DEVICE_ATTR(modalias, S_IRUGO, show_modalias, NULL); |
| |
| --- linux-2.6.14.1.orig/drivers/usb/core/usb.c |
| +++ linux-2.6.14.1/drivers/usb/core/usb.c |
| @@ -557,6 +557,7 @@ static int usb_hotplug (struct device *d |
| { |
| struct usb_interface *intf; |
| struct usb_device *usb_dev; |
| + struct usb_host_interface *alt; |
| int i = 0; |
| int length = 0; |
| |
| @@ -573,7 +574,8 @@ static int usb_hotplug (struct device *d |
| |
| intf = to_usb_interface(dev); |
| usb_dev = interface_to_usbdev (intf); |
| - |
| + alt = intf->cur_altsetting; |
| + |
| if (usb_dev->devnum < 0) { |
| pr_debug ("usb %s: already deleted?\n", dev->bus_id); |
| return -ENODEV; |
| @@ -615,46 +617,27 @@ static int usb_hotplug (struct device *d |
| usb_dev->descriptor.bDeviceProtocol)) |
| return -ENOMEM; |
| |
| - if (usb_dev->descriptor.bDeviceClass == 0) { |
| - struct usb_host_interface *alt = intf->cur_altsetting; |
| + if (add_hotplug_env_var(envp, num_envp, &i, |
| + buffer, buffer_size, &length, |
| + "INTERFACE=%d/%d/%d", |
| + alt->desc.bInterfaceClass, |
| + alt->desc.bInterfaceSubClass, |
| + alt->desc.bInterfaceProtocol)) |
| + return -ENOMEM; |
| |
| - /* 2.4 only exposed interface zero. in 2.5, hotplug |
| - * agents are called for all interfaces, and can use |
| - * $DEVPATH/bInterfaceNumber if necessary. |
| - */ |
| - if (add_hotplug_env_var(envp, num_envp, &i, |
| - buffer, buffer_size, &length, |
| - "INTERFACE=%d/%d/%d", |
| - alt->desc.bInterfaceClass, |
| - alt->desc.bInterfaceSubClass, |
| - alt->desc.bInterfaceProtocol)) |
| - return -ENOMEM; |
| - |
| - if (add_hotplug_env_var(envp, num_envp, &i, |
| - buffer, buffer_size, &length, |
| - "MODALIAS=usb:v%04Xp%04Xd%04Xdc%02Xdsc%02Xdp%02Xic%02Xisc%02Xip%02X", |
| - le16_to_cpu(usb_dev->descriptor.idVendor), |
| - le16_to_cpu(usb_dev->descriptor.idProduct), |
| - le16_to_cpu(usb_dev->descriptor.bcdDevice), |
| - usb_dev->descriptor.bDeviceClass, |
| - usb_dev->descriptor.bDeviceSubClass, |
| - usb_dev->descriptor.bDeviceProtocol, |
| - alt->desc.bInterfaceClass, |
| - alt->desc.bInterfaceSubClass, |
| - alt->desc.bInterfaceProtocol)) |
| - return -ENOMEM; |
| - } else { |
| - if (add_hotplug_env_var(envp, num_envp, &i, |
| - buffer, buffer_size, &length, |
| - "MODALIAS=usb:v%04Xp%04Xd%04Xdc%02Xdsc%02Xdp%02Xic*isc*ip*", |
| - le16_to_cpu(usb_dev->descriptor.idVendor), |
| - le16_to_cpu(usb_dev->descriptor.idProduct), |
| - le16_to_cpu(usb_dev->descriptor.bcdDevice), |
| - usb_dev->descriptor.bDeviceClass, |
| - usb_dev->descriptor.bDeviceSubClass, |
| - usb_dev->descriptor.bDeviceProtocol)) |
| - return -ENOMEM; |
| - } |
| + if (add_hotplug_env_var(envp, num_envp, &i, |
| + buffer, buffer_size, &length, |
| + "MODALIAS=usb:v%04Xp%04Xd%04Xdc%02Xdsc%02Xdp%02Xic%02Xisc%02Xip%02X", |
| + le16_to_cpu(usb_dev->descriptor.idVendor), |
| + le16_to_cpu(usb_dev->descriptor.idProduct), |
| + le16_to_cpu(usb_dev->descriptor.bcdDevice), |
| + usb_dev->descriptor.bDeviceClass, |
| + usb_dev->descriptor.bDeviceSubClass, |
| + usb_dev->descriptor.bDeviceProtocol, |
| + alt->desc.bInterfaceClass, |
| + alt->desc.bInterfaceSubClass, |
| + alt->desc.bInterfaceProtocol)) |
| + return -ENOMEM; |
| |
| envp[i] = NULL; |
| |