[][MAC80211][misc][Refactor wed/flowblock/mtk_ppe patches]
[Description]
Refactor wed/flowblock/mtk_ppe patches
[Release-log]
Change-Id: I4353142dea601460dcae92b8b70e71dd79cc38fb
Reviewed-on: https://gerrit.mediatek.inc/c/openwrt/feeds/mtk_openwrt_feeds/+/8021862
diff --git a/autobuild_mac80211_release/target/linux/mediatek/patches-5.4/999-3016-mediatek-ethernet-add-wifi2wifi-offload-support.patch b/autobuild_mac80211_release/target/linux/mediatek/patches-5.4/999-3016-mediatek-ethernet-add-wifi2wifi-offload-support.patch
new file mode 100644
index 0000000..121db94
--- /dev/null
+++ b/autobuild_mac80211_release/target/linux/mediatek/patches-5.4/999-3016-mediatek-ethernet-add-wifi2wifi-offload-support.patch
@@ -0,0 +1,166 @@
+From d3183ad9ed0a8a35047a37f30d85f920a729897c Mon Sep 17 00:00:00 2001
+From: Sujuan Chen <sujuan.chen@mediatek.com>
+Date: Mon, 18 Sep 2023 11:16:18 +0800
+Subject: [PATCH 17/22] mediatek-ethernet-add-wifi2wifi-offload-support
+
+---
+ drivers/net/ethernet/mediatek/mtk_eth_soc.h | 2 ++
+ .../net/ethernet/mediatek/mtk_ppe_offload.c | 35 +++++++++++++------
+ drivers/net/ethernet/mediatek/mtk_wed.c | 13 +++++++
+ include/linux/soc/mediatek/mtk_wed.h | 6 +++-
+ 4 files changed, 45 insertions(+), 11 deletions(-)
+ mode change 100755 => 100644 drivers/net/ethernet/mediatek/mtk_ppe_offload.c
+
+diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.h b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
+index 23c5f49..ee89b4c 100644
+--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h
++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
+@@ -2027,6 +2027,8 @@ void mtk_usxgmii_link_poll(struct work_struct *work);
+ int mtk_eth_offload_init(struct mtk_eth *eth, int id);
+ int mtk_eth_setup_tc(struct net_device *dev, enum tc_setup_type type,
+ void *type_data);
++int mtk_eth_setup_tc_block(struct net_device *dev, struct flow_block_offload *f,
++ struct mtk_eth *eth);
+ void mtk_eth_set_dma_device(struct mtk_eth *eth, struct device *dma_dev);
+ u32 mtk_rss_indr_table(struct mtk_rss_params *rss_params, int index);
+
+diff --git a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c
+old mode 100755
+new mode 100644
+index f0c63da..c1cce76
+--- a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c
++++ b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c
+@@ -563,10 +563,20 @@ static int
+ mtk_eth_setup_tc_block_cb(enum tc_setup_type type, void *type_data, void *cb_priv)
+ {
+ struct flow_cls_offload *cls = type_data;
+- struct net_device *dev = cb_priv;
+- struct mtk_mac *mac = netdev_priv(dev);
+- struct mtk_eth *eth = mac->hw;
+- int err;
++ struct mtk_eth *eth = cb_priv;
++ struct net_device *dev = NULL;
++ int i, err;
++
++ for (i = 0; i < MTK_MAC_COUNT; i++) {
++ if (!eth->netdev[i])
++ continue;
++
++ dev = eth->netdev[i];
++ break;
++ }
++
++ if (!dev)
++ return -EOPNOTSUPP;
+
+ if (!tc_can_offload(dev))
+ return -EOPNOTSUPP;
+@@ -594,16 +604,21 @@ mtk_eth_setup_tc_block_cb(enum tc_setup_type type, void *type_data, void *cb_pri
+ return err;
+ }
+
+-static int
+-mtk_eth_setup_tc_block(struct net_device *dev, struct flow_block_offload *f)
++int
++mtk_eth_setup_tc_block(struct net_device *dev, struct flow_block_offload *f,
++ struct mtk_eth *eth)
+ {
+- struct mtk_mac *mac = netdev_priv(dev);
+- struct mtk_eth *eth = mac->hw;
++ struct mtk_mac *mac;
+ static LIST_HEAD(block_cb_list);
+ struct flow_block_cb *block_cb;
+ flow_setup_cb_t *cb;
+ int i, err = 0;
+
++ if (!eth) {
++ mac = netdev_priv(dev);
++ eth = mac->hw;
++ }
++
+ for (i = 0; i < eth->ppe_num; i++) {
+ if (!eth->ppe[i] || !eth->ppe[i]->foe_table)
+ return -EOPNOTSUPP;
+@@ -622,7 +637,7 @@ mtk_eth_setup_tc_block(struct net_device *dev, struct flow_block_offload *f)
+ flow_block_cb_incref(block_cb);
+ goto unlock;
+ }
+- block_cb = flow_block_cb_alloc(cb, dev, dev, NULL);
++ block_cb = flow_block_cb_alloc(cb, dev, eth, NULL);
+ if (IS_ERR(block_cb)) {
+ err = PTR_ERR(block_cb);
+ goto unlock;
+@@ -658,7 +673,7 @@ int mtk_eth_setup_tc(struct net_device *dev, enum tc_setup_type type,
+ switch (type) {
+ case TC_SETUP_BLOCK:
+ case TC_SETUP_FT:
+- return mtk_eth_setup_tc_block(dev, type_data);
++ return mtk_eth_setup_tc_block(dev, type_data, NULL);
+ default:
+ return -EOPNOTSUPP;
+ }
+diff --git a/drivers/net/ethernet/mediatek/mtk_wed.c b/drivers/net/ethernet/mediatek/mtk_wed.c
+index ae31412..3e760f7 100644
+--- a/drivers/net/ethernet/mediatek/mtk_wed.c
++++ b/drivers/net/ethernet/mediatek/mtk_wed.c
+@@ -1733,6 +1733,18 @@ void mtk_wed_flow_remove(int index)
+ mutex_unlock(&hw_lock);
+ }
+
++static int mtk_wed_eth_setup_tc(struct mtk_wed_device *wed, struct net_device *dev,
++ int type, void *type_data)
++{
++ switch (type) {
++ case TC_SETUP_BLOCK:
++ case TC_SETUP_FT:
++ return mtk_eth_setup_tc_block(dev, type_data, wed->hw->eth);
++ default:
++ return -EOPNOTSUPP;
++ }
++}
++
+ void mtk_wed_add_hw(struct device_node *np, struct mtk_eth *eth,
+ void __iomem *wdma, u32 wdma_phy, int index)
+
+@@ -1751,6 +1763,7 @@ void mtk_wed_add_hw(struct device_node *np, struct mtk_eth *eth,
+ .irq_get = mtk_wed_irq_get,
+ .irq_set_mask = mtk_wed_irq_set_mask,
+ .detach = mtk_wed_detach,
++ .setup_tc = mtk_wed_eth_setup_tc,
+ .ppe_check = mtk_wed_ppe_check,
+ };
+ struct device_node *eth_np = eth->dev->of_node;
+diff --git a/include/linux/soc/mediatek/mtk_wed.h b/include/linux/soc/mediatek/mtk_wed.h
+index 98ed390..27cf284 100644
+--- a/include/linux/soc/mediatek/mtk_wed.h
++++ b/include/linux/soc/mediatek/mtk_wed.h
+@@ -183,7 +183,8 @@ struct mtk_wed_ops {
+ int (*msg_update)(struct mtk_wed_device *dev, int cmd_id,
+ void *data, int len);
+ void (*detach)(struct mtk_wed_device *dev);
+-
++ int (*setup_tc)(struct mtk_wed_device *wed, struct net_device *dev,
++ int type, void *type_data);
+ void (*stop)(struct mtk_wed_device *dev);
+ void (*start)(struct mtk_wed_device *dev, u32 irq_mask);
+ void (*reset_dma)(struct mtk_wed_device *dev);
+@@ -232,6 +233,8 @@ mtk_wed_get_rx_capa(struct mtk_wed_device *dev)
+ #ifdef CONFIG_NET_MEDIATEK_SOC_WED
+ #define mtk_wed_device_active(_dev) !!(_dev)->ops
+ #define mtk_wed_device_detach(_dev) (_dev)->ops->detach(_dev)
++#define mtk_wed_device_setup_tc(_dev, _ndev, _type, _data) \
++ (_dev)->ops->setup_tc(_dev, _ndev, _type, _data)
+ #define mtk_wed_device_start(_dev, _mask) (_dev)->ops->start(_dev, _mask)
+ #define mtk_wed_device_stop(_dev) (_dev)->ops->stop(_dev)
+ #define mtk_wed_device_tx_ring_setup(_dev, _ring, _regs, _reset) \
+@@ -270,6 +273,7 @@ static inline bool mtk_wed_device_active(struct mtk_wed_device *dev)
+ #define mtk_wed_device_irq_get(_dev, _mask) 0
+ #define mtk_wed_device_irq_set_mask(_dev, _mask) do {} while (0)
+ #define mtk_wed_device_dma_reset(_dev) do {} while (0)
++#define mtk_wed_device_setup_tc(_dev, _ndev, _type, _data) do {} while (0)
+ #define mtk_wed_device_ppe_check(_dev, _hash) do {} while (0)
+ #endif
+
+--
+2.18.0
+