]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
net: stmmac: Disable automatic FCS/Pad stripping
authorKurt Kanzenbach <kurt@linutronix.de>
Mon, 5 Sep 2022 13:01:55 +0000 (15:01 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 17 Oct 2024 13:11:21 +0000 (15:11 +0200)
[ Upstream commit 929d43421ee526c5a3c4d6f7e2bb1b98b2cb1b1f ]

The stmmac has the possibility to automatically strip the padding/FCS for IEEE
802.3 type frames. This feature is enabled conditionally. Therefore, the stmmac
receive path has to have a determination logic whether the FCS has to be
stripped in software or not.

In fact, for DSA this ACS feature is disabled and the determination logic
doesn't check for it properly. For instance, when using DSA in combination with
an older stmmac (pre version 4), the FCS is not stripped by hardware or software
which is problematic.

So either add another check for DSA to the fast path or simply disable ACS
feature completely. The latter approach has been chosen, because most of the
time the FCS is stripped in software anyway and it removes conditionals from the
receive fast path.

Signed-off-by: Kurt Kanzenbach <kurt@linutronix.de>
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
Link: https://lore.kernel.org/r/87v8q8jjgh.fsf@kurt/
Link: https://lore.kernel.org/r/20220905130155.193640-1-kurt@linutronix.de
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
Stable-dep-of: 4c1b56671b68 ("net: stmmac: dwmac4: extend timeout for VLAN Tag register busy bit check")
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/net/ethernet/stmicro/stmmac/dwmac100.h
drivers/net/ethernet/stmicro/stmmac/dwmac1000.h
drivers/net/ethernet/stmicro/stmmac/dwmac1000_core.c
drivers/net/ethernet/stmicro/stmmac/dwmac100_core.c
drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c

index 35ab8d0bdce71c6223f6905b876e230177a66db8..7ab791c8d355fb056a9f92b1747ddeee579a97d7 100644 (file)
@@ -56,7 +56,7 @@
 #define MAC_CONTROL_TE         0x00000008      /* Transmitter Enable */
 #define MAC_CONTROL_RE         0x00000004      /* Receiver Enable */
 
-#define MAC_CORE_INIT (MAC_CONTROL_HBD | MAC_CONTROL_ASTP)
+#define MAC_CORE_INIT (MAC_CONTROL_HBD)
 
 /* MAC FLOW CTRL defines */
 #define MAC_FLOW_CTRL_PT_MASK  0xffff0000      /* Pause Time Mask */
index 3c73453725f946b00d6d15aedbc934efe5cfa583..4296ddda8aaa6c91b44e3c0a1fddd13d1405e8e9 100644 (file)
@@ -126,7 +126,7 @@ enum inter_frame_gap {
 #define GMAC_CONTROL_TE                0x00000008      /* Transmitter Enable */
 #define GMAC_CONTROL_RE                0x00000004      /* Receiver Enable */
 
-#define GMAC_CORE_INIT (GMAC_CONTROL_JD | GMAC_CONTROL_PS | GMAC_CONTROL_ACS | \
+#define GMAC_CORE_INIT (GMAC_CONTROL_JD | GMAC_CONTROL_PS | \
                        GMAC_CONTROL_BE | GMAC_CONTROL_DCRS)
 
 /* GMAC Frame Filter defines */
index 76edb9b726756ef7d91de344a8d01eee391bb110..0e00dd83d027afcfec6267857a5e28816d314350 100644 (file)
@@ -15,7 +15,6 @@
 #include <linux/crc32.h>
 #include <linux/slab.h>
 #include <linux/ethtool.h>
-#include <net/dsa.h>
 #include <asm/io.h>
 #include "stmmac.h"
 #include "stmmac_pcs.h"
@@ -24,7 +23,6 @@
 static void dwmac1000_core_init(struct mac_device_info *hw,
                                struct net_device *dev)
 {
-       struct stmmac_priv *priv = netdev_priv(dev);
        void __iomem *ioaddr = hw->pcsr;
        u32 value = readl(ioaddr + GMAC_CONTROL);
        int mtu = dev->mtu;
@@ -32,13 +30,6 @@ static void dwmac1000_core_init(struct mac_device_info *hw,
        /* Configure GMAC core */
        value |= GMAC_CORE_INIT;
 
-       /* Clear ACS bit because Ethernet switch tagging formats such as
-        * Broadcom tags can look like invalid LLC/SNAP packets and cause the
-        * hardware to truncate packets on reception.
-        */
-       if (netdev_uses_dsa(dev) || !priv->plat->enh_desc)
-               value &= ~GMAC_CONTROL_ACS;
-
        if (mtu > 1500)
                value |= GMAC_CONTROL_2K;
        if (mtu > 2000)
index 75071a7d551a828e652c00c53f689b4f05ce278a..a6e8d7bd95886fc277c7e22c896ddf618e0fca97 100644 (file)
@@ -15,7 +15,6 @@
 *******************************************************************************/
 
 #include <linux/crc32.h>
-#include <net/dsa.h>
 #include <asm/io.h>
 #include "stmmac.h"
 #include "dwmac100.h"
@@ -28,13 +27,6 @@ static void dwmac100_core_init(struct mac_device_info *hw,
 
        value |= MAC_CORE_INIT;
 
-       /* Clear ASTP bit because Ethernet switch tagging formats such as
-        * Broadcom tags can look like invalid LLC/SNAP packets and cause the
-        * hardware to truncate packets on reception.
-        */
-       if (netdev_uses_dsa(dev))
-               value &= ~MAC_CONTROL_ASTP;
-
        writel(value, ioaddr + MAC_CONTROL);
 
 #ifdef STMMAC_VLAN_TAG_USED
index e5c5a9c5389c358f7e2fcc6a6b75324d218dfc23..687eb17e41c6e318f7af72cddccb74e09a3a0441 100644 (file)
@@ -14,7 +14,6 @@
 #include <linux/slab.h>
 #include <linux/ethtool.h>
 #include <linux/io.h>
-#include <net/dsa.h>
 #include "stmmac.h"
 #include "stmmac_pcs.h"
 #include "dwmac4.h"
index 23c0355c13c18d934ea30342a1956232e9f56fd6..b62d153f1676ecdb53fb7c8208a194faf6108da7 100644 (file)
@@ -5045,16 +5045,8 @@ read_again:
                buf1_len = stmmac_rx_buf1_len(priv, p, status, len);
                len += buf1_len;
 
-               /* ACS is set; GMAC core strips PAD/FCS for IEEE 802.3
-                * Type frames (LLC/LLC-SNAP)
-                *
-                * llc_snap is never checked in GMAC >= 4, so this ACS
-                * feature is always disabled and packets need to be
-                * stripped manually.
-                */
-               if (likely(!(status & rx_not_ls)) &&
-                   (likely(priv->synopsys_id >= DWMAC_CORE_4_00) ||
-                    unlikely(status != llc_snap))) {
+               /* ACS is disabled; strip manually. */
+               if (likely(!(status & rx_not_ls))) {
                        buf1_len -= ETH_FCS_LEN;
                        len -= ETH_FCS_LEN;
                }
@@ -5231,16 +5223,8 @@ read_again:
                buf2_len = stmmac_rx_buf2_len(priv, p, status, len);
                len += buf2_len;
 
-               /* ACS is set; GMAC core strips PAD/FCS for IEEE 802.3
-                * Type frames (LLC/LLC-SNAP)
-                *
-                * llc_snap is never checked in GMAC >= 4, so this ACS
-                * feature is always disabled and packets need to be
-                * stripped manually.
-                */
-               if (likely(!(status & rx_not_ls)) &&
-                   (likely(priv->synopsys_id >= DWMAC_CORE_4_00) ||
-                    unlikely(status != llc_snap))) {
+               /* ACS is disabled; strip manually. */
+               if (likely(!(status & rx_not_ls))) {
                        if (buf2_len) {
                                buf2_len -= ETH_FCS_LEN;
                                len -= ETH_FCS_LEN;