[PATCH 3/5] usb: dwc3-generic: Relax unsupported dr_mode check
Marek Vasut
marex at denx.de
Thu Jul 13 13:35:55 CEST 2023
On 7/13/23 12:25, Jonas Karlman wrote:
> On 2023-07-13 12:08, Marek Vasut wrote:
>> On 7/13/23 11:56, Jonas Karlman wrote:
>>> Hi Marek,
>>>
>>> Sorry for late reply.
>>> On 2023-06-05 12:14, Marek Vasut wrote:
>>>> On 5/30/23 12:26, Jonas Karlman wrote:
>>>>> When dr_mode is peripheral or otg and U-Boot has not been built with
>>>>> DM_USB_GADGET support, booting such device may end up with:
>>>>>
>>>>> dwc3_glue_bind_common: subnode name: usb at fcc00000
>>>>> Error binding driver 'dwc3-generic-wrapper': -6
>>>>> Some drivers failed to bind
>>>>> initcall sequence 00000000effbca08 failed at call 0000000000a217c8 (err=-6)
>>>>> ### ERROR ### Please RESET the board ###
>>>>>
>>>>> Instead fail gracfully with ENODEV to allow board continue booting.
>>>>>
>>>>> dwc3_glue_bind_common: subnode name: usb at fcc00000
>>>>> dwc3_glue_bind_common: unsupported dr_mode
>>>>>
>>>>> Signed-off-by: Jonas Karlman <jonas at kwiboo.se>
>>>>> ---
>>>>> drivers/usb/dwc3/dwc3-generic.c | 4 ++--
>>>>> 1 file changed, 2 insertions(+), 2 deletions(-)
>>>>>
>>>>> diff --git a/drivers/usb/dwc3/dwc3-generic.c b/drivers/usb/dwc3/dwc3-generic.c
>>>>> index c28ad47bddd8..f7859a530280 100644
>>>>> --- a/drivers/usb/dwc3/dwc3-generic.c
>>>>> +++ b/drivers/usb/dwc3/dwc3-generic.c
>>>>> @@ -422,13 +422,13 @@ static int dwc3_glue_bind_common(struct udevice *parent, ofnode node)
>>>>> dr_mode = usb_get_dr_mode(node);
>>>>>
>>>>> switch (dr_mode) {
>>>>> +#if CONFIG_IS_ENABLED(DM_USB_GADGET)
>>>>> case USB_DR_MODE_PERIPHERAL:
>>>>> case USB_DR_MODE_OTG:
>>>>> -#if CONFIG_IS_ENABLED(DM_USB_GADGET)
>>>>
>>>> Why not just do
>>>>
>>>> #else
>>>> return -ENODEV
>>>> #endif
>>>>
>>>> here ?
>>>
>>> The code was changed to closer match how host mode is already handled,
>>> and the default switch case already return -ENODEV.
>>
>> Let's try the above and see if that makes the code more readable.
>>
>> Also, you might want to try
>>
>> if (!CONFIG_IS_ENABLED(DM_USB_GADGET))
>> return -ENODEV;
>>
>> To improve build coverage.
>
> In my opinion this (after this patch as-is) is more readable and has the
> benefit of the debug message when DM_USB_GADGET is disabled.
>
>
> switch (dr_mode) {
> #if CONFIG_IS_ENABLED(DM_USB_GADGET)
> case USB_DR_MODE_PERIPHERAL:
> case USB_DR_MODE_OTG:
> debug("%s: dr_mode: OTG or Peripheral\n", __func__);
> driver = "dwc3-generic-peripheral";
> break;
> #endif
> #if defined(CONFIG_SPL_USB_HOST) || !defined(CONFIG_SPL_BUILD)
> case USB_DR_MODE_HOST:
> debug("%s: dr_mode: HOST\n", __func__);
> driver = "dwc3-generic-host";
> break;
> #endif
> default:
> debug("%s: unsupported dr_mode\n", __func__);
> return -ENODEV;
> };
>
>
> Compared to the following:
>
>
> switch (dr_mode) {
> case USB_DR_MODE_PERIPHERAL:
> case USB_DR_MODE_OTG:
> if (!CONFIG_IS_ENABLED(DM_USB_GADGET))
> return -ENODEV;
Maybe drop the switch-case and try:
if (CONFIG_IS_ENABLED(DM_USB_GADGET) &&
(dr_mode == USB_DR_MODE_PERIPHERAL || dr_mode == USB_DR_MODE_OTG))
{
> debug("%s: dr_mode: OTG or Peripheral\n", __func__);
> driver = "dwc3-generic-peripheral";
> break;
> #if defined(CONFIG_SPL_USB_HOST) || !defined(CONFIG_SPL_BUILD)
else if ((CONFIG_IS_ENABLED(USB_HOST) || !IS_ENABLED(SPL_BUILD)) &&
dr_mode == host) {
> case USB_DR_MODE_HOST:
> debug("%s: dr_mode: HOST\n", __func__);
> driver = "dwc3-generic-host";
> break;
> #endif
} else {
> default:
> debug("%s: unsupported dr_mode\n", __func__);
> return -ENODEV;
> };
}
>
> Any suggestion on how this could otherwise be refactored?
>
> The original intent with the patch is to fix a non-booting
> config to a booting config with minimal code changes :-)
It's awful either way, but at least with the CONFIG_IS_ENABLED() stuff,
we avoid bitrot of ifdef'd out code, since all the code is compiled in
any case.
More information about the U-Boot
mailing list