FAILED: patch "[PATCH] usb: dwc3: gadget: Improve dwc3_gadget_suspend() and" failed to apply to 4.19-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 4.19-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-4.19.y
git checkout FETCH_HEAD
git cherry-pick -x c8540870af4ce6ddeb27a7bb5498b75fb29b643c
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2023052252-overstock-junior-02c2@gregkh' --subject-prefix 'PATCH 4.19.y' HEAD^..
Possible dependencies:
c8540870af4c ("usb: dwc3: gadget: Improve dwc3_gadget_suspend() and dwc3_gadget_resume()") bdb19d01026a ("USB: dwc3: gadget: drop dead hibernation code")af870d93c706 ("usb: dwc3: Fix typos in gadget.c")5265397f9442 ("usb: dwc3: Remove DWC3 locking during gadget suspend/resume") 9711c67de748 ("usb: dwc3: gadget: Synchronize IRQ between soft connect/disconnect") 8f8034f493b5 ("usb: dwc3: gadget: Don't modify GEVNTCOUNT in pullup()") 861c010a2ee1 ("usb: dwc3: gadget: Refactor pullup()")0066472de157 ("usb: dwc3: Issue core soft reset before enabling run/stop") 8217f07a5023 ("usb: dwc3: gadget: Avoid starting DWC3 gadget during UDC unbind") 8212937305f8 ("usb: dwc3: gadget: Disable gadget IRQ during pullup disable") f09ddcfcb8c5 ("usb: dwc3: gadget: Prevent EP queuing while stopping transfers") a66a7d48f34a ("Merge 5.11-rc3 into usb-next")
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From c8540870af4ce6ddeb27a7bb5498b75fb29b643c Mon Sep 17 00:00:00 2001
From: Roger Quadros <[email protected]>
Date: Wed, 3 May 2023 14:00:48 +0300
Subject: [PATCH] usb: dwc3: gadget: Improve dwc3_gadget_suspend() and
dwc3_gadget_resume()
Prevent -ETIMEDOUT error on .suspend().
e.g. If gadget driver is loaded and we are connected to a USB host, all transfers must be stopped before stopping the controller else we will not get a clean stop i.e. dwc3_gadget_run_stop() will take several seconds to complete and will return -ETIMEDOUT.
Handle error cases properly in dwc3_gadget_suspend(). Simplify dwc3_gadget_resume() by using the introduced helper function.
drivers/usb/dwc3/gadget.c +34 -33
@@ -2699,6 +2699,21 @@ static int dwc3_gadget_soft_disconnect(struct dwc3 *dwc)return ret; } +static int dwc3_gadget_soft_connect (struct dwc3 *dwc) +{ +/* +* In the Synopsys DWC_usb31 1.90a programming guide section +* 4.1.9, it specifies that for a reconnect after a +* device-initiated disconnect requires a core soft reset +* (DCTL.CSftRst) before enabling the run/stop bit. +*/ +dwc3_core_soft_reset (dwc); + +dwc3_event_buffers_setup (dwc); +__dwc3_gadget_start (dwc); +return dwc3_gadget_run_stop (dwc, true); +} +static int dwc3_gadget_pullup (struct usb_gadget *g,int is_on) {struct dwc3 *dwc =gadget_to_dwc (g);
@@ -2737,21 +2752,10 @@ static int dwc3_gadget_pullup(struct usb_gadget *g, int is_on)synchronize_irq (dwc->irq_gadget); -if (!is_on) { +if (!is_on) ret =dwc3_gadget_soft_disconnect (dwc); - }else { -/* -* In the Synopsys DWC_usb31 1.90a programming guide section -* 4.1.9, it specifies that for a reconnect after a -* device-initiated disconnect requires a core soft reset -* (DCTL.CSftRst) before enabling the run/stop bit. -*/ -dwc3_core_soft_reset (dwc); - -dwc3_event_buffers_setup (dwc); -__dwc3_gadget_start (dwc); - ret =dwc3_gadget_run_stop (dwc, true); - } +else + ret =dwc3_gadget_soft_connect (dwc);pm_runtime_put (dwc->dev);
@@ -4655,42 +4659,39 @@ void dwc3_gadget_exit(struct dwc3 *dwc)int dwc3_gadget_suspend (struct dwc3 *dwc) {unsigned long flags; +int ret;if (!dwc->gadget_driver)return 0 ; -dwc3_gadget_run_stop (dwc, false); + ret =dwc3_gadget_soft_disconnect (dwc); +if (ret) + goto err;spin_lock_irqsave (&dwc->lock, flags);dwc3_disconnect_gadget (dwc); -__dwc3_gadget_stop (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) { -int ret; -if (!dwc->gadget_driver || !dwc->softconnect)return 0 ; - ret =__dwc3_gadget_start (dwc); -if (ret <0 ) - goto err0; - - ret =dwc3_gadget_run_stop (dwc, true); -if (ret <0 ) - goto err1; - -return 0 ; - -err1: -__dwc3_gadget_stop (dwc); - -err0: -return ret; +return dwc3_gadget_soft_connect (dwc); }void dwc3_gadget_process_pending_events (struct dwc3 *dwc)