USBUS CDC ACM: disable interrupts when using tsrb

This commit is contained in:
Antonio Galea 2019-10-10 08:26:45 +02:00
parent 01c3043f6f
commit 6c04cb1a45

View File

@ -126,11 +126,17 @@ static size_t _gen_full_acm_descriptor(usbus_t *usbus, void *arg)
/* Submit (ACM interface in) */ /* Submit (ACM interface in) */
size_t usbus_cdc_acm_submit(usbus_cdcacm_device_t *cdcacm, const uint8_t *buf, size_t len) 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) { 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 */ /* 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) { if (len > n) {
n += tsrb_drop(&cdcacm->tsrb, len - n); n += tsrb_drop(&cdcacm->tsrb, len - n);
buf += 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); tsrb_add(&cdcacm->tsrb, buf, n);
/* behave as if everything has been written correctly */ /* behave as if everything has been written correctly */
irq_restore(old);
return len; return len;
} }
void usbus_cdc_acm_set_coding_cb(usbus_cdcacm_device_t *cdcacm, void usbus_cdc_acm_set_coding_cb(usbus_cdcacm_device_t *cdcacm,
usbus_cdcacm_coding_cb_t coding_cb) usbus_cdcacm_coding_cb_t coding_cb)
{ {
irq_disable(); unsigned old = irq_disable();
cdcacm->coding_cb = coding_cb; cdcacm->coding_cb = coding_cb;
irq_enable(); irq_restore(old);
} }
/* flush event */ /* flush event */
@ -286,6 +293,8 @@ static void _handle_in(usbus_cdcacm_device_t *cdcacm,
(cdcacm->state != USBUS_CDC_ACM_LINE_STATE_DTE)) { (cdcacm->state != USBUS_CDC_ACM_LINE_STATE_DTE)) {
return; 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)) { while (!tsrb_empty(&cdcacm->tsrb)) {
int c = tsrb_get_one(&cdcacm->tsrb); int c = tsrb_get_one(&cdcacm->tsrb);
ep->buf[cdcacm->occupied++] = (uint8_t)c; ep->buf[cdcacm->occupied++] = (uint8_t)c;
@ -293,6 +302,7 @@ static void _handle_in(usbus_cdcacm_device_t *cdcacm,
break; break;
} }
} }
irq_restore(old);
usbdev_ep_ready(ep, cdcacm->occupied); usbdev_ep_ready(ep, cdcacm->occupied);
} }