]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
added usb alias patch to queue
authorGreg Kroah-Hartman <gregkh@suse.de>
Tue, 8 Nov 2005 18:02:41 +0000 (10:02 -0800)
committerGreg Kroah-Hartman <gregkh@suse.de>
Tue, 8 Nov 2005 18:02:41 +0000 (10:02 -0800)
queue/series
queue/usb-interface-modalias-fix.patch [new file with mode: 0644]

index 3f81cf89179a7ddabc97776fbdd3ba9ff44f508d..6e1bfa38e8b002f97d8d98d33c81ce26bce5dffb 100644 (file)
@@ -2,3 +2,4 @@ prism54_frame_size.patch
 xfs-modular-quota-build-fix.patch
 4GB-memory-intel-dual-core.patch
 cfq-io-sched-fix.patch
+usb-interface-modalias-fix.patch
diff --git a/queue/usb-interface-modalias-fix.patch b/queue/usb-interface-modalias-fix.patch
new file mode 100644 (file)
index 0000000..6385515
--- /dev/null
@@ -0,0 +1,151 @@
+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(-)
+
+--- gregkh-2.6.orig/drivers/usb/core/sysfs.c
++++ gregkh-2.6/drivers/usb/core/sysfs.c
+@@ -462,30 +462,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);
+--- gregkh-2.6.orig/drivers/usb/core/usb.c
++++ gregkh-2.6/drivers/usb/core/usb.c
+@@ -569,6 +569,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;
+@@ -585,7 +586,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;
+@@ -627,46 +629,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;