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]

 



Hi Sarah.
It works. I applied the patch to 3.13rc8 (I had to modify it a little
bit because in my version xhci_readl is called rather than readl).
lsusb I've sent included the dock info. It's 'JMicron Technology'
device. At least it's the only difference between lsusb output with
and without dock.

Thanks,
Sergey

On 18 January 2014 02:55, Sarah Sharp <sarah.a.sharp@xxxxxxxxxxxxxxx> wrote:
> 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