Re: [PATCH] USB: leave LPM alone if possible when binding/unbinding interface drivers

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

 



On Mon, 2 May 2016, Mathias Nyman wrote:

> On 29.04.2016 22:25, Alan Stern wrote:
> > When a USB driver is bound to an interface (either through probing or
> > by claiming it) or is unbound from an interface, the USB core always
> > disables Link Power Management during the transition and then
> > re-enables it afterward.  The reason is because the driver might want
> > to prevent hub-initiated link power transitions, in which case the HCD
> > would have to recalculate the various LPM parameters.  This
> > recalculation takes place when LPM is re-enabled and the new
> > parameters are sent to the device and its parent hub.
> >
> > However, if the driver does not want to prevent hub-initiated link
> > power transitions then none of this work is necessary.  The parameters
> > don't need to be recalculated, and LPM doesn't need to be disabled and
> > re-enabled.
> >
> > It turns out that disabling and enabling LPM can be time-consuming,
> > enough so that it interferes with user programs that want to claim and
> > release interfaces rapidly via usbfs.  Since the usbfs kernel driver
> > doesn't set the disable_hub_initiated_lpm flag, we can speed things up
> > and get the user programs to work by leaving LPM alone whenever the
> > flag isn't set.
> >
> > And while we're improving the way disable_hub_initiated_lpm gets used,
> > let's also fix its kerneldoc.
> >
> > Signed-off-by: Alan Stern <stern@xxxxxxxxxxxxxxxxxxx>
> > Tested-by: Matthew Giassa <matthew@xxxxxxxxxx>
> > CC: Mathias Nyman <mathias.nyman@xxxxxxxxx>
> > CC: <stable@xxxxxxxxxxxxxxx>
> >
> > ---
> >
> > Mathias, can you check that this is right?  If the driver's
> > disable_hub_initiated_lpm flag isn't set then binding or unbinding it
> > shouldn't require any changes to the LPM parameters.  The flag gets
> > used in only one place, in xhci_calculate_lpm_timeout(), and if it
> > isn't set then then result would be the same as if the driver weren't
> > bound.
> >
> > Thanks.
> 
> It looks like xhci driver calculates the u1 and u2 timeout values for
> ports based on udev->u1_params.sel * x (where x depends on endpoint type).
> 
> It loops through all active interfaces all endpoints, and picks the worst
> (longest) timeout as the timeout value.
> 
> In this sense if a interface drive disappears or appears it could be possible
> that the timeout values change, even if the xhci_calculate_lpm_timeout() is
> not set.

I don't understand.  The calculation below doesn't care whether the 
interface is bound to a driver, does it?  It looks at all the endpoints 
in all the current altsettings, whether they are bound or not.

Or have I misunderstood something?

Alan Stern

> usb_enable_lpm()
>    usb_enable_link_state()
>      hcd->driver->enable_usb3_lpm_timeout(hcd, udev, state)
>        xhci_calculate_lpm_timeout()
>          for (i = 0; i < udev->actconfig->desc.bNumInterfaces; i++)
>            xhci_update_timeout_for_interface(... &timeout))
>              for (j = 0; j < alt->desc.bNumEndpoints; j++)
>                xhci_update_timeout_for_endpoint(&timeout) // saves longest timeout
>                  xhci_call_host_update_timeout_for_endpoint(&timeout)
>                    ..xhci_calculate_intel_u1_timeout()  // skipped a few steps
>                       case USB_ENDPOINT_XFER_CONTROL:
>                         timeout = udev->u1_params.sel * 3;
>                       case USB_ENDPOINT_XFER_BULK:
>                         timeout = udev->u1_params.sel * 5;
>                       case USB_ENDPOINT_XFER_INT:
> 			timeout = ...
> 
> -Mathias
> 
> 

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