Re: [RFT] usb: Don't enable USB 3.0 LPM for non-Intel hosts.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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




[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux