> On Feb 5, 2020, at 19:22, Kai-Heng Feng <kai.heng.feng@xxxxxxxxxxxxx> wrote: > > 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. > > Signed-off-by: Kai-Heng Feng <kai.heng.feng@xxxxxxxxxxxxx> Please ignore this series. Some patches are missing changelog, will resend one. Kai-Heng > --- > v2: > - Remove some redundant debug messages. > - Use msleep loop outside if spinlock to stop pegging CPU. > > drivers/usb/host/xhci-hub.c | 11 ++++++++++- > 1 file changed, 10 insertions(+), 1 deletion(-) > > diff --git a/drivers/usb/host/xhci-hub.c b/drivers/usb/host/xhci-hub.c > index 7a3a29e5e9d2..d3c5bcf76755 100644 > --- a/drivers/usb/host/xhci-hub.c > +++ b/drivers/usb/host/xhci-hub.c > @@ -1313,7 +1313,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 = 10; > + > + while (retries--) { > + msleep(10); /* wait device to enter */ > + temp = readl(ports[wIndex]->addr); > + if ((temp & PORT_PLS_MASK) == XDEV_U3) > + break; > + } > + } > spin_lock_irqsave(&xhci->lock, flags); > > temp = readl(ports[wIndex]->addr); > -- > 2.17.1 >