mirror of
https://github.com/openwrt/openwrt.git
synced 2026-05-05 22:25:44 +04:00
39ae0f972d
This is an automatically generated commit. When doing `git bisect`, consider `git bisect --skip`. Signed-off-by: Kenneth Kasilag <kenneth@kasilag.me> Link: https://github.com/openwrt/openwrt/pull/19038 Signed-off-by: Robert Marko <robimarko@gmail.com>
208 lines
6.7 KiB
Diff
208 lines
6.7 KiB
Diff
From a7cc1aa151e3a9c0314b995f06102f7763d3bd71 Mon Sep 17 00:00:00 2001
|
|
From: Lorenzo Bianconi <lorenzo@kernel.org>
|
|
Date: Sat, 23 Aug 2025 09:56:04 +0200
|
|
Subject: [PATCH 3/3] net: airoha: Introduce check_skb callback in ppe_dev ops
|
|
|
|
Export airoha_ppe_check_skb routine in ppe_dev ops. check_skb callback
|
|
will be used by the MT76 driver in order to offload the traffic received
|
|
by the wlan NIC and forwarded to the ethernet one.
|
|
Add rx_wlan parameter to airoha_ppe_check_skb routine signature.
|
|
|
|
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
|
|
Link: https://patch.msgid.link/20250823-airoha-en7581-wlan-rx-offload-v3-3-f78600ec3ed8@kernel.org
|
|
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
|
---
|
|
drivers/net/ethernet/airoha/airoha_eth.c | 3 ++-
|
|
drivers/net/ethernet/airoha/airoha_eth.h | 8 ++------
|
|
drivers/net/ethernet/airoha/airoha_ppe.c | 25 +++++++++++++----------
|
|
include/linux/soc/airoha/airoha_offload.h | 20 ++++++++++++++++++
|
|
4 files changed, 38 insertions(+), 18 deletions(-)
|
|
|
|
--- a/drivers/net/ethernet/airoha/airoha_eth.c
|
|
+++ b/drivers/net/ethernet/airoha/airoha_eth.c
|
|
@@ -703,7 +703,8 @@ static int airoha_qdma_rx_process(struct
|
|
|
|
reason = FIELD_GET(AIROHA_RXD4_PPE_CPU_REASON, msg1);
|
|
if (reason == PPE_CPU_REASON_HIT_UNBIND_RATE_REACHED)
|
|
- airoha_ppe_check_skb(eth->ppe, q->skb, hash);
|
|
+ airoha_ppe_check_skb(ð->ppe->dev, q->skb, hash,
|
|
+ false);
|
|
|
|
done++;
|
|
napi_gro_receive(&q->napi, q->skb);
|
|
--- a/drivers/net/ethernet/airoha/airoha_eth.h
|
|
+++ b/drivers/net/ethernet/airoha/airoha_eth.h
|
|
@@ -230,10 +230,6 @@ struct airoha_hw_stats {
|
|
};
|
|
|
|
enum {
|
|
- PPE_CPU_REASON_HIT_UNBIND_RATE_REACHED = 0x0f,
|
|
-};
|
|
-
|
|
-enum {
|
|
AIROHA_FOE_STATE_INVALID,
|
|
AIROHA_FOE_STATE_UNBIND,
|
|
AIROHA_FOE_STATE_BIND,
|
|
@@ -622,8 +618,8 @@ static inline bool airhoa_is_lan_gdm_por
|
|
bool airoha_is_valid_gdm_port(struct airoha_eth *eth,
|
|
struct airoha_gdm_port *port);
|
|
|
|
-void airoha_ppe_check_skb(struct airoha_ppe *ppe, struct sk_buff *skb,
|
|
- u16 hash);
|
|
+void airoha_ppe_check_skb(struct airoha_ppe_dev *dev, struct sk_buff *skb,
|
|
+ u16 hash, bool rx_wlan);
|
|
int airoha_ppe_setup_tc_block_cb(struct airoha_ppe_dev *dev, void *type_data);
|
|
int airoha_ppe_init(struct airoha_eth *eth);
|
|
void airoha_ppe_deinit(struct airoha_eth *eth);
|
|
--- a/drivers/net/ethernet/airoha/airoha_ppe.c
|
|
+++ b/drivers/net/ethernet/airoha/airoha_ppe.c
|
|
@@ -616,7 +616,7 @@ static bool airoha_ppe_foe_compare_entry
|
|
|
|
static int airoha_ppe_foe_commit_entry(struct airoha_ppe *ppe,
|
|
struct airoha_foe_entry *e,
|
|
- u32 hash)
|
|
+ u32 hash, bool rx_wlan)
|
|
{
|
|
struct airoha_foe_entry *hwe = ppe->foe + hash * sizeof(*hwe);
|
|
u32 ts = airoha_ppe_get_timestamp(ppe);
|
|
@@ -639,7 +639,8 @@ static int airoha_ppe_foe_commit_entry(s
|
|
goto unlock;
|
|
}
|
|
|
|
- airoha_ppe_foe_flow_stats_update(ppe, npu, hwe, hash);
|
|
+ if (!rx_wlan)
|
|
+ airoha_ppe_foe_flow_stats_update(ppe, npu, hwe, hash);
|
|
|
|
if (hash < PPE_SRAM_NUM_ENTRIES) {
|
|
dma_addr_t addr = ppe->foe_dma + hash * sizeof(*hwe);
|
|
@@ -665,7 +666,7 @@ static void airoha_ppe_foe_remove_flow(s
|
|
e->data.ib1 &= ~AIROHA_FOE_IB1_BIND_STATE;
|
|
e->data.ib1 |= FIELD_PREP(AIROHA_FOE_IB1_BIND_STATE,
|
|
AIROHA_FOE_STATE_INVALID);
|
|
- airoha_ppe_foe_commit_entry(ppe, &e->data, e->hash);
|
|
+ airoha_ppe_foe_commit_entry(ppe, &e->data, e->hash, false);
|
|
e->hash = 0xffff;
|
|
}
|
|
if (e->type == FLOW_TYPE_L2_SUBFLOW) {
|
|
@@ -704,7 +705,7 @@ static void airoha_ppe_foe_flow_remove_e
|
|
static int
|
|
airoha_ppe_foe_commit_subflow_entry(struct airoha_ppe *ppe,
|
|
struct airoha_flow_table_entry *e,
|
|
- u32 hash)
|
|
+ u32 hash, bool rx_wlan)
|
|
{
|
|
u32 mask = AIROHA_FOE_IB1_BIND_PACKET_TYPE | AIROHA_FOE_IB1_BIND_UDP;
|
|
struct airoha_foe_entry *hwe_p, hwe;
|
|
@@ -745,14 +746,14 @@ airoha_ppe_foe_commit_subflow_entry(stru
|
|
}
|
|
|
|
hwe.bridge.data = e->data.bridge.data;
|
|
- airoha_ppe_foe_commit_entry(ppe, &hwe, hash);
|
|
+ airoha_ppe_foe_commit_entry(ppe, &hwe, hash, rx_wlan);
|
|
|
|
return 0;
|
|
}
|
|
|
|
static void airoha_ppe_foe_insert_entry(struct airoha_ppe *ppe,
|
|
struct sk_buff *skb,
|
|
- u32 hash)
|
|
+ u32 hash, bool rx_wlan)
|
|
{
|
|
struct airoha_flow_table_entry *e;
|
|
struct airoha_foe_bridge br = {};
|
|
@@ -785,7 +786,7 @@ static void airoha_ppe_foe_insert_entry(
|
|
if (!airoha_ppe_foe_compare_entry(e, hwe))
|
|
continue;
|
|
|
|
- airoha_ppe_foe_commit_entry(ppe, &e->data, hash);
|
|
+ airoha_ppe_foe_commit_entry(ppe, &e->data, hash, rx_wlan);
|
|
commit_done = true;
|
|
e->hash = hash;
|
|
}
|
|
@@ -797,7 +798,7 @@ static void airoha_ppe_foe_insert_entry(
|
|
e = rhashtable_lookup_fast(&ppe->l2_flows, &br,
|
|
airoha_l2_flow_table_params);
|
|
if (e)
|
|
- airoha_ppe_foe_commit_subflow_entry(ppe, e, hash);
|
|
+ airoha_ppe_foe_commit_subflow_entry(ppe, e, hash, rx_wlan);
|
|
unlock:
|
|
spin_unlock_bh(&ppe_lock);
|
|
}
|
|
@@ -1301,9 +1302,10 @@ int airoha_ppe_setup_tc_block_cb(struct
|
|
return err;
|
|
}
|
|
|
|
-void airoha_ppe_check_skb(struct airoha_ppe *ppe, struct sk_buff *skb,
|
|
- u16 hash)
|
|
+void airoha_ppe_check_skb(struct airoha_ppe_dev *dev, struct sk_buff *skb,
|
|
+ u16 hash, bool rx_wlan)
|
|
{
|
|
+ struct airoha_ppe *ppe = dev->priv;
|
|
u16 now, diff;
|
|
|
|
if (hash > PPE_HASH_MASK)
|
|
@@ -1315,7 +1317,7 @@ void airoha_ppe_check_skb(struct airoha_
|
|
return;
|
|
|
|
ppe->foe_check_time[hash] = now;
|
|
- airoha_ppe_foe_insert_entry(ppe, skb, hash);
|
|
+ airoha_ppe_foe_insert_entry(ppe, skb, hash, rx_wlan);
|
|
}
|
|
|
|
void airoha_ppe_init_upd_mem(struct airoha_gdm_port *port)
|
|
@@ -1404,6 +1406,7 @@ int airoha_ppe_init(struct airoha_eth *e
|
|
return -ENOMEM;
|
|
|
|
ppe->dev.ops.setup_tc_block_cb = airoha_ppe_setup_tc_block_cb;
|
|
+ ppe->dev.ops.check_skb = airoha_ppe_check_skb;
|
|
ppe->dev.priv = ppe;
|
|
|
|
foe_size = PPE_NUM_ENTRIES * sizeof(struct airoha_foe_entry);
|
|
--- a/include/linux/soc/airoha/airoha_offload.h
|
|
+++ b/include/linux/soc/airoha/airoha_offload.h
|
|
@@ -9,10 +9,17 @@
|
|
#include <linux/spinlock.h>
|
|
#include <linux/workqueue.h>
|
|
|
|
+enum {
|
|
+ PPE_CPU_REASON_HIT_UNBIND_RATE_REACHED = 0x0f,
|
|
+};
|
|
+
|
|
struct airoha_ppe_dev {
|
|
struct {
|
|
int (*setup_tc_block_cb)(struct airoha_ppe_dev *dev,
|
|
void *type_data);
|
|
+ void (*check_skb)(struct airoha_ppe_dev *dev,
|
|
+ struct sk_buff *skb, u16 hash,
|
|
+ bool rx_wlan);
|
|
} ops;
|
|
|
|
void *priv;
|
|
@@ -27,6 +34,13 @@ static inline int airoha_ppe_dev_setup_t
|
|
{
|
|
return dev->ops.setup_tc_block_cb(dev, type_data);
|
|
}
|
|
+
|
|
+static inline void airoha_ppe_dev_check_skb(struct airoha_ppe_dev *dev,
|
|
+ struct sk_buff *skb,
|
|
+ u16 hash, bool rx_wlan)
|
|
+{
|
|
+ dev->ops.check_skb(dev, skb, hash, rx_wlan);
|
|
+}
|
|
#else
|
|
static inline struct airoha_ppe_dev *airoha_ppe_get_dev(struct device *dev)
|
|
{
|
|
@@ -42,6 +56,12 @@ static inline int airoha_ppe_setup_tc_bl
|
|
{
|
|
return -EOPNOTSUPP;
|
|
}
|
|
+
|
|
+static inline void airoha_ppe_dev_check_skb(struct airoha_ppe_dev *dev,
|
|
+ struct sk_buff *skb, u16 hash,
|
|
+ bool rx_wlan)
|
|
+{
|
|
+}
|
|
#endif
|
|
|
|
#define NPU_NUM_CORES 8
|