From 12d6e268cd21b794d9df3c60239288a28b587700 Mon Sep 17 00:00:00 2001 From: Grant Ramsay Date: Thu, 3 Aug 2023 14:20:53 +1200 Subject: [PATCH] drivers: can: mcan: tidy TX complete semaphore usage "callback != NULL" is used to determine if the callback is in use. The TX complete semaphone should only be given back after setting the callback to NULL. This would likely only be a race condition if the ISR is processed on a different core to the TX call. Signed-off-by: Grant Ramsay --- drivers/can/can_mcan.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/drivers/can/can_mcan.c b/drivers/can/can_mcan.c index dff4a0ca51d..7c99da756d1 100644 --- a/drivers/can/can_mcan.c +++ b/drivers/can/can_mcan.c @@ -477,6 +477,7 @@ static void can_mcan_tx_event_handler(const struct device *dev) struct can_mcan_data *data = dev->data; struct can_mcan_tx_event_fifo tx_event; can_tx_callback_t tx_cb; + void *user_data; uint32_t event_idx; uint32_t tx_idx; uint32_t txefs; @@ -507,12 +508,14 @@ static void can_mcan_tx_event_handler(const struct device *dev) return; } - k_sem_give(&data->tx_sem); - __ASSERT_NO_MSG(tx_idx <= cbs->num_tx); tx_cb = cbs->tx[tx_idx].function; + user_data = cbs->tx[tx_idx].user_data; cbs->tx[tx_idx].function = NULL; - tx_cb(dev, 0, cbs->tx[tx_idx].user_data); + + k_sem_give(&data->tx_sem); + + tx_cb(dev, 0, user_data); err = can_mcan_read_reg(dev, CAN_MCAN_TXEFS, &txefs); if (err != 0) {