From 4ebedb957f55a36f39dde4a9bf10a886b69630db Mon Sep 17 00:00:00 2001 From: Jack Pham Date: Tue, 2 Jun 2015 10:36:43 -0700 Subject: 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. Change-Id: I8de7c7e50d9216a7492ce7863e3aaf92ff805eff --- adb/usb_linux_client.cpp | 50 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) (limited to 'adb') 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); -- cgit v1.1