FAILED: patch "[PATCH] usb: dwc3: Avoid waking up gadget during startxfer" failed to apply to 5.4-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 5.4-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-5.4.y
git checkout FETCH_HEAD
git cherry-pick -x 00dcf2fa449f23a263343d7fe051741bdde65d0b
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2024090924-crescent-edging-00be@gregkh' --subject-prefix 'PATCH 5.4.y' HEAD^..
Possible dependencies:
00dcf2fa449f ("usb: dwc3: Avoid waking up gadget during startxfer") 047161686b81 ("usb: dwc3: Add remote wakeup handling") a02a26eb0aea ("usb: dwc3: gadget: Ignore Update Transfer cmd params") 63c4c320ccf7 ("usb: dwc3: gadget: Check for L1/L2/U3 for Start Transfer") 40edb52298df ("usb: dwc3: avoid NULL access of usb_gadget_driver") c560e76319a9 ("usb: dwc3: gadget: Fix START_TRANSFER link state check") 475e8be53d04 ("usb: dwc3: gadget: Check for disabled LPM quirk") 82c46b8ed9dc ("usb: dwc3: gadget: Introduce a DWC3 VBUS draw callback") f580170f135a ("usb: dwc3: Add splitdisable quirk for Hisilicon Kirin Soc") e81a7018d93a ("usb: dwc3: allocate gadget structure dynamically") c5a7092f4015 ("usb: dwc3: gadget: make starting isoc transfers more robust") 9af21dd6faeb ("usb: dwc3: Add support for DWC_usb32 IP") 8bb14308a869 ("usb: dwc3: core: Use role-switch default dr_mode") d0550cd20e52 ("usb: dwc3: gadget: Do link recovery for SS and SSP") d94ea5319813 ("usb: dwc3: gadget: Properly set maxpacket limit") 586f4335700f ("usb: dwc3: Fix GTXFIFOSIZ.TXFDEP macro name") 5eb5afb07853 ("usb: dwc3: use proper initializers for property entries") 9ba3aca8fe82 ("usb: dwc3: Disable phy suspend after power-on reset")
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 00dcf2fa449f23a263343d7fe051741bdde65d0b Mon Sep 17 00:00:00 2001
From: Prashanth K <[email protected]>
Date: Wed, 28 Aug 2024 12:13:02 +0530
Subject: [PATCH] usb: dwc3: Avoid waking up gadget during startxfer
When operating in High-Speed, it is observed that DSTS[USBLNKST] doesn't update link state immediately after receiving the wakeup interrupt. Since wakeup event handler calls the resume callbacks, there is a chance that function drivers can perform an ep queue, which in turn tries to perform remote wakeup from send_gadget_ep_cmd(STARTXFER). This happens because DSTS[[21:18] wasn't updated to U0 yet, it's observed that the latency of DSTS can be in order of milli-seconds. Hence avoid calling gadget_wakeup during startxfer to prevent unnecessarily issuing remote wakeup to host.
drivers/usb/dwc3/gadget.c +17 -24
@@ -287,6 +287,23 @@ static int __dwc3_gadget_wakeup(struct dwc3 *dwc, bool async);* * Caller should handle locking. This function will issue @cmd with given * @params to @dep and wait for its completion. +* +* According to the programming guide, if the link state is in L1/L2/U3, +* then sending the Start Transfer command may not complete. The +* programming guide suggested to bring the link state back to ON/U0 by +* performing remote wakeup prior to sending the command. However, don't +* initiate remote wakeup when the user/function does not send wakeup +* request via wakeup ops. Send the command when it's allowed. +* +* Notes: +* For L1 link state, issuing a command requires the clearing of +* GUSB2PHYCFG.SUSPENDUSB2, which turns on the signal required to complete +* the given command (usually within 50us). This should happen within the +* command timeout set by driver. No additional step is needed. +* +* For L2 or U3 link state, the gadget is in USB suspend. Care should be +* taken when sending Start Transfer command to ensure that it's done after +* USB resume. */ int dwc3_send_gadget_ep_cmd (struct dwc3_ep *dep,unsigned int cmd,struct dwc3_gadget_ep_cmd_params *params)
@@ -327,30 +344,6 @@ int dwc3_send_gadget_ep_cmd(struct dwc3_ep *dep, unsigned int cmd,dwc3_writel (dwc->regs,DWC3_GUSB2PHYCFG (0 ), reg); } -if (DWC3_DEPCMD_CMD (cmd) ==DWC3_DEPCMD_STARTTRANSFER ) { -int link_state; - -/* -* Initiate remote wakeup if the link state is in U3 when -* operating in SS/SSP or L1/L2 when operating in HS/FS. If the -* link state is in U1/U2, no remote wakeup is needed. The Start -* Transfer command will initiate the link recovery. -*/ - link_state =dwc3_gadget_get_link_state (dwc); -switch (link_state) { -case DWC3_LINK_STATE_U2 : -if (dwc->gadget->speed >=USB_SPEED_SUPER ) -break ; - - fallthrough; -case DWC3_LINK_STATE_U3 : - ret =__dwc3_gadget_wakeup (dwc, false); -dev_WARN_ONCE (dwc->dev, ret,"wakeup failed --> %d\n" , - ret); -break ; - } - } -/* * For some commands such as Update Transfer command, DEPCMDPARn * registers are reserved. Since the driver often sends Update Transfer