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 Sat, Jan 18, 2014 at 04:59:12AM +0400, Sergey Galanov wrote:
> 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.

It looks like you didn't run lsusb as root.  I really need to see the
information in the SuperSpeed BOS descriptors, and that requires root
privileges.

Sarah Sharp

> 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