@@ -54,9 +54,15 @@ LOG_MODULE_REGISTER(can_stm32, CONFIG_CAN_LOG_LEVEL);
54
54
*/
55
55
static struct k_mutex filter_mutex ;
56
56
57
- static void can_stm32_signal_tx_complete (const struct device * dev , struct can_stm32_mailbox * mb )
57
+ static void can_stm32_signal_tx_complete (const struct device * dev , struct can_stm32_mailbox * mb ,
58
+ int status )
58
59
{
59
- mb -> tx_callback (dev , mb -> error , mb -> callback_arg );
60
+ can_tx_callback_t callback = mb -> tx_callback ;
61
+
62
+ if (callback != NULL ) {
63
+ callback (dev , status , mb -> callback_arg );
64
+ mb -> tx_callback = NULL ;
65
+ }
60
66
}
61
67
62
68
static void can_stm32_rx_fifo_pop (CAN_FIFOMailBox_TypeDef * mbox , struct can_frame * frame )
@@ -206,43 +212,41 @@ static inline void can_stm32_tx_isr_handler(const struct device *dev)
206
212
const struct can_stm32_config * cfg = dev -> config ;
207
213
CAN_TypeDef * can = cfg -> can ;
208
214
uint32_t bus_off ;
215
+ int status ;
209
216
210
217
bus_off = can -> ESR & CAN_ESR_BOFF ;
211
218
212
219
if ((can -> TSR & CAN_TSR_RQCP0 ) | bus_off ) {
213
- data -> mb0 .error =
214
- can -> TSR & CAN_TSR_TXOK0 ? 0 :
215
- can -> TSR & CAN_TSR_TERR0 ? - EIO :
216
- can -> TSR & CAN_TSR_ALST0 ? - EBUSY :
217
- bus_off ? - ENETUNREACH :
218
- - EIO ;
220
+ status = can -> TSR & CAN_TSR_TXOK0 ? 0 :
221
+ can -> TSR & CAN_TSR_TERR0 ? - EIO :
222
+ can -> TSR & CAN_TSR_ALST0 ? - EBUSY :
223
+ bus_off ? - ENETUNREACH :
224
+ - EIO ;
219
225
/* clear the request. */
220
226
can -> TSR |= CAN_TSR_RQCP0 ;
221
- can_stm32_signal_tx_complete (dev , & data -> mb0 );
227
+ can_stm32_signal_tx_complete (dev , & data -> mb0 , status );
222
228
}
223
229
224
230
if ((can -> TSR & CAN_TSR_RQCP1 ) | bus_off ) {
225
- data -> mb1 .error =
226
- can -> TSR & CAN_TSR_TXOK1 ? 0 :
227
- can -> TSR & CAN_TSR_TERR1 ? - EIO :
228
- can -> TSR & CAN_TSR_ALST1 ? - EBUSY :
229
- bus_off ? - ENETUNREACH :
230
- - EIO ;
231
+ status = can -> TSR & CAN_TSR_TXOK1 ? 0 :
232
+ can -> TSR & CAN_TSR_TERR1 ? - EIO :
233
+ can -> TSR & CAN_TSR_ALST1 ? - EBUSY :
234
+ bus_off ? - ENETUNREACH :
235
+ - EIO ;
231
236
/* clear the request. */
232
237
can -> TSR |= CAN_TSR_RQCP1 ;
233
- can_stm32_signal_tx_complete (dev , & data -> mb1 );
238
+ can_stm32_signal_tx_complete (dev , & data -> mb1 , status );
234
239
}
235
240
236
241
if ((can -> TSR & CAN_TSR_RQCP2 ) | bus_off ) {
237
- data -> mb2 .error =
238
- can -> TSR & CAN_TSR_TXOK2 ? 0 :
239
- can -> TSR & CAN_TSR_TERR2 ? - EIO :
240
- can -> TSR & CAN_TSR_ALST2 ? - EBUSY :
241
- bus_off ? - ENETUNREACH :
242
- - EIO ;
242
+ status = can -> TSR & CAN_TSR_TXOK2 ? 0 :
243
+ can -> TSR & CAN_TSR_TERR2 ? - EIO :
244
+ can -> TSR & CAN_TSR_ALST2 ? - EBUSY :
245
+ bus_off ? - ENETUNREACH :
246
+ - EIO ;
243
247
/* clear the request. */
244
248
can -> TSR |= CAN_TSR_RQCP2 ;
245
- can_stm32_signal_tx_complete (dev , & data -> mb2 );
249
+ can_stm32_signal_tx_complete (dev , & data -> mb2 , status );
246
250
}
247
251
248
252
if (can -> TSR & CAN_TSR_TME ) {
@@ -415,6 +419,12 @@ static int can_stm32_stop(const struct device *dev)
415
419
goto unlock ;
416
420
}
417
421
422
+ /* Abort any pending transmissions */
423
+ can_stm32_signal_tx_complete (dev , & data -> mb0 , - ENETDOWN );
424
+ can_stm32_signal_tx_complete (dev , & data -> mb1 , - ENETDOWN );
425
+ can_stm32_signal_tx_complete (dev , & data -> mb2 , - ENETDOWN );
426
+ can -> TSR |= CAN_TSR_ABRQ2 | CAN_TSR_ABRQ1 | CAN_TSR_ABRQ0 ;
427
+
418
428
if (cfg -> phy != NULL ) {
419
429
ret = can_transceiver_disable (cfg -> phy );
420
430
if (ret != 0 ) {
0 commit comments