Skip to content

Commit f239c3d

Browse files
henrikbrixandersenfabiobaltieri
authored andcommitted
drivers: can: stm32: abort transfers after entering init mode
Abort any pending transmissions after entering init mode and notify the senders. Fixes: #50545 Signed-off-by: Henrik Brix Andersen <[email protected]>
1 parent 6cf34d0 commit f239c3d

File tree

2 files changed

+33
-24
lines changed

2 files changed

+33
-24
lines changed

drivers/can/can_stm32.c

Lines changed: 33 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -54,9 +54,15 @@ LOG_MODULE_REGISTER(can_stm32, CONFIG_CAN_LOG_LEVEL);
5454
*/
5555
static 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

6268
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)
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) {

drivers/can/can_stm32.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
struct can_stm32_mailbox {
2626
can_tx_callback_t tx_callback;
2727
void *callback_arg;
28-
int error;
2928
};
3029

3130
struct can_stm32_data {

0 commit comments

Comments
 (0)