From 48c707b5f50a1cd87925a725e5c85ac06b19219f Mon Sep 17 00:00:00 2001 From: Ondrej Jirman Date: Sat, 9 Aug 2025 10:10:42 +0200 Subject: [PATCH 2/3] Revert "usb: dwc3: Abort suspend on soft disconnect failure" This reverts commit 630a1dec3b0eba2a695b9063f1c205d585cbfec9. --- drivers/usb/dwc3/core.c | 9 ++------- drivers/usb/dwc3/gadget.c | 22 +++++++++++++--------- 2 files changed, 15 insertions(+), 16 deletions(-) diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c index 91dec9c81a40..1e436ac6a1fa 100644 --- a/drivers/usb/dwc3/core.c +++ b/drivers/usb/dwc3/core.c @@ -2460,7 +2460,6 @@ static int dwc3_suspend_common(struct dwc3 *dwc, pm_message_t msg) { u32 reg; int i; - int ret; if (!pm_runtime_suspended(dwc->dev) && !PMSG_IS_AUTO(msg)) { dwc->susphy_state = (dwc3_readl(dwc->regs, DWC3_GUSB2PHYCFG(0)) & @@ -2480,9 +2479,7 @@ static int dwc3_suspend_common(struct dwc3 *dwc, pm_message_t msg) case DWC3_GCTL_PRTCAP_DEVICE_DISCONNECTED: if (pm_runtime_suspended(dwc->dev)) break; - ret = dwc3_gadget_suspend(dwc); - if (ret) - return ret; + dwc3_gadget_suspend(dwc); synchronize_irq(dwc->irq_gadget); dwc3_core_exit(dwc); break; @@ -2517,9 +2514,7 @@ static int dwc3_suspend_common(struct dwc3 *dwc, pm_message_t msg) break; if (dwc->current_otg_role == DWC3_OTG_ROLE_DEVICE) { - ret = dwc3_gadget_suspend(dwc); - if (ret) - return ret; + dwc3_gadget_suspend(dwc); synchronize_irq(dwc->irq_gadget); } diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c index 74968f93d4a3..99fbd29d8f46 100644 --- a/drivers/usb/dwc3/gadget.c +++ b/drivers/usb/dwc3/gadget.c @@ -4821,15 +4821,8 @@ int dwc3_gadget_suspend(struct dwc3 *dwc) int ret; ret = dwc3_gadget_soft_disconnect(dwc); - /* - * Attempt to reset the controller's state. Likely no - * communication can be established until the host - * performs a port reset. - */ - if (ret && dwc->softconnect) { - dwc3_gadget_soft_connect(dwc); - return -EAGAIN; - } + if (ret) + goto err; spin_lock_irqsave(&dwc->lock, flags); if (dwc->gadget_driver) @@ -4837,6 +4830,17 @@ int dwc3_gadget_suspend(struct dwc3 *dwc) spin_unlock_irqrestore(&dwc->lock, flags); return 0; + +err: + /* + * Attempt to reset the controller's state. Likely no + * communication can be established until the host + * performs a port reset. + */ + if (dwc->softconnect) + dwc3_gadget_soft_connect(dwc); + + return ret; } int dwc3_gadget_resume(struct dwc3 *dwc) -- 2.51.0