usb: dwc3: don't reset device side if dwc3 was configured as host-only
Subsystems (2)
PATCH 1/1 usb: dwc3: don't reset device side if dwc3 was configured as host-only
Commit c4a5153e87fd ("usb: dwc3: core: Power-off core/PHYs on system_suspend in host mode") replaces check for HOST only dr_mode with current_dr_role. But during booting, the current_dr_role isn't initialized, thus the device side reset is always issued even if dwc3 was configured as host-only. What's more, on some platforms with host only dwc3, aways issuing device side reset by accessing device register block can cause kernel panic.
--- drivers/usb/dwc3/core.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/usb/dwc3/core.c +2 -2
@@ -277,9 +277,9 @@ int dwc3_core_soft_reset(struct dwc3 *dwc)/* * We're resetting only the device side because, if we're in host mode, * XHCI driver will reset the host block. If dwc3 was configured for -* host-only mode, then we can return early. +* host-only mode or current role is host, then we can return early. */ -if (dwc->current_dr_role ==DWC3_GCTL_PRTCAP_HOST ) +if (dwc->dr_mode ==USB_DR_MODE_HOST || dwc->current_dr_role ==DWC3_GCTL_PRTCAP_HOST )return 0 ; reg =dwc3_readl (dwc->regs,DWC3_DCTL );
Signature · 1 line
2.40.1
Quoted 8 lines · Jisheng Zhang
Commit
c4a5153e87fd("usb: dwc3: core: Power-off core/PHYs onsystem_suspendin host mode") replaces check for HOST onlydr_modewithcurrent_dr_role. But during booting, thecurrent_dr_roleisn't initialized, thus the device side reset is always issued even if dwc3 was configured as host-only. What's more, on some platforms with host only dwc3, aways issuing device side reset by accessing device register block can cause kernel panic.
Ah... good catch!
This should be backported to stable.
So perhaps you or Greg can add Cc: [email protected]
Quoted 25 lines
Fixes c4a5153e87fd ("usb: dwc3: core: Power-off core/PHYs on system_suspend in host mode")Signed-off-by Jisheng Zhang <[email protected]>--- drivers/usb/dwc3/core.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)drivers/usb/dwc3/core.c +2
-2@@ -277,9 +277,9 @@ int dwc3_core_soft_reset(struct dwc3 *dwc)/* * We're resetting only the device side because, if we're in host mode, * XHCI driver will reset the host block. If dwc3 was configured for -* host-only mode, then we can return early. +* host-only mode or current role is host, then we can return early. */ -if (dwc->current_dr_role ==DWC3_GCTL_PRTCAP_HOST ) +if (dwc->dr_mode ==USB_DR_MODE_HOST || dwc->current_dr_role ==DWC3_GCTL_PRTCAP_HOST )return 0 ; reg =dwc3_readl (dwc->regs,DWC3_DCTL );Signature · 1 line
2.40.1
Thanks,
Thinh
It seems that this patch causes driver failed to initialize on rockchip rk3399 devices when DWC3 controller is configured as dual role.
[ 2.827119] dwc3 fe900000.usb: error -ETIMEDOUT: failed to initialize core [ 2.827881] dwc3: probe of fe900000.usb failed with error -110
After some tests I am preliminarily certain that this patch caused the failure.