Some HID devices have multiple interfaces. e.x. Keyboard + Mouse Keyboard + Mouse + Pointer. Cuurent(2.4.21pre5) code of usb hotplug supports the first interface only.
OKI/Fijitsu use this type of kerbaord. IBM Blade Center do USB emulation as PS2. And USB emulation has multiple interfaces.
Below are IBM Blade Center's devices.
T: Bus=01 Lev=02 Prnt=03 Port=02 Cnt=02 Dev#= 5 Spd=12 MxCh= 0 D: Ver= 1.10 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs= 1 P: Vendor=04b3 ProdID=4004 Rev= 0.01 S: Manufacturer=Cypress S: Product=HID K/M C:* #Ifs= 2 Cfg#= 1 Atr=e0 MxPwr= 0mA I: If#= 0 Alt= 0 #EPs= 1 Cls=03(HID ) Sub=01 Prot=01 Driver=hid <-- 1st E: Ad=81(I) Atr=03(Int.) MxPS= 8 Ivl=10ms I: If#= 1 Alt= 0 #EPs= 1 Cls=03(HID ) Sub=01 Prot=02 Driver=hid <-- 2nd. E: Ad=82(I) Atr=03(Int.) MxPS= 4 Ivl=10ms
As for blade server, keyboard which has multiple interfaces are often used. However, mouse dose not use with hotplug.
This patch activates hotplug in accordance with number of interface.
-- GO!
--- linux-2.4.21-pre5.orig/drivers/usb/usb.c 2003-03-03 13:02:39.000000000 +0900
+++ linux-2.4.21-pre5/drivers/usb/usb.c 2003-03-03 13:18:24.000000000 +0900
@@ -782,7 +782,7 @@
* cases, we know no other thread can recycle our address, since we must
* already have been serialized enough to prevent that.
*/
-static void call_policy (char *verb, struct usb_device *dev)
+static void call_policy_interface (char *verb, struct usb_device *dev, int interface)
{
char *argv [3], **envp, *buf, *scratch;
int i = 0, value;
@@ -861,20 +861,14 @@
dev->descriptor.bDeviceSubClass,
dev->descriptor.bDeviceProtocol) + 1;
if (dev->descriptor.bDeviceClass == 0) {
- int alt = dev->actconfig->interface [0].act_altsetting;
+ int alt = dev->actconfig->interface [interface].act_altsetting;
- /* a simple/common case: one config, one interface, one driver
- * with current altsetting being a reasonable setting.
- * everything needs a smart agent and usbdevfs; or can rely on
- * device-specific binding policies.
- */
envp [i++] = scratch;
scratch += sprintf (scratch, "INTERFACE=%d/%d/%d",
- dev->actconfig->interface [0].altsetting [alt].bInterfaceClass,
- dev->actconfig->interface [0].altsetting
[alt].bInterfaceSubClass,
- dev->actconfig->interface [0].altsetting
[alt].bInterfaceProtocol)
+ dev->actconfig->interface [interface].altsetting
[alt].bInterfaceClass,
+ dev->actconfig->interface [interface].altsetting
[alt].bInterfaceSubClass,
+ dev->actconfig->interface [interface].altsetting
[alt].bInterfaceProtocol)
+ 1;
- /* INTERFACE-0, INTERFACE-1, ... ? */
}
envp [i++] = 0;
/* assert: (scratch - buf) < sizeof buf */
@@ -889,6 +883,14 @@
dbg ("kusbd policy returned 0x%x", value);
}
+static void call_policy (char *verb, struct usb_device *dev)
+{
+ int i;
+ for (i = 0; i < dev->actconfig->bNumInterfaces; i++) {
+ call_policy_interface (verb, dev, i);
+ }
+}
+
#else
static inline void