]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
net: macb: add TX stall timeout callback to recover from lost TSTART write
authorLukasz Raczylo <lukasz@raczylo.com>
Tue, 16 Jun 2026 13:23:03 +0000 (15:23 +0200)
committerJakub Kicinski <kuba@kernel.org>
Fri, 19 Jun 2026 01:05:11 +0000 (18:05 -0700)
The MACB found in the Raspberry Pi RP1 suffers from sporadic stalls on
the TX queue.
While the exact root cause is not yet fully understood, it is likely
related to a hardware issue where a TSTART write to the NCR register
is missed, preventing the transmission from being kicked off.

Implement a timeout callback to handle TX queue stalls, triggering the
existing restart mechanism to recover.

Link: https://lore.kernel.org/all/20260514215459.36109-1-lukasz@raczylo.com/
Fixes: dc110d1b23564 ("net: cadence: macb: Add support for Raspberry Pi RP1 ethernet controller")
Signed-off-by: Lukasz Raczylo <lukasz@raczylo.com>
Co-developed-by: Steffen Jaeckel <sjaeckel@suse.de>
Signed-off-by: Steffen Jaeckel <sjaeckel@suse.de>
Co-developed-by: Andrea della Porta <andrea.porta@suse.com>
Signed-off-by: Andrea della Porta <andrea.porta@suse.com>
Reviewed-by: Nicolai Buchwitz <nb@tipi-net.de>
Reviewed-by: Théo Lebrun <theo.lebrun@bootlin.com>
Link: https://patch.msgid.link/468f480454a314303bac6a54780b153f689f2267.1781598350.git.andrea.porta@suse.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/cadence/macb_main.c

index a12aa21244e83bc7f905a972a924eb6442aaeec7..fd282a1700fb98413a0d315a86a8e9d7caed76f4 100644 (file)
@@ -4522,6 +4522,13 @@ static int macb_setup_tc(struct net_device *dev, enum tc_setup_type type,
        }
 }
 
+static void macb_tx_timeout(struct net_device *dev, unsigned int q)
+{
+       struct macb *bp = netdev_priv(dev);
+
+       macb_tx_restart(&bp->queues[q]);
+}
+
 static const struct net_device_ops macb_netdev_ops = {
        .ndo_open               = macb_open,
        .ndo_stop               = macb_close,
@@ -4540,6 +4547,7 @@ static const struct net_device_ops macb_netdev_ops = {
        .ndo_hwtstamp_set       = macb_hwtstamp_set,
        .ndo_hwtstamp_get       = macb_hwtstamp_get,
        .ndo_setup_tc           = macb_setup_tc,
+       .ndo_tx_timeout         = macb_tx_timeout,
 };
 
 /* Configure peripheral capabilities according to device tree