linux/drivers/usb/dwc3
Wesley Cheng c519a9054b usb: dwc3: gadget: Handle EP0 request dequeuing properly
[ Upstream commit 730e12fbec ]

Current EP0 dequeue path will share the same as other EPs.  However, there
are some special considerations that need to be made for EP0 transfers:

  - EP0 transfers never transition into the started_list
  - EP0 only has one active request at a time

In case there is a vendor specific control message for a function over USB
FFS, then there is no guarantee on the timeline which the DATA/STATUS stage
is responded to.  While this occurs, any attempt to end transfers on
non-control EPs will end up having the DWC3_EP_DELAY_STOP flag set, and
defer issuing of the end transfer command.  If the USB FFS application
decides to timeout the control transfer, or if USB FFS AIO path exits, the
USB FFS driver will issue a call to usb_ep_dequeue() for the ep0 request.

In case of the AIO exit path, the AIO FS blocks until all pending USB
requests utilizing the AIO path is completed.  However, since the dequeue
of ep0 req does not happen properly, all non-control EPs with the
DWC3_EP_DELAY_STOP flag set will not be handled, and the AIO exit path will
be stuck waiting for the USB FFS data endpoints to receive a completion
callback.

Fix is to utilize dwc3_ep0_reset_state() in the dequeue API to ensure EP0
is brought back to the SETUP state, and ensures that any deferred end
transfer commands are handled.  This also will end any active transfers
on EP0, compared to the previous implementation which directly called
giveback only.

Fixes: fcd2def663 ("usb: dwc3: gadget: Refactor dwc3_gadget_ep_dequeue")
Cc: stable <stable@kernel.org>
Signed-off-by: Wesley Cheng <quic_wcheng@quicinc.com>
Acked-by: Thinh Nguyen <Thinh.Nguyen@synopsys.com>
Link: https://lore.kernel.org/r/20231206201814.32664-1-quic_wcheng@quicinc.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
History 2024-01-31 16:16:57 -08:00
..
core.c Revert "usb: dwc3: don't reset device side if dwc3 was configured as host-only" 2024-01-25 15:27:39 -08:00
core.h usb: dwc3: core: configure TX/RX threshold for DWC3_IP 2023-11-28 17:07:01 +00:00
debug.h USB: dwc3: fix memory leak with using debugfs_lookup() 2023-03-11 13:55:36 +01:00
debugfs.c usb: dwc3: debugfs: Resume dwc3 before accessing registers 2023-05-24 17:32:48 +01:00
drd.c usb: dwc3: Fix default mode initialization 2023-12-03 07:32:12 +01:00
dwc3-am62.c usb: dwc3-am62: remove unnecesary clk_put() 2022-06-29 21:04:55 +02:00
dwc3-exynos.c usb: dwc3: exynos: Fix remove() function 2022-11-22 16:51:45 +01:00
dwc3-haps.c usb: dwc3: haps: Constify the software node 2021-02-04 15:42:06 +01:00
dwc3-imx8mp.c usb: dwc3: imx8mp: Add support for setting SOC specific flags 2022-03-15 15:37:11 +01:00
dwc3-keystone.c usb: dwc3: fix incorrect kernel-doc comment syntax in files 2021-04-02 15:20:51 +02:00
dwc3-meson-g12a.c usb: dwc3: meson-g12a: do post init to fix broken usb after resumption 2023-09-06 21:27:00 +01:00
dwc3-of-simple.c usb: dwc3: Add driver for Xilinx platforms 2021-03-23 12:48:14 +01:00
dwc3-omap.c usb: dwc3: omap: fix "unbalanced disables for smps10_out1" on omap5evm 2022-03-15 15:44:46 +01:00
dwc3-pci.c usb: dwc3: pci: skip BYT GPIO lookup table for hardwired phy 2023-08-03 10:24:10 +02:00
dwc3-qcom.c USB: dwc3: qcom: fix wakeup after probe deferral 2023-12-03 07:32:13 +01:00
dwc3-st.c usb: dwc3: st: Rely on child's compatible instead of name 2022-10-25 19:06:13 +02:00
dwc3-xilinx.c usb: dwc3: xilinx: include linux/gpio/consumer.h 2023-01-12 12:02:34 +01:00
ep0.c usb: dwc: ep0: Update request status in dwc3_ep0_stall_restart 2024-01-25 15:27:39 -08:00
gadget.c usb: dwc3: gadget: Handle EP0 request dequeuing properly 2024-01-31 16:16:57 -08:00
gadget.h usb: dwc3: Fix ep0 handling when getting reset while doing control transfer 2022-05-19 18:14:16 +02:00
host.c Revert "usb: dwc3: disable USB core PHY management" 2022-11-08 16:45:12 +01:00
io.h usb: dwc3: fix incorrect kernel-doc comment syntax in files 2021-04-02 15:20:51 +02:00
Kconfig usb: dwc3: fix extcon dependency 2023-02-01 08:34:25 +01:00
Makefile drivers: usb: dwc3: Add AM62 USB wrapper driver 2022-04-21 18:31:56 +02:00
trace.c usb: dwc3: fix incorrect kernel-doc comment syntax in files 2021-04-02 15:20:51 +02:00
trace.h usb: dwc3: trace: add Start of Frame Number to trace event 2022-08-19 11:03:52 +02:00
ulpi.c usb: dwc3: ulpi: Fix USB2.0 HS/FS/LS PHY suspend regression 2020-12-28 15:55:44 +01:00