ramips: mt7621: fix mtu setting with kernel 4.14
authorMathias Kresin <dev@kresin.me>
Sun, 18 Feb 2018 21:48:44 +0000 (22:48 +0100)
committerMathias Kresin <dev@kresin.me>
Sat, 16 Jun 2018 08:08:51 +0000 (10:08 +0200)
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>
target/linux/ramips/files-4.14/drivers/net/ethernet/mediatek/mtk_eth_soc.c

index c806e28..d298fa9 100644 (file)
@@ -1373,20 +1373,12 @@ static int fe_change_mtu(struct net_device *dev, int new_mtu)
        int frag_size, old_mtu;
        u32 fwd_cfg;
 
        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;
 
        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;
        /* return early if the buffer sizes will not change */
        if (old_mtu <= ETH_DATA_LEN && new_mtu <= ETH_DATA_LEN)
                return 0;
@@ -1408,6 +1400,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 {
                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;
                        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;
@@ -1541,6 +1534,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;
 
        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;
        /* 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;