Re: [RFC PATCH] usb: dwc3: Poll CMDACT after issuing EndXfer command

From: Prashanth K
Date: Wed Apr 24 2024 - 23:56:00 EST




On 25-04-24 04:06 am, Thinh Nguyen wrote:

Thanks for the data.

Ok, I remember now why we did what we did. I just notice the Fixes
commit you tag: b353eb6dc285 ("usb: dwc3: gadget: Skip waiting for
CMDACT cleared during endxfer")

I forgot that at one point we skip CMDACT for End Transfer command.
Let's not poll for CMDACT for End Transfer command and unconditionally
wait 1ms. Otherwise we may run into the issue being stuck with CMDACT
again while SETUP packet is not DMA out again. 1ms should be plenty of
time for the End Transfer command to complete.

It should look like this:

diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
index f94f68f1e7d2..dad30c6ab19d 100644
--- a/drivers/usb/dwc3/gadget.c
+++ b/drivers/usb/dwc3/gadget.c
@@ -1724,8 +1724,7 @@ static int __dwc3_stop_active_transfer(struct dwc3_ep *dep, bool force, bool int
dep->resource_index = 0;
if (!interrupt) {
- if (!DWC3_IP_IS(DWC3) || DWC3_VER_IS_PRIOR(DWC3, 310A))
- mdelay(1);
+ mdelay(1);
dep->flags &= ~DWC3_EP_TRANSFER_STARTED;
} else if (!ret) {
dep->flags |= DWC3_EP_END_TRANSFER_PENDING;

Thanks,
Thinh

Ps. also please Cc stable.
Thanks for the suggestion, I had tried 1ms initially when encountering the issue and it was helping. Then I thought that CMDACT polling was better approach. But anyways I echo you, having common solution for all controller revisions is the cleaner way. I'll send V2 with mdelay(1).

Thanks again,
Prashanth K