From 6c04cb1a451ad0812b583398352882f7d1e3b41c Mon Sep 17 00:00:00 2001 From: Antonio Galea Date: Thu, 10 Oct 2019 08:26:45 +0200 Subject: [PATCH] USBUS CDC ACM: disable interrupts when using tsrb --- sys/usb/usbus/cdc/acm/cdc_acm.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/sys/usb/usbus/cdc/acm/cdc_acm.c b/sys/usb/usbus/cdc/acm/cdc_acm.c index a132fce5ba..a8e4bcccd9 100644 --- a/sys/usb/usbus/cdc/acm/cdc_acm.c +++ b/sys/usb/usbus/cdc/acm/cdc_acm.c @@ -126,11 +126,17 @@ static size_t _gen_full_acm_descriptor(usbus_t *usbus, void *arg) /* Submit (ACM interface in) */ size_t usbus_cdc_acm_submit(usbus_cdcacm_device_t *cdcacm, const uint8_t *buf, size_t len) { + size_t n; + unsigned old; if (cdcacm->state != USBUS_CDC_ACM_LINE_STATE_DISCONNECTED) { - return tsrb_add(&cdcacm->tsrb, buf, len); + old = irq_disable(); + n = tsrb_add(&cdcacm->tsrb, buf, len); + irq_restore(old); + return n; } /* stuff as much data as possible into tsrb, discarding the oldest */ - size_t n = tsrb_free(&cdcacm->tsrb); + old = irq_disable(); + n = tsrb_free(&cdcacm->tsrb); if (len > n) { n += tsrb_drop(&cdcacm->tsrb, len - n); buf += len - n; @@ -139,15 +145,16 @@ size_t usbus_cdc_acm_submit(usbus_cdcacm_device_t *cdcacm, const uint8_t *buf, s } tsrb_add(&cdcacm->tsrb, buf, n); /* behave as if everything has been written correctly */ + irq_restore(old); return len; } void usbus_cdc_acm_set_coding_cb(usbus_cdcacm_device_t *cdcacm, usbus_cdcacm_coding_cb_t coding_cb) { - irq_disable(); + unsigned old = irq_disable(); cdcacm->coding_cb = coding_cb; - irq_enable(); + irq_restore(old); } /* flush event */ @@ -286,6 +293,8 @@ static void _handle_in(usbus_cdcacm_device_t *cdcacm, (cdcacm->state != USBUS_CDC_ACM_LINE_STATE_DTE)) { return; } + /* copy at most USBUS_CDC_ACM_BULK_EP_SIZE chars from input into ep->buf */ + unsigned old = irq_disable(); while (!tsrb_empty(&cdcacm->tsrb)) { int c = tsrb_get_one(&cdcacm->tsrb); ep->buf[cdcacm->occupied++] = (uint8_t)c; @@ -293,6 +302,7 @@ static void _handle_in(usbus_cdcacm_device_t *cdcacm, break; } } + irq_restore(old); usbdev_ep_ready(ep, cdcacm->occupied); }