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 <[email protected]>
> Reported-by: Sergey Galanov <[email protected]>
> Cc: Alan Stern <[email protected]>
> ---
>  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 [email protected]
> 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 [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to