summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMDLZCOOL <[email protected]>2025-12-14 00:36:26 +0800
committersakumisu <[email protected]>2025-12-14 08:51:51 +0800
commit11b91a028309a16068dc91ae882ce694a1472c25 (patch)
treef246fc3d6d539b89b1a94e45d1fe8304ce2d067f
parentb1ca0406a539d9e54c9e2da27e87897fe14f4301 (diff)
fix(usbh_serial): don't resubmit the read urb when rx short packet
-rw-r--r--class/serial/usbh_serial.c19
1 files changed, 10 insertions, 9 deletions
diff --git a/class/serial/usbh_serial.c b/class/serial/usbh_serial.c
index 56e1f011..3d02c2a8 100644
--- a/class/serial/usbh_serial.c
+++ b/class/serial/usbh_serial.c
@@ -174,6 +174,13 @@ static void usbh_serial_callback(void *arg, int nbytes)
return;
}
+ if (nbytes < serial->driver->ignore_rx_header) {
+ USB_LOG_ERR("serial rx short packet: %d\n", nbytes);
+ serial->rx_errorcode = -USB_ERR_IO;
+ usb_osal_sem_give(serial->rx_complete_sem);
+ return;
+ }
+
if (nbytes >= serial->driver->ignore_rx_header) {
/* resubmit the read urb */
usbh_bulk_urb_fill(&serial->bulkin_urb, serial->hport, serial->bulkin, &serial->iobuffer[serial->rx_buf_index ? USBH_SERIAL_RX_NOCACHE_OFFSET : USBH_SERIAL_RX2_NOCACHE_OFFSET], serial->bulkin->wMaxPacketSize,
@@ -181,6 +188,9 @@ static void usbh_serial_callback(void *arg, int nbytes)
ret = usbh_submit_urb(&serial->bulkin_urb);
if (ret < 0) {
USB_LOG_ERR("serial submit failed: %d\n", ret);
+ serial->rx_errorcode = ret;
+ usb_osal_sem_give(serial->rx_complete_sem);
+ return;
}
usbh_serial_ringbuffer_write(&serial->rx_rb,
@@ -193,15 +203,6 @@ static void usbh_serial_callback(void *arg, int nbytes)
serial->rx_buf_index ^= 1;
serial->rx_errorcode = 0;
usb_osal_sem_give(serial->rx_complete_sem);
- } else {
- serial->rx_errorcode = nbytes;
- usb_osal_sem_give(serial->rx_complete_sem);
- usbh_bulk_urb_fill(&serial->bulkin_urb, serial->hport, serial->bulkin, &serial->iobuffer[serial->rx_buf_index ? USBH_SERIAL_RX2_NOCACHE_OFFSET : USBH_SERIAL_RX_NOCACHE_OFFSET], serial->bulkin->wMaxPacketSize,
- 0, usbh_serial_callback, serial);
- ret = usbh_submit_urb(&serial->bulkin_urb);
- if (ret < 0) {
- USB_LOG_ERR("serial resubmit short packet failed: %d\n", ret);
- }
}
}