[PATCH v2] bmips: bcm6368-enetsw: Bump max MTU

Linus Walleij linus.walleij at linaro.org
Sun Oct 1 15:25:53 PDT 2023


The max frame size for this ethernet switch is 1536 bytes, excluding the
VLAN headers, which is

1536 - VLAN_ETH_HLEN - VLAN_HLEN = 1536 - 18 - 4 = 1514

not

ETH_DATA_LEN + ENETSW_TAG_SIZE = 1500 + 4 + 6 = 1510

as it is right now. The available overhead is needed when using the DSA
switch with a cascaded Marvell DSA switch, which is something that exist
in real products, in this case the Inteno XG6846.

Before this patch (on the lan1 DSA port in this case):
dsa_slave_change_mtu: master->max_mtu = 9724, dev->max_mtu = 10218, DSA overhead = 8
dsa_slave_change_mtu: master = extsw, dev = lan1
dsa_slave_change_mtu: master->max_mtu = 1510, dev->max_mtu = 9724, DSA overhead = 6
dsa_slave_change_mtu: master = eth0, dev = extsw
dsa_slave_change_mtu new_master_mtu 1514 > mtu_limit 1510
mdio_mux-0.1:00: nonfatal error -34 setting MTU to 1500 on port 0

My added debug prints before the nonfatal error: the first switch from the top
is the Marvell switch, the second in the bcm6368-enetsw with its 1510 limit.

After this patch the error is gone.

Test with ping from host:

PING 192.168.1.220 (192.168.1.220) 1472(1500) bytes of data.
1480 bytes from 192.168.1.220: icmp_seq=1 ttl=64 time=0.723 ms
1480 bytes from 192.168.1.220: icmp_seq=2 ttl=64 time=0.562 ms
1480 bytes from 192.168.1.220: icmp_seq=3 ttl=64 time=0.555 ms

When this ping reaches the device, the Marvell switch adds 8 bytes of DSA overhead,
and the Broadcom enetsw adds 6 bytes, resulting in exactly 1514 bytes which is what
the switch can handle.

Tests with larger MTUs have not been successful so this is likely the actual
hardware max MTU.

Cc: Álvaro Fernández Rojas <noltari at gmail.com>
Cc: Jonas Gorski <jonas.gorski at gmail.com>
Signed-off-by: Linus Walleij <linus.walleij at linaro.org>
---
ChangeLog v1->v2:
- Do some better research after help on IRC, did some ping tests.
---
 .../files/drivers/net/ethernet/broadcom/bcm6368-enetsw.c     | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/target/linux/bmips/files/drivers/net/ethernet/broadcom/bcm6368-enetsw.c b/target/linux/bmips/files/drivers/net/ethernet/broadcom/bcm6368-enetsw.c
index 321e95dbbb3d..01e4723c176d 100644
--- a/target/linux/bmips/files/drivers/net/ethernet/broadcom/bcm6368-enetsw.c
+++ b/target/linux/bmips/files/drivers/net/ethernet/broadcom/bcm6368-enetsw.c
@@ -22,7 +22,8 @@
 #include <linux/reset.h>
 #include <linux/version.h>
 
-/* MTU */
+/* The max frame size is 1536 including VLAN headers but excluding the 6 byte DSA tag */
+#define ENETSW_MAX_MTU			(1536 - VLAN_ETH_HLEN - VLAN_HLEN)
 #define ENETSW_TAG_SIZE			(6 + VLAN_HLEN)
 #define ENETSW_MTU_OVERHEAD		(VLAN_ETH_HLEN + VLAN_HLEN + \
 					 ENETSW_TAG_SIZE)
@@ -1067,7 +1068,7 @@ static int bcm6368_enetsw_probe(struct platform_device *pdev)
 	ndev->netdev_ops = &bcm6368_enetsw_ops;
 	ndev->min_mtu = ETH_ZLEN;
 	ndev->mtu = ETH_DATA_LEN + ENETSW_TAG_SIZE;
-	ndev->max_mtu = ETH_DATA_LEN + ENETSW_TAG_SIZE;
+	ndev->max_mtu = ENETSW_MAX_MTU;
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(6,1,0)
 	netif_napi_add(ndev, &priv->napi, bcm6368_enetsw_poll);
 #else
-- 
2.34.1




More information about the openwrt-devel mailing list