Linux USB
 help / color / mirror / Atom feed
From: Thinh Nguyen <Thinh.Nguyen@synopsys.com>
To: Roger Quadros <rogerq@kernel.org>
Cc: Thinh Nguyen <Thinh.Nguyen@synopsys.com>,
	Alan Stern <stern@rowland.harvard.edu>,
	"linux-usb@vger.kernel.org" <linux-usb@vger.kernel.org>
Subject: Re: dwc3: gadget suspend/resume vs system suspend/resume
Date: Thu, 16 Feb 2023 22:23:08 +0000	[thread overview]
Message-ID: <20230216222306.i3ijnt2ptvgqazbl@synopsys.com> (raw)
In-Reply-To: <00e5e799-6cf0-b6f1-4eb4-0bd0c57e91c8@kernel.org>

On Thu, Feb 16, 2023, Roger Quadros wrote:
> 
> 
> On 16/02/2023 20:11, Thinh Nguyen wrote:
> > On Thu, Feb 16, 2023, Roger Quadros wrote:
> >>
> >>
> >> On 16/02/2023 00:53, Thinh Nguyen wrote:
> >>> On Wed, Feb 15, 2023, Alan Stern wrote:
> >>>> On Wed, Feb 15, 2023 at 07:29:52PM +0200, Roger Quadros wrote:
> >>>>> I was more interested in this case where USB is suspended and then system suspends.
> >>>>> Waking up the system on USB activity (while suspended) is taken care of by hardware.
> >>>>> But I'm not sure if gadget driver will be up in time to respond to the request
> >>>>> reasonably quickly. It would take a couple of seconds and is not hard time bound.
> >>>>> Is this time mandated by the USB Spec or is it host implementation specific?
> >>>>
> >>>> The USB spec doesn't say very much about it.  One part of the USB 2.0 
> >>>> spec seems relevant; it says:
> >>>>
> >>>> 	9.2.6.2 Reset/Resume Recovery Time
> >>>>
> >>>> 	After a port is reset or resumed, the USB System Software is 
> >>>> 	expected to provide a “recovery” interval of 10 ms before the 
> >>>> 	device attached to the port is expected to respond to data 
> >>>> 	transfers. The device may ignore any data transfers during the 
> >>>> 	recovery interval.
> >>>>
> >>>> 	After the end of the recovery interval (measured from the end 
> >>>> 	of the reset or the end of the EOP at the end of the resume 
> >>>> 	signaling), the device must accept data transfers at any time.
> >>>>
> >>>> Accepting a data transfer doesn't necessarily mean completing it, 
> >>>> though.  The Linux USB core does send a request to a device 10 ms 
> >>>> after resuming it, but the timeout period on this request is 5 seconds.  
> >>>> This gives you some leeway.
> >>>>
> >>>
> >>> For most standard control requests, the spec indicates that the device
> >>> must respond within 500ms. But that's not the case for some real devices
> >>
> >> I could not find any reference to 500ms time limit for suspend/resume case.
> >> The only mention of 500ms in USB2.0 spec is:
> >>
> >> 	9.2.6.4 Standard Device Requests
> >> 	...
> >> 	For standard device requests that require data stage transfer
> >> 	to the host, the device must be able to return the first data
> >> 	packet to the host within 500 ms of receipt of the request.
> >> 	For subsequent data packets, if any, the device must be able to
> >> 	return them within 500 ms of successful completion of the
> >> 	transmission of the previous packet. The device must then be
> >> 	able to successfully complete the status stage within 50 ms after
> >> 	returning the last data packet.
> >>
> >> I don't think this applies to suspend/resume.
> > 
> > Are you referring to the handshake timeout when the host tries to
> > initiate resume at the link layer? It's relatively short compare to the
> > software timeout and will vary depending on how many hub tiers in the
> > topology. Also, that's handled by the host and device controller. We
> > should care more about the software timeout after resume completed. The
> > 500ms here applies if the device couldn't resume fast enough for the
> > driver to prepare a transfer response to the host.
> > 
> >>
> >>> so we have a 5 second timeout in Linux. For other requests, it's up to
> >>> the class drivers. For most drivers on Linux, it's typically 5 seconds
> >>> also.
> >>
> >> So it looks doable with Linux host. I'll have to check how other
> >> USB hosts behave.
> >>
> >>>
> >>> IMO, the system suspend on the gadget side should take precedence. That
> >>> is, it shouldn't depend on whether the usb gadget is in suspend or not
> >>> to go through system suspend. For that to happen, the gadget must
> >>> initiate soft-disconnect. Otherwise I can see we may run into
> >>> complications from the delay from the system suspend. For example, what
> >>> if the host initiates resume right after suspend while the gadget side
> >>> is still suspending?
> >>
> >> In this case, system will go all the way to suspend and then wake up.
> >> It will take a few seconds more to respond than if system was already suspended.
> > 
> > Yes, my concern is the suspend/resume is measured in seconds.
> > 
> >>
> >>> What if there are other gadgets on the setup that
> >>> want or not want to go to suspend also? How can the system decide when
> >>> it can go into suspend then?
> >>
> >> I think this is a policy decision and we cannot force one way or the other
> >> in the kernel but allow user space to decide what must be done.
> >> It would really depend on what the end application needs.
> >>
> >> So, does a gadget specific user settable flag seem reasonable to decide
> >> if gadget driver should:
> >> a) disconnect on system suspend regardless of USB state (current behavior)
> >> b) prevent a system suspend if gadget is not in USB suspend. Allow otherwise.
> >>
> >> Or any better ideas?
> >>
> > 
> > What's the use case here? Are you trying to drive the gadget system
> > suspend via the host? That is, if the host resumes, the system on the
> > gadget side would resume also? If that's the case, then perhaps that can
> > be triggered in the gadget driver suspend instead?
> 
> The use case is:
> The Linux System is a USB gadget which
> 1) If plugged to USB host and USB gadget is active the system will remain active
> 2) If plugged to USB host and USB gadget is suspended, it can transition to system suspend
> (but may not always) (this check and trigger to system suspend is user space driven)
> 3) If system has suspended, any USB activity should resume the system and USB gadget should
> resume (preferably without a disconnect/re-enumeration)
> There can be exceptions if we don't meet certain host software timeout criteria,
> in which case we simply re-enumerate.

