Re: dwc3: gadget suspend/resume vs system suspend/resume

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

 




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.

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

cheers,
-roger



[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux