From 8b50d3768f4885108fd84fe8cfad1cc84dd28fba Mon Sep 17 00:00:00 2001 From: Marek Pieta Date: Tue, 27 Aug 2024 23:16:06 +0200 Subject: [PATCH] drivers: usb: udc_dwc2: Notify upper layer on failed TX Change ensures that `dwc2_handle_xfer_next` would notify upper layer if `dwc2_tx_fifo_write` fails. This is necessary to ensure that upper layer is aware of the failed TX for the submitted transfer. It also ensures that the submitted transfer is removed from the TX queue. Signed-off-by: Marek Pieta Signed-off-by: Kamil Piszczek --- drivers/usb/udc/udc_dwc2.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/drivers/usb/udc/udc_dwc2.c b/drivers/usb/udc/udc_dwc2.c index 7a8d9fcccf5..b0d03cd9429 100644 --- a/drivers/usb/udc/udc_dwc2.c +++ b/drivers/usb/udc/udc_dwc2.c @@ -639,9 +639,18 @@ static void dwc2_handle_xfer_next(const struct device *dev, if (USB_EP_DIR_IS_OUT(cfg->addr)) { dwc2_prep_rx(dev, buf, cfg); } else { - if (dwc2_tx_fifo_write(dev, cfg, buf)) { - LOG_ERR("Failed to start write to TX FIFO, ep 0x%02x", - cfg->addr); + int err = dwc2_tx_fifo_write(dev, cfg, buf); + + if (err) { + LOG_ERR("Failed to start write to TX FIFO, ep 0x%02x (err: %d)", + cfg->addr, err); + + buf = udc_buf_get(dev, cfg->addr); + if (udc_submit_ep_event(dev, buf, -ECONNREFUSED)) { + LOG_ERR("Failed to submit endpoint event"); + }; + + return; } }