]> git.ipfire.org Git - thirdparty/openwrt.git/commitdiff
ramips: ethernet: ralink: mt7620 enable jumbo frames
authorLuiz Angelo Daros de Luca <luizluca@gmail.com>
Thu, 31 Mar 2022 04:15:44 +0000 (01:15 -0300)
committerRobert Marko <robimarko@gmail.com>
Mon, 29 Jun 2026 12:54:58 +0000 (14:54 +0200)
mt7620 can forward jumbo frames up to 2048. The fe_change_mtu() was
already compatible except for the GDM_FWD_CFG address.

An MTU greater than 1500 is required to use DSA tags with a stacked
switch chip.

This patch enables jumbo frame support by default.

Signed-off-by: Andrey Melnikov <temnota.am@gmail.com>
Signed-off-by: Luiz Angelo Daros de Luca <luizluca@gmail.com>
Link: https://github.com/openwrt/openwrt/pull/23933
Signed-off-by: Robert Marko <robimarko@gmail.com>
target/linux/ramips/files/drivers/net/ethernet/ralink/gsw_mt7620.c
target/linux/ramips/files/drivers/net/ethernet/ralink/gsw_mt7620.h
target/linux/ramips/files/drivers/net/ethernet/ralink/mtk_eth_soc.c
target/linux/ramips/files/drivers/net/ethernet/ralink/soc_mt7620.c

index ac447ba7cb9428d7a6714a43a6721f6ae2c925ed..8965f73211c3f19a5bf8e4ea008cb8960f7a1861 100644 (file)
@@ -178,6 +178,8 @@ static void mt7620_ephy_init(struct mt7620_gsw *gsw)
 
 static void mt7620_mac_init(struct mt7620_gsw *gsw)
 {
+       u32 val;
+
        /* Internal ethernet requires PCIe RC mode */
        rt_sysc_w32(rt_sysc_r32(SYSC_REG_CFG1) | PCIE_RC_MODE, SYSC_REG_CFG1);
 
@@ -190,6 +192,12 @@ static void mt7620_mac_init(struct mt7620_gsw *gsw)
        /* Set Port 6 as CPU Port */
        mtk_switch_w32(gsw, 0x7f7f7fe0, 0x0010);
 
+       val = mtk_switch_r32(gsw, GSW_REG_GMACCR);
+       val &= ~((GMACCR_JMB_LEN_MASK << GMACCR_JMB_LEN_SHIFT) | GMACCR_MAX_RX_PKT_LEN_MASK);
+       /* Set 2k max frame size and set MAX_RX_PKT_LEN to jumbo mode */
+       val |= (2 << GMACCR_JMB_LEN_SHIFT) | GMACCR_MAX_RX_PKT_LEN_JUMBO;
+       mtk_switch_w32(gsw, val, GSW_REG_GMACCR);
+
        /* Enable MIB stats */
        mtk_switch_w32(gsw, mtk_switch_r32(gsw, GSW_REG_MIB_CNT_EN) | (1 << 1), GSW_REG_MIB_CNT_EN);
 }
index 12cab39b771f07de6a805177242dbc911dd913c7..4252bc22a6d6425464b0f8e1127765257d0fc1ca 100644 (file)
 #define GSW_REG_MAC_P1_MCR     0x200
 
 // Global MAC control register
-#define GSW_REG_GMACCR         0x30E0
+#define GSW_REG_GMACCR         0x3FE0 /* correct address per MT7620A datasheet */
+#define GMACCR_JMB_LEN_MASK    0x0F
+#define GMACCR_JMB_LEN_SHIFT   2
+// MAX_RX_PKT_LEN field (bits 0:1): 0=1518, 1=1536, 2=jumbo
+#define GMACCR_MAX_RX_PKT_LEN_MASK     0x3
+#define GMACCR_MAX_RX_PKT_LEN_JUMBO    0x2
 
 #define SYSC_REG_CHIP_REV_ID   0x0c
 #define SYSC_REG_CFG1          0x14
index 928449ae98c474a20e9aa8d7b9a21d63801a5c5c..9c8b34aac04e153e1ee2118235d162c8e8c29607 100644 (file)
 #include "mdio.h"
 #include "ethtool.h"
 
+#if defined(CONFIG_SOC_MT7620)
+#define        DMA_FWD_REG             MT7620A_GDMA1_FWD_CFG
+#define        MAX_RX_LENGTH           2048
+#else
+#define DMA_FWD_REG            FE_GDMA1_FWD_CFG
 #define        MAX_RX_LENGTH           1536
