Re: [PATCH] usb: dwc3: qcom: Make sure core device is fully initialized before it is used

From: Bjorn Andersson
Date: Wed Jun 17 2020 - 01:35:34 EST


On Tue 16 Jun 13:37 PDT 2020, Matthias Kaehlcke wrote:

> dwc3_qcom_of_register_core() uses of_platform_populate() to add
> the dwc3 core device. The driver core will try to probe the device,
> however this might fail (e.g. due to deferred probing) and
> of_platform_populate() would still return 0 if the device was
> successully added to the platform bus. Verify that the core device
> is actually bound to its driver before using it, defer probing of the
> dwc3_qcom device if the core device isn't ready (yet).
>
> Fixes: a4333c3a6ba9 ("usb: dwc3: Add Qualcomm DWC3 glue driver").
> Signed-off-by: Matthias Kaehlcke <mka@xxxxxxxxxxxx>

I wish there was a better way than to unregistering the dwc3 device when
this happens. E.g. if dwc3 fails for some other reason we still would
keep probe deferring the qcom part and each time attempt to reprobe dwc3.

But with the way the device model is used here I don't have any better
suggestions, and until a better solution appears this does improve the
situation...

Reviewed-by: Bjorn Andersson <bjorn.andersson@xxxxxxxxxx>

Regards,
Bjorn

> ---
> depends on:
> https://lore.kernel.org/patchwork/patch/1251661/ ("driver core:Export
> the symbol device_is_bound")
>
> drivers/usb/dwc3/dwc3-qcom.c | 10 ++++++++++
> 1 file changed, 10 insertions(+)
>
> diff --git a/drivers/usb/dwc3/dwc3-qcom.c b/drivers/usb/dwc3/dwc3-qcom.c
> index 1dfd024cd06b..5a9036b050c6 100644
> --- a/drivers/usb/dwc3/dwc3-qcom.c
> +++ b/drivers/usb/dwc3/dwc3-qcom.c
> @@ -537,6 +537,16 @@ static int dwc3_qcom_of_register_core(struct platform_device *pdev)
> return -ENODEV;
> }
>
> + /*
> + * A successful return from of_platform_populate() only guarantees that
> + * the core device was added to the platform bus, however it might not
> + * be bound to its driver (e.g. due to deferred probing). This driver
> + * requires the core device to be fully initialized, so defer probing
> + * if it isn't ready (yet).
> + */
> + if (!device_is_bound(&qcom->dwc3->dev))
> + return -EPROBE_DEFER;
> +
> return 0;
> }
>
> --
> 2.27.0.290.gba653c62da-goog
>