diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/stm/ao_usb_stm.c | 19 |
1 files changed, 11 insertions, 8 deletions
diff --git a/src/stm/ao_usb_stm.c b/src/stm/ao_usb_stm.c index 44f49dfa..e29abc87 100644 --- a/src/stm/ao_usb_stm.c +++ b/src/stm/ao_usb_stm.c @@ -823,15 +823,20 @@ ao_usb_ep0(void) /* Queue the current IN buffer for transmission */ static void -ao_usb_in_send(void) +_ao_usb_in_send(void) { _tx_dbg0("in_send start"); debug ("send %d\n", ao_usb_tx_count); + while (ao_usb_in_pending) + ao_sleep(&ao_usb_in_pending); ao_usb_in_pending = 1; + if (ao_usb_tx_count != AO_USB_IN_SIZE) + ao_usb_in_flushed = 1; ao_usb_write(ao_usb_tx_buffer, ao_usb_in_tx_buffer, 0, ao_usb_tx_count); ao_usb_bdt[AO_USB_IN_EPR].single.count_tx = ao_usb_tx_count; - ao_usb_set_stat_tx(AO_USB_IN_EPR, STM_USB_EPR_STAT_TX_VALID); ao_usb_tx_count = 0; + _ao_usb_set_stat_tx(AO_USB_IN_EPR, STM_USB_EPR_STAT_TX_VALID); + _tx_dbg0("in_send end"); } /* Wait for a free IN buffer. Interrupts are blocked */ @@ -865,12 +870,10 @@ ao_usb_flush(void) * want to send an empty packet */ ao_arch_block_interrupts(); - if (!ao_usb_in_flushed) { - ao_usb_in_flushed = 1; - /* Wait for an IN buffer to be ready */ - while (ao_usb_in_pending) - ao_sleep(&ao_usb_in_pending); - ao_usb_in_send(); + while (!ao_usb_in_flushed) { + _tx_dbg0("flush top"); + _ao_usb_in_send(); + _tx_dbg0("flush end"); } ao_arch_release_interrupts(); } |