ramips: implement vlan rx offload on MT7621
authorFelix Fietkau <nbd@nbd.name>
Sat, 23 Mar 2019 13:29:00 +0000 (14:29 +0100)
committerFelix Fietkau <nbd@nbd.name>
Wed, 3 Apr 2019 08:40:09 +0000 (10:40 +0200)
Avoids the overhead of software VLAN untagging in the network stack

Signed-off-by: Felix Fietkau <nbd@nbd.name>
target/linux/ramips/files-4.14/drivers/net/ethernet/mediatek/mtk_eth_soc.c
target/linux/ramips/files-4.14/drivers/net/ethernet/mediatek/mtk_eth_soc.h
target/linux/ramips/files-4.14/drivers/net/ethernet/mediatek/soc_mt7621.c

index e0bc0ab818c43d4ce9eb786ca41d71cb8cb7d308..10d9fd7a3e67cd7380346dd45385e2771dc9eaea 100644 (file)
@@ -933,6 +933,11 @@ static int fe_poll_rx(struct napi_struct *napi, int budget,
                        skb_checksum_none_assert(skb);
                skb->protocol = eth_type_trans(skb, netdev);
 
+               if (netdev->features & NETIF_F_HW_VLAN_CTAG_RX &&
+                   RX_DMA_VID(trxd.rxd3))
+                       __vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q),
+                                              RX_DMA_VID(trxd.rxd3));
+
 #ifdef CONFIG_NET_MEDIATEK_OFFLOAD
                if (mtk_offload_check_rx(priv, skb, trxd.rxd4) == 0) {
 #endif
@@ -1585,7 +1590,9 @@ static int fe_probe(struct platform_device *pdev)
 
        if (soc->init_data)
                soc->init_data(soc, netdev);
-       netdev->vlan_features = netdev->hw_features & ~NETIF_F_HW_VLAN_CTAG_TX;
+       netdev->vlan_features = netdev->hw_features &
+                               ~(NETIF_F_HW_VLAN_CTAG_TX |
+                                 NETIF_F_HW_VLAN_CTAG_RX);
        netdev->features |= netdev->hw_features;
 
        if (IS_ENABLED(CONFIG_SOC_MT7621))
index c42126116fc6c43b1b23a00fb379c4be9a6a6e15..2f6fe1724c8c784d9f6b30ab09918da1f210398d 100644 (file)
@@ -406,7 +406,6 @@ struct fe_soc_data {
 #define FE_FLAG_JUMBO_FRAME            BIT(2)
 #define FE_FLAG_RX_2B_OFFSET           BIT(3)
 #define FE_FLAG_RX_SG_DMA              BIT(4)
-#define FE_FLAG_RX_VLAN_CTAG           BIT(5)
 #define FE_FLAG_NAPI_WEIGHT            BIT(6)
 #define FE_FLAG_CALIBRATE_CLK          BIT(7)
 #define FE_FLAG_HAS_SWITCH             BIT(8)
index 392e0ea2e58893ecd0eff4b9f7e964039a5e3e59..26a198fa2b486d658ad1b4651f20dfcfbf6c3c28 100644 (file)
@@ -122,7 +122,7 @@ static int mt7621_fwd_config(struct fe_priv *priv)
 
        /* mt7621 doesn't have txcsum config */
        mt7621_rxcsum_config((dev->features & NETIF_F_RXCSUM));
-       mt7621_rxvlan_config(priv->flags & FE_FLAG_RX_VLAN_CTAG);
+       mt7621_rxvlan_config(dev->features & NETIF_F_HW_VLAN_CTAG_RX);
 
        return 0;
 }
@@ -142,7 +142,8 @@ static void mt7621_init_data(struct fe_soc_data *data,
                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 |
+               NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_HW_VLAN_CTAG_RX |
+               NETIF_F_SG | NETIF_F_TSO |
                NETIF_F_TSO6 | NETIF_F_IPV6_CSUM |
                NETIF_F_TSO_MANGLEID;
 }