| From 4d53c469cb044f05f9a798a2a5b150854f48dee5 Mon Sep 17 00:00:00 2001 |
| From: Mathias Nyman <mathias.nyman@linux.intel.com> |
| Date: Fri, 4 Oct 2019 14:59:29 +0300 |
| Subject: [PATCH] xhci: Fix USB 3.1 capability detection on early xHCI 1.1 spec |
| based hosts |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| commit 47f50d61076523e1a0d5a070062c2311320eeca8 upstream. |
| |
| Early xHCI 1.1 spec did not mention USB 3.1 capable hosts should set |
| sbrn to 0x31, or that the minor revision is a two digit BCD |
| containing minor and sub-minor numbers. |
| This was later clarified in xHCI 1.2. |
| |
| Some USB 3.1 capable hosts therefore have sbrn set to 0x30, or minor |
| revision set to 0x1 instead of 0x10. |
| |
| Detect the USB 3.1 capability correctly for these hosts as well |
| |
| Fixes: ddd57980a0fd ("xhci: detect USB 3.2 capable host controllers correctly") |
| Cc: <stable@vger.kernel.org> # v4.18+ |
| Cc: Loïc Yhuel <loic.yhuel@gmail.com> |
| Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com> |
| Link: https://lore.kernel.org/r/1570190373-30684-5-git-send-email-mathias.nyman@linux.intel.com |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c |
| index 402c103c9396..5ec5b27ee8a5 100644 |
| --- a/drivers/usb/host/xhci.c |
| +++ b/drivers/usb/host/xhci.c |
| @@ -5066,11 +5066,18 @@ int xhci_gen_setup(struct usb_hcd *hcd, xhci_get_quirks_t get_quirks) |
| hcd->has_tt = 1; |
| } else { |
| /* |
| - * Some 3.1 hosts return sbrn 0x30, use xhci supported protocol |
| - * minor revision instead of sbrn. Minor revision is a two digit |
| - * BCD containing minor and sub-minor numbers, only show minor. |
| + * Early xHCI 1.1 spec did not mention USB 3.1 capable hosts |
| + * should return 0x31 for sbrn, or that the minor revision |
| + * is a two digit BCD containig minor and sub-minor numbers. |
| + * This was later clarified in xHCI 1.2. |
| + * |
| + * Some USB 3.1 capable hosts therefore have sbrn 0x30, and |
| + * minor revision set to 0x1 instead of 0x10. |
| */ |
| - minor_rev = xhci->usb3_rhub.min_rev / 0x10; |
| + if (xhci->usb3_rhub.min_rev == 0x1) |
| + minor_rev = 1; |
| + else |
| + minor_rev = xhci->usb3_rhub.min_rev / 0x10; |
| |
| switch (minor_rev) { |
| case 2: |
| -- |
| 2.7.4 |
| |