[PATCH] usb: gadget: dwc2_udc_otg: Fix dwc2_gadget_start()

Marek Vasut marex at denx.de
Tue Feb 16 22:15:14 CET 2021


On 2/16/21 6:32 PM, Patrice CHOTARD wrote:
> Hi Marek

Hi,

> On 2/11/21 12:26 PM, Marek Vasut wrote:
>> On 2/11/21 10:58 AM, Patrice CHOTARD wrote:
>>> Hi Marek
>>>
>>> On 2/10/21 3:26 PM, Marek Vasut wrote:
>>>> On 2/10/21 3:17 PM, Patrice Chotard wrote:
>>>>> Since commit 8745b9ebccae ("usb: gadget: add super speed support")
>>>>> ums was no more functional on platform which use dwc2_udc_otg driver.
>>>>>
>>>>> Remove the speed test in dwc2_gadget_start() to fix it.
>>>>> Tested on stm32mp157c-ev1 board.
>>>>
>>>> Isn't the speed check correct though ?
>>>
>>> I am not sure this speed test is needed.
>>>
>>>>
>>>> What is really going on when this fails ?
>>>
>>>
>>> Since 8745b9ebccae ("usb: gadget: add super speed support"),
>>> driver->speed is now set to USB_SPEED_SUPER in drivers/usb/gadget/composite.c
>>>
>>> and this forbids dwc2_udc_otg.c to be registered.
>>
>> That sounds like a bug in the USB gadget/otg core , no ?
> 
> After analysis, if i correctly understood, the speed test done in both usb_gadget_register_driver()
> and in dwc2_gadget_start() in dwc2_udc_otg.c is too restrictive and accepts only gadget driver with
> max speed equal to USB_SPEED_FULL or USB_SPEED_HIGH.

That should be fine for the DWC2 IP, which is LS/FS/HS.

> So all gadget driver with max speed set to higher speed than USB_SPEED_HIGH (USB_SPEED_SUPER in case of
> composite gadget driver) are not allowed, which is wrong.
> 
> This test should check that the gadget driver max speed is higher or equal to the min speed supported by
> dwc2_udc_otg driver, ie USB_SPEED_FULL.
> 
> So the test should be :
> 
> @@ -247,12 +247,11 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver)
>   	unsigned long flags = 0;
>   
>   	debug_cond(DEBUG_SETUP != 0, "%s: %s\n", __func__, "no name");
>   
>   	if (!driver
> -	    || (driver->speed != USB_SPEED_FULL
> -		&& driver->speed != USB_SPEED_HIGH)
> +	    || driver->speed < USB_SPEED_FULL
>   	    || !driver->bind || !driver->disconnect || !driver->setup)
>   		return -EINVAL;
>   	if (!dev)
>   		return -ENODEV;
>   	if (dev->driver)
> @@ -319,12 +318,11 @@ static int dwc2_gadget_start(struct usb_gadget *g,
>   	struct dwc2_udc *dev = the_controller;
>   
>   	debug_cond(DEBUG_SETUP != 0, "%s: %s\n", __func__, "no name");
>   
>   	if (!driver ||
> -	    (driver->speed != USB_SPEED_FULL &&
> -	     driver->speed != USB_SPEED_HIGH) ||
> +	    driver->speed < USB_SPEED_FULL ||

The DWC2 can't operate in LS gadget mode , i.e. emulate some old 
keyboard ? Maybe what you want is driver->speed > USB_SPEED_HIGH instead ?

>   	    !driver->bind || !driver->disconnect || !driver->setup)
>   		return -EINVAL;
>   
>   	if (!dev)
> 
> I you are agree, i will send a v2 with this.

Yes please. But you really want to get AB/RB from Lukasz, since he does 
the gadget stuff.


More information about the U-Boot mailing list