From c9262a96d1fc0a7fb1ba0806acb3b7aae00b1ecf Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Sat, 23 Mar 2019 14:29:00 +0100 Subject: [PATCH] ramips: implement vlan rx offload on MT7621 Avoids the overhead of software VLAN untagging in the network stack Signed-off-by: Felix Fietkau --- .../drivers/net/ethernet/mediatek/mtk_eth_soc.c | 9 ++++++++- .../drivers/net/ethernet/mediatek/mtk_eth_soc.h | 1 - .../drivers/net/ethernet/mediatek/soc_mt7621.c | 5 +++-- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/target/linux/ramips/files-4.14/drivers/net/ethernet/mediatek/mtk_eth_soc.c b/target/linux/ramips/files-4.14/drivers/net/ethernet/mediatek/mtk_eth_soc.c index e0bc0ab818..10d9fd7a3e 100644 --- a/target/linux/ramips/files-4.14/drivers/net/ethernet/mediatek/mtk_eth_soc.c +++ b/target/linux/ramips/files-4.14/drivers/net/ethernet/mediatek/mtk_eth_soc.c @@ -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)) diff --git a/target/linux/ramips/files-4.14/drivers/net/ethernet/mediatek/mtk_eth_soc.h b/target/linux/ramips/files-4.14/drivers/net/ethernet/mediatek/mtk_eth_soc.h index c42126116f..2f6fe1724c 100644 --- a/target/linux/ramips/files-4.14/drivers/net/ethernet/mediatek/mtk_eth_soc.h +++ b/target/linux/ramips/files-4.14/drivers/net/ethernet/mediatek/mtk_eth_soc.h @@ -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) diff --git a/target/linux/ramips/files-4.14/drivers/net/ethernet/mediatek/soc_mt7621.c b/target/linux/ramips/files-4.14/drivers/net/ethernet/mediatek/soc_mt7621.c index 392e0ea2e5..26a198fa2b 100644 --- a/target/linux/ramips/files-4.14/drivers/net/ethernet/mediatek/soc_mt7621.c +++ b/target/linux/ramips/files-4.14/drivers/net/ethernet/mediatek/soc_mt7621.c @@ -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; } -- 2.25.1