Sergei Shtylyov wrote: > Hello! > > On 02.02.2021 6:42, Thinh Nguyen wrote: > >> Some hosts incorrectly use sub-minor version for minor version (i.e. >> 0x02 instead of 0x20 for bcdUSB 0x320 and 0x01 for bcdUSB 0x310). >> Currently the xHCI driver works around this by just checking for minor >> revision > 0x01 for USB 3.1 everywhere. With the addition of USB 3.2, >> checking this gets a bit cumbersome. Since there is no USB release with >> bcdUSB 0x301 to 0x309, we can assume that sub-minor version 01 to 09 is >> incorrect. Let's try to fix this and use the minor revision that matches >> with the USB/xHCI spec to help with the version checking within the >> driver. >> >> Signed-off-by: Thinh Nguyen <Thinh.Nguyen@xxxxxxxxxxxx> >> --- >> drivers/usb/host/xhci-mem.c | 9 +++++++++ >> 1 file changed, 9 insertions(+) >> >> diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c >> index f2c4ee7c4786..34105b477c62 100644 >> --- a/drivers/usb/host/xhci-mem.c >> +++ b/drivers/usb/host/xhci-mem.c >> @@ -2129,6 +2129,15 @@ static void xhci_add_in_port(struct xhci_hcd >> *xhci, unsigned int num_ports, >> if (major_revision == 0x03) { >> rhub = &xhci->usb3_rhub; >> + /* >> + * Some hosts incorrectly use sub-minor version for minor >> + * version (i.e. 0x02 instead of 0x20 for bcdUSB 0x320 and 0x01 >> + * for bcdUSB 0x310). Since there is no USB release with sub >> + * minor version 0x301 to 0x309, we can assume that they are >> + * incorrect and fix it here. >> + */ >> + if (!(minor_revision & 0xf0) && (minor_revision & 0x0f)) >> + minor_revision = minor_revision << 4; > > Why not: > > minor_revision <<= 4; > > [...] > > MBR, Sergei Sure, we can do that. Thanks, Thinh