From 65288c9d5b6580ac42013255c33071239825f9a3 Mon Sep 17 00:00:00 2001 From: sakumisu <1203593632@qq.com> Date: Thu, 31 Jul 2025 21:22:48 +0800 Subject: [PATCH] update(port/dwc2/usb_hc_dwc2): stop split transfer when intr nak, follow with nosplit intr transfer Signed-off-by: sakumisu <1203593632@qq.com> --- port/dwc2/usb_hc_dwc2.c | 38 ++++++++++++++++++++++++++++++++------ 1 file changed, 32 insertions(+), 6 deletions(-) diff --git a/port/dwc2/usb_hc_dwc2.c b/port/dwc2/usb_hc_dwc2.c index b8d54c3e..78e0d521 100644 --- a/port/dwc2/usb_hc_dwc2.c +++ b/port/dwc2/usb_hc_dwc2.c @@ -1215,9 +1215,22 @@ static void dwc2_inchan_irq_handler(struct usbh_bus *bus, uint8_t ch_num) } else if (chan_intstatus & USB_OTG_HCINT_NAK) { if (chan->do_ssplit) { /* restart ssplit transfer */ - chan->do_csplit = 0; - dwc2_chan_enable_csplit(bus, ch_num, false); - dwc2_chan_reenable(bus, ch_num); + switch (USB_GET_ENDPOINT_TYPE(urb->ep->bmAttributes)) { + case USB_ENDPOINT_TYPE_CONTROL: + case USB_ENDPOINT_TYPE_BULK: + chan->do_csplit = 0; + dwc2_chan_enable_csplit(bus, ch_num, false); + dwc2_chan_reenable(bus, ch_num); + break; + case USB_ENDPOINT_TYPE_INTERRUPT: + dwc2_chan_enable_csplit(bus, ch_num, false); + urb->errorcode = -USB_ERR_NAK; + dwc2_urb_waitup(urb); + break; + + default: + break; + } } else { urb->errorcode = -USB_ERR_NAK; dwc2_urb_waitup(urb); @@ -1339,9 +1352,22 @@ static void dwc2_outchan_irq_handler(struct usbh_bus *bus, uint8_t ch_num) } else if (chan_intstatus & USB_OTG_HCINT_NAK) { if (chan->do_ssplit) { /* restart ssplit transfer */ - chan->do_csplit = 0; - dwc2_chan_enable_csplit(bus, ch_num, false); - dwc2_chan_reenable(bus, ch_num); + switch (USB_GET_ENDPOINT_TYPE(urb->ep->bmAttributes)) { + case USB_ENDPOINT_TYPE_CONTROL: + case USB_ENDPOINT_TYPE_BULK: + chan->do_csplit = 0; + dwc2_chan_enable_csplit(bus, ch_num, false); + dwc2_chan_reenable(bus, ch_num); + break; + case USB_ENDPOINT_TYPE_INTERRUPT: + dwc2_chan_enable_csplit(bus, ch_num, false); + urb->errorcode = -USB_ERR_NAK; + dwc2_urb_waitup(urb); + break; + + default: + break; + } } else { urb->errorcode = -USB_ERR_NAK; dwc2_urb_waitup(urb);