diff --git a/sys/usb/usbus/cdc/acm/cdc_acm.c b/sys/usb/usbus/cdc/acm/cdc_acm.c index 4d65762e8a64..4c9b347f1515 100644 --- a/sys/usb/usbus/cdc/acm/cdc_acm.c +++ b/sys/usb/usbus/cdc/acm/cdc_acm.c @@ -152,25 +152,14 @@ size_t usbus_cdc_acm_submit(usbus_cdcacm_device_t *cdcacm, const uint8_t *buf, s { size_t n; unsigned old; - if (cdcacm->state != USBUS_CDC_ACM_LINE_STATE_DISCONNECTED) { - old = irq_disable(); - n = turb_add(&cdcacm->tsrb, buf, len); - irq_restore(old); - return n; + if (cdcacm->state == USBUS_CDC_ACM_LINE_STATE_DISCONNECTED) { + return len; } - /* stuff as much data as possible into tsrb, discarding the oldest */ + old = irq_disable(); - n = turb_free(&cdcacm->tsrb); - if (len > n) { - n += turb_drop(&cdcacm->tsrb, len - n); - buf += len - n; - } else { - n = len; - } - turb_add(&cdcacm->tsrb, buf, n); - /* behave as if everything has been written correctly */ + n = turb_add(&cdcacm->tsrb, buf, len); irq_restore(old); - return len; + return n; } void usbus_cdc_acm_set_coding_cb(usbus_cdcacm_device_t *cdcacm, @@ -357,8 +346,12 @@ static void _transfer_handler(usbus_t *usbus, usbus_handler_t *handler, { (void)usbus; (void)event; /* Only receives TR_COMPLETE events */ + if (ep->type != USB_EP_TYPE_BULK) { + return; + } + usbus_cdcacm_device_t *cdcacm = (usbus_cdcacm_device_t*)handler; - if ((ep->dir == USB_EP_DIR_OUT) && (ep->type == USB_EP_TYPE_BULK)) { + if (ep->dir == USB_EP_DIR_OUT) { size_t len; /* Retrieve incoming data */ usbdev_ep_get(ep, USBOPT_EP_AVAILABLE, &len, sizeof(size_t)); @@ -367,7 +360,7 @@ static void _transfer_handler(usbus_t *usbus, usbus_handler_t *handler, } usbdev_ep_xmit(ep, cdcacm->out_buf, CONFIG_USBUS_CDC_ACM_BULK_EP_SIZE); } - if ((ep->dir == USB_EP_DIR_IN) && (ep->type == USB_EP_TYPE_BULK)) { + else if (ep->dir == USB_EP_DIR_IN) { cdcacm->occupied = 0; if (!tsrb_empty(&cdcacm->tsrb)) { return _handle_in(cdcacm, ep); diff --git a/sys/usb/usbus/cdc/acm/cdc_acm_stdio.c b/sys/usb/usbus/cdc/acm/cdc_acm_stdio.c index fe171e74202b..64ab9bb1d700 100644 --- a/sys/usb/usbus/cdc/acm/cdc_acm_stdio.c +++ b/sys/usb/usbus/cdc/acm/cdc_acm_stdio.c @@ -51,9 +51,7 @@ static void _cdc_acm_rx_pipe(usbus_cdcacm_device_t *cdcacm, uint8_t *data, size_t len) { (void)cdcacm; - for (size_t i = 0; i < len; i++) { - isrpipe_write_one(&stdin_isrpipe, data[i]); - } + isrpipe_write(&stdin_isrpipe, data, len); } void usb_cdc_acm_stdio_init(usbus_t *usbus)