Skip to content

Commit 94d4638

Browse files
henrikbrixandersenfabiobaltieri
authored andcommitted
drivers: can: sja1000: notify of aborted transmission on can_stop()
Notify of any aborted transmission when entering reset mode via can_stop(). Fixes: #50545 Signed-off-by: Henrik Brix Andersen <[email protected]>
1 parent 9ca4b34 commit 94d4638

File tree

1 file changed

+17
-12
lines changed

1 file changed

+17
-12
lines changed

drivers/can/can_sja1000.c

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,20 @@ static inline void can_sja1000_clear_errors(const struct device *dev)
8989
(void)can_sja1000_read_reg(dev, CAN_SJA1000_ECC);
9090
}
9191

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+
92106
int can_sja1000_set_timing(const struct device *dev, const struct can_timing *timing)
93107
{
94108
struct can_sja1000_data *data = dev->data;
@@ -187,6 +201,7 @@ int can_sja1000_stop(const struct device *dev)
187201
return -EALREADY;
188202
}
189203

204+
/* Entering reset mode aborts current transmission, if any */
190205
err = can_sja1000_enter_reset_mode(dev);
191206
if (err != 0) {
192207
return err;
@@ -202,6 +217,8 @@ int can_sja1000_stop(const struct device *dev)
202217

203218
data->started = false;
204219

220+
can_sja1000_tx_done(dev, -ENETDOWN);
221+
205222
return 0;
206223
}
207224

@@ -564,18 +581,6 @@ static void can_sja1000_handle_receive_irq(const struct device *dev)
564581
} while ((sr & CAN_SJA1000_SR_RBS) != 0);
565582
}
566583

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-
579584
static void can_sja1000_handle_transmit_irq(const struct device *dev)
580585
{
581586
int status = 0;

0 commit comments

Comments
 (0)