cdc device: claim endpoint before checking fifo availability

- add pre-check to reduce mutex lock in usbd_edpt_claim
This commit is contained in:
hathach
2020-09-14 22:14:31 +07:00
parent 1804dba615
commit 23e6ee2ea2
2 changed files with 23 additions and 7 deletions

View File

@@ -75,14 +75,27 @@ CFG_TUSB_MEM_SECTION static cdcd_interface_t _cdcd_itf[CFG_TUD_CDC];
static void _prep_out_transaction (cdcd_interface_t* p_cdc)
{
// Prepare for incoming data but only allow what we can store in the ring buffer.
uint16_t const available = tu_fifo_remaining(&p_cdc->rx_ff);
TU_VERIFY( available >= sizeof(p_cdc->epout_buf), );
uint8_t const rhport = TUD_OPT_RHPORT;
uint16_t available = tu_fifo_remaining(&p_cdc->rx_ff);
// claim endpoint and submit transfer
if ( usbd_edpt_claim(TUD_OPT_RHPORT, p_cdc->ep_out) )
// Prepare for incoming data but only allow what we can store in the ring buffer.
// TODO Actually we can still carry out the transfer, keeping count of received bytes
// and slowly move it to the FIFO when read().
// This pre-check reduces endpoint claiming
TU_VERIFY(available >= sizeof(p_cdc->epout_buf), );
// claim endpoint
TU_VERIFY(usbd_edpt_claim(rhport, p_cdc->ep_out), );
// fifo can be changed before endpoint is claimed
available = tu_fifo_remaining(&p_cdc->rx_ff);
if ( available >= sizeof(p_cdc->epout_buf) ) {
usbd_edpt_xfer(rhport, p_cdc->ep_out, p_cdc->epout_buf, sizeof(p_cdc->epout_buf));
}else
{
usbd_edpt_xfer(TUD_OPT_RHPORT, p_cdc->ep_out, p_cdc->epout_buf, sizeof(p_cdc->epout_buf));
// Release endpoint since we don't make any transfer
usbd_edpt_release(rhport, p_cdc->ep_out);
}
}