blob: 121db940f2c43ec9884ad803939e9649c9486757 [file] [log] [blame]
developer58aa0682023-09-18 14:02:26 +08001From d3183ad9ed0a8a35047a37f30d85f920a729897c Mon Sep 17 00:00:00 2001
developerfeeda732022-12-27 10:19:39 +08002From: Sujuan Chen <sujuan.chen@mediatek.com>
developer58aa0682023-09-18 14:02:26 +08003Date: Mon, 18 Sep 2023 11:16:18 +0800
4Subject: [PATCH 17/22] mediatek-ethernet-add-wifi2wifi-offload-support
developerfeeda732022-12-27 10:19:39 +08005
developerfeeda732022-12-27 10:19:39 +08006---
7 drivers/net/ethernet/mediatek/mtk_eth_soc.h | 2 ++
developeree39bcf2023-06-16 08:03:30 +08008 .../net/ethernet/mediatek/mtk_ppe_offload.c | 35 +++++++++++++------
developerfeeda732022-12-27 10:19:39 +08009 drivers/net/ethernet/mediatek/mtk_wed.c | 13 +++++++
10 include/linux/soc/mediatek/mtk_wed.h | 6 +++-
developeree39bcf2023-06-16 08:03:30 +080011 4 files changed, 45 insertions(+), 11 deletions(-)
12 mode change 100755 => 100644 drivers/net/ethernet/mediatek/mtk_ppe_offload.c
developerfeeda732022-12-27 10:19:39 +080013
14diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.h b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
developer58aa0682023-09-18 14:02:26 +080015index 23c5f49..ee89b4c 100644
developerfeeda732022-12-27 10:19:39 +080016--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h
17+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
developer58aa0682023-09-18 14:02:26 +080018@@ -2027,6 +2027,8 @@ void mtk_usxgmii_link_poll(struct work_struct *work);
developeree39bcf2023-06-16 08:03:30 +080019 int mtk_eth_offload_init(struct mtk_eth *eth, int id);
developerfeeda732022-12-27 10:19:39 +080020 int mtk_eth_setup_tc(struct net_device *dev, enum tc_setup_type type,
21 void *type_data);
22+int mtk_eth_setup_tc_block(struct net_device *dev, struct flow_block_offload *f,
23+ struct mtk_eth *eth);
24 void mtk_eth_set_dma_device(struct mtk_eth *eth, struct device *dma_dev);
developer58aa0682023-09-18 14:02:26 +080025 u32 mtk_rss_indr_table(struct mtk_rss_params *rss_params, int index);
developeree39bcf2023-06-16 08:03:30 +080026
developerfeeda732022-12-27 10:19:39 +080027diff --git a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c
developeree39bcf2023-06-16 08:03:30 +080028old mode 100755
29new mode 100644
developer58aa0682023-09-18 14:02:26 +080030index f0c63da..c1cce76
developerfeeda732022-12-27 10:19:39 +080031--- a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c
32+++ b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c
developer58aa0682023-09-18 14:02:26 +080033@@ -563,10 +563,20 @@ static int
developerfeeda732022-12-27 10:19:39 +080034 mtk_eth_setup_tc_block_cb(enum tc_setup_type type, void *type_data, void *cb_priv)
35 {
36 struct flow_cls_offload *cls = type_data;
37- struct net_device *dev = cb_priv;
38- struct mtk_mac *mac = netdev_priv(dev);
39- struct mtk_eth *eth = mac->hw;
developeree39bcf2023-06-16 08:03:30 +080040- int err;
developerfeeda732022-12-27 10:19:39 +080041+ struct mtk_eth *eth = cb_priv;
42+ struct net_device *dev = NULL;
developeree39bcf2023-06-16 08:03:30 +080043+ int i, err;
developerfeeda732022-12-27 10:19:39 +080044+
45+ for (i = 0; i < MTK_MAC_COUNT; i++) {
46+ if (!eth->netdev[i])
47+ continue;
48+
49+ dev = eth->netdev[i];
50+ break;
51+ }
52+
53+ if (!dev)
54+ return -EOPNOTSUPP;
55
56 if (!tc_can_offload(dev))
57 return -EOPNOTSUPP;
developer58aa0682023-09-18 14:02:26 +080058@@ -594,16 +604,21 @@ mtk_eth_setup_tc_block_cb(enum tc_setup_type type, void *type_data, void *cb_pri
developeree39bcf2023-06-16 08:03:30 +080059 return err;
developerfeeda732022-12-27 10:19:39 +080060 }
61
62-static int
63-mtk_eth_setup_tc_block(struct net_device *dev, struct flow_block_offload *f)
64+int
65+mtk_eth_setup_tc_block(struct net_device *dev, struct flow_block_offload *f,
66+ struct mtk_eth *eth)
67 {
68- struct mtk_mac *mac = netdev_priv(dev);
69- struct mtk_eth *eth = mac->hw;
70+ struct mtk_mac *mac;
developerfeeda732022-12-27 10:19:39 +080071 static LIST_HEAD(block_cb_list);
72 struct flow_block_cb *block_cb;
73 flow_setup_cb_t *cb;
developeree39bcf2023-06-16 08:03:30 +080074 int i, err = 0;
developerfeeda732022-12-27 10:19:39 +080075
76+ if (!eth) {
77+ mac = netdev_priv(dev);
78+ eth = mac->hw;
79+ }
80+
developeree39bcf2023-06-16 08:03:30 +080081 for (i = 0; i < eth->ppe_num; i++) {
developer58aa0682023-09-18 14:02:26 +080082 if (!eth->ppe[i] || !eth->ppe[i]->foe_table)
83 return -EOPNOTSUPP;
84@@ -622,7 +637,7 @@ mtk_eth_setup_tc_block(struct net_device *dev, struct flow_block_offload *f)
developerfeeda732022-12-27 10:19:39 +080085 flow_block_cb_incref(block_cb);
developeree39bcf2023-06-16 08:03:30 +080086 goto unlock;
developerfeeda732022-12-27 10:19:39 +080087 }
88- block_cb = flow_block_cb_alloc(cb, dev, dev, NULL);
89+ block_cb = flow_block_cb_alloc(cb, dev, eth, NULL);
developeree39bcf2023-06-16 08:03:30 +080090 if (IS_ERR(block_cb)) {
91 err = PTR_ERR(block_cb);
92 goto unlock;
developer58aa0682023-09-18 14:02:26 +080093@@ -658,7 +673,7 @@ int mtk_eth_setup_tc(struct net_device *dev, enum tc_setup_type type,
developerfeeda732022-12-27 10:19:39 +080094 switch (type) {
95 case TC_SETUP_BLOCK:
96 case TC_SETUP_FT:
97- return mtk_eth_setup_tc_block(dev, type_data);
98+ return mtk_eth_setup_tc_block(dev, type_data, NULL);
99 default:
100 return -EOPNOTSUPP;
101 }
102diff --git a/drivers/net/ethernet/mediatek/mtk_wed.c b/drivers/net/ethernet/mediatek/mtk_wed.c
developer58aa0682023-09-18 14:02:26 +0800103index ae31412..3e760f7 100644
developerfeeda732022-12-27 10:19:39 +0800104--- a/drivers/net/ethernet/mediatek/mtk_wed.c
105+++ b/drivers/net/ethernet/mediatek/mtk_wed.c
developer58aa0682023-09-18 14:02:26 +0800106@@ -1733,6 +1733,18 @@ void mtk_wed_flow_remove(int index)
developerfeeda732022-12-27 10:19:39 +0800107 mutex_unlock(&hw_lock);
108 }
109
110+static int mtk_wed_eth_setup_tc(struct mtk_wed_device *wed, struct net_device *dev,
111+ int type, void *type_data)
112+{
113+ switch (type) {
114+ case TC_SETUP_BLOCK:
115+ case TC_SETUP_FT:
116+ return mtk_eth_setup_tc_block(dev, type_data, wed->hw->eth);
117+ default:
118+ return -EOPNOTSUPP;
119+ }
120+}
121+
122 void mtk_wed_add_hw(struct device_node *np, struct mtk_eth *eth,
123 void __iomem *wdma, u32 wdma_phy, int index)
124
developer58aa0682023-09-18 14:02:26 +0800125@@ -1751,6 +1763,7 @@ void mtk_wed_add_hw(struct device_node *np, struct mtk_eth *eth,
developerfeeda732022-12-27 10:19:39 +0800126 .irq_get = mtk_wed_irq_get,
127 .irq_set_mask = mtk_wed_irq_set_mask,
128 .detach = mtk_wed_detach,
129+ .setup_tc = mtk_wed_eth_setup_tc,
130 .ppe_check = mtk_wed_ppe_check,
131 };
132 struct device_node *eth_np = eth->dev->of_node;
133diff --git a/include/linux/soc/mediatek/mtk_wed.h b/include/linux/soc/mediatek/mtk_wed.h
developerfd8e1152023-02-14 11:29:23 +0800134index 98ed390..27cf284 100644
developerfeeda732022-12-27 10:19:39 +0800135--- a/include/linux/soc/mediatek/mtk_wed.h
136+++ b/include/linux/soc/mediatek/mtk_wed.h
developerfd8e1152023-02-14 11:29:23 +0800137@@ -183,7 +183,8 @@ struct mtk_wed_ops {
developerfeeda732022-12-27 10:19:39 +0800138 int (*msg_update)(struct mtk_wed_device *dev, int cmd_id,
139 void *data, int len);
140 void (*detach)(struct mtk_wed_device *dev);
141-
142+ int (*setup_tc)(struct mtk_wed_device *wed, struct net_device *dev,
143+ int type, void *type_data);
developerfd8e1152023-02-14 11:29:23 +0800144 void (*stop)(struct mtk_wed_device *dev);
developerfeeda732022-12-27 10:19:39 +0800145 void (*start)(struct mtk_wed_device *dev, u32 irq_mask);
146 void (*reset_dma)(struct mtk_wed_device *dev);
developerfd8e1152023-02-14 11:29:23 +0800147@@ -232,6 +233,8 @@ mtk_wed_get_rx_capa(struct mtk_wed_device *dev)
developerfeeda732022-12-27 10:19:39 +0800148 #ifdef CONFIG_NET_MEDIATEK_SOC_WED
149 #define mtk_wed_device_active(_dev) !!(_dev)->ops
150 #define mtk_wed_device_detach(_dev) (_dev)->ops->detach(_dev)
151+#define mtk_wed_device_setup_tc(_dev, _ndev, _type, _data) \
152+ (_dev)->ops->setup_tc(_dev, _ndev, _type, _data)
153 #define mtk_wed_device_start(_dev, _mask) (_dev)->ops->start(_dev, _mask)
developerfd8e1152023-02-14 11:29:23 +0800154 #define mtk_wed_device_stop(_dev) (_dev)->ops->stop(_dev)
developerfeeda732022-12-27 10:19:39 +0800155 #define mtk_wed_device_tx_ring_setup(_dev, _ring, _regs, _reset) \
developerfd8e1152023-02-14 11:29:23 +0800156@@ -270,6 +273,7 @@ static inline bool mtk_wed_device_active(struct mtk_wed_device *dev)
developerfeeda732022-12-27 10:19:39 +0800157 #define mtk_wed_device_irq_get(_dev, _mask) 0
158 #define mtk_wed_device_irq_set_mask(_dev, _mask) do {} while (0)
159 #define mtk_wed_device_dma_reset(_dev) do {} while (0)
160+#define mtk_wed_device_setup_tc(_dev, _ndev, _type, _data) do {} while (0)
161 #define mtk_wed_device_ppe_check(_dev, _hash) do {} while (0)
162 #endif
163
164--
1652.18.0
166