]> git.ipfire.org Git - thirdparty/openwrt.git/blob
1edc2aa54c4f48914f36ba6daa205d4b9800b461
[thirdparty/openwrt.git] /
1 From a7cc1aa151e3a9c0314b995f06102f7763d3bd71 Mon Sep 17 00:00:00 2001
2 From: Lorenzo Bianconi <lorenzo@kernel.org>
3 Date: Sat, 23 Aug 2025 09:56:04 +0200
4 Subject: [PATCH 3/3] net: airoha: Introduce check_skb callback in ppe_dev ops
5
6 Export airoha_ppe_check_skb routine in ppe_dev ops. check_skb callback
7 will be used by the MT76 driver in order to offload the traffic received
8 by the wlan NIC and forwarded to the ethernet one.
9 Add rx_wlan parameter to airoha_ppe_check_skb routine signature.
10
11 Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
12 Link: https://patch.msgid.link/20250823-airoha-en7581-wlan-rx-offload-v3-3-f78600ec3ed8@kernel.org
13 Signed-off-by: Jakub Kicinski <kuba@kernel.org>
14 ---
15 drivers/net/ethernet/airoha/airoha_eth.c | 3 ++-
16 drivers/net/ethernet/airoha/airoha_eth.h | 8 ++------
17 drivers/net/ethernet/airoha/airoha_ppe.c | 25 +++++++++++++----------
18 include/linux/soc/airoha/airoha_offload.h | 20 ++++++++++++++++++
19 4 files changed, 38 insertions(+), 18 deletions(-)
20
21 --- a/drivers/net/ethernet/airoha/airoha_eth.c
22 +++ b/drivers/net/ethernet/airoha/airoha_eth.c
23 @@ -703,7 +703,8 @@ static int airoha_qdma_rx_process(struct
24
25 reason = FIELD_GET(AIROHA_RXD4_PPE_CPU_REASON, msg1);
26 if (reason == PPE_CPU_REASON_HIT_UNBIND_RATE_REACHED)
27 - airoha_ppe_check_skb(eth->ppe, q->skb, hash);
28 + airoha_ppe_check_skb(&eth->ppe->dev, q->skb, hash,
29 + false);
30
31 done++;
32 napi_gro_receive(&q->napi, q->skb);
33 --- a/drivers/net/ethernet/airoha/airoha_eth.h
34 +++ b/drivers/net/ethernet/airoha/airoha_eth.h
35 @@ -230,10 +230,6 @@ struct airoha_hw_stats {
36 };
37
38 enum {
39 - PPE_CPU_REASON_HIT_UNBIND_RATE_REACHED = 0x0f,
40 -};
41 -
42 -enum {
43 AIROHA_FOE_STATE_INVALID,
44 AIROHA_FOE_STATE_UNBIND,
45 AIROHA_FOE_STATE_BIND,
46 @@ -622,8 +618,8 @@ static inline bool airhoa_is_lan_gdm_por
47 bool airoha_is_valid_gdm_port(struct airoha_eth *eth,
48 struct airoha_gdm_port *port);
49
50 -void airoha_ppe_check_skb(struct airoha_ppe *ppe, struct sk_buff *skb,
51 - u16 hash);
52 +void airoha_ppe_check_skb(struct airoha_ppe_dev *dev, struct sk_buff *skb,
53 + u16 hash, bool rx_wlan);
54 int airoha_ppe_setup_tc_block_cb(struct airoha_ppe_dev *dev, void *type_data);
55 int airoha_ppe_init(struct airoha_eth *eth);
56 void airoha_ppe_deinit(struct airoha_eth *eth);
57 --- a/drivers/net/ethernet/airoha/airoha_ppe.c
58 +++ b/drivers/net/ethernet/airoha/airoha_ppe.c
59 @@ -616,7 +616,7 @@ static bool airoha_ppe_foe_compare_entry
60
61 static int airoha_ppe_foe_commit_entry(struct airoha_ppe *ppe,
62 struct airoha_foe_entry *e,
63 - u32 hash)
64 + u32 hash, bool rx_wlan)
65 {
66 struct airoha_foe_entry *hwe = ppe->foe + hash * sizeof(*hwe);
67 u32 ts = airoha_ppe_get_timestamp(ppe);
68 @@ -639,7 +639,8 @@ static int airoha_ppe_foe_commit_entry(s
69 goto unlock;
70 }
71
72 - airoha_ppe_foe_flow_stats_update(ppe, npu, hwe, hash);
73 + if (!rx_wlan)
74 + airoha_ppe_foe_flow_stats_update(ppe, npu, hwe, hash);
75
76 if (hash < PPE_SRAM_NUM_ENTRIES) {
77 dma_addr_t addr = ppe->foe_dma + hash * sizeof(*hwe);
78 @@ -665,7 +666,7 @@ static void airoha_ppe_foe_remove_flow(s
79 e->data.ib1 &= ~AIROHA_FOE_IB1_BIND_STATE;
80 e->data.ib1 |= FIELD_PREP(AIROHA_FOE_IB1_BIND_STATE,
81 AIROHA_FOE_STATE_INVALID);
82 - airoha_ppe_foe_commit_entry(ppe, &e->data, e->hash);
83 + airoha_ppe_foe_commit_entry(ppe, &e->data, e->hash, false);
84 e->hash = 0xffff;
85 }
86 if (e->type == FLOW_TYPE_L2_SUBFLOW) {
87 @@ -704,7 +705,7 @@ static void airoha_ppe_foe_flow_remove_e
88 static int
89 airoha_ppe_foe_commit_subflow_entry(struct airoha_ppe *ppe,
90 struct airoha_flow_table_entry *e,
91 - u32 hash)
92 + u32 hash, bool rx_wlan)
93 {
94 u32 mask = AIROHA_FOE_IB1_BIND_PACKET_TYPE | AIROHA_FOE_IB1_BIND_UDP;
95 struct airoha_foe_entry *hwe_p, hwe;
96 @@ -745,14 +746,14 @@ airoha_ppe_foe_commit_subflow_entry(stru
97 }
98
99 hwe.bridge.data = e->data.bridge.data;
100 - airoha_ppe_foe_commit_entry(ppe, &hwe, hash);
101 + airoha_ppe_foe_commit_entry(ppe, &hwe, hash, rx_wlan);
102
103 return 0;
104 }
105
106 static void airoha_ppe_foe_insert_entry(struct airoha_ppe *ppe,
107 struct sk_buff *skb,
108 - u32 hash)
109 + u32 hash, bool rx_wlan)
110 {
111 struct airoha_flow_table_entry *e;
112 struct airoha_foe_bridge br = {};
113 @@ -785,7 +786,7 @@ static void airoha_ppe_foe_insert_entry(
114 if (!airoha_ppe_foe_compare_entry(e, hwe))
115 continue;
116
117 - airoha_ppe_foe_commit_entry(ppe, &e->data, hash);
118 + airoha_ppe_foe_commit_entry(ppe, &e->data, hash, rx_wlan);
119 commit_done = true;
120 e->hash = hash;
121 }
122 @@ -797,7 +798,7 @@ static void airoha_ppe_foe_insert_entry(
123 e = rhashtable_lookup_fast(&ppe->l2_flows, &br,
124 airoha_l2_flow_table_params);
125 if (e)
126 - airoha_ppe_foe_commit_subflow_entry(ppe, e, hash);
127 + airoha_ppe_foe_commit_subflow_entry(ppe, e, hash, rx_wlan);
128 unlock:
129 spin_unlock_bh(&ppe_lock);
130 }
131 @@ -1301,9 +1302,10 @@ int airoha_ppe_setup_tc_block_cb(struct
132 return err;
133 }
134
135 -void airoha_ppe_check_skb(struct airoha_ppe *ppe, struct sk_buff *skb,
136 - u16 hash)
137 +void airoha_ppe_check_skb(struct airoha_ppe_dev *dev, struct sk_buff *skb,
138 + u16 hash, bool rx_wlan)
139 {
140 + struct airoha_ppe *ppe = dev->priv;
141 u16 now, diff;
142
143 if (hash > PPE_HASH_MASK)
144 @@ -1315,7 +1317,7 @@ void airoha_ppe_check_skb(struct airoha_
145 return;
146
147 ppe->foe_check_time[hash] = now;
148 - airoha_ppe_foe_insert_entry(ppe, skb, hash);
149 + airoha_ppe_foe_insert_entry(ppe, skb, hash, rx_wlan);
150 }
151
152 void airoha_ppe_init_upd_mem(struct airoha_gdm_port *port)
153 @@ -1404,6 +1406,7 @@ int airoha_ppe_init(struct airoha_eth *e
154 return -ENOMEM;
155
156 ppe->dev.ops.setup_tc_block_cb = airoha_ppe_setup_tc_block_cb;
157 + ppe->dev.ops.check_skb = airoha_ppe_check_skb;
158 ppe->dev.priv = ppe;
159
160 foe_size = PPE_NUM_ENTRIES * sizeof(struct airoha_foe_entry);
161 --- a/include/linux/soc/airoha/airoha_offload.h
162 +++ b/include/linux/soc/airoha/airoha_offload.h
163 @@ -9,10 +9,17 @@
164 #include <linux/spinlock.h>
165 #include <linux/workqueue.h>
166
167 +enum {
168 + PPE_CPU_REASON_HIT_UNBIND_RATE_REACHED = 0x0f,
169 +};
170 +
171 struct airoha_ppe_dev {
172 struct {
173 int (*setup_tc_block_cb)(struct airoha_ppe_dev *dev,
174 void *type_data);
175 + void (*check_skb)(struct airoha_ppe_dev *dev,
176 + struct sk_buff *skb, u16 hash,
177 + bool rx_wlan);
178 } ops;
179
180 void *priv;
181 @@ -27,6 +34,13 @@ static inline int airoha_ppe_dev_setup_t
182 {
183 return dev->ops.setup_tc_block_cb(dev, type_data);
184 }
185 +
186 +static inline void airoha_ppe_dev_check_skb(struct airoha_ppe_dev *dev,
187 + struct sk_buff *skb,
188 + u16 hash, bool rx_wlan)
189 +{
190 + dev->ops.check_skb(dev, skb, hash, rx_wlan);
191 +}
192 #else
193 static inline struct airoha_ppe_dev *airoha_ppe_get_dev(struct device *dev)
194 {
195 @@ -42,6 +56,12 @@ static inline int airoha_ppe_setup_tc_bl
196 {
197 return -EOPNOTSUPP;
198 }
199 +
200 +static inline void airoha_ppe_dev_check_skb(struct airoha_ppe_dev *dev,
201 + struct sk_buff *skb, u16 hash,
202 + bool rx_wlan)
203 +{
204 +}
205 #endif
206
207 #define NPU_NUM_CORES 8