[PATCH] lsusb: Fix USB 3.0 link state reporting.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



The math in the link status reporting is wrong.  The link state is in
bits 8:5 of the hub port status word, which is split across a char
array.  Currently, if the link state is 0xb (Loopback mode), the status
char array will look something like this:

status[0] = 0110 0000
status[1] = 0000 0001

The current math will mask and shift those bits like so:

(status[0] & 0xe0) >> 5 = 0000 0011
(status[1] & 0x1) << 4 =  0001 0000

This sets link_state to 0x13, which is not correct (it should be 0xb).
This bug will cause valid link states greater than seven (Recovery, Hot
Reset, Compliance Mode, and Loopback Mode) to not be printed.

It's important to correctly report Compliance Mode, since some TI USB
3.0 host controllers can get "stuck" in Compliance Mode.

Fix this by left shifting status[1] by 3, not 4.

Signed-off-by: Sarah Sharp <sarah.a.sharp@xxxxxxxxxxxxxxx>
---
 lsusb.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/lsusb.c b/lsusb.c
index 106dd33..5f0df11 100644
--- a/lsusb.c
+++ b/lsusb.c
@@ -3276,7 +3276,7 @@ static void do_hub(libusb_device_handle *fd, unsigned tt_type, unsigned speed)
 					(status[0] & 0x01) ? " connect" : "");
 		} else {
 			link_state = ((status[0] & 0xe0) >> 5) +
-				((status[1] & 0x1) << 4);
+				((status[1] & 0x1) << 3);
 			printf("%s%s%s%s%s%s",
 					(status[2] & 0x80) ? " C_CONFIG_ERROR" : "",
 					(status[2] & 0x40) ? " C_LINK_STATE" : "",
-- 
1.7.9

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux