ramips: implement vlan rx offload on MT7621
[openwrt/openwrt.git] / target / linux / ramips / files-4.14 / drivers / net / ethernet / mediatek / mtk_eth_soc.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))