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
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.
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>
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(-)
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
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(ð->ppe->dev, q->skb, hash,
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 {
39 - PPE_CPU_REASON_HIT_UNBIND_RATE_REACHED = 0x0f,
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);
50 -void airoha_ppe_check_skb(struct airoha_ppe *ppe, struct sk_buff *skb,
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
61 static int airoha_ppe_foe_commit_entry(struct airoha_ppe *ppe,
62 struct airoha_foe_entry *e,
64 + u32 hash, bool rx_wlan)
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
72 - airoha_ppe_foe_flow_stats_update(ppe, npu, hwe, hash);
74 + airoha_ppe_foe_flow_stats_update(ppe, npu, hwe, hash);
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);
86 if (e->type == FLOW_TYPE_L2_SUBFLOW) {
87 @@ -704,7 +705,7 @@ static void airoha_ppe_foe_flow_remove_e
89 airoha_ppe_foe_commit_subflow_entry(struct airoha_ppe *ppe,
90 struct airoha_flow_table_entry *e,
92 + u32 hash, bool rx_wlan)
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
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);
106 static void airoha_ppe_foe_insert_entry(struct airoha_ppe *ppe,
109 + u32 hash, bool rx_wlan)
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))
117 - airoha_ppe_foe_commit_entry(ppe, &e->data, hash);
118 + airoha_ppe_foe_commit_entry(ppe, &e->data, hash, rx_wlan);
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);
126 - airoha_ppe_foe_commit_subflow_entry(ppe, e, hash);
127 + airoha_ppe_foe_commit_subflow_entry(ppe, e, hash, rx_wlan);
129 spin_unlock_bh(&ppe_lock);
131 @@ -1301,9 +1302,10 @@ int airoha_ppe_setup_tc_block_cb(struct
135 -void airoha_ppe_check_skb(struct airoha_ppe *ppe, struct sk_buff *skb,
137 +void airoha_ppe_check_skb(struct airoha_ppe_dev *dev, struct sk_buff *skb,
138 + u16 hash, bool rx_wlan)
140 + struct airoha_ppe *ppe = dev->priv;
143 if (hash > PPE_HASH_MASK)
144 @@ -1315,7 +1317,7 @@ void airoha_ppe_check_skb(struct airoha_
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);
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
156 ppe->dev.ops.setup_tc_block_cb = airoha_ppe_setup_tc_block_cb;
157 + ppe->dev.ops.check_skb = airoha_ppe_check_skb;
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
164 #include <linux/spinlock.h>
165 #include <linux/workqueue.h>
168 + PPE_CPU_REASON_HIT_UNBIND_RATE_REACHED = 0x0f,
171 struct airoha_ppe_dev {
173 int (*setup_tc_block_cb)(struct airoha_ppe_dev *dev,
175 + void (*check_skb)(struct airoha_ppe_dev *dev,
176 + struct sk_buff *skb, u16 hash,
181 @@ -27,6 +34,13 @@ static inline int airoha_ppe_dev_setup_t
183 return dev->ops.setup_tc_block_cb(dev, type_data);
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)
190 + dev->ops.check_skb(dev, skb, hash, rx_wlan);
193 static inline struct airoha_ppe_dev *airoha_ppe_get_dev(struct device *dev)
195 @@ -42,6 +56,12 @@ static inline int airoha_ppe_setup_tc_bl
200 +static inline void airoha_ppe_dev_check_skb(struct airoha_ppe_dev *dev,
201 + struct sk_buff *skb, u16 hash,
207 #define NPU_NUM_CORES 8