First of all thanks for the comments. It is really helpful to get better 
insights of this driver.

On Mon, 8 Oct 2018 21:59:44 +0200
Oliver Neukum <oneu...@suse.com> wrote:

> On Mo, 2018-10-08 at 11:16 -0400, Alan Stern wrote:
> > On Mon, 8 Oct 2018, Oliver Neukum wrote:
> > 
> > > On Mo, 2018-10-08 at 10:50 +0100, Mayuresh Kulkarni wrote:
> > > > 
> > > > As a result of this, the USB suspend (L2) does not seem to happen, even 
> > > > if all the interface drivers of a composite USB device report "idle" to 
> > > > USB core driver. The USB suspend seem to happen only when the caller in 
> > > > user-space (in our case) closes the device file.
> > > > 
> > > > Is this correct understanding?
> > > 
> > > Yes, it is.
> > > 
> > > > If yes, could you please help understand -
> > > > 1. Any specific reason to choose this design approach? Apologies, but 
> > > > "git blame" does not reveal much information (or maybe I did not do git 
> > > > blame on correct kernel version).
> > > 
> > > We cannot assume that a device is done executing a command as soon as
> > > communication is done. Think of a scanner moving its sensor bar
> > > or a printer printing a page. Or a display displaying something.
> > > 

The USB core driver has a module-param "usb_autosuspend_delay" whose default 
value is 2 sec. AFAIU, the PM core will wait at-least 2 sec before scheduling 
the suspend of this USB device.
So, if the user-space driving any of the above devices sends "new" URB request 
before usb_autosuspend_delay expires, the PM core will cancel suspend. This 
will essentially mean the device remained active and link never entered L2.

I could be wrong, but 2 sec seems like a pretty good time-out to me, from end 
user's perspective.

But because usb_autosuspend_delay is a module-param, a previledged user space 
can change it and even set it 0 on a particular platform. In such cases, the 
device will suspend ASAP.

> > > > 2. Is it possible to modify this driver to take PM ref-count on USB 
> > > > device, only when user-space is actively interacting with the USB 
> > > > device (so in open/close and appropriate ioctl calls, with special 
> > > > handling for async URB submission)?
> > > 
> > > Technically this is possible, but it is a bad idea.
> > > 
> > > > 3. Will (2) break any known existing device(s)?
> > > 
> > > Yes, it would and that makes it a bad idea.
> > 
> > In theory we could add ioctls to perform the runtime PM put and get 
> > operations.
> 
> Hi,
> 
> we had this discussion years ago. Then the majority view was that an
> application should close the device. Do we have a reason to revisit
> that decision?
> 
>       Regards
>               Oliver

With all due respect, one of the possible reason for this could be, power 
saving on mobile/tablet platforms (running Android). These platforms usually 
have a single USB port.
Specifically from our point of view, these platforms are removing 3.5 mm jack 
and hence the only interface available for headsets is USB.

So, for any such USB devices that connect to these platforms and communicated 
by user space, such a change might allow the USB device and link go into 
suspend for prolonged period, saving battery power.

With that said, above example might be on a very small scale as comapred to 
vast amount of USB devices in the world, so please feel to disagree :-).

Best Regards,
Mayuresh

Reply via email to