ramips: ethernet: ralink: mt7620 enable jumbo frames

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>
This commit is contained in:
Luiz Angelo Daros de Luca authored and Robert Marko committed 2026-06-29 14:54:58 +02:00
1 parent 257aee0cc0
commit d083212e11
4 files changed
+32 -11

No files matched your search

@@ -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);
}
@@ -53,7 +53,12 @@
#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
@@ -41,7 +41,14 @@
#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 */
@@ -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;