ramips: add jumbo frame support for v4.9
authorJohn Crispin <john@phrozen.org>
Thu, 1 Jun 2017 10:29:40 +0000 (12:29 +0200)
committerJohn Crispin <john@phrozen.org>
Thu, 1 Jun 2017 10:30:17 +0000 (12:30 +0200)
Signed-off-by: John Crispin <john@phrozen.org>
target/linux/ramips/files-4.9/drivers/net/ethernet/mtk/gsw_mt7620.h
target/linux/ramips/files-4.9/drivers/net/ethernet/mtk/gsw_mt7621.c
target/linux/ramips/files-4.9/drivers/net/ethernet/mtk/mtk_eth_soc.c
target/linux/ramips/files-4.9/drivers/net/ethernet/mtk/soc_mt7621.c

index 77dd2ed0b801d4d03279b7a5a61958a51358aa80..ae0b6de02416bbf9604c32c3a74b93173d6399a6 100644 (file)
 #define GSW_REG_ISR            0x700c
 #define GSW_REG_GPC1           0x7014
 
 #define GSW_REG_ISR            0x700c
 #define GSW_REG_GPC1           0x7014
 
+#define GSW_REG_MAC_P0_MCR     0x100
+#define GSW_REG_MAC_P1_MCR     0x200
+
+// Global MAC control register
+#define GSW_REG_GMACCR         0x30E0
+
 #define SYSC_REG_CHIP_REV_ID   0x0c
 #define SYSC_REG_CFG1          0x14
 #define RST_CTRL_MCM           BIT(2)
 #define SYSC_REG_CHIP_REV_ID   0x0c
 #define SYSC_REG_CFG1          0x14
 #define RST_CTRL_MCM           BIT(2)
index 8e2fbd282ddcae10f861ada553722abd8758ac31..3adad48c885bce773643b9889d14cfac51f5dc4b 100644 (file)
@@ -100,16 +100,19 @@ static void mt7621_hw_init(struct mt7620_gsw *gsw, struct device_node *np)
 
        if ((rt_sysc_r32(SYSC_REG_CHIP_REV_ID) & 0xFFFF) == 0x0101) {
                /* (GE1, Force 1000M/FD, FC ON, MAX_RX_LENGTH 1536) */
 
        if ((rt_sysc_r32(SYSC_REG_CHIP_REV_ID) & 0xFFFF) == 0x0101) {
                /* (GE1, Force 1000M/FD, FC ON, MAX_RX_LENGTH 1536) */
-               mtk_switch_w32(gsw, 0x2105e30b, 0x100);
+               mtk_switch_w32(gsw, 0x2305e30b, GSW_REG_MAC_P0_MCR);
                mt7530_mdio_w32(gsw, 0x3600, 0x5e30b);
        } else {
                /* (GE1, Force 1000M/FD, FC ON, MAX_RX_LENGTH 1536) */
                mt7530_mdio_w32(gsw, 0x3600, 0x5e30b);
        } else {
                /* (GE1, Force 1000M/FD, FC ON, MAX_RX_LENGTH 1536) */
-               mtk_switch_w32(gsw, 0x2105e33b, 0x100);
+               mtk_switch_w32(gsw, 0x2305e33b, GSW_REG_MAC_P0_MCR);
                mt7530_mdio_w32(gsw, 0x3600, 0x5e33b);
        }
 
        /* (GE2, Link down) */
                mt7530_mdio_w32(gsw, 0x3600, 0x5e33b);
        }
 
        /* (GE2, Link down) */
-       mtk_switch_w32(gsw, 0x8000, 0x200);
+       mtk_switch_w32(gsw, 0x8000, GSW_REG_MAC_P1_MCR);
+
+       /* Set switch max RX frame length to 2k */
+       mt7530_mdio_w32(gsw, GSW_REG_GMACCR, 0x3F0B);
 
        /* Enable Port 6, P5 as GMAC5, P5 disable */
        val = mt7530_mdio_r32(gsw, 0x7804);
 
        /* Enable Port 6, P5 as GMAC5, P5 disable */
        val = mt7530_mdio_r32(gsw, 0x7804);
index 3e8768f63ac58ad7f174a75bc992da939486ecc7..5f4afade06cb9803faf1c4d25b11542e92fc192c 100644 (file)
@@ -1350,6 +1350,10 @@ static int fe_change_mtu(struct net_device *dev, int new_mtu)
        if (!(priv->flags & FE_FLAG_JUMBO_FRAME))
                return eth_change_mtu(dev, new_mtu);
 
        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;
        frag_size = fe_max_frag_size(new_mtu);
        if (new_mtu < 68 || frag_size > PAGE_SIZE)
                return -EINVAL;
@@ -1373,15 +1377,17 @@ static int fe_change_mtu(struct net_device *dev, int new_mtu)
                return 0;
 
        fe_stop(dev);
                return 0;
 
        fe_stop(dev);
-       fwd_cfg = fe_r32(FE_GDMA1_FWD_CFG);
-       if (new_mtu <= ETH_DATA_LEN) {
-               fwd_cfg &= ~FE_GDM1_JMB_EN;
-       } else {
-               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;
+       if (!IS_ENABLED(CONFIG_SOC_MT7621)) {
+               fwd_cfg = fe_r32(FE_GDMA1_FWD_CFG);
+               if (new_mtu <= ETH_DATA_LEN) {
+                       fwd_cfg &= ~FE_GDM1_JMB_EN;
+               } else {
+                       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;
+               }
+               fe_w32(fwd_cfg, FE_GDMA1_FWD_CFG);
        }
        }
-       fe_w32(fwd_cfg, FE_GDMA1_FWD_CFG);
 
        return fe_open(dev);
 }
 
        return fe_open(dev);
 }
index 3a8653e5e2b51ec99a302cc616bdeb31f63c8edb..ce41b342e754a77f027935dabcb67853ab3910f0 100644 (file)
@@ -139,7 +139,7 @@ static void mt7621_init_data(struct fe_soc_data *data,
 
        priv->flags = FE_FLAG_PADDING_64B | FE_FLAG_RX_2B_OFFSET |
                FE_FLAG_RX_SG_DMA | FE_FLAG_NAPI_WEIGHT |
 
        priv->flags = FE_FLAG_PADDING_64B | FE_FLAG_RX_2B_OFFSET |
                FE_FLAG_RX_SG_DMA | FE_FLAG_NAPI_WEIGHT |
-               FE_FLAG_HAS_SWITCH;
+               FE_FLAG_HAS_SWITCH | FE_FLAG_JUMBO_FRAME;
 
        netdev->hw_features = NETIF_F_IP_CSUM | NETIF_F_RXCSUM |
                NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_SG | NETIF_F_TSO |
 
        netdev->hw_features = NETIF_F_IP_CSUM | NETIF_F_RXCSUM |
                NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_SG | NETIF_F_TSO |