From: Thinh Nguyen <Thinh.Nguyen@synopsys.com>
To: Andrey Konovalov <andreyknvl@gmail.com>
Cc: Alan Stern <stern@rowland.harvard.edu>,
Thinh Nguyen <Thinh.Nguyen@synopsys.com>,
Felipe Balbi <balbi@kernel.org>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
USB list <linux-usb@vger.kernel.org>,
LKML <linux-kernel@vger.kernel.org>
Subject: Re: dwc3: unusual handling of setup requests with wLength == 0
Date: Fri, 18 Aug 2023 01:08:19 +0000 [thread overview]
Message-ID: <20230818010815.4kcue67idma5yguf@synopsys.com> (raw)
In-Reply-To: <CA+fCnZcQSYy63ichdivAH5-fYvN2UMzTtZ--h=F6nK0jfVou3Q@mail.gmail.com>
Hi,
On Fri, Aug 18, 2023, Andrey Konovalov wrote:
> Hi Alan and Thinh,
>
> I have been testing Raw Gadget with the dwc3 UDC driver and stumbled
> upon an issue related to how dwc3 handles setup requests with wLength
> == 0.
>
> When running a simple Raw Gadget-based keyboard emulator [1],
> everything works as expected until the point when the host sends a
> SET_CONFIGURATION request, which has wLength == 0.
>
> For setup requests with wLength != 0, just like the other UDC drivers
> I tested, dwc3 calls the gadget driver's ->setup() callback and then
> waits until the gadget driver queues an URB to EP0 as a response.
For the lack of better term, can we use "request" or "usb_request"
instead of URB for gadget side, I get confused with the host side
whenever we mention URB.
>
> However, for a setup request with wLength == 0, dwc3 does not wait
> until the gadget driver queues an URB to ack the transfer. It appears
> that dwc3 just acks the request internally and then proceeds with
> calling the ->setup() callback for the next request received from the
It depends on the bRequest. It should not proceed to ->setup() unless
the gadget driver already setups the request for it.
> host. This confuses Raw Gadget, as it does not expect to get a new
> ->setup() call before it explicitly acks the previous one by queuing
> an URB. As a result, the emulation fails.
If the host intent is to send a 3-stage control request with a 0-length
data packet, the gadget driver needs to return USB_GADGET_DELAYED_STATUS
to prepare a 0-length request. For SET_CONFIGURATION, we don't expect
a data phase, why should the gadget driver queue a 0-length data?
>
> I suspect this issue has not been observed with other gadget drivers,
> as they queue an URB immediately after receiving a ->setup() call:
> dwc3 appears to somehow correctly handle this internally even though
> it acks the transfer by itself. But the timings with Raw Gadget are
> different, as it requires userspace to ack the transfer. Sometimes
> though, the Raw Gadget-based emulator also manages to queue an URB
> before the next request is received from the host and the enumeration
> continues properly (until the next request with wLength == 0).
>
> What do you think would be the best approach to deal with this?
The communication should be clearly defined. That is, the dwc3 needs to
know if this is a 3-stage or 2-stage control transfer. It knows about
the standard requests, but not the vendor/non-standard ones. If the raw
gadget defined some unknown OUT request, it needs to tell dwc3 whether
it should expect the data stage or not.
BR,
Thinh
>
> Can this be considered a bug in dwc3 that should be fixed? There's a
> seemingly related comment in dwc3 code [2], but I'm not familiar
> enough with its internals to understand whether this is what leads to
> the issue I'm seeing.
>
> Or should I adapt Raw Gadget to handle this unusual dwc3 behavior?
> This might be tricky to do, as I cannot change the existing userspace
> API.
>
> On a side note, as an experiment, I tried returning
> USB_GADGET_DELAYED_STATUS from the Raw Gadget's ->setup() callback if
> the UDC driver calls it too early: some UDC drivers, including dwc3,
> appear to contain a special handling for this return value. However,
> that didn't work out. Perhaps, I misunderstand the meaning of this
> value.
>
> Thank you!
>
> [1] https://urldefense.com/v3/__https://github.com/xairy/raw-gadget/blob/master/examples/keyboard.c__;!!A4F2R9G_pg!fsksN9-eooWS7Uui8MfCcBkff8awG2ovwl6UaPuJ4_v50Ny5s-WQ4YuQht1ACRl6eDYZ4o-gkVlF6l82C8UT58e7$
> [2] https://urldefense.com/v3/__https://elixir.bootlin.com/linux/v6.5-rc6/source/drivers/usb/dwc3/ep0.c*L145__;Iw!!A4F2R9G_pg!fsksN9-eooWS7Uui8MfCcBkff8awG2ovwl6UaPuJ4_v50Ny5s-WQ4YuQht1ACRl6eDYZ4o-gkVlF6l82C6Q3wZfW$
next prev parent reply other threads:[~2023-08-18 1:09 UTC|newest]
Thread overview: 37+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-08-18 0:15 dwc3: unusual handling of setup requests with wLength == 0 Andrey Konovalov
2023-08-18 1:08 ` Thinh Nguyen [this message]
2023-08-18 2:37 ` Alan Stern
2023-08-18 3:10 ` Thinh Nguyen
2023-08-18 3:26 ` Thinh Nguyen
2023-08-18 3:42 ` Alan Stern
2023-08-18 19:49 ` Thinh Nguyen
2023-08-18 20:46 ` Thinh Nguyen
2023-08-18 23:06 ` Alan Stern
2023-08-19 0:06 ` Thinh Nguyen
2023-08-19 1:54 ` Andrey Konovalov
2023-08-20 14:20 ` Alan Stern
2023-08-21 16:13 ` Andrey Konovalov
2023-08-21 17:25 ` Alan Stern
2023-08-23 2:05 ` Thinh Nguyen
2023-08-23 2:30 ` Andrey Konovalov
2023-08-23 15:48 ` Alan Stern
2023-08-23 17:18 ` Thinh Nguyen
2023-08-25 1:36 ` Andrey Konovalov
2023-08-25 2:08 ` Alan Stern
2023-08-23 2:14 ` Thinh Nguyen
2023-08-23 15:17 ` Alan Stern
2023-08-23 17:59 ` Thinh Nguyen
2023-08-23 19:19 ` Alan Stern
2023-08-23 22:22 ` Thinh Nguyen
2023-08-24 2:21 ` Alan Stern
2023-08-26 1:20 ` Thinh Nguyen
2023-08-26 3:10 ` Alan Stern
2023-08-30 1:32 ` Thinh Nguyen
2023-08-30 14:48 ` Alan Stern
2023-08-31 2:43 ` Thinh Nguyen
2023-08-31 15:40 ` Alan Stern
2023-09-01 1:27 ` Thinh Nguyen
2023-09-01 17:37 ` Alan Stern
2023-09-01 21:14 ` Thinh Nguyen
2023-09-02 15:15 ` Alan Stern
2023-09-05 22:53 ` Thinh Nguyen
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=20230818010815.4kcue67idma5yguf@synopsys.com \
--to=thinh.nguyen@synopsys.com \
--cc=andreyknvl@gmail.com \
--cc=balbi@kernel.org \
--cc=gregkh@linuxfoundation.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-usb@vger.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.