@@ -54,9 +54,15 @@ LOG_MODULE_REGISTER(can_stm32, CONFIG_CAN_LOG_LEVEL);
5454 */
5555static struct k_mutex filter_mutex ;
5656
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 )
5859{
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+ }
6066}
6167
6268static 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)
206212 const struct can_stm32_config * cfg = dev -> config ;
207213 CAN_TypeDef * can = cfg -> can ;
208214 uint32_t bus_off ;
215+ int status ;
209216
210217 bus_off = can -> ESR & CAN_ESR_BOFF ;
211218
212219 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 ;
219225 /* clear the request. */
220226 can -> TSR |= CAN_TSR_RQCP0 ;
221- can_stm32_signal_tx_complete (dev , & data -> mb0 );
227+ can_stm32_signal_tx_complete (dev , & data -> mb0 , status );
222228 }
223229
224230 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 ;
231236 /* clear the request. */
232237 can -> TSR |= CAN_TSR_RQCP1 ;
233- can_stm32_signal_tx_complete (dev , & data -> mb1 );
238+ can_stm32_signal_tx_complete (dev , & data -> mb1 , status );
234239 }
235240
236241 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 ;
243247 /* clear the request. */
244248 can -> TSR |= CAN_TSR_RQCP2 ;
245- can_stm32_signal_tx_complete (dev , & data -> mb2 );
249+ can_stm32_signal_tx_complete (dev , & data -> mb2 , status );
246250 }
247251
248252 if (can -> TSR & CAN_TSR_TME ) {
@@ -415,6 +419,12 @@ static int can_stm32_stop(const struct device *dev)
415419 goto unlock ;
416420 }
417421
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+
418428 if (cfg -> phy != NULL ) {
419429 ret = can_transceiver_disable (cfg -> phy );
420430 if (ret != 0 ) {
0 commit comments