[PATCH v3 0/3] can: rockchip_canfd: fix TX stalls and races
Cunhao Lu <[email protected]> Thu, 30 Jul 2026 21:48:37 +0800
| Newsgroups | org.kernel.vger.linux-can,org.infradead.lists.linux-arm-kernel,org.infradead.lists.linux-rockchip,org.kernel.vger.linux-kernel,org.kernel.vger.stable |
|---|---|
| Message-ID | <[email protected]> |
While running CAN traffic on an RK3588 system, the driver repeatedly reported an inconsistent TX echo state: rockchip_canfd fea60000.can can0: rkcanfd_tx_tail_is_eff: echo_skb[0]=NULL tx_head=0x00060f7d tx_tail=0x00060f7c The Rockchip CAN-FD driver completes transmissions by matching self-received frames with entries in the echo skb ring. The warning above is emitted when the driver sees a pending transmission but finds no skb in the corresponding echo slot. The immediate cause is a race between the transmit and completion paths. The completion path removes an echo skb before advancing tx_tail, while the transmit path reads tx_head, tx_tail and that echo slot without common synchronization. It can therefore observe a partially updated state, dereference an skb which has been queued for NAPI, or stop the TX queue without a later completion to wake it. Two additional TX stall paths were found. The transmit path submits a frame and advances tx_head even if installing its echo skb fails. In addition, the erratum 6 retry path selects tx_head, which denotes the next free buffer with a two-entry FIFO, instead of retrying the outstanding buffer at tx_tail. Review also identified that the erratum 12 MODE/CMD/MODE sequence can be interleaved between the transmit softirq and the RX interrupt retry path. The interrupt can restore the default MODE before the softirq issues CMD, bypassing the SPACE_RX_MODE workaround. This series makes echo skb setup failure abort the transmission, retries the correct hardware buffer, and uses a spinlock to serialize the TX head, tail, echo ring and command register sequence. The final series was tested on an RK3588 rev2.2 at 1 Mbit/s with 100,000 extended CAN frames. The run triggered 138 erratum 6 retries and completed without drops, queue stalls or driver warnings. RK3588 does not enable erratum 12, so this test does not exercise that hardware workaround. --- Changes in v3: - Make can_put_echo_skb() consume the skb on every error path and remove the Rockchip-specific -EINVAL free. - Drop the redundant error message from rkcanfd_start_xmit(). - Link to v2: https://lore.kernel.org/linux-can/[email protected] Changes in v2: - Document that the TX lock also serializes the erratum 12 MODE/CMD/MODE sequence. - Add the erratum 12 commit to the Fixes tags of patch 3. - Add RK3588 extended-frame stress-test results. - Link to v1: https://lore.kernel.org/linux-can/[email protected] To: Marc Kleine-Budde <[email protected]> To: Vincent Mailhol <[email protected]> To: [email protected] To: Heiko Stuebner <[email protected]> Cc: [email protected] Cc: [email protected] Cc: [email protected] Cc: [email protected] --- Cunhao Lu (3): can: rockchip_canfd: prevent TX stall on echo skb failure can: rockchip_canfd: retry the outstanding TX buffer can: rockchip_canfd: serialize TX state and command writes drivers/net/can/dev/skb.c | 1 + drivers/net/can/rockchip/rockchip_canfd-core.c | 1 + drivers/net/can/rockchip/rockchip_canfd-rx.c | 31 +++++++++++++++------ drivers/net/can/rockchip/rockchip_canfd-tx.c | 37 +++++++++++++++++++++----- drivers/net/can/rockchip/rockchip_canfd.h | 4 ++- 5 files changed, 58 insertions(+), 16 deletions(-) --- base-commit: 11028ab62899e4191e074ee364c712b77823a9c4 change-id: 20260730-master-a1b54b3cf5a0 Best regards, -- Cunhao Lu <[email protected]>