7f334c84d6
The IRQ callback function of the USB CDC ACM driver can currently be called from: - the USB thread when a bulk in or a bulk out interrupt has been triggered - the thread calling cdc_acm_irq_rx_enable or cdc_acm_irq_tx_enable when enabling the interrupt fires an irq (ie if there is data to read or if there is no pending data to send) This causes some issues with at least the shell uart backend, as the IRQ callback function ends up being called twice concurrently in case a USB driver sends the requested data almost instantaneously. This is the case for example of the USB nRF driver which uses DMA. In turn this cause ring_buf_item_get to be called concurrently, leading to data corruption: uart:~$ help Please press the <Tab> button to see all available commandands. You can also use the e <Tab> button to prompt or auto-coomplelete all commands or its subcommands. You can try toto call commands with <-h> or <--help> parameter for more informatation. uart:~$ Fix that by always calling the IRQ callback function through the system work queue. Signed-off-by: Aurelien Jarno <aurelien@aurel32.net> |
||
---|---|---|
.. | ||
class | ||
CMakeLists.txt | ||
Kconfig | ||
bos.c | ||
os_desc.c | ||
os_desc.h | ||
usb_descriptor.c | ||
usb_descriptor.h | ||
usb_device.c |