blob: 03af3051cb67e13230117ed31fb02d75b86ed6fb [file] [log] [blame]
developerfeeda732022-12-27 10:19:39 +08001From 4c8f0a38d9c2df3815ace32133bb63d8a4345856 Mon Sep 17 00:00:00 2001
2From: Sujuan Chen <sujuan.chen@mediatek.com>
3Date: Tue, 27 Dec 2022 10:14:35 +0800
4Subject: [PATCH] mediatek: ethernet: add wifi2wifi offload support
5
6Signed-off-by: Sujuan Chen <sujuan.chen@mediatek.com>
7---
8 drivers/net/ethernet/mediatek/mtk_eth_soc.h | 2 ++
9 .../net/ethernet/mediatek/mtk_ppe_offload.c | 35 +++++++++++++------
10 drivers/net/ethernet/mediatek/mtk_wed.c | 13 +++++++
11 include/linux/soc/mediatek/mtk_wed.h | 6 +++-
12 4 files changed, 45 insertions(+), 11 deletions(-)
13
14diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.h b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
15index ab1df9c..7879798 100644
16--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h
17+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
18@@ -1716,6 +1716,8 @@ void ethsys_reset(struct mtk_eth *eth, u32 reset_bits);
19 int mtk_eth_offload_init(struct mtk_eth *eth, int id);
20 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);
25
26 int mtk_ppe_debugfs_init(struct mtk_eth *eth);
27diff --git a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c
28index 2787a97..23d2048 100644
29--- a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c
30+++ b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c
31@@ -546,10 +546,20 @@ static int
32 mtk_eth_setup_tc_block_cb(enum tc_setup_type type, void *type_data, void *cb_priv)
33 {
34 struct flow_cls_offload *cls = type_data;
35- struct net_device *dev = cb_priv;
36- struct mtk_mac *mac = netdev_priv(dev);
37- struct mtk_eth *eth = mac->hw;
38- int err;
39+ struct mtk_eth *eth = cb_priv;
40+ struct net_device *dev = NULL;
41+ int i, err;
42+
43+ for (i = 0; i < MTK_MAC_COUNT; i++) {
44+ if (!eth->netdev[i])
45+ continue;
46+
47+ dev = eth->netdev[i];
48+ break;
49+ }
50+
51+ if (!dev)
52+ return -EOPNOTSUPP;
53
54 if (!tc_can_offload(dev))
55 return -EOPNOTSUPP;
56@@ -577,17 +587,22 @@ mtk_eth_setup_tc_block_cb(enum tc_setup_type type, void *type_data, void *cb_pri
57 return err;
58 }
59
60-static int
61-mtk_eth_setup_tc_block(struct net_device *dev, struct flow_block_offload *f)
62+int
63+mtk_eth_setup_tc_block(struct net_device *dev, struct flow_block_offload *f,
64+ struct mtk_eth *eth)
65 {
66- struct mtk_mac *mac = netdev_priv(dev);
67- struct mtk_eth *eth = mac->hw;
68+ struct mtk_mac *mac;
69 struct nf_flowtable *flowtable;
70 static LIST_HEAD(block_cb_list);
71 struct flow_block_cb *block_cb;
72 flow_setup_cb_t *cb;
73 int i, err = 0;
74
75+ if (!eth) {
76+ mac = netdev_priv(dev);
77+ eth = mac->hw;
78+ }
79+
80 flowtable = container_of(f->block, struct nf_flowtable, flow_block);
81
82 for (i = 0; i < eth->ppe_num; i++) {
83@@ -610,7 +625,7 @@ mtk_eth_setup_tc_block(struct net_device *dev, struct flow_block_offload *f)
84 flow_block_cb_incref(block_cb);
85 goto unlock;
86 }
87- block_cb = flow_block_cb_alloc(cb, dev, dev, NULL);
88+ block_cb = flow_block_cb_alloc(cb, dev, eth, NULL);
89 if (IS_ERR(block_cb)) {
90 err = PTR_ERR(block_cb);
91 goto unlock;
92@@ -647,7 +662,7 @@ int mtk_eth_setup_tc(struct net_device *dev, enum tc_setup_type type,
93 switch (type) {
94 case TC_SETUP_BLOCK:
95 case TC_SETUP_FT:
96- return mtk_eth_setup_tc_block(dev, type_data);
97+ return mtk_eth_setup_tc_block(dev, type_data, NULL);
98 default:
99 return -EOPNOTSUPP;
100 }
101diff --git a/drivers/net/ethernet/mediatek/mtk_wed.c b/drivers/net/ethernet/mediatek/mtk_wed.c
102index b328a52..a6e6eb8 100644
103--- a/drivers/net/ethernet/mediatek/mtk_wed.c
104+++ b/drivers/net/ethernet/mediatek/mtk_wed.c
105@@ -1717,6 +1717,18 @@ out:
106 mutex_unlock(&hw_lock);
107 }
108
109+static int mtk_wed_eth_setup_tc(struct mtk_wed_device *wed, struct net_device *dev,
110+ int type, void *type_data)
111+{
112+ switch (type) {
113+ case TC_SETUP_BLOCK:
114+ case TC_SETUP_FT:
115+ return mtk_eth_setup_tc_block(dev, type_data, wed->hw->eth);
116+ default:
117+ return -EOPNOTSUPP;
118+ }
119+}
120+
121 void mtk_wed_add_hw(struct device_node *np, struct mtk_eth *eth,
122 void __iomem *wdma, u32 wdma_phy, int index)
123
124@@ -1735,6 +1747,7 @@ void mtk_wed_add_hw(struct device_node *np, struct mtk_eth *eth,
125 .irq_get = mtk_wed_irq_get,
126 .irq_set_mask = mtk_wed_irq_set_mask,
127 .detach = mtk_wed_detach,
128+ .setup_tc = mtk_wed_eth_setup_tc,
129 .ppe_check = mtk_wed_ppe_check,
130 };
131 struct device_node *eth_np = eth->dev->of_node;
132diff --git a/include/linux/soc/mediatek/mtk_wed.h b/include/linux/soc/mediatek/mtk_wed.h
133index 00c9a78..96c8a03 100644
134--- a/include/linux/soc/mediatek/mtk_wed.h
135+++ b/include/linux/soc/mediatek/mtk_wed.h
136@@ -182,7 +182,8 @@ struct mtk_wed_ops {
137 int (*msg_update)(struct mtk_wed_device *dev, int cmd_id,
138 void *data, int len);
139 void (*detach)(struct mtk_wed_device *dev);
140-
141+ int (*setup_tc)(struct mtk_wed_device *wed, struct net_device *dev,
142+ int type, void *type_data);
143 void (*stop)(struct mtk_wed_device *dev, bool reset);
144 void (*start)(struct mtk_wed_device *dev, u32 irq_mask);
145 void (*reset_dma)(struct mtk_wed_device *dev);
146@@ -231,6 +232,8 @@ mtk_wed_get_rx_capa(struct mtk_wed_device *dev)
147 #ifdef CONFIG_NET_MEDIATEK_SOC_WED
148 #define mtk_wed_device_active(_dev) !!(_dev)->ops
149 #define mtk_wed_device_detach(_dev) (_dev)->ops->detach(_dev)
150+#define mtk_wed_device_setup_tc(_dev, _ndev, _type, _data) \
151+ (_dev)->ops->setup_tc(_dev, _ndev, _type, _data)
152 #define mtk_wed_device_start(_dev, _mask) (_dev)->ops->start(_dev, _mask)
153 #define mtk_wed_device_stop(_dev, _reset) (_dev)->ops->stop(_dev, _reset)
154 #define mtk_wed_device_tx_ring_setup(_dev, _ring, _regs, _reset) \
155@@ -269,6 +272,7 @@ static inline bool mtk_wed_device_active(struct mtk_wed_device *dev)
156 #define mtk_wed_device_irq_get(_dev, _mask) 0
157 #define mtk_wed_device_irq_set_mask(_dev, _mask) do {} while (0)
158 #define mtk_wed_device_dma_reset(_dev) do {} while (0)
159+#define mtk_wed_device_setup_tc(_dev, _ndev, _type, _data) do {} while (0)
160 #define mtk_wed_device_ppe_check(_dev, _hash) do {} while (0)
161 #endif
162
163--
1642.18.0
165