blob: 6a2a6f6dc4741bfb8a64488dfa25ae4a5cb52339 [file] [log] [blame]
developer69bcd592024-03-25 14:26:39 +08001From 4eaba588e0c730d6188f5f1b667a55d1b9ca0fe6 Mon Sep 17 00:00:00 2001
developer740bee82023-10-16 10:58:43 +08002From: Bc-bocun Chen <bc-bocun.chen@mediatek.com>
3Date: Mon, 18 Sep 2023 11:09:23 +0800
developer69bcd592024-03-25 14:26:39 +08004Subject: [PATCH 11/24] flow-offload-add-mtkhnat-flow-accounting
developer740bee82023-10-16 10:58:43 +08005
6---
7 drivers/net/ethernet/mediatek/mtk_eth_soc.c | 11 +-
8 drivers/net/ethernet/mediatek/mtk_eth_soc.h | 1 +
9 drivers/net/ethernet/mediatek/mtk_ppe.c | 131 +++++++++++++++++-
10 drivers/net/ethernet/mediatek/mtk_ppe.h | 23 ++-
11 .../net/ethernet/mediatek/mtk_ppe_debugfs.c | 10 +-
12 .../net/ethernet/mediatek/mtk_ppe_offload.c | 7 +
13 drivers/net/ethernet/mediatek/mtk_ppe_regs.h | 14 ++
14 net/netfilter/xt_FLOWOFFLOAD.c | 2 +-
15 8 files changed, 191 insertions(+), 8 deletions(-)
16
developere8c82b22022-08-09 14:58:55 +080017diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.c b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
developer69bcd592024-03-25 14:26:39 +080018index e8837b6..9cd306d 100644
developere8c82b22022-08-09 14:58:55 +080019--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
20+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
developer69bcd592024-03-25 14:26:39 +080021@@ -5800,7 +5800,8 @@ static int mtk_probe(struct platform_device *pdev)
developere8c82b22022-08-09 14:58:55 +080022 for (i = 0; i < eth->ppe_num; i++) {
23 eth->ppe[i] = mtk_ppe_init(eth,
24 eth->base + MTK_ETH_PPE_BASE + i * 0x400,
25- 2, eth->soc->hash_way, i);
26+ 2, eth->soc->hash_way, i,
27+ eth->soc->has_accounting);
28 if (!eth->ppe[i]) {
29 err = -ENOMEM;
30 goto err_free_dev;
developer69bcd592024-03-25 14:26:39 +080031@@ -5914,6 +5915,7 @@ static const struct mtk_soc_data mt2701_data = {
developere8c82b22022-08-09 14:58:55 +080032 .required_clks = MT7623_CLKS_BITMAP,
33 .required_pctl = true,
34 .has_sram = false,
35+ .has_accounting = false,
36 .hash_way = 2,
37 .offload_version = 2,
developer740bee82023-10-16 10:58:43 +080038 .rss_num = 0,
developer69bcd592024-03-25 14:26:39 +080039@@ -5933,6 +5935,7 @@ static const struct mtk_soc_data mt7621_data = {
developere8c82b22022-08-09 14:58:55 +080040 .required_clks = MT7621_CLKS_BITMAP,
41 .required_pctl = false,
42 .has_sram = false,
43+ .has_accounting = false,
44 .hash_way = 2,
45 .offload_version = 2,
developer740bee82023-10-16 10:58:43 +080046 .rss_num = 0,
developer69bcd592024-03-25 14:26:39 +080047@@ -5953,6 +5956,7 @@ static const struct mtk_soc_data mt7622_data = {
developere8c82b22022-08-09 14:58:55 +080048 .required_clks = MT7622_CLKS_BITMAP,
49 .required_pctl = false,
50 .has_sram = false,
51+ .has_accounting = true,
52 .hash_way = 2,
53 .offload_version = 2,
developer740bee82023-10-16 10:58:43 +080054 .rss_num = 0,
developer69bcd592024-03-25 14:26:39 +080055@@ -5972,6 +5976,7 @@ static const struct mtk_soc_data mt7623_data = {
developere8c82b22022-08-09 14:58:55 +080056 .required_clks = MT7623_CLKS_BITMAP,
57 .required_pctl = true,
58 .has_sram = false,
59+ .has_accounting = false,
60 .hash_way = 2,
61 .offload_version = 2,
developer740bee82023-10-16 10:58:43 +080062 .rss_num = 0,
developer69bcd592024-03-25 14:26:39 +080063@@ -5992,6 +5997,7 @@ static const struct mtk_soc_data mt7629_data = {
developere8c82b22022-08-09 14:58:55 +080064 .required_clks = MT7629_CLKS_BITMAP,
65 .required_pctl = false,
66 .has_sram = false,
67+ .has_accounting = true,
developer740bee82023-10-16 10:58:43 +080068 .rss_num = 0,
developere8c82b22022-08-09 14:58:55 +080069 .txrx = {
70 .txd_size = sizeof(struct mtk_tx_dma),
developer69bcd592024-03-25 14:26:39 +080071@@ -6010,6 +6016,7 @@ static const struct mtk_soc_data mt7986_data = {
developere8c82b22022-08-09 14:58:55 +080072 .required_clks = MT7986_CLKS_BITMAP,
73 .required_pctl = false,
developer3c9c74d2023-09-11 11:36:12 +080074 .has_sram = false,
developere8c82b22022-08-09 14:58:55 +080075+ .has_accounting = true,
76 .hash_way = 4,
77 .offload_version = 2,
developer740bee82023-10-16 10:58:43 +080078 .rss_num = 4,
developer69bcd592024-03-25 14:26:39 +080079@@ -6030,6 +6037,7 @@ static const struct mtk_soc_data mt7981_data = {
developere8c82b22022-08-09 14:58:55 +080080 .required_clks = MT7981_CLKS_BITMAP,
81 .required_pctl = false,
developer3c9c74d2023-09-11 11:36:12 +080082 .has_sram = false,
developere8c82b22022-08-09 14:58:55 +080083+ .has_accounting = true,
84 .hash_way = 4,
85 .offload_version = 2,
developer740bee82023-10-16 10:58:43 +080086 .rss_num = 4,
developer69bcd592024-03-25 14:26:39 +080087@@ -6067,6 +6075,7 @@ static const struct mtk_soc_data rt5350_data = {
developere8c82b22022-08-09 14:58:55 +080088 .required_clks = MT7628_CLKS_BITMAP,
89 .required_pctl = false,
90 .has_sram = false,
91+ .has_accounting = false,
developer740bee82023-10-16 10:58:43 +080092 .rss_num = 0,
developere8c82b22022-08-09 14:58:55 +080093 .txrx = {
94 .txd_size = sizeof(struct mtk_tx_dma),
developere8c82b22022-08-09 14:58:55 +080095diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.h b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
developer69bcd592024-03-25 14:26:39 +080096index b4f04e2..5f90765 100644
developere8c82b22022-08-09 14:58:55 +080097--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h
98+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
developer69bcd592024-03-25 14:26:39 +080099@@ -1736,6 +1736,7 @@ struct mtk_soc_data {
developere8c82b22022-08-09 14:58:55 +0800100 u8 offload_version;
101 netdev_features_t hw_features;
102 bool has_sram;
103+ bool has_accounting;
104 struct {
105 u32 txd_size;
106 u32 rxd_size;
107diff --git a/drivers/net/ethernet/mediatek/mtk_ppe.c b/drivers/net/ethernet/mediatek/mtk_ppe.c
developer69bcd592024-03-25 14:26:39 +0800108index 569bf34..94e03b2 100755
developere8c82b22022-08-09 14:58:55 +0800109--- a/drivers/net/ethernet/mediatek/mtk_ppe.c
110+++ b/drivers/net/ethernet/mediatek/mtk_ppe.c
111@@ -74,6 +74,46 @@ static int mtk_ppe_wait_busy(struct mtk_ppe *ppe)
112 return ret;
113 }
114
115+static int mtk_ppe_mib_wait_busy(struct mtk_ppe *ppe)
116+{
117+ int ret;
118+ u32 val;
119+
120+ ret = readl_poll_timeout(ppe->base + MTK_PPE_MIB_SER_CR, val,
121+ !(val & MTK_PPE_MIB_SER_CR_ST),
122+ 20, MTK_PPE_WAIT_TIMEOUT_US);
123+
124+ if (ret)
125+ dev_err(ppe->dev, "MIB table busy");
126+
127+ return ret;
128+}
129+
130+int mtk_mib_entry_read(struct mtk_ppe *ppe, u16 index, u64 *bytes, u64 *packets)
131+{
132+ u32 val, cnt_r0, cnt_r1, cnt_r2;
133+ u32 byte_cnt_low, byte_cnt_high, pkt_cnt_low, pkt_cnt_high;
134+
135+ val = FIELD_PREP(MTK_PPE_MIB_SER_CR_ADDR, index) | MTK_PPE_MIB_SER_CR_ST;
136+ ppe_w32(ppe, MTK_PPE_MIB_SER_CR, val);
137+
138+ if (mtk_ppe_mib_wait_busy(ppe))
139+ return -ETIMEDOUT;
140+
141+ cnt_r0 = readl(ppe->base + MTK_PPE_MIB_SER_R0);
142+ cnt_r1 = readl(ppe->base + MTK_PPE_MIB_SER_R1);
143+ cnt_r2 = readl(ppe->base + MTK_PPE_MIB_SER_R2);
144+
145+ byte_cnt_low = FIELD_GET(MTK_PPE_MIB_SER_R0_BYTE_CNT_LOW, cnt_r0);
146+ byte_cnt_high = FIELD_GET(MTK_PPE_MIB_SER_R1_BYTE_CNT_HIGH, cnt_r1);
147+ pkt_cnt_low = FIELD_GET(MTK_PPE_MIB_SER_R1_PKT_CNT_LOW, cnt_r1);
148+ pkt_cnt_high = FIELD_GET(MTK_PPE_MIB_SER_R2_PKT_CNT_HIGH, cnt_r2);
149+ *bytes = ((u64)byte_cnt_high << 32) | byte_cnt_low;
150+ *packets = (pkt_cnt_high << 16) | pkt_cnt_low;
151+
152+ return 0;
153+}
154+
155 static void mtk_ppe_cache_clear(struct mtk_ppe *ppe)
156 {
157 ppe_set(ppe, MTK_PPE_CACHE_CTL, MTK_PPE_CACHE_CTL_CLEAR);
developer740bee82023-10-16 10:58:43 +0800158@@ -426,6 +466,18 @@ __mtk_foe_entry_clear(struct mtk_ppe *ppe, struct mtk_flow_entry *entry)
developere8c82b22022-08-09 14:58:55 +0800159 MTK_FOE_STATE_INVALID);
160 dma_wmb();
developerb69ecef2023-03-08 15:40:24 +0800161 mtk_ppe_cache_clear(ppe);
developere8c82b22022-08-09 14:58:55 +0800162+
163+ if (ppe->accounting) {
developer3ed7b542023-02-13 16:51:27 +0800164+ struct mtk_foe_accounting *acct, *acct_updated;
developere8c82b22022-08-09 14:58:55 +0800165+
166+ acct = ppe->acct_table + entry->hash * sizeof(*acct);
167+ acct->packets = 0;
168+ acct->bytes = 0;
developer3ed7b542023-02-13 16:51:27 +0800169+
170+ acct_updated = ppe->acct_updated_table + entry->hash * sizeof(*acct_updated);
171+ acct_updated->packets = 0;
172+ acct_updated->bytes = 0;
developere8c82b22022-08-09 14:58:55 +0800173+ }
developer740bee82023-10-16 10:58:43 +0800174 }
developere8c82b22022-08-09 14:58:55 +0800175 entry->hash = 0xffff;
176
developer740bee82023-10-16 10:58:43 +0800177@@ -528,6 +580,16 @@ __mtk_foe_entry_commit(struct mtk_ppe *ppe, struct mtk_foe_entry *entry,
developere8c82b22022-08-09 14:58:55 +0800178 wmb();
179 hwe->ib1 = entry->ib1;
180
181+ if (ppe->accounting) {
182+ int type;
183+
184+ type = FIELD_GET(MTK_FOE_IB1_PACKET_TYPE, entry->ib1);
185+ if (type >= MTK_PPE_PKT_TYPE_IPV4_DSLITE)
186+ hwe->ipv6.ib2 |= MTK_FOE_IB2_MIB_CNT;
187+ else
188+ hwe->ipv4.ib2 |= MTK_FOE_IB2_MIB_CNT;
189+ }
190+
191 dma_wmb();
192
193 mtk_ppe_cache_clear(ppe);
developer740bee82023-10-16 10:58:43 +0800194@@ -637,8 +699,6 @@ void __mtk_ppe_check_skb(struct mtk_ppe *ppe, struct sk_buff *skb, u16 hash)
developere8c82b22022-08-09 14:58:55 +0800195 }
196
197 if (found || !mtk_flow_entry_match(entry, hwe)) {
198- if (entry->hash != 0xffff)
199- entry->hash = 0xffff;
200 continue;
201 }
202
developer740bee82023-10-16 10:58:43 +0800203@@ -695,12 +755,44 @@ int mtk_foe_entry_idle_time(struct mtk_ppe *ppe, struct mtk_flow_entry *entry)
developere8c82b22022-08-09 14:58:55 +0800204 return __mtk_foe_entry_idle_time(ppe, entry->data.ib1);
205 }
206
207-struct mtk_ppe *mtk_ppe_init(struct mtk_eth *eth, void __iomem *base, int version, int way, int id)
208+struct mtk_foe_accounting *mtk_foe_entry_get_mib(struct mtk_ppe *ppe, u32 index, struct mtk_foe_accounting *diff)
209+{
developer3ed7b542023-02-13 16:51:27 +0800210+ struct mtk_foe_accounting *acct, *acct_updated;
developere8c82b22022-08-09 14:58:55 +0800211+ int size = sizeof(struct mtk_foe_accounting);
212+ u64 bytes, packets;
213+
214+ if (!ppe->accounting)
215+ return NULL;
216+
217+ if (mtk_mib_entry_read(ppe, index, &bytes, &packets))
218+ return NULL;
219+
220+ acct = ppe->acct_table + index * size;
221+
222+ acct->bytes += bytes;
223+ acct->packets += packets;
224+
225+ if (diff) {
developer3ed7b542023-02-13 16:51:27 +0800226+ acct_updated = ppe->acct_updated_table + index * size;
227+
228+ diff->bytes = acct->bytes - acct_updated->bytes;
229+ diff->packets = acct->packets - acct_updated->packets;
230+ acct_updated->bytes += diff->bytes;
231+ acct_updated->packets += diff->packets;
developere8c82b22022-08-09 14:58:55 +0800232+ }
233+
234+ return acct;
235+}
236+
237+struct mtk_ppe *mtk_ppe_init(struct mtk_eth *eth, void __iomem *base, int version, int way, int id,
238+ int accounting)
239 {
240 struct device *dev = eth->dev;
241 struct mtk_foe_entry *foe;
242+ struct mtk_mib_entry *mib;
243 struct mtk_ppe *ppe;
244 struct hlist_head *flow;
developer3ed7b542023-02-13 16:51:27 +0800245+ struct mtk_foe_accounting *acct, *acct_updated;
developere8c82b22022-08-09 14:58:55 +0800246
247 ppe = devm_kzalloc(dev, sizeof(*ppe), GFP_KERNEL);
248 if (!ppe)
developer740bee82023-10-16 10:58:43 +0800249@@ -717,6 +809,7 @@ struct mtk_ppe *mtk_ppe_init(struct mtk_eth *eth, void __iomem *base, int versio
developere8c82b22022-08-09 14:58:55 +0800250 ppe->version = version;
251 ppe->way = way;
252 ppe->id = id;
253+ ppe->accounting = accounting;
254
255 foe = dmam_alloc_coherent(ppe->dev, MTK_PPE_ENTRIES * sizeof(*foe),
256 &ppe->foe_phys, GFP_KERNEL);
developer740bee82023-10-16 10:58:43 +0800257@@ -732,6 +825,31 @@ struct mtk_ppe *mtk_ppe_init(struct mtk_eth *eth, void __iomem *base, int versio
developere8c82b22022-08-09 14:58:55 +0800258
259 ppe->foe_flow = flow;
260
261+ if (accounting) {
262+ mib = dmam_alloc_coherent(ppe->dev, MTK_PPE_ENTRIES * sizeof(*mib),
263+ &ppe->mib_phys, GFP_KERNEL);
264+ if (!foe)
265+ return NULL;
266+
267+ memset(mib, 0, MTK_PPE_ENTRIES * sizeof(*mib));
268+
269+ ppe->mib_table = mib;
270+
271+ acct = devm_kzalloc(dev, MTK_PPE_ENTRIES * sizeof(*acct),
272+ GFP_KERNEL);
273+ if (!acct)
274+ return NULL;
275+
276+ ppe->acct_table = acct;
developer3ed7b542023-02-13 16:51:27 +0800277+
278+ acct_updated = devm_kzalloc(dev, MTK_PPE_ENTRIES * sizeof(*acct_updated),
279+ GFP_KERNEL);
280+ if (!acct_updated)
281+ return NULL;
282+
283+ ppe->acct_updated_table = acct_updated;
developere8c82b22022-08-09 14:58:55 +0800284+ }
285+
286 return ppe;
287 }
288
developer740bee82023-10-16 10:58:43 +0800289@@ -834,6 +952,13 @@ int mtk_ppe_start(struct mtk_ppe *ppe)
developere8c82b22022-08-09 14:58:55 +0800290 ppe_w32(ppe, MTK_PPE_SBW_CTRL, 0x7f);
developer740bee82023-10-16 10:58:43 +0800291 #endif
developere8c82b22022-08-09 14:58:55 +0800292
293+ if (ppe->accounting && ppe->mib_phys) {
294+ ppe_w32(ppe, MTK_PPE_MIB_TB_BASE, ppe->mib_phys);
295+ ppe_m32(ppe, MTK_PPE_MIB_CFG, MTK_PPE_MIB_CFG_EN, MTK_PPE_MIB_CFG_EN);
296+ ppe_m32(ppe, MTK_PPE_MIB_CFG, MTK_PPE_MIB_CFG_RD_CLR, MTK_PPE_MIB_CFG_RD_CLR);
developer7cf584b2023-12-21 13:04:36 +0800297+ ppe_m32(ppe, MTK_PPE_MIB_CACHE_CTL, MTK_PPE_MIB_CACHE_CTL_EN, MTK_PPE_MIB_CACHE_CTL_EN);
developere8c82b22022-08-09 14:58:55 +0800298+ }
299+
300 return 0;
301 }
302
303diff --git a/drivers/net/ethernet/mediatek/mtk_ppe.h b/drivers/net/ethernet/mediatek/mtk_ppe.h
developer740bee82023-10-16 10:58:43 +0800304index feb1a4a..86288b0 100644
developere8c82b22022-08-09 14:58:55 +0800305--- a/drivers/net/ethernet/mediatek/mtk_ppe.h
306+++ b/drivers/net/ethernet/mediatek/mtk_ppe.h
developer740bee82023-10-16 10:58:43 +0800307@@ -316,6 +316,20 @@ struct mtk_flow_entry {
developere8c82b22022-08-09 14:58:55 +0800308 unsigned long cookie;
309 };
310
311+struct mtk_mib_entry {
312+ u32 byt_cnt_l;
313+ u16 byt_cnt_h;
314+ u32 pkt_cnt_l;
315+ u8 pkt_cnt_h;
316+ u8 _rsv0;
317+ u32 _rsv1;
318+} __packed;
319+
320+struct mtk_foe_accounting {
321+ u64 bytes;
322+ u64 packets;
323+};
324+
325 struct mtk_ppe {
326 struct mtk_eth *eth;
327 struct device *dev;
developer740bee82023-10-16 10:58:43 +0800328@@ -323,19 +337,25 @@ struct mtk_ppe {
developere8c82b22022-08-09 14:58:55 +0800329 int version;
330 int id;
331 int way;
332+ int accounting;
333
334 struct mtk_foe_entry *foe_table;
335 dma_addr_t foe_phys;
336
337+ struct mtk_mib_entry *mib_table;
338+ dma_addr_t mib_phys;
339+
340 u16 foe_check_time[MTK_PPE_ENTRIES];
341 struct hlist_head *foe_flow;
342
developer740bee82023-10-16 10:58:43 +0800343 struct rhashtable l2_flows;
344
developere8c82b22022-08-09 14:58:55 +0800345 void *acct_table;
developer3ed7b542023-02-13 16:51:27 +0800346+ void *acct_updated_table;
developere8c82b22022-08-09 14:58:55 +0800347 };
348
349-struct mtk_ppe *mtk_ppe_init(struct mtk_eth *eth, void __iomem *base, int version, int way, int id);
350+struct mtk_ppe *mtk_ppe_init(struct mtk_eth *eth, void __iomem *base, int version, int way, int id,
351+ int accounting);
352 int mtk_ppe_start(struct mtk_ppe *ppe);
353 int mtk_ppe_stop(struct mtk_ppe *ppe);
354
developer740bee82023-10-16 10:58:43 +0800355@@ -386,5 +406,6 @@ int mtk_foe_entry_set_wdma(struct mtk_foe_entry *entry, int wdma_idx, int txq,
developere8c82b22022-08-09 14:58:55 +0800356 int mtk_foe_entry_commit(struct mtk_ppe *ppe, struct mtk_flow_entry *entry);
357 void mtk_foe_entry_clear(struct mtk_ppe *ppe, struct mtk_flow_entry *entry);
358 int mtk_foe_entry_idle_time(struct mtk_ppe *ppe, struct mtk_flow_entry *entry);
359+struct mtk_foe_accounting *mtk_foe_entry_get_mib(struct mtk_ppe *ppe, u32 index, struct mtk_foe_accounting *diff);
360
361 #endif
362diff --git a/drivers/net/ethernet/mediatek/mtk_ppe_debugfs.c b/drivers/net/ethernet/mediatek/mtk_ppe_debugfs.c
363index f4ebe59..d713e2e 100644
364--- a/drivers/net/ethernet/mediatek/mtk_ppe_debugfs.c
365+++ b/drivers/net/ethernet/mediatek/mtk_ppe_debugfs.c
366@@ -81,6 +81,7 @@ mtk_ppe_debugfs_foe_show(struct seq_file *m, struct mtk_ppe *ppe, bool bind)
367 struct mtk_foe_entry *entry = &ppe->foe_table[i];
368 struct mtk_foe_mac_info *l2;
369 struct mtk_flow_addr_info ai = {};
370+ struct mtk_foe_accounting *acct;
371 unsigned char h_source[ETH_ALEN];
372 unsigned char h_dest[ETH_ALEN];
373 int type, state;
374@@ -94,6 +95,8 @@ mtk_ppe_debugfs_foe_show(struct seq_file *m, struct mtk_ppe *ppe, bool bind)
375 if (bind && state != MTK_FOE_STATE_BIND)
376 continue;
377
378+ acct = mtk_foe_entry_get_mib(ppe, i, NULL);
379+
380 type = FIELD_GET(MTK_FOE_IB1_PACKET_TYPE, entry->ib1);
381 seq_printf(m, "%05x %s %7s", i,
382 mtk_foe_entry_state_str(state),
383@@ -154,9 +157,12 @@ mtk_ppe_debugfs_foe_show(struct seq_file *m, struct mtk_ppe *ppe, bool bind)
384 *((__be16 *)&h_dest[4]) = htons(l2->dest_mac_lo);
385
386 seq_printf(m, " eth=%pM->%pM etype=%04x"
387- " vlan=%d,%d ib1=%08x ib2=%08x\n",
388+ " vlan=%d,%d ib1=%08x ib2=%08x"
389+ " packets=%lld bytes=%lld\n",
390 h_source, h_dest, ntohs(l2->etype),
391- l2->vlan1, l2->vlan2, entry->ib1, ib2);
392+ l2->vlan1, l2->vlan2, entry->ib1, ib2,
393+ acct->packets, acct->bytes
394+ );
395 }
396
397 return 0;
398diff --git a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c
developer740bee82023-10-16 10:58:43 +0800399index f256607..b80f72d 100755
developere8c82b22022-08-09 14:58:55 +0800400--- a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c
401+++ b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c
developer740bee82023-10-16 10:58:43 +0800402@@ -509,6 +509,7 @@ static int
developere8c82b22022-08-09 14:58:55 +0800403 mtk_flow_offload_stats(struct mtk_eth *eth, struct flow_cls_offload *f)
404 {
405 struct mtk_flow_entry *entry;
406+ struct mtk_foe_accounting diff;
407 u32 idle;
408 int i;
409
developer740bee82023-10-16 10:58:43 +0800410@@ -521,6 +522,12 @@ mtk_flow_offload_stats(struct mtk_eth *eth, struct flow_cls_offload *f)
developere8c82b22022-08-09 14:58:55 +0800411 idle = mtk_foe_entry_idle_time(eth->ppe[i], entry);
412 f->stats.lastused = jiffies - idle * HZ;
413
414+ if (entry->hash != 0xFFFF) {
415+ mtk_foe_entry_get_mib(eth->ppe[i], entry->hash, &diff);
416+ f->stats.pkts += diff.packets;
417+ f->stats.bytes += diff.bytes;
418+ }
419+
420 return 0;
421 }
422
423diff --git a/drivers/net/ethernet/mediatek/mtk_ppe_regs.h b/drivers/net/ethernet/mediatek/mtk_ppe_regs.h
developer740bee82023-10-16 10:58:43 +0800424index d319f18..8d3ebe1 100644
developere8c82b22022-08-09 14:58:55 +0800425--- a/drivers/net/ethernet/mediatek/mtk_ppe_regs.h
426+++ b/drivers/net/ethernet/mediatek/mtk_ppe_regs.h
developer740bee82023-10-16 10:58:43 +0800427@@ -145,6 +145,20 @@ enum {
developere8c82b22022-08-09 14:58:55 +0800428
429 #define MTK_PPE_MIB_TB_BASE 0x338
430
431+#define MTK_PPE_MIB_SER_CR 0x33C
432+#define MTK_PPE_MIB_SER_CR_ST BIT(16)
433+#define MTK_PPE_MIB_SER_CR_ADDR GENMASK(13, 0)
434+
435+#define MTK_PPE_MIB_SER_R0 0x340
436+#define MTK_PPE_MIB_SER_R0_BYTE_CNT_LOW GENMASK(31, 0)
437+
438+#define MTK_PPE_MIB_SER_R1 0x344
439+#define MTK_PPE_MIB_SER_R1_PKT_CNT_LOW GENMASK(31, 16)
440+#define MTK_PPE_MIB_SER_R1_BYTE_CNT_HIGH GENMASK(15, 0)
441+
442+#define MTK_PPE_MIB_SER_R2 0x348
443+#define MTK_PPE_MIB_SER_R2_PKT_CNT_HIGH GENMASK(23, 0)
444+
445 #define MTK_PPE_MIB_CACHE_CTL 0x350
446 #define MTK_PPE_MIB_CACHE_CTL_EN BIT(0)
447 #define MTK_PPE_MIB_CACHE_CTL_FLUSH BIT(2)
448diff --git a/net/netfilter/xt_FLOWOFFLOAD.c b/net/netfilter/xt_FLOWOFFLOAD.c
developer69bcd592024-03-25 14:26:39 +0800449index e4c7db9..aae37f5 100644
developere8c82b22022-08-09 14:58:55 +0800450--- a/net/netfilter/xt_FLOWOFFLOAD.c
451+++ b/net/netfilter/xt_FLOWOFFLOAD.c
developer69bcd592024-03-25 14:26:39 +0800452@@ -772,7 +772,7 @@ static int __init xt_flowoffload_tg_init(void)
developere8c82b22022-08-09 14:58:55 +0800453 if (ret)
454 goto cleanup;
455
456- flowtable[1].ft.flags = NF_FLOWTABLE_HW_OFFLOAD;
457+ flowtable[1].ft.flags = NF_FLOWTABLE_HW_OFFLOAD | NF_FLOWTABLE_COUNTER;
458
459 ret = xt_register_target(&offload_tg_reg);
460 if (ret)
developer740bee82023-10-16 10:58:43 +0800461--
4622.18.0
463