Re: usb3 hdd docking station doesn't work with recent kernels

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

 



On Tue, 14 Jan 2014, Sarah Sharp wrote:

> Alan, I believe your analysis of the code was incorrect when you asked
> Xenia to create commit 60e102ac73cd40069d077014c93c86dc7205cb68 in
> August:
> 
> http://marc.info/?l=linux-usb&m=137780837109921&w=2
> 
> You asked her to set lpm_capable because you thought it simply wasn't
> being set at all.  You overlooked the xHCI driver setting lpm_capable in
> drivers/usb/host/xhci-pci.c.

So I did.

> The xHCI driver only sets lpm_capable for xHCI host controllers that it
> knows how to calculate the U1/U2 timeout values for.  Since those
> timeout values are highly dependent on how the xHCI host hardware
> scheduling works, I've only enabled USB 3.0 Link PM for Intel hosts:
> 
> static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci)
> {
> ...
>         if (pdev->vendor == PCI_VENDOR_ID_INTEL) {
>                 xhci->quirks |= XHCI_LPM_SUPPORT;
>                 xhci->quirks |= XHCI_INTEL_HOST;
>         }
> 
> static int xhci_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
> {
> ...
>         /* 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;
> 
> lpm_capable shouldn't be set for hosts where we don't know how to
> calculate the U1/U2 timeout values, so commit
> 60e102ac73cd40069d077014c93c86dc7205cb68 should just be reverted.

Allow me to propose an alternative.

Let's do our best to treat root hubs the same as external hubs.  This 
means that udev->lpm_capable should be set the same way in 
hub_port_init() and register_root_hub(): by calling 
usb_device_supports_lpm(), which gets the information from the BOS 
extended capabilities.

In particular, xhci-hcd shouldn't go messing around with the innards of
the root hub structure.  Instead of setting lpm_capable when it knows
how to calculate the timeout values, it should pass the necessary
information through the ss_cap descriptor, just like an external hub
would.  Either don't provide that descriptor at all if you don't know
the timeout values, or else set those fields in the descriptor to
something invalid (and make usb_device_supports_lpm() test for it).

And while we're at it, let's change the comment in
usb_device_supports_lpm() that says "All USB 3.0 must support LPM".  
Not only is it ungrammatical, but as you point out, it is wrong for
some root hubs.

Alan Stern

--
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