Skip to content

Commit 119fcc0

Browse files
committed
[nrf fromlist] drivers: udc_dwc2: Disable control IN endpoint on timeout
DWC2 core sets DIEPCTL0 SNAK when SETUP packet is received. The CNAK bit results in device sending NAK in response to IN token sent to EP0, but it does not modify the TxFIFO in any way. The stale data in TxFIFO can then lead to "FIFO space is too low" error. Solve the issue by disabling and flushing IN endpoint 0 if previous control transfer did not finish. Upstream PR #: 88642 Signed-off-by: Tomasz Moń <[email protected]>
1 parent 9ac878d commit 119fcc0

File tree

1 file changed

+6
-1
lines changed

1 file changed

+6
-1
lines changed

drivers/usb/udc/udc_dwc2.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,9 @@ struct udc_dwc2_data {
139139
uint8_t setup[8];
140140
};
141141

142+
static void udc_dwc2_ep_disable(const struct device *dev,
143+
struct udc_ep_config *const cfg, bool stall);
144+
142145
#if defined(CONFIG_PINCTRL)
143146
#include <zephyr/drivers/pinctrl.h>
144147

@@ -801,6 +804,7 @@ static int dwc2_handle_evt_setup(const struct device *dev)
801804

802805
buf = udc_buf_get_all(dev, USB_CONTROL_EP_IN);
803806
if (buf) {
807+
udc_dwc2_ep_disable(dev, udc_get_ep_cfg(dev, USB_CONTROL_EP_IN), false);
804808
net_buf_unref(buf);
805809
}
806810

@@ -1493,7 +1497,8 @@ static void udc_dwc2_ep_disable(const struct device *dev,
14931497
dxepctl_reg = dwc2_get_dxepctl_reg(dev, cfg->addr);
14941498
dxepctl = sys_read32(dxepctl_reg);
14951499

1496-
if (!is_iso && (dxepctl & USB_DWC2_DEPCTL_NAKSTS)) {
1500+
if (!is_iso && (dxepctl & USB_DWC2_DEPCTL_NAKSTS) &&
1501+
!(dxepctl & USB_DWC2_DEPCTL_EPENA)) {
14971502
/* Endpoint already sends forced NAKs. STALL if necessary. */
14981503
if (stall) {
14991504
dxepctl |= USB_DWC2_DEPCTL_STALL;

0 commit comments

Comments
 (0)