Fix race condition in USB CDC transmit

If the Start of Frame interrupt triggers just after the call
to USB_SendSpace in USB_Send then we can get data loss.
When the first bank is full and the second partially full,
the SOF handler will release the second bank via USB_Flush.
Data is then lost due to overflow as USB_Send continues writing data
to the now-closed bank.

Fix this by re-checking the FIFO status inside LockEP, immediately before
doing the data write.

Signed-off-by: Paul Brook <paul@nowt.org>
This commit is contained in:
Paul Brook 2014-03-20 22:44:41 +00:00 committed by Cristian Maglie
parent b822091a78
commit 13c0db5834
1 changed files with 4 additions and 1 deletions

View File

@ -290,9 +290,12 @@ int USB_Send(u8 ep, const void* d, int len)
if (n > len)
n = len;
len -= n;
{
LockEP lock(ep);
// Frame may have been released by the SOF interrupt handler
if (!ReadWriteAllowed())
continue;
len -= n;
if (ep & TRANSFER_ZERO)
{
while (n--)