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 <hebad@vestas.com>
This commit is contained in:
parent
9ca4b34035
commit
94d4638ccc
1 changed files with 17 additions and 12 deletions
|
@ -89,6 +89,20 @@ static inline void can_sja1000_clear_errors(const struct device *dev)
|
||||||
(void)can_sja1000_read_reg(dev, CAN_SJA1000_ECC);
|
(void)can_sja1000_read_reg(dev, CAN_SJA1000_ECC);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void can_sja1000_tx_done(const struct device *dev, int status)
|
||||||
|
{
|
||||||
|
struct can_sja1000_data *data = dev->data;
|
||||||
|
can_tx_callback_t callback = data->tx_callback;
|
||||||
|
void *user_data = data->tx_user_data;
|
||||||
|
|
||||||
|
if (callback != NULL) {
|
||||||
|
data->tx_callback = NULL;
|
||||||
|
callback(dev, status, user_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
k_sem_give(&data->tx_idle);
|
||||||
|
}
|
||||||
|
|
||||||
int can_sja1000_set_timing(const struct device *dev, const struct can_timing *timing)
|
int can_sja1000_set_timing(const struct device *dev, const struct can_timing *timing)
|
||||||
{
|
{
|
||||||
struct can_sja1000_data *data = dev->data;
|
struct can_sja1000_data *data = dev->data;
|
||||||
|
@ -187,6 +201,7 @@ int can_sja1000_stop(const struct device *dev)
|
||||||
return -EALREADY;
|
return -EALREADY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Entering reset mode aborts current transmission, if any */
|
||||||
err = can_sja1000_enter_reset_mode(dev);
|
err = can_sja1000_enter_reset_mode(dev);
|
||||||
if (err != 0) {
|
if (err != 0) {
|
||||||
return err;
|
return err;
|
||||||
|
@ -202,6 +217,8 @@ int can_sja1000_stop(const struct device *dev)
|
||||||
|
|
||||||
data->started = false;
|
data->started = false;
|
||||||
|
|
||||||
|
can_sja1000_tx_done(dev, -ENETDOWN);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -564,18 +581,6 @@ static void can_sja1000_handle_receive_irq(const struct device *dev)
|
||||||
} while ((sr & CAN_SJA1000_SR_RBS) != 0);
|
} while ((sr & CAN_SJA1000_SR_RBS) != 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void can_sja1000_tx_done(const struct device *dev, int status)
|
|
||||||
{
|
|
||||||
struct can_sja1000_data *data = dev->data;
|
|
||||||
can_tx_callback_t callback = data->tx_callback;
|
|
||||||
void *user_data = data->tx_user_data;
|
|
||||||
|
|
||||||
data->tx_callback = NULL;
|
|
||||||
callback(dev, status, user_data);
|
|
||||||
|
|
||||||
k_sem_give(&data->tx_idle);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void can_sja1000_handle_transmit_irq(const struct device *dev)
|
static void can_sja1000_handle_transmit_irq(const struct device *dev)
|
||||||
{
|
{
|
||||||
int status = 0;
|
int status = 0;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue