Commit 7521803d authored by Greg Kroah-Hartman's avatar Greg Kroah-Hartman

[PATCH] 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: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 17a882fc
...@@ -462,30 +462,23 @@ static ssize_t show_modalias(struct device *dev, struct device_attribute *attr, ...@@ -462,30 +462,23 @@ static ssize_t show_modalias(struct device *dev, struct device_attribute *attr,
{ {
struct usb_interface *intf; struct usb_interface *intf;
struct usb_device *udev; struct usb_device *udev;
int len; struct usb_host_interface *alt;
intf = to_usb_interface(dev); intf = to_usb_interface(dev);
udev = interface_to_usbdev(intf); 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), return sprintf(buf, "usb:v%04Xp%04Xd%04Xdc%02Xdsc%02Xdp%02X"
le16_to_cpu(udev->descriptor.idProduct), "ic%02Xisc%02Xip%02X\n",
le16_to_cpu(udev->descriptor.bcdDevice), le16_to_cpu(udev->descriptor.idVendor),
udev->descriptor.bDeviceClass, le16_to_cpu(udev->descriptor.idProduct),
udev->descriptor.bDeviceSubClass, le16_to_cpu(udev->descriptor.bcdDevice),
udev->descriptor.bDeviceProtocol); udev->descriptor.bDeviceClass,
buf += len; udev->descriptor.bDeviceSubClass,
udev->descriptor.bDeviceProtocol,
if (udev->descriptor.bDeviceClass == 0) { alt->desc.bInterfaceClass,
struct usb_host_interface *alt = intf->cur_altsetting; alt->desc.bInterfaceSubClass,
alt->desc.bInterfaceProtocol);
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");
}
} }
static DEVICE_ATTR(modalias, S_IRUGO, show_modalias, NULL); static DEVICE_ATTR(modalias, S_IRUGO, show_modalias, NULL);
......
...@@ -569,6 +569,7 @@ static int usb_hotplug (struct device *dev, char **envp, int num_envp, ...@@ -569,6 +569,7 @@ static int usb_hotplug (struct device *dev, char **envp, int num_envp,
{ {
struct usb_interface *intf; struct usb_interface *intf;
struct usb_device *usb_dev; struct usb_device *usb_dev;
struct usb_host_interface *alt;
int i = 0; int i = 0;
int length = 0; int length = 0;
...@@ -585,7 +586,8 @@ static int usb_hotplug (struct device *dev, char **envp, int num_envp, ...@@ -585,7 +586,8 @@ static int usb_hotplug (struct device *dev, char **envp, int num_envp,
intf = to_usb_interface(dev); intf = to_usb_interface(dev);
usb_dev = interface_to_usbdev (intf); usb_dev = interface_to_usbdev (intf);
alt = intf->cur_altsetting;
if (usb_dev->devnum < 0) { if (usb_dev->devnum < 0) {
pr_debug ("usb %s: already deleted?\n", dev->bus_id); pr_debug ("usb %s: already deleted?\n", dev->bus_id);
return -ENODEV; return -ENODEV;
...@@ -627,46 +629,27 @@ static int usb_hotplug (struct device *dev, char **envp, int num_envp, ...@@ -627,46 +629,27 @@ static int usb_hotplug (struct device *dev, char **envp, int num_envp,
usb_dev->descriptor.bDeviceProtocol)) usb_dev->descriptor.bDeviceProtocol))
return -ENOMEM; return -ENOMEM;
if (usb_dev->descriptor.bDeviceClass == 0) { if (add_hotplug_env_var(envp, num_envp, &i,
struct usb_host_interface *alt = intf->cur_altsetting; 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 if (add_hotplug_env_var(envp, num_envp, &i,
* agents are called for all interfaces, and can use buffer, buffer_size, &length,
* $DEVPATH/bInterfaceNumber if necessary. "MODALIAS=usb:v%04Xp%04Xd%04Xdc%02Xdsc%02Xdp%02Xic%02Xisc%02Xip%02X",
*/ le16_to_cpu(usb_dev->descriptor.idVendor),
if (add_hotplug_env_var(envp, num_envp, &i, le16_to_cpu(usb_dev->descriptor.idProduct),
buffer, buffer_size, &length, le16_to_cpu(usb_dev->descriptor.bcdDevice),
"INTERFACE=%d/%d/%d", usb_dev->descriptor.bDeviceClass,
alt->desc.bInterfaceClass, usb_dev->descriptor.bDeviceSubClass,
alt->desc.bInterfaceSubClass, usb_dev->descriptor.bDeviceProtocol,
alt->desc.bInterfaceProtocol)) alt->desc.bInterfaceClass,
return -ENOMEM; alt->desc.bInterfaceSubClass,
alt->desc.bInterfaceProtocol))
if (add_hotplug_env_var(envp, num_envp, &i, return -ENOMEM;
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;
}
envp[i] = NULL; envp[i] = NULL;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment