diff options
author | Marc Kleine-Budde <[email protected]> | 2023-12-19 12:33:30 +0100 |
---|---|---|
committer | Marc Kleine-Budde <[email protected]> | 2024-09-04 14:41:54 +0200 |
commit | e3b5fa0f081b1eca1e5b6771a524e1c633e9a788 (patch) | |
tree | 6be4456b2b6f076d35992b01f52f6557752229c7 | |
parent | edf1dd18c8f9c7ef01c6e0e934a9526f9acae873 (diff) |
can: rockchip_canfd: add support for CAN_CTRLMODE_BERR_REPORTING
Add support for Bus Error Reporting.
Tested-by: Alibek Omarov <[email protected]>
Acked-by: Heiko Stuebner <[email protected]>
Link: https://patch.msgid.link/[email protected]
Signed-off-by: Marc Kleine-Budde <[email protected]>
-rw-r--r-- | drivers/net/can/rockchip/rockchip_canfd-core.c | 25 |
1 files changed, 17 insertions, 8 deletions
diff --git a/drivers/net/can/rockchip/rockchip_canfd-core.c b/drivers/net/can/rockchip/rockchip_canfd-core.c index 8853f6a135da..6883153e8fc1 100644 --- a/drivers/net/can/rockchip/rockchip_canfd-core.c +++ b/drivers/net/can/rockchip/rockchip_canfd-core.c @@ -293,6 +293,12 @@ static void rkcanfd_chip_start(struct rkcanfd_priv *priv) RKCANFD_REG_INT_OVERLOAD_INT | RKCANFD_REG_INT_TX_FINISH_INT; + /* Do not mask the bus error interrupt if the bus error + * reporting is requested. + */ + if (!(priv->can.ctrlmode & CAN_CTRLMODE_BERR_REPORTING)) + priv->reg_int_mask_default |= RKCANFD_REG_INT_ERROR_INT; + memset(&priv->bec, 0x0, sizeof(priv->bec)); rkcanfd_chip_fifo_setup(priv); @@ -533,14 +539,16 @@ static int rkcanfd_handle_error_int(struct rkcanfd_priv *priv) if (!reg_ec) return 0; - skb = rkcanfd_alloc_can_err_skb(priv, &cf, ×tamp); - if (cf) { - struct can_berr_counter bec; + if (priv->can.ctrlmode & CAN_CTRLMODE_BERR_REPORTING) { + skb = rkcanfd_alloc_can_err_skb(priv, &cf, ×tamp); + if (cf) { + struct can_berr_counter bec; - rkcanfd_get_berr_counter_corrected(priv, &bec); - cf->can_id |= CAN_ERR_PROT | CAN_ERR_BUSERROR | CAN_ERR_CNT; - cf->data[6] = bec.txerr; - cf->data[7] = bec.rxerr; + rkcanfd_get_berr_counter_corrected(priv, &bec); + cf->can_id |= CAN_ERR_PROT | CAN_ERR_BUSERROR | CAN_ERR_CNT; + cf->data[6] = bec.txerr; + cf->data[7] = bec.rxerr; + } } rkcanfd_handle_error_int_reg_ec(priv, cf, reg_ec); @@ -899,7 +907,8 @@ static int rkcanfd_probe(struct platform_device *pdev) priv->can.clock.freq = clk_get_rate(priv->clks[0].clk); priv->can.bittiming_const = &rkcanfd_bittiming_const; priv->can.data_bittiming_const = &rkcanfd_data_bittiming_const; - priv->can.ctrlmode_supported = CAN_CTRLMODE_LOOPBACK; + priv->can.ctrlmode_supported = CAN_CTRLMODE_LOOPBACK | + CAN_CTRLMODE_BERR_REPORTING; if (!(priv->devtype_data.quirks & RKCANFD_QUIRK_CANFD_BROKEN)) priv->can.ctrlmode_supported |= CAN_CTRLMODE_FD; priv->can.do_set_mode = rkcanfd_set_mode; |