drivers: can: mcux: Fix can_detach

The detach function didn't call FLEXCAN_TransferAbortReceive.
The state of the mailbox after detaching was still kFLEXCAN_StateRxData
and therefore a new filter couldn't be attached.
This PR calls FLEXCAN_TransferAbortReceive and releases the mailbox.

Signed-off-by: Alexander Wachter <alexander.wachter@student.tugraz.at>
This commit is contained in:
Alexander Wachter 2019-08-13 17:16:04 +02:00 committed by Ioannis Glaropoulos
commit 4c8901869c

View file

@ -296,17 +296,23 @@ static void mcux_flexcan_detach(struct device *dev, int filter_id)
struct mcux_flexcan_data *data = dev->driver_data; struct mcux_flexcan_data *data = dev->driver_data;
if (filter_id >= MCUX_FLEXCAN_MAX_RX) { if (filter_id >= MCUX_FLEXCAN_MAX_RX) {
LOG_ERR("Detach: Filter id >= MAX_RX (%d >= %d)", filter_id,
MCUX_FLEXCAN_MAX_RX);
return; return;
} }
k_mutex_lock(&data->rx_mutex, K_FOREVER); k_mutex_lock(&data->rx_mutex, K_FOREVER);
if (atomic_test_and_clear_bit(data->rx_allocs, filter_id)) { if (atomic_test_and_clear_bit(data->rx_allocs, filter_id)) {
FLEXCAN_TransferAbortReceive(config->base, &data->handle,
ALLOC_IDX_TO_RXMB_IDX(filter_id));
FLEXCAN_SetRxMbConfig(config->base, FLEXCAN_SetRxMbConfig(config->base,
ALLOC_IDX_TO_RXMB_IDX(filter_id), NULL, ALLOC_IDX_TO_RXMB_IDX(filter_id), NULL,
false); false);
data->rx_cbs[filter_id].function = NULL; data->rx_cbs[filter_id].function = NULL;
data->rx_cbs[filter_id].arg = NULL; data->rx_cbs[filter_id].arg = NULL;
} else {
LOG_WRN("Filter ID %d already detached", filter_id);
} }
k_mutex_unlock(&data->rx_mutex); k_mutex_unlock(&data->rx_mutex);