|
@@ -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;
|
|
|
|