]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
net: ibm: emac: Reserve VLAN header in MJS limit
authorRosen Penev <rosenp@gmail.com>
Tue, 26 May 2026 20:22:47 +0000 (13:22 -0700)
committerPaolo Abeni <pabeni@redhat.com>
Mon, 1 Jun 2026 13:35:37 +0000 (15:35 +0200)
The IBM EMAC programs its Maximum Jumbo Size (MJS) drop
threshold from ndev->mtu directly. The hardware sizes the threshold
against the L2 frame minus the ethernet header, but does not
discount the 802.1Q tag, so a frame carrying a VLAN tag and a full
1500-byte payload exceeds MJS by exactly 4 bytes and is dropped.

This is normally hidden because JPSM (and therefore the MJS check)
only engages when the MTU is raised above ETH_DATA_LEN.  With the
qca8k DSA tagger the conduit MTU is bumped by QCA_HDR_LEN to 1502
during dsa_conduit_setup(), which is enough to enable JPSM and
expose the off-by-VLAN-tag in the limit.

Pad MJS by VLAN_HLEN so a VLAN-tagged full-MTU frame passes.

Reported on Meraki MX60 (qca8k switch): tagged VLAN
traffic drops at 1500-byte payload, while 1496 bytes works
and untagged 1500 bytes works.

Assisted-by: Claude:Opus-4.7
Signed-off-by: Rosen Penev <rosenp@gmail.com>
Link: https://patch.msgid.link/20260526202247.13823-1-rosenp@gmail.com
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/net/ethernet/ibm/emac/core.c

index 7216209211d9629b1b30aebc6717e247bd9e4206..e597e2ad434cccb71f25e973855aceceb92e0189 100644 (file)
@@ -30,6 +30,7 @@
 #include <linux/skbuff.h>
 #include <linux/crc32.h>
 #include <linux/ethtool.h>
+#include <linux/if_vlan.h>
 #include <linux/mii.h>
 #include <linux/bitops.h>
 #include <linux/of.h>
@@ -457,7 +458,7 @@ static inline u32 emac_iff2rmr(struct net_device *ndev)
 
        if (emac_has_feature(dev, EMAC_APM821XX_REQ_JUMBO_FRAME_SIZE)) {
                r &= ~EMAC4_RMR_MJS_MASK;
-               r |= EMAC4_RMR_MJS(ndev->mtu);
+               r |= EMAC4_RMR_MJS(ndev->mtu + VLAN_HLEN);
        }
 
        return r;