blob: f51887dc02c52f51ec79ab9d98ec75852f56f97f [file] [log] [blame]
From 99f5d4b260f4e58749780acea8c176717db3d87c Mon Sep 17 00:00:00 2001
From: Mathias Nyman <mathias.nyman@linux.intel.com>
Date: Mon, 14 Sep 2015 16:20:07 +0300
Subject: [PATCH 1/7] lsusb: Add support for the USB 3.1 SuperSpeedPlus device
capability desc
USB 3.1 devices have a SuperSpeedPlus USB device capability descriptor
as part of the BOS descritptor. It if exists then show this content
togeter with the rest of the BOS descriptor.
A sample output looks like:
SuperSpeedPlus USB Device Capability:
bLength 20
bDescriptorType 16
bDevCapabilityType 10
bmAttributes 0x00000001
Sublink Speed Attribute count 1
Sublink Speed ID count 0
wFunctionalitySupport 0x1100
bmSublinkSpeedAttr[0] 0x000a4030
Speed attr ID: 0 10Gb/s Symmetric RX SuperSpeedPlus
bmSublinkSpeedAttr[1] 0x000a40b0
Speed attr ID: 0 10Gb/s Symmetric TX SuperSpeedPlus
Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
(cherry picked from commit 21d0d7a58947a5d9b48682711a45b87aa85c33a8)
---
lsusb.c | 40 ++++++++++++++++++++++++++++++++++++++++
1 file changed, 40 insertions(+)
diff --git a/lsusb.c b/lsusb.c
index 620eccc..1eadcf8 100644
--- a/lsusb.c
+++ b/lsusb.c
@@ -69,6 +69,7 @@
#define USB_DC_20_EXTENSION 0x02
#define USB_DC_SUPERSPEED 0x03
#define USB_DC_CONTAINER_ID 0x04
+#define USB_DC_SUPERSPEEDPLUS 0x0a
/* Conventional codes for class-specific descriptors. The convention is
* defined in the USB "Common Class" Spec (3.11). Individual class specs
@@ -3695,6 +3696,42 @@ static void dump_ss_device_capability_desc(unsigned char *buf)
printf(" bU2DevExitLat %8u micro seconds\n", buf[8] + (buf[9] << 8));
}
+static void dump_ssp_device_capability_desc(unsigned char *buf)
+{
+ int i;
+ unsigned int bm_attr, ss_attr;
+ char bitrate_prefix[] = " KMG";
+
+ if (buf[0] < 12) {
+ printf(" Bad SuperSpeedPlus USB Device Capability descriptor.\n");
+ return;
+ }
+
+ bm_attr = convert_le_u32(buf + 4);
+ printf(" SuperSpeedPlus USB Device Capability:\n"
+ " bLength %5u\n"
+ " bDescriptorType %5u\n"
+ " bDevCapabilityType %5u\n"
+ " bmAttributes 0x%08x\n",
+ buf[0], buf[1], buf[2], bm_attr);
+
+ printf(" Sublink Speed Attribute count %u\n", buf[4] & 0x1f);
+ printf(" Sublink Speed ID count %u\n", (bm_attr >> 5) & 0xf);
+ printf(" wFunctionalitySupport 0x%02x%02x\n", buf[9], buf[8]);
+
+ for (i = 0; i <= (buf[4] & 0x1f); i++) {
+ ss_attr = convert_le_u32(buf + 12 + (i * 4));
+ printf(" bmSublinkSpeedAttr[%u] 0x%08x\n", i, ss_attr);
+ printf(" Speed Attribute ID: %u %u%cb/s %s %s SuperSpeed%s\n",
+ ss_attr & 0x0f,
+ ss_attr >> 16,
+ (bitrate_prefix[((ss_attr >> 4) & 0x3)]),
+ (ss_attr & 0x40)? "Asymmetric" : "Symmetric",
+ (ss_attr & 0x80)? "TX" : "RX",
+ (ss_attr & 0x4000)? "Plus": "" );
+ }
+}
+
static void dump_container_id_device_capability_desc(unsigned char *buf)
{
if (buf[0] < 20) {
@@ -3782,6 +3819,9 @@ static void dump_bos_descriptor(libusb_device_handle *fd)
case USB_DC_SUPERSPEED:
dump_ss_device_capability_desc(buf);
break;
+ case USB_DC_SUPERSPEEDPLUS:
+ dump_ssp_device_capability_desc(buf);
+ break;
case USB_DC_CONTAINER_ID:
dump_container_id_device_capability_desc(buf);
break;
--
2.12.2