From ca2a0bdcb5badab6b8fc7b752e7ab1963fb660dd Mon Sep 17 00:00:00 2001 From: Badhri Jagan Sridharan Date: Mon, 5 Oct 2015 13:04:03 -0700 Subject: [PATCH] adbd: Add os descriptor support for adb. Eventhough windows does not rely on extended os descriptor for adbd, when android usb device is configures as a composite device such as mtp+adb, windows discards the extended os descriptor even if one of the USB function fails to send the extended compat descriptor. This results in automatic install of MTP driverto fail when Android device is in "File Transfer" mode with adb enabled. https://msdn.microsoft.com/en-us/library/windows/hardware/gg463179.aspx BUG=24583401 BUG=chromium:43409 Change-Id: I87341683a9337848cac66daf9055b0d05cedd3d3 --- adb/usb_linux_client.cpp | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/adb/usb_linux_client.cpp b/adb/usb_linux_client.cpp index 817917e71..3495a71cc 100644 --- a/adb/usb_linux_client.cpp +++ b/adb/usb_linux_client.cpp @@ -88,8 +88,11 @@ struct desc_v2 { __le32 fs_count; __le32 hs_count; __le32 ss_count; + __le32 os_count; struct func_desc fs_descs, hs_descs; struct ss_func_desc ss_descs; + struct usb_os_desc_header os_header; + struct usb_ext_compat_desc os_desc; } __attribute__((packed)); static struct func_desc fs_descriptors = { @@ -181,6 +184,24 @@ static struct ss_func_desc ss_descriptors = { }, }; +struct usb_ext_compat_desc os_desc_compat = { + .bFirstInterfaceNumber = 0, + .Reserved1 = cpu_to_le32(1), + .CompatibleID = {0}, + .SubCompatibleID = {0}, + .Reserved2 = {0}, +}; + +static struct usb_os_desc_header os_desc_header = { + .interface = cpu_to_le32(1), + .dwLength = cpu_to_le32(sizeof(os_desc_header) + sizeof(os_desc_compat)), + .bcdVersion = cpu_to_le32(1), + .wIndex = cpu_to_le32(4), + .bCount = cpu_to_le32(1), + .Reserved = cpu_to_le32(0), +}; + + #define STR_INTERFACE_ "ADB Interface" static const struct { @@ -332,13 +353,16 @@ static void init_functionfs(struct usb_handle *h) v2_descriptor.header.magic = cpu_to_le32(FUNCTIONFS_DESCRIPTORS_MAGIC_V2); v2_descriptor.header.length = cpu_to_le32(sizeof(v2_descriptor)); v2_descriptor.header.flags = FUNCTIONFS_HAS_FS_DESC | FUNCTIONFS_HAS_HS_DESC | - FUNCTIONFS_HAS_SS_DESC; + FUNCTIONFS_HAS_SS_DESC | FUNCTIONFS_HAS_MS_OS_DESC; v2_descriptor.fs_count = 3; v2_descriptor.hs_count = 3; v2_descriptor.ss_count = 5; + v2_descriptor.os_count = 1; v2_descriptor.fs_descs = fs_descriptors; v2_descriptor.hs_descs = hs_descriptors; v2_descriptor.ss_descs = ss_descriptors; + v2_descriptor.os_header = os_desc_header; + v2_descriptor.os_desc = os_desc_compat; if (h->control < 0) { // might have already done this before D("OPENING %s", USB_FFS_ADB_EP0);