From 883b77fe3bb08c93ca302fb8ea3c11af2ebd00ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Mo=C5=84?= Date: Tue, 14 Jan 2025 11:32:42 +0100 Subject: [PATCH] drivers: udc_dwc2: Recover after STALLed OUT Data Stage MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Prepare buffer to receive SETUP data on OUT endpoint 0 after endpoint halt. This solves the issue where the device would no longer process any control transfers after the first failed transfer with too large OUT Data Stage (when processing failed due to data stage buffer allocation failure). Signed-off-by: Tomasz Moń --- drivers/usb/udc/udc_dwc2.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/usb/udc/udc_dwc2.c b/drivers/usb/udc/udc_dwc2.c index adbd3074270..be50fcef6a4 100644 --- a/drivers/usb/udc/udc_dwc2.c +++ b/drivers/usb/udc/udc_dwc2.c @@ -1577,6 +1577,9 @@ static int udc_dwc2_ep_set_halt(const struct device *dev, LOG_DBG("Set halt ep 0x%02x", cfg->addr); if (ep_idx != 0) { cfg->stat.halted = true; + } else if (!udc_buf_peek(dev, USB_CONTROL_EP_OUT)) { + /* Data stage is STALLed, allow receiving next SETUP */ + dwc2_ctrl_feed_dout(dev, 8); } return 0;