-Index: linux-5.4.28/drivers/net/ethernet/mediatek/Kconfig
-===================================================================
---- linux-5.4.28.orig/drivers/net/ethernet/mediatek/Kconfig
-+++ linux-5.4.28/drivers/net/ethernet/mediatek/Kconfig
-@@ -14,4 +14,8 @@ config NET_MEDIATEK_SOC
+--- a/drivers/net/ethernet/mediatek/Kconfig
++++ b/drivers/net/ethernet/mediatek/Kconfig
+@@ -15,4 +15,8 @@ config NET_MEDIATEK_SOC
This driver supports the gigabit ethernet MACs in the
MediaTek SoC family.
+ depends on NET_MEDIATEK_SOC
+
endif #NET_VENDOR_MEDIATEK
-Index: linux-5.4.28/drivers/net/ethernet/mediatek/Makefile
-===================================================================
---- linux-5.4.28.orig/drivers/net/ethernet/mediatek/Makefile
-+++ linux-5.4.28/drivers/net/ethernet/mediatek/Makefile
+--- a/drivers/net/ethernet/mediatek/Makefile
++++ b/drivers/net/ethernet/mediatek/Makefile
@@ -5,3 +5,4 @@
obj-$(CONFIG_NET_MEDIATEK_SOC) += mtk_eth.o
mtk_eth-y := mtk_eth_soc.o mtk_sgmii.o mtk_eth_path.o
+mtk_eth-$(CONFIG_NET_MEDIATEK_OFFLOAD) += mtk_offload.o mtk_debugfs.o
-Index: linux-5.4.28/drivers/net/ethernet/mediatek/mtk_debugfs.c
-===================================================================
--- /dev/null
-+++ linux-5.4.28/drivers/net/ethernet/mediatek/mtk_debugfs.c
++++ b/drivers/net/ethernet/mediatek/mtk_debugfs.c
@@ -0,0 +1,117 @@
+/* This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+
+ return 0;
+}
-Index: linux-5.4.28/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-===================================================================
---- linux-5.4.28.orig/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-+++ linux-5.4.28/drivers/net/ethernet/mediatek/mtk_eth_soc.c
+--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
@@ -19,6 +19,8 @@
#include <linux/interrupt.h>
#include <linux/pinctrl/devinfo.h>
#include <linux/phylink.h>
+#include <linux/netfilter.h>
+#include <net/netfilter/nf_flow_table.h>
+ #include <net/dsa.h>
#include "mtk_eth_soc.h"
-
-@@ -65,6 +67,18 @@ u32 mtk_r32(struct mtk_eth *eth, unsigne
- return __raw_readl(eth->base + reg);
- }
-
-+void mtk_m32(struct mtk_eth *eth, u32 clear, u32 set, unsigned reg)
-+{
-+ u32 val;
-+
-+ spin_lock(ð->page_lock);
-+ val = __raw_readl(eth->base + reg);
-+ val &= ~clear;
-+ val |= set;
-+ __raw_writel(val, eth->base + reg);
-+ spin_unlock(ð->page_lock);
-+}
-+
- static int mtk_mdio_busy_wait(struct mtk_eth *eth)
- {
- unsigned long t_start = jiffies;
-@@ -1276,8 +1290,16 @@ static int mtk_poll_rx(struct napi_struc
+@@ -1327,8 +1329,16 @@ static int mtk_poll_rx(struct napi_struc
(trxd.rxd2 & RX_DMA_VTAG))
__vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q),
RX_DMA_VID(trxd.rxd3));
+ }
+#endif
+ skip_rx:
ring->data[idx] = new_data;
- rxd->rxd1 = (unsigned int)dma_addr;
-@@ -2194,6 +2216,9 @@ static int mtk_open(struct net_device *d
+@@ -2292,6 +2302,9 @@ static int mtk_open(struct net_device *d
mtk_tx_irq_enable(eth, MTK_TX_DONE_INT);
mtk_rx_irq_enable(eth, MTK_RX_DONE_INT);
refcount_set(ð->dma_refcnt, 1);
}
else
refcount_inc(ð->dma_refcnt);
-@@ -2252,6 +2277,9 @@ static int mtk_stop(struct net_device *d
+@@ -2355,6 +2368,9 @@ static int mtk_stop(struct net_device *d
mtk_dma_free(eth);
return 0;
}
-@@ -2711,6 +2739,27 @@ static int mtk_set_rxnfc(struct net_devi
+@@ -2853,6 +2869,27 @@ static int mtk_set_rxnfc(struct net_devi
return ret;
}
static const struct ethtool_ops mtk_ethtool_ops = {
.get_link_ksettings = mtk_get_link_ksettings,
.set_link_ksettings = mtk_set_link_ksettings,
-@@ -2742,6 +2791,9 @@ static const struct net_device_ops mtk_n
+@@ -2884,6 +2921,9 @@ static const struct net_device_ops mtk_n
#ifdef CONFIG_NET_POLL_CONTROLLER
.ndo_poll_controller = mtk_poll_controller,
#endif
};
static int mtk_add_mac(struct mtk_eth *eth, struct device_node *np)
-@@ -3075,6 +3127,7 @@ static const struct mtk_soc_data mt7622_
+@@ -3226,6 +3266,7 @@ static const struct mtk_soc_data mt7622_
.hw_features = MTK_HW_FEATURES,
.required_clks = MT7622_CLKS_BITMAP,
.required_pctl = false,
};
static const struct mtk_soc_data mt7623_data = {
-Index: linux-5.4.28/drivers/net/ethernet/mediatek/mtk_eth_soc.h
-===================================================================
---- linux-5.4.28.orig/drivers/net/ethernet/mediatek/mtk_eth_soc.h
-+++ linux-5.4.28/drivers/net/ethernet/mediatek/mtk_eth_soc.h
-@@ -771,6 +771,13 @@ enum mkt_eth_capabilities {
+--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h
++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
+@@ -790,6 +790,13 @@ enum mkt_eth_capabilities {
MTK_MUX_U3_GMAC2_TO_QPHY | \
MTK_MUX_GMAC12_TO_GEPHY_SGMII | MTK_QDMA)
/* struct mtk_eth_data - This is the structure holding all differences
* among various plaforms
* @ana_rgc3: The offset for register ANA_RGC3 related to
-@@ -788,6 +795,7 @@ struct mtk_soc_data {
+@@ -807,6 +814,7 @@ struct mtk_soc_data {
u32 required_clks;
bool required_pctl;
netdev_features_t hw_features;
};
/* currently no SoC has more than 2 macs */
-@@ -813,6 +821,23 @@ struct mtk_sgmii {
+@@ -832,6 +840,23 @@ struct mtk_sgmii {
u32 ana_rgc3;
};
/* struct mtk_eth - This is the main datasructure for holding the state
* of the driver
* @dev: The device pointer
-@@ -886,6 +911,16 @@ struct mtk_eth {
+@@ -917,6 +942,16 @@ struct mtk_eth {
u32 tx_int_status_reg;
u32 rx_dma_l4_valid;
int ip_align;
};
/* struct mtk_mac - the structure that holds the info about the MACs of the
-@@ -918,6 +953,7 @@ void mtk_stats_update_mac(struct mtk_mac
+@@ -949,6 +984,7 @@ void mtk_stats_update_mac(struct mtk_mac
void mtk_w32(struct mtk_eth *eth, u32 val, unsigned reg);
u32 mtk_r32(struct mtk_eth *eth, unsigned reg);
-+void mtk_m32(struct mtk_eth *eth, u32 clear, u32 set, unsigned reg);
++u32 mtk_m32(struct mtk_eth *eth, u32 mask, u32 set, unsigned reg);
int mtk_sgmii_init(struct mtk_sgmii *ss, struct device_node *np,
u32 ana_rgc3);
-@@ -930,4 +966,13 @@ int mtk_gmac_sgmii_path_setup(struct mtk
+@@ -961,4 +997,13 @@ int mtk_gmac_sgmii_path_setup(struct mtk
int mtk_gmac_gephy_path_setup(struct mtk_eth *eth, int mac_id);
int mtk_gmac_rgmii_path_setup(struct mtk_eth *eth, int mac_id);
+int mtk_offload_check_rx(struct mtk_eth *eth, struct sk_buff *skb, u32 rxd4);
+
#endif /* MTK_ETH_H */
-Index: linux-5.4.28/drivers/net/ethernet/mediatek/mtk_offload.c
-===================================================================
--- /dev/null
-+++ linux-5.4.28/drivers/net/ethernet/mediatek/mtk_offload.c
-@@ -0,0 +1,593 @@
++++ b/drivers/net/ethernet/mediatek/mtk_offload.c
+@@ -0,0 +1,609 @@
+/* This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ }
+ }
+
++ if (dest->flags & FLOW_OFFLOAD_PATH_DSA) {
++ entry->bfib1.vlan_layer = 1;
++
++ entry->ipv4_hnapt.bfib1.vpm = 0;
++ entry->ipv4_hnapt.etype = BIT(dest->dsa_port);
++
++ if (dest->flags & FLOW_OFFLOAD_PATH_VLAN) {
++ if (dest->vlan_proto != htons(ETH_P_8021Q))
++ return -EINVAL;
++
++ entry->ipv4_hnapt.etype |= BIT(8);
++ } else {
++ entry->ipv4_hnapt.vlan1 = 0;
++ }
++ }
++
+ return 0;
+}
+
+{
+ mtk_ppe_stop(eth);
+}
-Index: linux-5.4.28/drivers/net/ethernet/mediatek/mtk_offload.h
-===================================================================
--- /dev/null
-+++ linux-5.4.28/drivers/net/ethernet/mediatek/mtk_offload.h
++++ b/drivers/net/ethernet/mediatek/mtk_offload.h
@@ -0,0 +1,298 @@
+/* This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by