@@ -89,6 +89,20 @@ static inline void can_sja1000_clear_errors(const struct device *dev)
89
89
(void )can_sja1000_read_reg (dev , CAN_SJA1000_ECC );
90
90
}
91
91
92
+ static void can_sja1000_tx_done (const struct device * dev , int status )
93
+ {
94
+ struct can_sja1000_data * data = dev -> data ;
95
+ can_tx_callback_t callback = data -> tx_callback ;
96
+ void * user_data = data -> tx_user_data ;
97
+
98
+ if (callback != NULL ) {
99
+ data -> tx_callback = NULL ;
100
+ callback (dev , status , user_data );
101
+ }
102
+
103
+ k_sem_give (& data -> tx_idle );
104
+ }
105
+
92
106
int can_sja1000_set_timing (const struct device * dev , const struct can_timing * timing )
93
107
{
94
108
struct can_sja1000_data * data = dev -> data ;
@@ -187,6 +201,7 @@ int can_sja1000_stop(const struct device *dev)
187
201
return - EALREADY ;
188
202
}
189
203
204
+ /* Entering reset mode aborts current transmission, if any */
190
205
err = can_sja1000_enter_reset_mode (dev );
191
206
if (err != 0 ) {
192
207
return err ;
@@ -202,6 +217,8 @@ int can_sja1000_stop(const struct device *dev)
202
217
203
218
data -> started = false;
204
219
220
+ can_sja1000_tx_done (dev , - ENETDOWN );
221
+
205
222
return 0 ;
206
223
}
207
224
@@ -564,18 +581,6 @@ static void can_sja1000_handle_receive_irq(const struct device *dev)
564
581
} while ((sr & CAN_SJA1000_SR_RBS ) != 0 );
565
582
}
566
583
567
- static void can_sja1000_tx_done (const struct device * dev , int status )
568
- {
569
- struct can_sja1000_data * data = dev -> data ;
570
- can_tx_callback_t callback = data -> tx_callback ;
571
- void * user_data = data -> tx_user_data ;
572
-
573
- data -> tx_callback = NULL ;
574
- callback (dev , status , user_data );
575
-
576
- k_sem_give (& data -> tx_idle );
577
- }
578
-
579
584
static void can_sja1000_handle_transmit_irq (const struct device * dev )
580
585
{
581
586
int status = 0 ;
0 commit comments