blob: 85e15c93e555eb48d6cb7e224a87fe41d202e532 [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(-)
developerfd8e1152023-02-14 11:29:23 +080013 mode change 100755 => 100644 drivers/net/ethernet/mediatek/mtk_ppe_offload.c
developerfeeda732022-12-27 10:19:39 +080014
15diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.h b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
developerfd8e1152023-02-14 11:29:23 +080016index b935de6..acefa48 100644
developerfeeda732022-12-27 10:19:39 +080017--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h
18+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
developerfd8e1152023-02-14 11:29:23 +080019@@ -1767,6 +1767,8 @@ void ethsys_reset(struct mtk_eth *eth, u32 reset_bits);
developerfeeda732022-12-27 10:19:39 +080020 int mtk_eth_offload_init(struct mtk_eth *eth, int id);
21 int mtk_eth_setup_tc(struct net_device *dev, enum tc_setup_type type,
22 void *type_data);
23+int mtk_eth_setup_tc_block(struct net_device *dev, struct flow_block_offload *f,
24+ struct mtk_eth *eth);
25 void mtk_eth_set_dma_device(struct mtk_eth *eth, struct device *dma_dev);
26
27 int mtk_ppe_debugfs_init(struct mtk_eth *eth);
28diff --git a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c
developerfd8e1152023-02-14 11:29:23 +080029old mode 100755
30new mode 100644
31index 2787a97..23d2048
developerfeeda732022-12-27 10:19:39 +080032--- a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c
33+++ b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c
34@@ -546,10 +546,20 @@ static int
35 mtk_eth_setup_tc_block_cb(enum tc_setup_type type, void *type_data, void *cb_priv)
36 {
37 struct flow_cls_offload *cls = type_data;
38- struct net_device *dev = cb_priv;
39- struct mtk_mac *mac = netdev_priv(dev);
40- struct mtk_eth *eth = mac->hw;
41- int err;
42+ struct mtk_eth *eth = cb_priv;
43+ struct net_device *dev = NULL;
44+ int i, err;
45+
46+ for (i = 0; i < MTK_MAC_COUNT; i++) {
47+ if (!eth->netdev[i])
48+ continue;
49+
50+ dev = eth->netdev[i];
51+ break;
52+ }
53+
54+ if (!dev)
55+ return -EOPNOTSUPP;
56
57 if (!tc_can_offload(dev))
58 return -EOPNOTSUPP;
59@@ -577,17 +587,22 @@ mtk_eth_setup_tc_block_cb(enum tc_setup_type type, void *type_data, void *cb_pri
60 return err;
61 }
62
63-static int
64-mtk_eth_setup_tc_block(struct net_device *dev, struct flow_block_offload *f)
65+int
66+mtk_eth_setup_tc_block(struct net_device *dev, struct flow_block_offload *f,
67+ struct mtk_eth *eth)
68 {
69- struct mtk_mac *mac = netdev_priv(dev);
70- struct mtk_eth *eth = mac->hw;
71+ struct mtk_mac *mac;
72 struct nf_flowtable *flowtable;
73 static LIST_HEAD(block_cb_list);
74 struct flow_block_cb *block_cb;
75 flow_setup_cb_t *cb;
76 int i, err = 0;
77
78+ if (!eth) {
79+ mac = netdev_priv(dev);
80+ eth = mac->hw;
81+ }
82+
83 flowtable = container_of(f->block, struct nf_flowtable, flow_block);
84
85 for (i = 0; i < eth->ppe_num; i++) {
86@@ -610,7 +625,7 @@ mtk_eth_setup_tc_block(struct net_device *dev, struct flow_block_offload *f)
87 flow_block_cb_incref(block_cb);
88 goto unlock;
89 }
90- block_cb = flow_block_cb_alloc(cb, dev, dev, NULL);
91+ block_cb = flow_block_cb_alloc(cb, dev, eth, NULL);
92 if (IS_ERR(block_cb)) {
93 err = PTR_ERR(block_cb);
94 goto unlock;
95@@ -647,7 +662,7 @@ int mtk_eth_setup_tc(struct net_device *dev, enum tc_setup_type type,
96 switch (type) {
97 case TC_SETUP_BLOCK:
98 case TC_SETUP_FT:
99- return mtk_eth_setup_tc_block(dev, type_data);
100+ return mtk_eth_setup_tc_block(dev, type_data, NULL);
101 default:
102 return -EOPNOTSUPP;
103 }
104diff --git a/drivers/net/ethernet/mediatek/mtk_wed.c b/drivers/net/ethernet/mediatek/mtk_wed.c
developerfd8e1152023-02-14 11:29:23 +0800105index 1a615f2..37a86c3 100644
developerfeeda732022-12-27 10:19:39 +0800106--- a/drivers/net/ethernet/mediatek/mtk_wed.c
107+++ b/drivers/net/ethernet/mediatek/mtk_wed.c
developerfd8e1152023-02-14 11:29:23 +0800108@@ -1731,6 +1731,18 @@ out:
developerfeeda732022-12-27 10:19:39 +0800109 mutex_unlock(&hw_lock);
110 }
111
112+static int mtk_wed_eth_setup_tc(struct mtk_wed_device *wed, struct net_device *dev,
113+ int type, void *type_data)
114+{
115+ switch (type) {
116+ case TC_SETUP_BLOCK:
117+ case TC_SETUP_FT:
118+ return mtk_eth_setup_tc_block(dev, type_data, wed->hw->eth);
119+ default:
120+ return -EOPNOTSUPP;
121+ }
122+}
123+
124 void mtk_wed_add_hw(struct device_node *np, struct mtk_eth *eth,
125 void __iomem *wdma, u32 wdma_phy, int index)
126
developerfd8e1152023-02-14 11:29:23 +0800127@@ -1749,6 +1761,7 @@ void mtk_wed_add_hw(struct device_node *np, struct mtk_eth *eth,
developerfeeda732022-12-27 10:19:39 +0800128 .irq_get = mtk_wed_irq_get,
129 .irq_set_mask = mtk_wed_irq_set_mask,
130 .detach = mtk_wed_detach,
131+ .setup_tc = mtk_wed_eth_setup_tc,
132 .ppe_check = mtk_wed_ppe_check,
133 };
134 struct device_node *eth_np = eth->dev->of_node;
135diff --git a/include/linux/soc/mediatek/mtk_wed.h b/include/linux/soc/mediatek/mtk_wed.h
developerfd8e1152023-02-14 11:29:23 +0800136index 98ed390..27cf284 100644
developerfeeda732022-12-27 10:19:39 +0800137--- a/include/linux/soc/mediatek/mtk_wed.h
138+++ b/include/linux/soc/mediatek/mtk_wed.h
developerfd8e1152023-02-14 11:29:23 +0800139@@ -183,7 +183,8 @@ struct mtk_wed_ops {
developerfeeda732022-12-27 10:19:39 +0800140 int (*msg_update)(struct mtk_wed_device *dev, int cmd_id,
141 void *data, int len);
142 void (*detach)(struct mtk_wed_device *dev);
143-
144+ int (*setup_tc)(struct mtk_wed_device *wed, struct net_device *dev,
145+ int type, void *type_data);
developerfd8e1152023-02-14 11:29:23 +0800146 void (*stop)(struct mtk_wed_device *dev);
developerfeeda732022-12-27 10:19:39 +0800147 void (*start)(struct mtk_wed_device *dev, u32 irq_mask);
148 void (*reset_dma)(struct mtk_wed_device *dev);
developerfd8e1152023-02-14 11:29:23 +0800149@@ -232,6 +233,8 @@ mtk_wed_get_rx_capa(struct mtk_wed_device *dev)
developerfeeda732022-12-27 10:19:39 +0800150 #ifdef CONFIG_NET_MEDIATEK_SOC_WED
151 #define mtk_wed_device_active(_dev) !!(_dev)->ops
152 #define mtk_wed_device_detach(_dev) (_dev)->ops->detach(_dev)
153+#define mtk_wed_device_setup_tc(_dev, _ndev, _type, _data) \
154+ (_dev)->ops->setup_tc(_dev, _ndev, _type, _data)
155 #define mtk_wed_device_start(_dev, _mask) (_dev)->ops->start(_dev, _mask)
developerfd8e1152023-02-14 11:29:23 +0800156 #define mtk_wed_device_stop(_dev) (_dev)->ops->stop(_dev)
developerfeeda732022-12-27 10:19:39 +0800157 #define mtk_wed_device_tx_ring_setup(_dev, _ring, _regs, _reset) \
developerfd8e1152023-02-14 11:29:23 +0800158@@ -270,6 +273,7 @@ static inline bool mtk_wed_device_active(struct mtk_wed_device *dev)
developerfeeda732022-12-27 10:19:39 +0800159 #define mtk_wed_device_irq_get(_dev, _mask) 0
160 #define mtk_wed_device_irq_set_mask(_dev, _mask) do {} while (0)
161 #define mtk_wed_device_dma_reset(_dev) do {} while (0)
162+#define mtk_wed_device_setup_tc(_dev, _ndev, _type, _data) do {} while (0)
163 #define mtk_wed_device_ppe_check(_dev, _hash) do {} while (0)
164 #endif
165
166--
1672.18.0
168