I see.

> 
> > 
> > Otherwise, it makes more sense to let the user control when he/she wants
> > to resume if the user is the one that triggers the system suspend. On
> > resume, the connection can be reestablished.
> 
> This is how it already is now no?

Yes, that's the current behavior.

Thanks for the clarification on the use case. I think it makes sense if
you want to change the current behavior for this. However this requires
some testings.

Thanks,
Thinh

  reply	other threads:[~2023-02-16 22:24 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-02-15  9:40 dwc3: gadget suspend/resume vs system suspend/resume Roger Quadros
2023-02-15 15:41 ` Alan Stern
2023-02-15 17:29   ` Roger Quadros
2023-02-15 18:24     ` Alan Stern
2023-02-15 22:53       ` Thinh Nguyen
2023-02-16  8:40         ` Roger Quadros
2023-02-16 18:11           ` Thinh Nguyen
2023-02-16 20:03             ` Alan Stern
2023-02-16 22:10               ` Thinh Nguyen
2023-02-16 20:43             ` Roger Quadros
2023-02-16 22:23               ` Thinh Nguyen [this message]
2023-02-17  9:28                 ` Roger Quadros

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20230216222306.i3ijnt2ptvgqazbl@synopsys.com \
    --to=thinh.nguyen@synopsys.com \
    --cc=linux-usb@vger.kernel.org \
    --cc=rogerq@kernel.org \
    --cc=stern@rowland.harvard.edu \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox