[PATCH] USB: always export interface information for modalias
authorGreg Kroah-Hartman <gregkh@suse.de>
Tue, 21 Jun 2005 04:15:16 +0000 (21:15 -0700)
committerGreg Kroah-Hartman <gregkh@suse.de>
Fri, 28 Oct 2005 23:47:48 +0000 (16:47 -0700)
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
drivers/usb/core/usb.c

index eae413bf8c2aa4483d556e9f9068ac55568c7a9b..4bdbc9df6e03a599cea97892b34a7f14591bc3e7 100644 (file)
@@ -462,30 +462,23 @@ static ssize_t show_modalias(struct device *dev, struct device_attribute *attr,
 {
        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);
-
-       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");
-       }
+       alt = intf->cur_altsetting;
+
+       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);
 
index 2493e7d9f5b32a6a7c153bd7976c6e3976bbb5ea..4eca4904938fcb72bf25eb52a6babe10970c5d09 100644 (file)
@@ -569,6 +569,7 @@ static int usb_hotplug (struct device *dev, char **envp, int num_envp,
 {
        struct usb_interface *intf;
        struct usb_device *usb_dev;
+       struct usb_host_interface *alt;
        int i = 0;
        int length = 0;
 
@@ -585,7 +586,8 @@ static int usb_hotplug (struct device *dev, char **envp, int num_envp,
 
        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;
@@ -627,46 +629,27 @@ static int usb_hotplug (struct device *dev, char **envp, int num_envp,
                                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;