drivers: can: mcux: flexcan: abort transfers before entering freeze mode

Abort any pending transmissions before entering freeze mode and notify the
senders.

Fixes: #50545

Signed-off-by: Henrik Brix Andersen <hebad@vestas.com>
diff --git a/drivers/can/can_mcux_flexcan.c b/drivers/can/can_mcux_flexcan.c
index 1a03b52..9c936f3 100644
--- a/drivers/can/can_mcux_flexcan.c
+++ b/drivers/can/can_mcux_flexcan.c
@@ -220,12 +220,31 @@
 {
 	const struct mcux_flexcan_config *config = dev->config;
 	struct mcux_flexcan_data *data = dev->data;
+	can_tx_callback_t function;
+	void *arg;
+	int alloc;
 	int err;
 
 	if (!data->started) {
 		return -EALREADY;
 	}
 
+	data->started = false;
+
+	/* Abort any pending TX frames before entering freeze mode */
+	for (alloc = 0; alloc < MCUX_FLEXCAN_MAX_TX; alloc++) {
+		function = data->tx_cbs[alloc].function;
+		arg = data->tx_cbs[alloc].arg;
+
+		if (atomic_test_and_clear_bit(data->tx_allocs, alloc)) {
+			FLEXCAN_TransferAbortSend(config->base, &data->handle,
+						ALLOC_IDX_TO_TXMB_IDX(alloc));
+
+			function(dev, -ENETDOWN, arg);
+			k_sem_give(&data->tx_allocs_sem);
+		}
+	}
+
 	FLEXCAN_EnterFreezeMode(config->base);
 
 	if (config->phy != NULL) {
@@ -236,8 +255,6 @@
 		}
 	}
 
-	data->started = false;
-
 	return 0;
 }