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

Patrice CHOTARD patrice.chotard at foss.st.com
Wed Feb 17 09:57:16 CET 2021


Hi Marek

On 2/16/21 10:15 PM, Marek Vasut wrote:
> 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 ?
The test is correct, in case driver->speed is lower than FS, we return -EINVAL.
All others speed FS/HS/SS and higher are allowed.

> 
>>           !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.

Ok, i will add Lukasz for the V2 review.

Thanks
Patrice


More information about the U-Boot mailing list