lkml.org 
[lkml]   [2005]   [Nov]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[patch 04/11] USB: always export interface information for modalias
    From: Greg Kroah-Hartman <gregkh@suse.de>

    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;

    --
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2005-11-09 19:43    [W:0.026 / U:60.660 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site