xhci: Ensure link state is U3 after setting USB_SS_PORT_LS_U3
The xHCI spec doesn't specify the upper bound of U3 transition time. For some devices 20ms is not enough, so we need to make sure the link state is in U3 before further actions. I've tried to use U3 Entry Capability by setting U3 Entry Enable in config register, however the port change event for U3 transition interrupts the system suspend process. For now let's use the less ideal method by polling PLS. [use usleep_range(), and shorten the delay time while polling -Mathias] Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com> Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com> Link: https://lore.kernel.org/r/20200312144517.1593-7-mathias.nyman@linux.intel.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
cbb23d5572
commit
eb002726fa
|
@ -1324,7 +1324,16 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
|
|||
xhci_set_link_state(xhci, ports[wIndex], link_state);
|
||||
|
||||
spin_unlock_irqrestore(&xhci->lock, flags);
|
||||
msleep(20); /* wait device to enter */
|
||||
if (link_state == USB_SS_PORT_LS_U3) {
|
||||
int retries = 16;
|
||||
|
||||
while (retries--) {
|
||||
usleep_range(4000, 8000);
|
||||
temp = readl(ports[wIndex]->addr);
|
||||
if ((temp & PORT_PLS_MASK) == XDEV_U3)
|
||||
break;
|
||||
}
|
||||
}
|
||||
spin_lock_irqsave(&xhci->lock, flags);
|
||||
|
||||
temp = readl(ports[wIndex]->addr);
|
||||
|
|
Loading…
Reference in New Issue