FAILED: patch "[PATCH] net: stmmac: Avoid DMA_CHAN_CONTROL write if no Split Header" failed to apply to 5.10-stable tree
Subsystems (4)
[email protected]
maintainerThe patch below does not apply to the 5.10-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From f8e7dfd6fdabb831846ab1970a875746559d491b Mon Sep 17 00:00:00 2001
From: Vincent Whitchurch <[email protected]>
Date: Fri, 26 Nov 2021 16:51:15 +0100
Subject: [PATCH] net: stmmac: Avoid DMA_CHAN_CONTROL write if no Split Header
support
The driver assumes that split headers can be enabled/disabled without stopping/starting the device, so it writes DMA_CHAN_CONTROL from stmmac_set_features(). However, on my system (IP v5.10a without Split Header support), simply writing DMA_CHAN_CONTROL when DMA is running (for example, with the commands below) leads to a TX watchdog timeout.
host$ socat TCP-LISTEN:1024,fork,reuseaddr - & device$ ethtool -K eth0 tso off
device$ ethtool -K eth0 tso on
device$ dd if=/dev/zero bs=1M count=10 | socat - TCP4:host:1024 <tx watchdog timeout>
Note that since my IP is configured without Split Header support, the driver always just reads and writes the same value to the DMA_CHAN_CONTROL register.
I don't have access to any platforms with Split Header support so I don't know if these writes to the DMA_CHAN_CONTROL while DMA is running actually work properly on such systems. I could not find anything in the databook that says that DMA_CHAN_CONTROL should not be written when the DMA is running.
But on systems without Split Header support, there is in any case no need to call enable_sph() in stmmac_set_features() at all since SPH can never be toggled, so we can avoid the watchdog timeout there by skipping this call.
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +6 -5
@@ -5540,8 +5540,6 @@ static int stmmac_set_features(struct net_device *netdev, netdev_features_t features) {struct stmmac_priv *priv =netdev_priv (netdev); -bool sph_en; -u32 chan;/* Keep the COE Type in case of csum is supporting */ if (features &NETIF_F_RXCSUM )
@@ -5553,10 +5551,13 @@ static int stmmac_set_features(struct net_device *netdev,*/ stmmac_rx_ipc (priv, priv->hw); - sph_en = (priv->hw->rx_csum >0 ) && priv->sph; +if (priv->sph_cap) { +bool sph_en = (priv->hw->rx_csum >0 ) && priv->sph; +u32 chan; -for (chan =0 ; chan < priv->plat->rx_queues_to_use; chan++) -stmmac_enable_sph (priv, priv->ioaddr, sph_en, chan); +for (chan =0 ; chan < priv->plat->rx_queues_to_use; chan++) +stmmac_enable_sph (priv, priv->ioaddr, sph_en, chan); + }return 0 ; }