drivers: can: Fix R-Car driver can_stop behavior
Calling for can_stop() method was not emptying FIFOs and tx_msgq. Resetting TX FIFO to empty it. Emptying tx_msgq with "ENETDOWN" return code. Fixes #50546 Signed-off-by: Aymeric Aillet <aymeric.aillet@iot.bzh>
This commit is contained in:
parent
d9e4f8fa1d
commit
8959b838bf
|
@ -217,7 +217,7 @@ static inline void can_rcar_write16(const struct can_rcar_cfg *config,
|
||||||
sys_write16(value, config->reg_addr + offs);
|
sys_write16(value, config->reg_addr + offs);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void can_rcar_tx_done(const struct device *dev)
|
static void can_rcar_tx_done(const struct device *dev, uint8_t err)
|
||||||
{
|
{
|
||||||
struct can_rcar_data *data = dev->data;
|
struct can_rcar_data *data = dev->data;
|
||||||
struct can_rcar_tx_cb *tx_cb;
|
struct can_rcar_tx_cb *tx_cb;
|
||||||
|
@ -229,7 +229,7 @@ static void can_rcar_tx_done(const struct device *dev)
|
||||||
}
|
}
|
||||||
|
|
||||||
data->tx_unsent--;
|
data->tx_unsent--;
|
||||||
tx_cb->cb(dev, 0, tx_cb->cb_arg);
|
tx_cb->cb(dev, err, tx_cb->cb_arg);
|
||||||
k_sem_give(&data->tx_sem);
|
k_sem_give(&data->tx_sem);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -453,7 +453,7 @@ static void can_rcar_isr(const struct device *dev)
|
||||||
if (data->tx_unsent <= unsent) {
|
if (data->tx_unsent <= unsent) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
can_rcar_tx_done(dev);
|
can_rcar_tx_done(dev, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Clear the Tx interrupt */
|
/* Clear the Tx interrupt */
|
||||||
|
@ -642,6 +642,15 @@ static int can_rcar_stop(const struct device *dev)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Resetting TX FIFO, emptying it */
|
||||||
|
sys_write8((uint8_t)~RCAR_CAN_TFCR_TFE, config->reg_addr + RCAR_CAN_TFCR);
|
||||||
|
sys_write8(RCAR_CAN_TFCR_TFE, config->reg_addr + RCAR_CAN_TFCR);
|
||||||
|
|
||||||
|
/* Empty TX msgq, returning an error for each message */
|
||||||
|
while (data->tx_unsent) {
|
||||||
|
can_rcar_tx_done(dev, -ENETDOWN);
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue