Re: [RFC PATCH v2 1/3] usb: dwc3: Flush pending SETUP data during stop active xfers

Thinh Nguyen
2022-03-23T01:31:15Z

Hi Wesley,

Wesley Cheng wrote:
> Hi Thinh,
>
> On 2/15/2022 4:08 PM, Wesley Cheng wrote:
>> While running the pullup disable sequence, if there are pending SETUP
>> transfers stored in the controller, then the ENDTRANSFER commands on non
>> control eps will fail w/ ETIMEDOUT. As a suggestion from SNPS, in order
>> to drain potentially cached SETUP packets, SW needs to issue a
>> STARTTRANSFER command. After issuing the STARTTRANSFER, and retrying the
>> ENDTRANSFER, the command should succeed. Else, if the endpoints are not
>> properly stopped, the controller halt sequence will fail as well.
>>
>> One limitation is that the current logic will drop the SETUP data
>> being received (ie dropping the SETUP packet), however, it should be
>> acceptable in the pullup disable case, as the device is eventually
>> going to disconnect from the host.
>>
>> Signed-off-by: Wesley Cheng <quic_wcheng@quicinc.com>
>> ---
> Just wondering if you had any inputs for this particular change? I
> think on the dequeue path discussion you had some concerns with parts of
> this change? I think the difficult part for the pullup disable path is
> that we have this API running w/ interrupts disabled, so the EP0 state
> won't be able to advance compared to the dequeue case.

This doesn't sound right. The pullup disable (or device initiated
disconnect) should wait for the EP0 state to be EP0_SETUP_PHASE before
proceeding, which it does.

>
> Ideally, if there is a way to ensure that we avoid reading further setup
> packets, that would be nice, but from our discussions with Synopsys,
> this was not possible. (controller is always armed and ready to ACK
> setup tokens)
>
> I did evaluate keeping IRQs enabled and periodically releasing/attaining
> the lock between the stop active xfer calls, but that opened another can
> of worms. If you think this is the approach we should take, I can take
> a look at this implementation further.
>

This patch doesn't look right to me. The change I suggested before
should address this (I believe Greg already picked it up). What other
problem do you see, I'm not clear what's the problem here. One potential
problem that I can see is that currently dwc3 driver doesn't wait for
active endpoints to complete/end before clearing the run_stop bit on
device initiated disconnect, but I'm not sure if that's what you're seeing.

Please help clarify further. If there's trace points log, that'd help.

Thanks,
Thinh