[PATCH RESEND v2 2/2] usb: udc: Try to clarify an error message
Marek Vasut
marex at denx.de
Sat Oct 7 23:09:32 CEST 2023
On 10/5/23 17:51, Miquel Raynal wrote:
> Hi Marek,
>
> marex at denx.de wrote on Thu, 5 Oct 2023 15:04:25 +0200:
>
>> On 10/2/23 15:46, Miquel Raynal wrote:
>>> At some point when trying to use USB gadgets, two situations may arise
>>> and lead to a failure. Either the UDC (USB Device Controller) is not
>>> available at all (not described or not probed) or the UDC is already in
>>> use. For instance, as the USB Ethernet gadget remains bound to the UDC,
>>> the use of any other USB gadget (fastboot, dfu, etc) *after* will always
>>> fail with the "couldn't find an available UDC" error.
>>>
>>> Let's give a more helpful message by making a difference between the two
>>> cases. Let's also hint people who would get this error and grep it into
>>> the sources a better explanation of what's wrong with their workflow.
>>>
>>> Signed-off-by: Miquel Raynal <miquel.raynal at bootlin.com>
>>> ---
>>> While doing this I really wanted to add "much more" error comments but I
>>> faced another reality: often the messages are there but use
>>> pr_err/log_err which is actually silenced by default with LOGLEVEL=3, so
>>> I consider this unnecessary, as decreasing the loglevel will make these
>>> messages appear. I would have expected errors to be displayed, but I
>>> understand it makes the binaries even bigger.
>>>
>>> Resend: no change.
>>>
>>> Changes in v2:
>>> * s/UDC/UDCs/. I kept the sentence as it was as the suggested form did
>>> not sound well at all when there is only one UDC.
>>> ---
>>> drivers/usb/gadget/udc/udc-core.c | 13 ++++++++++++-
>>> 1 file changed, 12 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/drivers/usb/gadget/udc/udc-core.c b/drivers/usb/gadget/udc/udc-core.c
>>> index 7f73926cb3e..8405b03462e 100644
>>> --- a/drivers/usb/gadget/udc/udc-core.c
>>> +++ b/drivers/usb/gadget/udc/udc-core.c
>>> @@ -323,6 +323,7 @@ err1:
>>> int usb_gadget_probe_driver(struct usb_gadget_driver *driver)
>>> {
>>> struct usb_udc *udc = NULL;
>>> + unsigned int udc_count = 0;
>>> int ret;
>>> > if (!driver || !driver->bind || !driver->setup)
>>> @@ -330,12 +331,22 @@ int usb_gadget_probe_driver(struct usb_gadget_driver *driver)
>>> > mutex_lock(&udc_lock);
>>> list_for_each_entry(udc, &udc_list, list) {
>>> + udc_count++;
>>> +
>>> /* For now we take the first one */
>>> if (!udc->driver)
>>> goto found;
>>> }
>>> > - printf("couldn't find an available UDC\n");
>>> + if (!udc_count)
>>> + printf("No UDC available in the system\n");
>>> + else
>>> + /* When this happens, users should 'unbind <class> <index>'
>>> + * using the output of 'dm tree' and looking at the line right
>>> + * after the USB peripheral/device controller.
>>> + */
>>> + printf("All UDCs in use (%d available), use the unbind command\n",
>>> + udc_count);
>>
>> Users should really use 'bind' command in the first place, to avoid this guesswork to which UDC (on systems with multiple UDCs) a gadget gets bound to, and instead bind the gadget to specific UDC they want to bind it to. This code should then be removed entirely.
>
> There are two cases when this can happen:
> * a single UDC (common) but a function already bound, there is no
> guessing here
> * two (or more) UDC and there is some guessing
>
> Before your cleanup, drivers would get automatically unbound from the
> UDC to let the one being needed to bind.
How did that ever work ?
> This is no longer the case,
> so there is a change in the CLI and I want to help people facing
> this new problem with a slightly more comprehensive message because
> people don't fully understand what USB is all about. We cannot
> ask all U-Boot USB users to be U-Boot experts and USB experts. This
> is just a little help.
In that case, you have to handle the details like CMD_BIND may not be
enabled, and CMD_DM may not be enabled. But then, maybe what we want to
do is fix the automatic switching of gadgets to make it work again ?
> In an ideal world, we will have the possibility to create
> composite gadgets and all this can go away once it is well
> integrated, I guess?
I believe you would still have to do a disconnect/connect cycle even
with a composite driver, you cannot just add functions to existing
composite at runtime.
More information about the U-Boot
mailing list