From: Greg Kroah-Hartman Date: Tue, 8 Nov 2005 18:02:41 +0000 (-0800) Subject: added usb alias patch to queue X-Git-Tag: v2.6.14.1~3 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=a9b28df305816a8f59a524dab4e53e9e847f45b6;p=thirdparty%2Fkernel%2Fstable-queue.git added usb alias patch to queue --- diff --git a/queue/series b/queue/series index 3f81cf89179..6e1bfa38e8b 100644 --- a/queue/series +++ b/queue/series @@ -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 index 00000000000..63855153d09 --- /dev/null +++ b/queue/usb-interface-modalias-fix.patch @@ -0,0 +1,151 @@ +From: Greg Kroah-Hartman +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 + +--- + 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; +