Files
build/patch/kernel/archive/sunxi-6.16/patches.megous/Revert-usb-dwc3-Abort-suspend-on-soft-disconnect-fai.patch

90 lines
2.5 KiB
Diff

From 48c707b5f50a1cd87925a725e5c85ac06b19219f Mon Sep 17 00:00:00 2001
From: Ondrej Jirman <megi@xff.cz>
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