summaryrefslogtreecommitdiffstats
path: root/adb
diff options
context:
space:
mode:
authorJack Pham <jackp@codeaurora.org>2015-06-02 10:36:43 -0700
committerLinux Build Service Account <lnxbuild@localhost>2015-10-06 03:22:36 -0600
commit4ebedb957f55a36f39dde4a9bf10a886b69630db (patch)
tree51e5cb4d74c7f4bf0607af4b323e4d332b8d2441 /adb
parent22abdc3934cc255a136ba7050c0aa49cb0a0f9ba (diff)
downloadsystem_core-4ebedb957f55a36f39dde4a9bf10a886b69630db.zip
system_core-4ebedb957f55a36f39dde4a9bf10a886b69630db.tar.gz
system_core-4ebedb957f55a36f39dde4a9bf10a886b69630db.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. Change-Id: I8de7c7e50d9216a7492ce7863e3aaf92ff805eff
Diffstat (limited to 'adb')
-rw-r--r--adb/usb_linux_client.cpp50
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);