Skip to content

Commit

Permalink
nrf5x: Fix EP OUT race conditions in OS build
Browse files Browse the repository at this point in the history
When two tasks entered dcd_edpt_xfer() it was possible that
first disabled interrupt to setup total_len and actual_len
but second task for another endpoint enabled interrupt
between total_len and actual_len resulting in race
condition with interrupt, hence mutex is added on top of interrupt being blocked.
  • Loading branch information
kasjer committed Jan 19, 2022
1 parent 980ffe3 commit 36b6ed8
Showing 1 changed file with 8 additions and 2 deletions.
10 changes: 8 additions & 2 deletions src/portable/nordic/nrf5x/dcd_nrf5x.c
Original file line number Diff line number Diff line change
Expand Up @@ -463,11 +463,17 @@ bool dcd_edpt_xfer (uint8_t rhport, uint8_t ep_addr, uint8_t * buffer, uint16_t

xfer_td_t* xfer = get_td(epnum, dir);

dcd_int_disable(rhport);
if (!is_in_isr()) {
osal_mutex_lock(dcd_mutex, OSAL_TIMEOUT_WAIT_FOREVER);
dcd_int_disable(rhport);
}
xfer->buffer = buffer;
xfer->total_len = total_bytes;
xfer->actual_len = 0;
dcd_int_enable(rhport);
if (!is_in_isr()) {
dcd_int_enable(rhport);
osal_mutex_unlock(dcd_mutex);
}

// Control endpoint with zero-length packet and opposite direction to 1st request byte --> status stage
bool const control_status = (epnum == 0 && total_bytes == 0 && dir != tu_edpt_dir(NRF_USBD->BMREQUESTTYPE));
Expand Down

0 comments on commit 36b6ed8

Please sign in to comment.