lkml.org 
[lkml]   [2022]   [Dec]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v5 2/2] usb: dwc3: core: defer probe on ulpi_read_id timeout
    Date
    Since commit 0f0101719138 ("usb: dwc3: Don't switch OTG -> peripheral
    if extcon is present"), Dual Role support on Intel Merrifield platform
    broke due to rearranging the call to dwc3_get_extcon().

    It appears to be caused by ulpi_read_id() masking the timeout on the first
    test write. In the past dwc3 probe continued by calling dwc3_core_soft_reset()
    followed by dwc3_get_extcon() which happend to return -EPROBE_DEFER.
    On deferred probe ulpi_read_id() finally succeeded. Due to above mentioned
    rearranging -EPROBE_DEFER is not returned and probe completes without phy.

    On Intel Merrifield the timeout on the first test write issue is reproducible
    but it is difficult to find the root cause. Using a mainline kernel and
    rootfs with buildroot ulpi_read_id() succeeds. As soon as adding
    ftrace / bootconfig to find out why, ulpi_read_id() fails and we can't
    analyze the flow. Using another rootfs ulpi_read_id() fails even without
    adding ftrace. We suspect the issue is some kind of timing / race, but
    merely retrying ulpi_read_id() does not resolve the issue.

    As we now changed ulpi_read_id() to return -ETIMEDOUT in this case, we
    need to handle the error by calling dwc3_core_soft_reset() and request
    -EPROBE_DEFER. On deferred probe ulpi_read_id() is retried and succeeds.

    Fixes: ef6a7bcfb01c ("usb: ulpi: Support device discovery via DT")
    Cc: stable@vger.kernel.org
    Signed-off-by: Ferry Toth <ftoth@exalondelft.nl>
    ---
    drivers/usb/dwc3/core.c | 7 ++++++-
    1 file changed, 6 insertions(+), 1 deletion(-)

    diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c
    index 648f1c570021..2779f17bffaf 100644
    --- a/drivers/usb/dwc3/core.c
    +++ b/drivers/usb/dwc3/core.c
    @@ -1106,8 +1106,13 @@ static int dwc3_core_init(struct dwc3 *dwc)

    if (!dwc->ulpi_ready) {
    ret = dwc3_core_ulpi_init(dwc);
    - if (ret)
    + if (ret) {
    + if (ret == -ETIMEDOUT) {
    + dwc3_core_soft_reset(dwc);
    + ret = -EPROBE_DEFER;
    + }
    goto err0;
    + }
    dwc->ulpi_ready = true;
    }

    --
    2.37.2
    \
     
     \ /
      Last update: 2022-12-05 21:17    [W:4.202 / U:0.120 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site