+#endif
+
 #define FE_RX_ETH_HLEN         (VLAN_ETH_HLEN + VLAN_HLEN + ETH_FCS_LEN)
 #define FE_RX_HLEN             (NET_SKB_PAD + FE_RX_ETH_HLEN + NET_IP_ALIGN)
 #define DMA_DUMMY_DESC         0xffffffff
@@ -1169,7 +1176,7 @@ void fe_fwd_config(struct fe_priv *priv)
 {
        u32 fwd_cfg;
 
-       fwd_cfg = fe_r32(FE_GDMA1_FWD_CFG);
+       fwd_cfg = fe_r32(DMA_FWD_REG);
 
        /* disable jumbo frame */
        if (priv->flags & FE_FLAG_JUMBO_FRAME)
@@ -1178,19 +1185,19 @@ void fe_fwd_config(struct fe_priv *priv)
        /* set unicast/multicast/broadcast frame to cpu */
        fwd_cfg &= ~0xffff;
 
-       fe_w32(fwd_cfg, FE_GDMA1_FWD_CFG);
+       fe_w32(fwd_cfg, DMA_FWD_REG);
 }
 
 static void fe_rxcsum_config(bool enable)
 {
        if (enable)
-               fe_w32(fe_r32(FE_GDMA1_FWD_CFG) | (FE_GDM1_ICS_EN |
+               fe_w32(fe_r32(DMA_FWD_REG) | (FE_GDM1_ICS_EN |
                                        FE_GDM1_TCS_EN | FE_GDM1_UCS_EN),
-                               FE_GDMA1_FWD_CFG);
+                               DMA_FWD_REG);
        else
-               fe_w32(fe_r32(FE_GDMA1_FWD_CFG) & ~(FE_GDM1_ICS_EN |
+               fe_w32(fe_r32(DMA_FWD_REG) & ~(FE_GDM1_ICS_EN |
                                        FE_GDM1_TCS_EN | FE_GDM1_UCS_EN),
-                               FE_GDMA1_FWD_CFG);
+                               DMA_FWD_REG);
 }
 
 static void fe_txcsum_config(bool enable)
@@ -1450,7 +1457,7 @@ static int fe_change_mtu(struct net_device *dev, int new_mtu)
 
        fe_stop(dev);
        if (!IS_ENABLED(CONFIG_SOC_MT7621)) {
-               fwd_cfg = fe_r32(FE_GDMA1_FWD_CFG);
+               fwd_cfg = fe_r32(DMA_FWD_REG);
                if (new_mtu <= ETH_DATA_LEN) {
                        fwd_cfg &= ~FE_GDM1_JMB_EN;
                } else {
@@ -1459,7 +1466,7 @@ static int fe_change_mtu(struct net_device *dev, int new_mtu)
                        fwd_cfg |= (DIV_ROUND_UP(frag_size, 1024) <<
                        FE_GDM1_JMB_LEN_SHIFT) | FE_GDM1_JMB_EN;
                }
-               fe_w32(fwd_cfg, FE_GDMA1_FWD_CFG);
+               fe_w32(fwd_cfg, DMA_FWD_REG);
        }
 
        return fe_open(dev);
@@ -1581,7 +1588,7 @@ static int fe_probe(struct platform_device *pdev)
                                  NETIF_F_HW_VLAN_CTAG_RX);
        netdev->features |= netdev->hw_features;
 
-       if (IS_ENABLED(CONFIG_SOC_MT7621))
+       if (IS_ENABLED(CONFIG_SOC_MT7620) || IS_ENABLED(CONFIG_SOC_MT7621))
                netdev->max_mtu = 2048;
 
        /* fake rx vlan filter func. to support tx vlan offload func */
index e2b2aceff958fc20f942a76165377f0b480c876a..15c595df151c5a681bd28a585d381f3fd2cab356 100644 (file)
@@ -332,7 +332,8 @@ static void mt7620_init_data(struct fe_soc_data *data,
        struct fe_priv *priv = netdev_priv(netdev);
 
        priv->flags = FE_FLAG_PADDING_64B | FE_FLAG_RX_2B_OFFSET |
-               FE_FLAG_RX_SG_DMA | FE_FLAG_HAS_SWITCH;
+               FE_FLAG_RX_SG_DMA | FE_FLAG_HAS_SWITCH |
+               FE_FLAG_JUMBO_FRAME;
 
        netdev->hw_features = NETIF_F_IP_CSUM | NETIF_F_RXCSUM |
                NETIF_F_HW_VLAN_CTAG_TX;