aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMathias Kresin <dev@kresin.me>2018-02-18 22:48:44 +0100
committerJo-Philipp Wich <jo@mein.io>2018-12-18 09:43:59 +0100
commitb81774cff80718d20982649c4f21a405fa71a07c (patch)
tree796b4919c416589ff6c26221f8de6cc6f4ebf2b7
parent3a507b2f9b6e544fc5768d501332919d579f2f9e (diff)
downloadupstream-b81774cff80718d20982649c4f21a405fa71a07c.tar.gz
upstream-b81774cff80718d20982649c4f21a405fa71a07c.tar.bz2
upstream-b81774cff80718d20982649c4f21a405fa71a07c.zip
ramips: mt7621: fix mtu setting with kernel 4.14
Since kernel 4.10 commit 61e84623ace3 ("net: centralize net_device min/max MTU checking"), the range of mtu is [min_mtu, max_mtu], which is [68, 1500] by default. It's necessary to set a max_mtu if a mtu > 1500 is supported. Signed-off-by: Mathias Kresin <dev@kresin.me> (backported from 5da2c68d001ee44b15a58639ed03a0ebb6f68020)
-rw-r--r--target/linux/ramips/files-4.14/drivers/net/ethernet/mtk/mtk_eth_soc.c18
1 files changed, 7 insertions, 11 deletions
diff --git a/target/linux/ramips/files-4.14/drivers/net/ethernet/mtk/mtk_eth_soc.c b/target/linux/ramips/files-4.14/drivers/net/ethernet/mtk/mtk_eth_soc.c
index 6eae661ecf..74639cbb68 100644
--- a/target/linux/ramips/files-4.14/drivers/net/ethernet/mtk/mtk_eth_soc.c
+++ b/target/linux/ramips/files-4.14/drivers/net/ethernet/mtk/mtk_eth_soc.c
@@ -1384,20 +1384,12 @@ static int fe_change_mtu(struct net_device *dev, int new_mtu)
int frag_size, old_mtu;
u32 fwd_cfg;
- if (!(priv->flags & FE_FLAG_JUMBO_FRAME))
- return eth_change_mtu(dev, new_mtu);
-
- if (IS_ENABLED(CONFIG_SOC_MT7621))
- if (new_mtu > 2048)
- return -EINVAL;
-
- frag_size = fe_max_frag_size(new_mtu);
- if (new_mtu < 68 || frag_size > PAGE_SIZE)
- return -EINVAL;
-
old_mtu = dev->mtu;
dev->mtu = new_mtu;
+ if (!(priv->flags & FE_FLAG_JUMBO_FRAME))
+ return 0;
+
/* return early if the buffer sizes will not change */
if (old_mtu <= ETH_DATA_LEN && new_mtu <= ETH_DATA_LEN)
return 0;
@@ -1419,6 +1411,7 @@ static int fe_change_mtu(struct net_device *dev, int new_mtu)
if (new_mtu <= ETH_DATA_LEN) {
fwd_cfg &= ~FE_GDM1_JMB_EN;
} else {
+ frag_size = fe_max_frag_size(new_mtu);
fwd_cfg &= ~(FE_GDM1_JMB_LEN_MASK << FE_GDM1_JMB_LEN_SHIFT);
fwd_cfg |= (DIV_ROUND_UP(frag_size, 1024) <<
FE_GDM1_JMB_LEN_SHIFT) | FE_GDM1_JMB_EN;
@@ -1552,6 +1545,9 @@ static int fe_probe(struct platform_device *pdev)
netdev->vlan_features = netdev->hw_features & ~NETIF_F_HW_VLAN_CTAG_TX;
netdev->features |= netdev->hw_features;
+ if (IS_ENABLED(CONFIG_SOC_MT7621))
+ netdev->max_mtu = 2048;
+
/* fake rx vlan filter func. to support tx vlan offload func */
if (fe_reg_table[FE_REG_FE_DMA_VID_BASE])
netdev->features |= NETIF_F_HW_VLAN_CTAG_FILTER;