On Fri, Jan 17, 2014 at 02:48:55PM -0800, Sarah Sharp wrote: > Sergey, can you test whether this fixes your issue? And if it works, please send me the output of `sudo lsusb -v` with the AgeStar dock plugged in. Your last lsusb output didn't include it. Sarah Sharp > 8<----------------------------------------------------------->8 > > Commit 9df89d85b407690afa46ddfbccc80bec6869971d "usbcore: set > lpm_capable field for LPM capable root hubs" was created under the > assumption that all USB host controllers should have USB 3.0 Link PM > enabled for all devices under the hosts. > > Unfortunately, that's not the case. The xHCI driver relies on knowledge > of the host hardware scheduler to calculate the LPM U1/U2 timeout > values, and it only sets lpm_capable to one for Intel host controllers > (that have the XHCI_LPM_SUPPORT quirk set). > > When LPM is enabled for some Fresco Logic hosts, it causes failures with > a AgeStar 3UBT USB 3.0 hard drive dock: > > Jan 11 13:59:03 sg-laptop kernel: usb 3-1: new SuperSpeed USB device number 2 using xhci_hcd > Jan 11 13:59:03 sg-laptop kernel: usb 3-1: Set SEL for device-initiated U1 failed. > Jan 11 13:59:08 sg-laptop kernel: usb 3-1: Set SEL for device-initiated U2 failed. > Jan 11 13:59:08 sg-laptop kernel: usb-storage 3-1:1.0: USB Mass Storage device detected > Jan 11 13:59:08 sg-laptop mtp-probe[613]: checking bus 3, device 2: "/sys/devices/pci0000:00/0000:00:1c.3/0000:04:00.0/usb3/3-1" > Jan 11 13:59:08 sg-laptop mtp-probe[613]: bus: 3, device: 2 was not an MTP device > Jan 11 13:59:08 sg-laptop kernel: scsi6 : usb-storage 3-1:1.0 > Jan 11 13:59:13 sg-laptop kernel: usb 3-1: Set SEL for device-initiated U1 failed. > Jan 11 13:59:18 sg-laptop kernel: usb 3-1: Set SEL for device-initiated U2 failed. > Jan 11 13:59:18 sg-laptop kernel: usbcore: registered new interface driver usb-storage > Jan 11 13:59:40 sg-laptop kernel: usb 3-1: reset SuperSpeed USB device number 2 using xhci_hcd > Jan 11 13:59:41 sg-laptop kernel: usb 3-1: device descriptor read/8, error -71 > Jan 11 13:59:41 sg-laptop kernel: usb 3-1: reset SuperSpeed USB device number 2 using xhci_hcd > Jan 11 13:59:46 sg-laptop kernel: usb 3-1: device descriptor read/8, error -110 > Jan 11 13:59:46 sg-laptop kernel: scsi 6:0:0:0: Device offlined - not ready after error recovery > Jan 11 13:59:46 sg-laptop kernel: usb 3-1: USB disconnect, device number 2 > > lspci for the affected host: > > 04:00.0 0c03: 1b73:1000 (rev 04) (prog-if 30 [XHCI]) > Subsystem: 1043:1039 > Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx- > Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx- > Latency: 0, Cache Line Size: 64 bytes > Interrupt: pin A routed to IRQ 19 > Region 0: Memory at dd200000 (32-bit, non-prefetchable) [size=64K] > Capabilities: [50] Power Management version 3 > Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA PME(D0+,D1-,D2-,D3hot+,D3cold-) > Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME- > Capabilities: [68] MSI: Enable- Count=1/1 Maskable- 64bit+ > Address: 0000000000000000 Data: 0000 > Capabilities: [80] Express (v1) Endpoint, MSI 00 > DevCap: MaxPayload 128 bytes, PhantFunc 0, Latency L0s <2us, L1 <32us > ExtTag- AttnBtn- AttnInd- PwrInd- RBE+ FLReset- > DevCtl: Report errors: Correctable- Non-Fatal- Fatal- Unsupported- > RlxdOrd+ ExtTag- PhantFunc- AuxPwr- NoSnoop+ > MaxPayload 128 bytes, MaxReadReq 512 bytes > DevSta: CorrErr- UncorrErr- FatalErr- UnsuppReq- AuxPwr- TransPend- > LnkCap: Port #0, Speed 2.5GT/s, Width x1, ASPM L0s L1, Latency L0 unlimited, L1 unlimited > ClockPM- Surprise- LLActRep- BwNot- > LnkCtl: ASPM Disabled; RCB 64 bytes Disabled- Retrain- CommClk+ > ExtSynch- ClockPM- AutWidDis- BWInt- AutBWInt- > LnkSta: Speed 2.5GT/s, Width x1, TrErr- Train- SlotClk+ DLActive- BWMgmt- ABWMgmt- > Kernel driver in use: xhci_hcd > Kernel modules: xhci_hcd > > The xHCI driver shouldn't really be mucking with USB core internal > fields, so rip that out. Instead, indicate the xHCI driver doesn't > support Link PM on this host by clearing the U1 and U2 exit latencies in > the roothub SuperSpeed Extended Capabilities BOS descriptor. > > This will also disable LPM for external devices that have the U1 and U2 > exit latencies set to zero. This was already effectively done with > commit ae8963adb4ad8c5f2a89ca1d99fb7bb721e7599f "usb: Don't enable LPM > if the exit latency is zero." Leave that code in place, in case there > are devices out there that set one exit latency value to zero, but set > the other to a valid value. > > Also, change messages about missing Link PM information from warning > level to info level. Only print a warning about the first device that > doesn't support LPM, to avoid log spam. Further, cleanup some > unnecessary line breaks. > > Signed-off-by: Sarah Sharp <sarah.a.sharp@xxxxxxxxxxxxxxx> > Reported-by: Sergey Galanov <sergey.e.galanov@xxxxxxxxx> > Cc: Alan Stern <stern@xxxxxxxxxxxxxxxxxxx> > --- > drivers/usb/core/hub.c | 25 ++++++++++++++----------- > drivers/usb/host/xhci-hub.c | 8 +++++--- > drivers/usb/host/xhci-pci.c | 6 ------ > 3 files changed, 19 insertions(+), 20 deletions(-) > > diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c > index babba885978d..3345fd771cf6 100644 > --- a/drivers/usb/core/hub.c > +++ b/drivers/usb/core/hub.c > @@ -141,24 +141,27 @@ int usb_device_supports_lpm(struct usb_device *udev) > return 0; > } > > - /* All USB 3.0 must support LPM, but we need their max exit latency > - * information from the SuperSpeed Extended Capabilities BOS descriptor. > + /* > + * According to the USB 3.0 spec, all USB 3.0 devices must support LPM. > + * However, there are some that don't, and they set the U1/U2 exit > + * latencies to zero. > */ > if (!udev->bos->ss_cap) { > - dev_warn(&udev->dev, "No LPM exit latency info found. " > - "Power management will be impacted.\n"); > + dev_info(&udev->dev, "No LPM exit latency info found, disabling LPM.\n"); > return 0; > } > > - /* udev is root hub */ > - if (!udev->parent) > - return 1; > + if (udev->bos->ss_cap->bU1devExitLat == 0 && > + udev->bos->ss_cap->bU2DevExitLat == 0) { > + if (udev->parent) > + dev_info(&udev->dev, "LPM exit latency is zeroed, disabling LPM.\n"); > + else > + dev_info(&udev->dev, "We don't know the algorithms for LPM for this host, disabling LPM.\n"); > + return 0; > + } > > - if (udev->parent->lpm_capable) > + if (!udev->parent || udev->parent->lpm_capable) > return 1; > - > - dev_warn(&udev->dev, "Parent hub missing LPM exit latency info. " > - "Power management will be impacted.\n"); > return 0; > } > > diff --git a/drivers/usb/host/xhci-hub.c b/drivers/usb/host/xhci-hub.c > index 9992fbfec85f..1ad6bc1951c7 100644 > --- a/drivers/usb/host/xhci-hub.c > +++ b/drivers/usb/host/xhci-hub.c > @@ -732,9 +732,11 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, > /* Set the U1 and U2 exit latencies. */ > memcpy(buf, &usb_bos_descriptor, > USB_DT_BOS_SIZE + USB_DT_USB_SS_CAP_SIZE); > - temp = readl(&xhci->cap_regs->hcs_params3); > - buf[12] = HCS_U1_LATENCY(temp); > - put_unaligned_le16(HCS_U2_LATENCY(temp), &buf[13]); > + if ((xhci->quirks & XHCI_LPM_SUPPORT)) { > + temp = readl(&xhci->cap_regs->hcs_params3); > + buf[12] = HCS_U1_LATENCY(temp); > + put_unaligned_le16(HCS_U2_LATENCY(temp), &buf[13]); > + } > > /* Indicate whether the host has LTM support. */ > temp = readl(&xhci->cap_regs->hcc_params); > diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c > index 3c898c12a06b..e42c318a4404 100644 > --- a/drivers/usb/host/xhci-pci.c > +++ b/drivers/usb/host/xhci-pci.c > @@ -217,12 +217,6 @@ static int xhci_pci_probe(struct pci_dev *dev, const struct pci_device_id *id) > goto put_usb3_hcd; > /* Roothub already marked as USB 3.0 speed */ > > - /* We know the LPM timeout algorithms for this host, let the USB core > - * enable and disable LPM for devices under the USB 3.0 roothub. > - */ > - if (xhci->quirks & XHCI_LPM_SUPPORT) > - hcd_to_bus(xhci->shared_hcd)->root_hub->lpm_capable = 1; > - > return 0; > > put_usb3_hcd: > -- > 1.8.5.2 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-usb" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html