blob: c810ff15f25c68911962f25b04a77de28f66b287 [file] [log] [blame]
developeree39bcf2023-06-16 08:03:30 +08001From 4c8f0a38d9c2df3815ace32133bb63d8a4345856 Mon Sep 17 00:00:00 2001
developerfeeda732022-12-27 10:19:39 +08002From: Sujuan Chen <sujuan.chen@mediatek.com>
developeree39bcf2023-06-16 08:03:30 +08003Date: Tue, 27 Dec 2022 10:14:35 +0800
4Subject: [PATCH] mediatek: ethernet: add wifi2wifi offload support
developerfeeda732022-12-27 10:19:39 +08005
developeree39bcf2023-06-16 08:03:30 +08006Signed-off-by: Sujuan Chen <sujuan.chen@mediatek.com>
developerfeeda732022-12-27 10:19:39 +08007---
8 drivers/net/ethernet/mediatek/mtk_eth_soc.h | 2 ++
developeree39bcf2023-06-16 08:03:30 +08009 .../net/ethernet/mediatek/mtk_ppe_offload.c | 35 +++++++++++++------
developerfeeda732022-12-27 10:19:39 +080010 drivers/net/ethernet/mediatek/mtk_wed.c | 13 +++++++
11 include/linux/soc/mediatek/mtk_wed.h | 6 +++-
developeree39bcf2023-06-16 08:03:30 +080012 4 files changed, 45 insertions(+), 11 deletions(-)
13 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
developeree39bcf2023-06-16 08:03:30 +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
developeree39bcf2023-06-16 08:03:30 +080019@@ -1767,6 +1767,8 @@ void ethsys_reset(struct mtk_eth *eth, u32 reset_bits);
20 int mtk_eth_offload_init(struct mtk_eth *eth, int id);
developerfeeda732022-12-27 10:19:39 +080021 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);
developeree39bcf2023-06-16 08:03:30 +080026
developerfeeda732022-12-27 10:19:39 +080027 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
developeree39bcf2023-06-16 08:03:30 +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
developeree39bcf2023-06-16 08:03:30 +080034@@ -546,10 +546,20 @@ static int
developerfeeda732022-12-27 10:19:39 +080035 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;
developeree39bcf2023-06-16 08:03:30 +080041- int err;
developerfeeda732022-12-27 10:19:39 +080042+ struct mtk_eth *eth = cb_priv;
43+ struct net_device *dev = NULL;
developeree39bcf2023-06-16 08:03:30 +080044+ int i, err;
developerfeeda732022-12-27 10:19:39 +080045+
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;
developeree39bcf2023-06-16 08:03:30 +080059@@ -577,14 +587,19 @@ mtk_eth_setup_tc_block_cb(enum tc_setup_type type, void *type_data, void *cb_pri
60 return err;
developerfeeda732022-12-27 10:19:39 +080061 }
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;
developerfeeda732022-12-27 10:19:39 +080072 static LIST_HEAD(block_cb_list);
73 struct flow_block_cb *block_cb;
74 flow_setup_cb_t *cb;
developeree39bcf2023-06-16 08:03:30 +080075 int i, err = 0;
developerfeeda732022-12-27 10:19:39 +080076
77+ if (!eth) {
78+ mac = netdev_priv(dev);
79+ eth = mac->hw;
80+ }
81+
developeree39bcf2023-06-16 08:03:30 +080082 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)
developerfeeda732022-12-27 10:19:39 +080084 flow_block_cb_incref(block_cb);
developeree39bcf2023-06-16 08:03:30 +080085 goto unlock;
developerfeeda732022-12-27 10:19:39 +080086 }
87- block_cb = flow_block_cb_alloc(cb, dev, dev, NULL);
88+ block_cb = flow_block_cb_alloc(cb, dev, eth, NULL);
developeree39bcf2023-06-16 08:03:30 +080089 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,
developerfeeda732022-12-27 10:19:39 +080093 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
developerfd8e1152023-02-14 11:29:23 +0800102index 1a615f2..37a86c3 100644
developerfeeda732022-12-27 10:19:39 +0800103--- a/drivers/net/ethernet/mediatek/mtk_wed.c
104+++ b/drivers/net/ethernet/mediatek/mtk_wed.c
developeree39bcf2023-06-16 08:03:30 +0800105@@ -1731,6 +1731,18 @@ out:
developerfeeda732022-12-27 10:19:39 +0800106 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
developerfd8e1152023-02-14 11:29:23 +0800124@@ -1749,6 +1761,7 @@ void mtk_wed_add_hw(struct device_node *np, struct mtk_eth *eth,
developerfeeda732022-12-27 10:19:39 +0800125 .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
developerfd8e1152023-02-14 11:29:23 +0800133index 98ed390..27cf284 100644
developerfeeda732022-12-27 10:19:39 +0800134--- a/include/linux/soc/mediatek/mtk_wed.h
135+++ b/include/linux/soc/mediatek/mtk_wed.h
developerfd8e1152023-02-14 11:29:23 +0800136@@ -183,7 +183,8 @@ struct mtk_wed_ops {
developerfeeda732022-12-27 10:19:39 +0800137 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);
developerfd8e1152023-02-14 11:29:23 +0800143 void (*stop)(struct mtk_wed_device *dev);
developerfeeda732022-12-27 10:19:39 +0800144 void (*start)(struct mtk_wed_device *dev, u32 irq_mask);
145 void (*reset_dma)(struct mtk_wed_device *dev);
developerfd8e1152023-02-14 11:29:23 +0800146@@ -232,6 +233,8 @@ mtk_wed_get_rx_capa(struct mtk_wed_device *dev)
developerfeeda732022-12-27 10:19:39 +0800147 #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)
developerfd8e1152023-02-14 11:29:23 +0800153 #define mtk_wed_device_stop(_dev) (_dev)->ops->stop(_dev)
developerfeeda732022-12-27 10:19:39 +0800154 #define mtk_wed_device_tx_ring_setup(_dev, _ring, _regs, _reset) \
developerfd8e1152023-02-14 11:29:23 +0800155@@ -270,6 +273,7 @@ static inline bool mtk_wed_device_active(struct mtk_wed_device *dev)
developerfeeda732022-12-27 10:19:39 +0800156 #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