|
|
@@ -165,27 +165,43 @@ static void usbh_serial_callback(void *arg, int nbytes)
|
|
|
struct usbh_serial *serial = (struct usbh_serial *)arg;
|
|
|
int ret;
|
|
|
|
|
|
- if (nbytes >= serial->driver->ignore_rx_header) {
|
|
|
- usbh_serial_ringbuffer_write(&serial->rx_rb,
|
|
|
- &serial->iobuffer[USBH_SERIAL_RX_NOCACHE_OFFSET + serial->driver->ignore_rx_header],
|
|
|
- (nbytes - serial->driver->ignore_rx_header));
|
|
|
+ if (nbytes < 0) {
|
|
|
+ if (nbytes != -USB_ERR_SHUTDOWN) {
|
|
|
+ USB_LOG_ERR("serial transfer error: %d\n", nbytes);
|
|
|
+ }
|
|
|
+ serial->rx_errorcode = nbytes;
|
|
|
+ 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[USBH_SERIAL_RX_NOCACHE_OFFSET], serial->bulkin->wMaxPacketSize,
|
|
|
+ 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,
|
|
|
0, usbh_serial_callback, serial);
|
|
|
ret = usbh_submit_urb(&serial->bulkin_urb);
|
|
|
if (ret < 0) {
|
|
|
USB_LOG_ERR("serial submit failed: %d\n", ret);
|
|
|
}
|
|
|
|
|
|
+ usbh_serial_ringbuffer_write(&serial->rx_rb,
|
|
|
+ &serial->iobuffer[(serial->rx_buf_index ? USBH_SERIAL_RX2_NOCACHE_OFFSET : USBH_SERIAL_RX_NOCACHE_OFFSET) + serial->driver->ignore_rx_header],
|
|
|
+ (nbytes - serial->driver->ignore_rx_header));
|
|
|
+
|
|
|
if (serial->rx_complete_callback) {
|
|
|
serial->rx_complete_callback(serial, nbytes - serial->driver->ignore_rx_header);
|
|
|
}
|
|
|
+ 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);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -439,7 +455,8 @@ int usbh_serial_control(struct usbh_serial *serial, int cmd, void *arg)
|
|
|
|
|
|
usbh_serial_ringbuffer_reset(&serial->rx_rb);
|
|
|
usb_osal_sem_reset(serial->rx_complete_sem);
|
|
|
- usbh_bulk_urb_fill(&serial->bulkin_urb, serial->hport, serial->bulkin, &serial->iobuffer[USBH_SERIAL_RX_NOCACHE_OFFSET], serial->bulkin->wMaxPacketSize,
|
|
|
+ serial->rx_buf_index = 0;
|
|
|
+ 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);
|
|
|
|