lkml.org 
[lkml]   [2020]   [Oct]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.9 311/757] usb: dwc3: core: Properly default unspecified speed
    Date
    From: Thinh Nguyen <Thinh.Nguyen@synopsys.com>

    [ Upstream commit b574ce3ee45937f4a01edc98c59213bfc7effe50 ]

    If the maximum_speed is not specified, default the device speed base on
    its HW capability. Don't prematurely check HW capability before
    validating the maximum_speed device property. The device property takes
    precedence in dwc->maximum_speed.

    Fixes: 0e1e5c47f7a9 ("usb: dwc3: add support for USB 2.0-only core configuration")
    Reported-by: Chunfeng Yun <chunfeng.yun@mediatek.com>
    Signed-off-by: Thinh Nguyen <thinhn@synopsys.com>
    Signed-off-by: Felipe Balbi <balbi@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/usb/dwc3/core.c | 35 ++++++++++++++++++-----------------
    1 file changed, 18 insertions(+), 17 deletions(-)

    diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c
    index 2eb34c8b4065f..c8e0ef2c1db33 100644
    --- a/drivers/usb/dwc3/core.c
    +++ b/drivers/usb/dwc3/core.c
    @@ -929,13 +929,6 @@ static int dwc3_core_init(struct dwc3 *dwc)
    */
    dwc3_writel(dwc->regs, DWC3_GUID, LINUX_VERSION_CODE);

    - /* Handle USB2.0-only core configuration */
    - if (DWC3_GHWPARAMS3_SSPHY_IFC(dwc->hwparams.hwparams3) ==
    - DWC3_GHWPARAMS3_SSPHY_IFC_DIS) {
    - if (dwc->maximum_speed == USB_SPEED_SUPER)
    - dwc->maximum_speed = USB_SPEED_HIGH;
    - }
    -
    ret = dwc3_phy_setup(dwc);
    if (ret)
    goto err0;
    @@ -1381,6 +1374,8 @@ bool dwc3_has_imod(struct dwc3 *dwc)
    static void dwc3_check_params(struct dwc3 *dwc)
    {
    struct device *dev = dwc->dev;
    + unsigned int hwparam_gen =
    + DWC3_GHWPARAMS3_SSPHY_IFC(dwc->hwparams.hwparams3);

    /* Check for proper value of imod_interval */
    if (dwc->imod_interval && !dwc3_has_imod(dwc)) {
    @@ -1412,17 +1407,23 @@ static void dwc3_check_params(struct dwc3 *dwc)
    dwc->maximum_speed);
    fallthrough;
    case USB_SPEED_UNKNOWN:
    - /* default to superspeed */
    - dwc->maximum_speed = USB_SPEED_SUPER;
    -
    - /*
    - * default to superspeed plus if we are capable.
    - */
    - if ((DWC3_IP_IS(DWC31) || DWC3_IP_IS(DWC32)) &&
    - (DWC3_GHWPARAMS3_SSPHY_IFC(dwc->hwparams.hwparams3) ==
    - DWC3_GHWPARAMS3_SSPHY_IFC_GEN2))
    + switch (hwparam_gen) {
    + case DWC3_GHWPARAMS3_SSPHY_IFC_GEN2:
    dwc->maximum_speed = USB_SPEED_SUPER_PLUS;
    -
    + break;
    + case DWC3_GHWPARAMS3_SSPHY_IFC_GEN1:
    + if (DWC3_IP_IS(DWC32))
    + dwc->maximum_speed = USB_SPEED_SUPER_PLUS;
    + else
    + dwc->maximum_speed = USB_SPEED_SUPER;
    + break;
    + case DWC3_GHWPARAMS3_SSPHY_IFC_DIS:
    + dwc->maximum_speed = USB_SPEED_HIGH;
    + break;
    + default:
    + dwc->maximum_speed = USB_SPEED_SUPER;
    + break;
    + }
    break;
    }
    }
    --
    2.25.1


    \
     
     \ /
      Last update: 2020-10-27 17:11    [W:4.017 / U:0.204 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site