From 89a81e3c1f9d17eaea403cc5329fcec9d48febbf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Mo=C5=84?= Date: Mon, 9 Jun 2025 10:14:11 +0200 Subject: [PATCH] drivers: udc_dwc2: Disable control IN endpoint on SETUP MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit New control transfer is started prematurely from device perspective when host timeout occurs. Any data transfer from previous control transfer have to be cancelled prior to handling SETUP data. Unconditionally disable control IN endpoint to prevent race for enqueued buffer between udc_buf_get_all() called in dwc2_handle_evt_setup() and udc_buf_peek() called in dwc2_handle_in_xfercompl(). Signed-off-by: Tomasz Moń --- drivers/usb/udc/udc_dwc2.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/usb/udc/udc_dwc2.c b/drivers/usb/udc/udc_dwc2.c index 269dfd56ee5..9b57436bc4b 100644 --- a/drivers/usb/udc/udc_dwc2.c +++ b/drivers/usb/udc/udc_dwc2.c @@ -823,6 +823,7 @@ static int dwc2_handle_evt_setup(const struct device *dev) * transfer beforehand. In Buffer DMA the SETUP can be copied to any EP0 * OUT buffer. If there is any buffer queued, it is obsolete now. */ + udc_dwc2_ep_disable(dev, cfg_in, false); atomic_and(&priv->xfer_finished, ~(BIT(0) | BIT(16))); buf = udc_buf_get_all(cfg_out); @@ -832,7 +833,6 @@ static int dwc2_handle_evt_setup(const struct device *dev) buf = udc_buf_get_all(cfg_in); if (buf) { - udc_dwc2_ep_disable(dev, cfg_in, false); net_buf_unref(buf); }