From: Luiz Angelo Daros de Luca Date: Thu, 31 Mar 2022 04:15:44 +0000 (-0300) Subject: ramips: ethernet: ralink: mt7620 enable jumbo frames X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=d083212e1105b56dec645108bc03bc3172eb7c81;p=thirdparty%2Fopenwrt.git 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 Signed-off-by: Luiz Angelo Daros de Luca Link: https://github.com/openwrt/openwrt/pull/23933 Signed-off-by: Robert Marko --- diff --git a/target/linux/ramips/files/drivers/net/ethernet/ralink/gsw_mt7620.c b/target/linux/ramips/files/drivers/net/ethernet/ralink/gsw_mt7620.c index ac447ba7cb9..8965f73211c 100644 --- a/target/linux/ramips/files/drivers/net/ethernet/ralink/gsw_mt7620.c +++ b/target/linux/ramips/files/drivers/net/ethernet/ralink/gsw_mt7620.c @@ -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); } diff --git a/target/linux/ramips/files/drivers/net/ethernet/ralink/gsw_mt7620.h b/target/linux/ramips/files/drivers/net/ethernet/ralink/gsw_mt7620.h index 12cab39b771..4252bc22a6d 100644 --- a/target/linux/ramips/files/drivers/net/ethernet/ralink/gsw_mt7620.h +++ b/target/linux/ramips/files/drivers/net/ethernet/ralink/gsw_mt7620.h @@ -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 diff --git a/target/linux/ramips/files/drivers/net/ethernet/ralink/mtk_eth_soc.c b/target/linux/ramips/files/drivers/net/ethernet/ralink/mtk_eth_soc.c index 928449ae98c..9c8b34aac04 100644 --- a/target/linux/ramips/files/drivers/net/ethernet/ralink/mtk_eth_soc.c +++ b/target/linux/ramips/files/drivers/net/ethernet/ralink/mtk_eth_soc.c @@ -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 */ diff --git a/target/linux/ramips/files/drivers/net/ethernet/ralink/soc_mt7620.c b/target/linux/ramips/files/drivers/net/ethernet/ralink/soc_mt7620.c index e2b2aceff95..15c595df151 100644 --- a/target/linux/ramips/files/drivers/net/ethernet/ralink/soc_mt7620.c +++ b/target/linux/ramips/files/drivers/net/ethernet/ralink/soc_mt7620.c @@ -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;