blob: a9ef7f2e49e96d96d3b094910636200b357659b6 [file] [log] [blame]
From 6374f26c8953a55ef0012cf8b6ca7219d9eb4255 Mon Sep 17 00:00:00 2001
From: Mathias Nyman <mathias.nyman@linux.intel.com>
Date: Mon, 14 Sep 2015 16:11:49 +0300
Subject: [PATCH] lsusb: Allocate the BOS descriptor buffer dynamically
We can't use a static size for the BOS descritpor anymore as the
SuperSpeedPlus USB device capability descriptor of USB 3.1 devices
varies in size depending on how many Sublink Speed Attributes it supports.
Total size is reported in the first 5 bytes of the standard BOS descriptor
Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
---
lsusb.c | 35 +++++++++++++++++++----------------
1 file changed, 19 insertions(+), 16 deletions(-)
diff --git a/lsusb.c b/lsusb.c
index a6ba96d..92415c7 100644
--- a/lsusb.c
+++ b/lsusb.c
@@ -3736,11 +3736,13 @@ static void dump_container_id_device_capability_desc(unsigned char *buf)
static void dump_bos_descriptor(libusb_device_handle *fd)
{
- /* Total for all known BOS descriptors is 43 bytes:
- * 6 bytes for Wireless USB, 7 bytes for USB 2.0 extension,
- * 10 bytes for SuperSpeed, 20 bytes for Container ID.
+ /* Total length of BOS descriptors varies.
+ * Read first static 5 bytes which include the total length before
+ * allocating and readig the full BOS
*/
- unsigned char bos_desc[43];
+
+ unsigned char bos_desc_static[5];
+ unsigned char *bos_desc;
unsigned int bos_desc_size;
int size, ret;
unsigned char *buf;
@@ -3750,32 +3752,31 @@ static void dump_bos_descriptor(libusb_device_handle *fd)
LIBUSB_ENDPOINT_IN | LIBUSB_RECIPIENT_DEVICE,
LIBUSB_REQUEST_GET_DESCRIPTOR,
USB_DT_BOS << 8, 0,
- bos_desc, 5, CTRL_TIMEOUT);
+ bos_desc_static, 5, CTRL_TIMEOUT);
if (ret <= 0)
return;
- else if (bos_desc[0] != 5 || bos_desc[1] != USB_DT_BOS)
+ else if (bos_desc_static[0] != 5 || bos_desc_static[1] != USB_DT_BOS)
return;
- bos_desc_size = bos_desc[2] + (bos_desc[3] << 8);
+ bos_desc_size = bos_desc_static[2] + (bos_desc_static[3] << 8);
printf("Binary Object Store Descriptor:\n"
" bLength %5u\n"
" bDescriptorType %5u\n"
" wTotalLength %5u\n"
" bNumDeviceCaps %5u\n",
- bos_desc[0], bos_desc[1],
- bos_desc_size, bos_desc[4]);
+ bos_desc_static[0], bos_desc_static[1],
+ bos_desc_size, bos_desc_static[4]);
if (bos_desc_size <= 5) {
- if (bos_desc[4] > 0)
+ if (bos_desc_static[4] > 0)
fprintf(stderr, "Couldn't get "
"device capability descriptors\n");
return;
}
- if (bos_desc_size > sizeof bos_desc) {
- fprintf(stderr, "FIXME: alloc bigger buffer for "
- "device capability descriptors\n");
+ bos_desc = malloc(bos_desc_size);
+ if (!bos_desc)
return;
- }
+ memset(bos_desc, 0, bos_desc_size);
ret = usb_control_msg(fd,
LIBUSB_ENDPOINT_IN | LIBUSB_RECIPIENT_DEVICE,
@@ -3784,7 +3785,7 @@ static void dump_bos_descriptor(libusb_device_handle *fd)
bos_desc, bos_desc_size, CTRL_TIMEOUT);
if (ret < 0) {
fprintf(stderr, "Couldn't get device capability descriptors\n");
- return;
+ goto out;
}
size = bos_desc_size - 5;
@@ -3793,7 +3794,7 @@ static void dump_bos_descriptor(libusb_device_handle *fd)
while (size >= 3) {
if (buf[0] < 3) {
printf("buf[0] = %u\n", buf[0]);
- return;
+ goto out;
}
switch (buf[2]) {
case USB_DC_WIRELESS_USB:
@@ -3816,6 +3817,8 @@ static void dump_bos_descriptor(libusb_device_handle *fd)
size -= buf[0];
buf += buf[0];
}
+out:
+ free(bos_desc);
}
static void dumpdev(libusb_device *dev)
--
2.17.1