diff options
author | Jack Pham <jackp@codeaurora.org> | 2015-06-02 10:36:43 -0700 |
---|---|---|
committer | Andrew Bresticker <abrestic@google.com> | 2015-08-24 18:03:03 +0000 |
commit | 47c3ce56edec14592d08f6f157a7aa354e74a4e0 (patch) | |
tree | c3df0d71905638bee59932e28b4bd08d6f930815 /adb/usb_linux_client.cpp | |
parent | 77e27d8c2a44a3a06c4fb9c12acc6a2169918bb0 (diff) | |
download | system_core-47c3ce56edec14592d08f6f157a7aa354e74a4e0.zip system_core-47c3ce56edec14592d08f6f157a7aa354e74a4e0.tar.gz system_core-47c3ce56edec14592d08f6f157a7aa354e74a4e0.tar.bz2 |
adbd: enable USB SuperSpeed (again)
The descriptors to enable USB 3.0 SuperSpeed support had previously
been added in commit d6ee9f26a5163af4121f4380264fcbd4e6851a17
but were removed when the v1/v2 descriptor handling was refactored
in commits ab3446dd3400652ecf50682d0e5c4184628e9930 and again in
c49f51c451516bf06afc6d71947eb11cc4627273. Now that the dust has
settled, add back the SS descriptors to re-enable USB 3.0.
Bug: 23385314
Change-Id: I8de7c7e50d9216a7492ce7863e3aaf92ff805eff
(cherry picked from commit a190c800bf562c2fd2fb113782ff83c1d475ea61)
Diffstat (limited to 'adb/usb_linux_client.cpp')
-rw-r--r-- | adb/usb_linux_client.cpp | 50 |
1 files changed, 49 insertions, 1 deletions
diff --git a/adb/usb_linux_client.cpp b/adb/usb_linux_client.cpp index 18289e2..f3db346 100644 --- a/adb/usb_linux_client.cpp +++ b/adb/usb_linux_client.cpp @@ -64,6 +64,14 @@ struct func_desc { struct usb_endpoint_descriptor_no_audio sink; } __attribute__((packed)); +struct ss_func_desc { + struct usb_interface_descriptor intf; + struct usb_endpoint_descriptor_no_audio source; + struct usb_ss_ep_comp_descriptor source_comp; + struct usb_endpoint_descriptor_no_audio sink; + struct usb_ss_ep_comp_descriptor sink_comp; +} __attribute__((packed)); + struct desc_v1 { struct usb_functionfs_descs_head_v1 { __le32 magic; @@ -79,7 +87,9 @@ struct desc_v2 { // The rest of the structure depends on the flags in the header. __le32 fs_count; __le32 hs_count; + __le32 ss_count; struct func_desc fs_descs, hs_descs; + struct ss_func_desc ss_descs; } __attribute__((packed)); struct func_desc fs_descriptors = { @@ -136,6 +146,41 @@ struct func_desc hs_descriptors = { }, }; +static struct ss_func_desc ss_descriptors = { + .intf = { + .bLength = sizeof(ss_descriptors.intf), + .bDescriptorType = USB_DT_INTERFACE, + .bInterfaceNumber = 0, + .bNumEndpoints = 2, + .bInterfaceClass = ADB_CLASS, + .bInterfaceSubClass = ADB_SUBCLASS, + .bInterfaceProtocol = ADB_PROTOCOL, + .iInterface = 1, /* first string from the provided table */ + }, + .source = { + .bLength = sizeof(ss_descriptors.source), + .bDescriptorType = USB_DT_ENDPOINT, + .bEndpointAddress = 1 | USB_DIR_OUT, + .bmAttributes = USB_ENDPOINT_XFER_BULK, + .wMaxPacketSize = MAX_PACKET_SIZE_SS, + }, + .source_comp = { + .bLength = sizeof(ss_descriptors.source_comp), + .bDescriptorType = USB_DT_SS_ENDPOINT_COMP, + }, + .sink = { + .bLength = sizeof(ss_descriptors.sink), + .bDescriptorType = USB_DT_ENDPOINT, + .bEndpointAddress = 2 | USB_DIR_IN, + .bmAttributes = USB_ENDPOINT_XFER_BULK, + .wMaxPacketSize = MAX_PACKET_SIZE_SS, + }, + .sink_comp = { + .bLength = sizeof(ss_descriptors.sink_comp), + .bDescriptorType = USB_DT_SS_ENDPOINT_COMP, + }, +}; + #define STR_INTERFACE_ "ADB Interface" static const struct { @@ -279,11 +324,14 @@ 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; + v2_descriptor.header.flags = FUNCTIONFS_HAS_FS_DESC | FUNCTIONFS_HAS_HS_DESC | + FUNCTIONFS_HAS_SS_DESC; v2_descriptor.fs_count = 3; v2_descriptor.hs_count = 3; + v2_descriptor.ss_count = 5; v2_descriptor.fs_descs = fs_descriptors; v2_descriptor.hs_descs = hs_descriptors; + v2_descriptor.ss_descs = ss_descriptors; if (h->control < 0) { // might have already done this before D("OPENING %s\n", USB_FFS_ADB_EP0); |