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