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:
parent
872c88bb5f
commit
b57b2ae3c1
|
@ -290,9 +290,12 @@ int USB_Send(u8 ep, const void* d, int len)
|
||||||
|
|
||||||
if (n > len)
|
if (n > len)
|
||||||
n = len;
|
n = len;
|
||||||
len -= n;
|
|
||||||
{
|
{
|
||||||
LockEP lock(ep);
|
LockEP lock(ep);
|
||||||
|
// Frame may have been released by the SOF interrupt handler
|
||||||
|
if (!ReadWriteAllowed())
|
||||||
|
continue;
|
||||||
|
len -= n;
|
||||||
if (ep & TRANSFER_ZERO)
|
if (ep & TRANSFER_ZERO)
|
||||||
{
|
{
|
||||||
while (n--)
|
while (n--)
|
||||||
|
|
Loading…
Reference in New Issue