This series first introduces the can_state_get_by_berr_counter() helper function. It returns the current TX and RX state depending on the provided CAN bit error counters. It will be later used by the at91_can driver. The remaining patches of this series first clean up the at91_can driver, clean up the bus- and line error (including bus-off) handling, and then convert it use the rx_offload helper. The driver works better under high system load and the order of received CAN frames is better maintained. Due to a hardware limitation the converted driver could trigger a race condition in the can_restart() CAN bus-off handler. The patch series [1] fixes the issue. [1] https://lore.kernel.org/all/20231004-can-dev-fix-can-restart-v1-0-2e52899eaaf5@xxxxxxxxxxxxxx Signed-off-by: Marc Kleine-Budde <mkl@xxxxxxxxxxxxxx> --- Marc Kleine-Budde (27): can: dev: add can_state_get_by_berr_counter() to return the CAN state based on the current error counters can: at91_can: use a consistent indention can: at91_can: at91_irq_tx(): remove one level of indention can: at91_can: BR register: convert to FIELD_PREP() can: at91_can: ECR register: convert to FIELD_GET() can: at91_can: MMR registers: convert to FIELD_PREP() can: at91_can: MID registers: convert access to FIELD_PREP(), FIELD_GET() can: at91_can: MSR Register: convert to FIELD_PREP() can: at91_can: MCR Register: convert to FIELD_PREP() can: at91_can: add more register definitions can: at91_can: at91_setup_mailboxes(): update comments can: at91_can: rename struct at91_priv::{tx_next,tx_echo} to {tx_head,tx_tail} can: at91_can: at91_set_bittiming(): demote register output to debug level can: at91_can: at91_chip_start(): don't disable IRQs twice can: at91_can: at91_open(): forward request_irq()'s return value in case or an error can: at91_can: add CAN transceiver support can: at91_can: at91_poll_err(): fold in at91_poll_err_frame() can: at91_can: at91_poll_err(): increase stats even if no quota left or OOM can: at91_can: at91_irq_err_frame(): call directly from IRQ handler can: at91_can: at91_irq_err_frame(): move next to at91_irq_err() can: at91_can: at91_irq_err(): rename to at91_irq_err_line() can: at91_can: at91_irq_err_line(): make use of can_state_get_by_berr_counter() can: at91_can: at91_irq_err_line(): take reg_sr into account for bus off can: at91_can: at91_irq_err_line(): make use of can_change_state() and can_bus_off() can: at91_can: at91_irq_err_line(): send error counters with state change can: at91_can: at91_alloc_can_err_skb() introduce new function can: at91_can: switch to rx-offload implementation drivers/net/can/Kconfig | 1 + drivers/net/can/at91_can.c | 998 ++++++++++++++++++--------------------------- drivers/net/can/dev/dev.c | 22 + include/linux/can/dev.h | 4 + 4 files changed, 432 insertions(+), 593 deletions(-) --- base-commit: 473267a4911f2469722c74ca58087d951072f72a change-id: 20231004-at91_can-rx_offload-32628a740af2 Best regards, -- Marc Kleine-Budde <mkl@xxxxxxxxxxxxxx>