]> git.baikalelectronics.ru Git - kernel.git/commitdiff
xhci: Fix USB 3.1 enumeration issues by increasing roothub power-on-good delay
authorMathias Nyman <mathias.nyman@linux.intel.com>
Fri, 5 Nov 2021 16:00:36 +0000 (18:00 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 6 Nov 2021 14:41:03 +0000 (15:41 +0100)
Some USB 3.1 enumeration issues were reported after the hub driver removed
the minimum 100ms limit for the power-on-good delay.

Since commit db4a0c5c49a6 ("usb: core: reduce power-on-good delay time of
root hub") the hub driver sets the power-on-delay based on the
bPwrOn2PwrGood value in the hub descriptor.

xhci driver has a 20ms bPwrOn2PwrGood value for both roothubs based
on xhci spec section 5.4.8, but it's clearly not enough for the
USB 3.1 devices, causing enumeration issues.

Tests indicate full 100ms delay is needed.

Reported-by: Walt Jr. Brake <mr.yming81@gmail.com>
Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
Fixes: db4a0c5c49a6 ("usb: core: reduce power-on-good delay time of root hub")
Cc: stable <stable@vger.kernel.org>
Link: https://lore.kernel.org/r/20211105160036.549516-1-mathias.nyman@linux.intel.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/host/xhci-hub.c

index a3f875eea751928dfcd189ff854d2f4bb0bc2f45..af946c42b6f0a0be25b948a0d0f6b5daf7e1a97b 100644 (file)
@@ -257,7 +257,6 @@ static void xhci_common_hub_descriptor(struct xhci_hcd *xhci,
 {
        u16 temp;
 
-       desc->bPwrOn2PwrGood = 10;      /* xhci section 5.4.9 says 20ms max */
        desc->bHubContrCurrent = 0;
 
        desc->bNbrPorts = ports;
@@ -292,6 +291,7 @@ static void xhci_usb2_hub_descriptor(struct usb_hcd *hcd, struct xhci_hcd *xhci,
        desc->bDescriptorType = USB_DT_HUB;
        temp = 1 + (ports / 8);
        desc->bDescLength = USB_DT_HUB_NONVAR_SIZE + 2 * temp;
+       desc->bPwrOn2PwrGood = 10;      /* xhci section 5.4.8 says 20ms */
 
        /* The Device Removable bits are reported on a byte granularity.
         * If the port doesn't exist within that byte, the bit is set to 0.
@@ -344,6 +344,7 @@ static void xhci_usb3_hub_descriptor(struct usb_hcd *hcd, struct xhci_hcd *xhci,
        xhci_common_hub_descriptor(xhci, desc, ports);
        desc->bDescriptorType = USB_DT_SS_HUB;
        desc->bDescLength = USB_DT_SS_HUB_SIZE;
+       desc->bPwrOn2PwrGood = 50;      /* usb 3.1 may fail if less than 100ms */
 
        /* header decode latency should be zero for roothubs,
         * see section 4.23.5.2.