USB: gadget: acm,rndis: IAD class, subclass & prot should match 1st iface
authorJohn Michelau <john.michelau@motorola.com>
Fri, 10 Dec 2010 19:51:19 +0000 (13:51 -0600)
committerMike Lockwood <lockwood@android.com>
Sat, 11 Dec 2010 19:01:53 +0000 (11:01 -0800)
Microsoft recommends that the class and subclass fields of
an IAD match the same fields from the first interface in the
collection that the IAD is grouping. In practice, we are also
finding that the protocol fields should also match. Without
this change, the default Microsoft composite driver may not
group interfaces properly, which is what allows child
function drivers with IAD's to load correctly.

Signed-off-by: Mike Lockwood <lockwood@android.com>
drivers/usb/gadget/f_acm.c
drivers/usb/gadget/f_rndis.c

index 2d7fdcce310ddc9dd78ddf58e08edee0ccd14e62..cf2e7fc7659f4218c8c6852bfe888e25980a76e1 100644 (file)
@@ -112,7 +112,7 @@ acm_iad_descriptor = {
        .bInterfaceCount =      2,      // control + data
        .bFunctionClass =       USB_CLASS_COMM,
        .bFunctionSubClass =    USB_CDC_SUBCLASS_ACM,
-       .bFunctionProtocol =    USB_CDC_PROTO_NONE,
+       .bFunctionProtocol =    USB_CDC_ACM_PROTO_AT_V25TER,
        /* .iFunction =         DYNAMIC */
 };
 
index 2d9d97ecce2b617eb64852ebd51507a522e7187d..af60922d6713b1da4d7f49133a09c2b2ec06126f 100644 (file)
@@ -133,8 +133,8 @@ static struct usb_interface_descriptor rndis_control_intf = {
 #ifdef CONFIG_USB_ANDROID_RNDIS_WCEIS
        /* "Wireless" RNDIS; auto-detected by Windows */
        .bInterfaceClass =      USB_CLASS_WIRELESS_CONTROLLER,
-       .bInterfaceSubClass = 1,
-       .bInterfaceProtocol =   3,
+       .bInterfaceSubClass =   0x01,
+       .bInterfaceProtocol =   0x03,
 #else
        .bInterfaceClass =      USB_CLASS_COMM,
        .bInterfaceSubClass =   USB_CDC_SUBCLASS_ACM,
@@ -198,9 +198,16 @@ rndis_iad_descriptor = {
 
        .bFirstInterface =      0, /* XXX, hardcoded */
        .bInterfaceCount =      2,      // control + data
+#ifdef CONFIG_USB_ANDROID_RNDIS_WCEIS
+       /* "Wireless" RNDIS; auto-detected by Windows */
+       .bFunctionClass =       USB_CLASS_WIRELESS_CONTROLLER,
+       .bFunctionSubClass =    0x01,
+       .bFunctionProtocol =    0x03,
+#else
        .bFunctionClass =       USB_CLASS_COMM,
        .bFunctionSubClass =    USB_CDC_SUBCLASS_ETHERNET,
-       .bFunctionProtocol =    USB_CDC_PROTO_NONE,
+       .bFunctionProtocol =    USB_CDC_ACM_PROTO_VENDOR,
+#endif
        /* .iFunction = DYNAMIC */
 };