blob: b8ec87a1ead2f7c62b0d0b96b959ae87938d157c [file] [log] [blame]
developerfd40db22021-04-29 10:08:25 +08001/* This program is free software; you can redistribute it and/or modify
2 * it under the terms of the GNU General Public License as published by
3 * the Free Software Foundation; version 2 of the License
4 *
5 * This program is distributed in the hope that it will be useful,
6 * but WITHOUT ANY WARRANTY; without even the implied warranty of
7 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
8 * GNU General Public License for more details.
9 *
10 * Copyright (C) 2014-2016 Sean Wang <sean.wang@mediatek.com>
11 * Copyright (C) 2016-2017 John Crispin <blogic@openwrt.org>
12 */
13
14#include <linux/debugfs.h>
15#include <linux/string.h>
16#include <linux/if.h>
17#include <linux/if_ether.h>
18#include <net/netevent.h>
19#include <linux/mod_devicetable.h>
20#include "hnat_mcast.h"
21
22/*--------------------------------------------------------------------------*/
23/* Register Offset*/
24/*--------------------------------------------------------------------------*/
25#define PPE_GLO_CFG 0x00
26#define PPE_FLOW_CFG 0x04
27#define PPE_IP_PROT_CHK 0x08
28#define PPE_IP_PROT_0 0x0C
29#define PPE_IP_PROT_1 0x10
30#define PPE_IP_PROT_2 0x14
31#define PPE_IP_PROT_3 0x18
32#define PPE_TB_CFG 0x1C
33#define PPE_TB_BASE 0x20
34#define PPE_TB_USED 0x24
35#define PPE_BNDR 0x28
36#define PPE_BIND_LMT_0 0x2C
37#define PPE_BIND_LMT_1 0x30
38#define PPE_KA 0x34
39#define PPE_UNB_AGE 0x38
40#define PPE_BND_AGE_0 0x3C
41#define PPE_BND_AGE_1 0x40
42#define PPE_HASH_SEED 0x44
43#define PPE_DFT_CPORT 0x48
44#define PPE_DFT_CPORT1 0x4C
45#define PPE_MCAST_PPSE 0x84
46#define PPE_MCAST_L_0 0x88
47#define PPE_MCAST_H_0 0x8C
48#define PPE_MCAST_L_1 0x90
49#define PPE_MCAST_H_1 0x94
50#define PPE_MCAST_L_2 0x98
51#define PPE_MCAST_H_2 0x9C
52#define PPE_MCAST_L_3 0xA0
53#define PPE_MCAST_H_3 0xA4
54#define PPE_MCAST_L_4 0xA8
55#define PPE_MCAST_H_4 0xAC
56#define PPE_MCAST_L_5 0xB0
57#define PPE_MCAST_H_5 0xB4
58#define PPE_MCAST_L_6 0xBC
59#define PPE_MCAST_H_6 0xC0
60#define PPE_MCAST_L_7 0xC4
61#define PPE_MCAST_H_7 0xC8
62#define PPE_MCAST_L_8 0xCC
63#define PPE_MCAST_H_8 0xD0
64#define PPE_MCAST_L_9 0xD4
65#define PPE_MCAST_H_9 0xD8
66#define PPE_MCAST_L_A 0xDC
67#define PPE_MCAST_H_A 0xE0
68#define PPE_MCAST_L_B 0xE4
69#define PPE_MCAST_H_B 0xE8
70#define PPE_MCAST_L_C 0xEC
71#define PPE_MCAST_H_C 0xF0
72#define PPE_MCAST_L_D 0xF4
73#define PPE_MCAST_H_D 0xF8
74#define PPE_MCAST_L_E 0xFC
75#define PPE_MCAST_H_E 0xE0
76#define PPE_MCAST_L_F 0x100
77#define PPE_MCAST_H_F 0x104
78#define PPE_MCAST_L_10 0xC00
79#define PPE_MCAST_H_10 0xC04
80#define PPE_MTU_DRP 0x108
81#define PPE_MTU_VLYR_0 0x10C
82#define PPE_MTU_VLYR_1 0x110
83#define PPE_MTU_VLYR_2 0x114
84#define PPE_VPM_TPID 0x118
85#define PPE_CAH_CTRL 0x120
86#define PPE_CAH_TAG_SRH 0x124
87#define PPE_CAH_LINE_RW 0x128
88#define PPE_CAH_WDATA 0x12C
89#define PPE_CAH_RDATA 0x130
90
91#define PPE_MIB_CFG 0X134
92#define PPE_MIB_TB_BASE 0X138
93#define PPE_MIB_SER_CR 0X13C
94#define PPE_MIB_SER_R0 0X140
95#define PPE_MIB_SER_R1 0X144
96#define PPE_MIB_SER_R2 0X148
developerd35bbcc2022-09-28 22:46:01 +080097#define PPE_MIB_SER_R3 0X14C
developerfd40db22021-04-29 10:08:25 +080098#define PPE_MIB_CAH_CTRL 0X150
99#define PPE_MIB_CAH_TAG_SRH 0X154
100#define PPE_MIB_CAH_LINE_RW 0X158
101#define PPE_MIB_CAH_WDATA 0X15C
102#define PPE_MIB_CAH_RDATA 0X160
developerd35bbcc2022-09-28 22:46:01 +0800103#define PPE_SB_FIFO_DBG 0x170
developerfd40db22021-04-29 10:08:25 +0800104#define PPE_SBW_CTRL 0x174
105
106#define GDMA1_FWD_CFG 0x500
107#define GDMA2_FWD_CFG 0x1500
developerd35bbcc2022-09-28 22:46:01 +0800108#define GDMA3_FWD_CFG 0x540
developerfd40db22021-04-29 10:08:25 +0800109
developer24948202021-11-24 17:38:27 +0800110/* QDMA Tx queue configuration */
developer70cdf6e2021-12-07 18:58:35 +0800111#define QTX_CFG(x) (QDMA_BASE + ((x) * 0x10))
112#define QTX_CFG_HW_RESV_CNT_OFFSET (8)
113#define QTX_CFG_SW_RESV_CNT_OFFSET (0)
114
115#define QTX_SCH(x) (QDMA_BASE + 0x4 + ((x) * 0x10))
116#define QTX_SCH_MIN_RATE_EN BIT(27)
117#define QTX_SCH_MAX_RATE_EN BIT(11)
118#define QTX_SCH_MIN_RATE_MAN_OFFSET (20)
119#define QTX_SCH_MIN_RATE_EXP_OFFSET (16)
120#define QTX_SCH_MAX_RATE_WGHT_OFFSET (12)
121#define QTX_SCH_MAX_RATE_MAN_OFFSET (4)
122#define QTX_SCH_MAX_RATE_EXP_OFFSET (0)
developer24948202021-11-24 17:38:27 +0800123
124/* QDMA Tx scheduler configuration */
developer70cdf6e2021-12-07 18:58:35 +0800125#define QDMA_PAGE (QDMA_BASE + 0x1f0)
126#define QDMA_TX_2SCH_BASE (QDMA_BASE + 0x214)
127#define QTX_MIB_IF (QDMA_BASE + 0x2bc)
128#define QDMA_TX_4SCH_BASE(x) (QDMA_BASE + 0x398 + (((x) >> 1) * 0x4))
developer34028fb2022-01-11 13:51:29 +0800129#define QDMA_TX_SCH_WFQ_EN BIT(15)
developerfd40db22021-04-29 10:08:25 +0800130
131/*--------------------------------------------------------------------------*/
132/* Register Mask*/
133/*--------------------------------------------------------------------------*/
134/* PPE_TB_CFG mask */
135#define TB_ETRY_NUM (0x7 << 0) /* RW */
136#define TB_ENTRY_SIZE (0x1 << 3) /* RW */
137#define SMA (0x3 << 4) /* RW */
138#define NTU_AGE (0x1 << 7) /* RW */
139#define UNBD_AGE (0x1 << 8) /* RW */
140#define TCP_AGE (0x1 << 9) /* RW */
141#define UDP_AGE (0x1 << 10) /* RW */
142#define FIN_AGE (0x1 << 11) /* RW */
143#define KA_CFG (0x3 << 12)
144#define HASH_MODE (0x3 << 14) /* RW */
145#define SCAN_MODE (0x3 << 16) /* RW */
146#define XMODE (0x3 << 18) /* RW */
developer8051e042022-04-08 13:26:36 +0800147#define TICK_SEL (0x1 << 24) /* RW */
148
developerfd40db22021-04-29 10:08:25 +0800149
150/*PPE_CAH_CTRL mask*/
151#define CAH_EN (0x1 << 0) /* RW */
152#define CAH_X_MODE (0x1 << 9) /* RW */
153
154/*PPE_UNB_AGE mask*/
155#define UNB_DLTA (0xff << 0) /* RW */
156#define UNB_MNP (0xffff << 16) /* RW */
157
158/*PPE_BND_AGE_0 mask*/
159#define UDP_DLTA (0xffff << 0) /* RW */
160#define NTU_DLTA (0xffff << 16) /* RW */
161
162/*PPE_BND_AGE_1 mask*/
163#define TCP_DLTA (0xffff << 0) /* RW */
164#define FIN_DLTA (0xffff << 16) /* RW */
165
166/*PPE_KA mask*/
167#define KA_T (0xffff << 0) /* RW */
168#define TCP_KA (0xff << 16) /* RW */
169#define UDP_KA (0xff << 24) /* RW */
170
171/*PPE_BIND_LMT_0 mask*/
172#define QURT_LMT (0x3ff << 0) /* RW */
173#define HALF_LMT (0x3ff << 16) /* RW */
174
175/*PPE_BIND_LMT_1 mask*/
176#define FULL_LMT (0x3fff << 0) /* RW */
177#define NTU_KA (0xff << 16) /* RW */
178
179/*PPE_BNDR mask*/
180#define BIND_RATE (0xffff << 0) /* RW */
181#define PBND_RD_PRD (0xffff << 16) /* RW */
182
183/*PPE_GLO_CFG mask*/
184#define PPE_EN (0x1 << 0) /* RW */
185#define TTL0_DRP (0x1 << 4) /* RW */
186#define MCAST_TB_EN (0x1 << 7) /* RW */
187#define MCAST_HASH (0x3 << 12) /* RW */
188
189#define MC_P3_PPSE (0xf << 12) /* RW */
190#define MC_P2_PPSE (0xf << 8) /* RW */
191#define MC_P1_PPSE (0xf << 4) /* RW */
192#define MC_P0_PPSE (0xf << 0) /* RW */
193
194#define MIB_EN (0x1 << 0) /* RW */
195#define MIB_READ_CLEAR (0X1 << 1) /* RW */
196#define MIB_CAH_EN (0X1 << 0) /* RW */
197
198/*GDMA_FWD_CFG mask */
developerd35bbcc2022-09-28 22:46:01 +0800199#define GDM_UFRC_MASK (0xF << 12) /* RW */
200#define GDM_BFRC_MASK (0xF << 8) /*RW*/
201#define GDM_MFRC_MASK (0xF << 4) /*RW*/
202#define GDM_OFRC_MASK (0xF << 0) /*RW*/
developerfd40db22021-04-29 10:08:25 +0800203#define GDM_ALL_FRC_MASK \
204 (GDM_UFRC_MASK | GDM_BFRC_MASK | GDM_MFRC_MASK | GDM_OFRC_MASK)
205
206/*QDMA_PAGE mask*/
207#define QTX_CFG_PAGE (0xf << 0) /* RW */
208
209/*QTX_MIB_IF mask*/
210#define MIB_ON_QTX_CFG (0x1 << 31) /* RW */
211#define VQTX_MIB_EN (0x1 << 28) /* RW */
212
developerd35bbcc2022-09-28 22:46:01 +0800213/* PPE Side Band FIFO Debug Mask */
214#define SB_MED_FULL_DRP_EN (0x1 << 11)
215
developerfd40db22021-04-29 10:08:25 +0800216/*--------------------------------------------------------------------------*/
217/* Descriptor Structure */
218/*--------------------------------------------------------------------------*/
developerd35bbcc2022-09-28 22:46:01 +0800219#if defined(CONFIG_MEDIATEK_NETSYS_V2) || defined(CONFIG_MEDIATEK_NETSYS_V3)
developerfd40db22021-04-29 10:08:25 +0800220struct hnat_unbind_info_blk {
221 u32 time_stamp : 8;
222 u32 sp : 4;
223 u32 pcnt : 8;
224 u32 ilgf : 1;
225 u32 mc : 1;
226 u32 preb : 1;
227 u32 pkt_type : 5;
228 u32 state : 2;
229 u32 udp : 1;
230 u32 sta : 1; /* static entry */
231} __packed;
232
233struct hnat_bind_info_blk {
234 u32 time_stamp : 8;
235 u32 sp : 4;
236 u32 mc : 1;
237 u32 ka : 1; /* keep alive */
238 u32 vlan_layer : 3;
239 u32 psn : 1; /* egress packet has PPPoE session */
240 u32 vpm : 1; /* 0:ethertype remark, 1:0x8100(CR default) */
241 u32 ps : 1; /* packet sampling */
242 u32 cah : 1; /* cacheable flag */
243 u32 rmt : 1; /* remove tunnel ip header (6rd/dslite only) */
244 u32 ttl : 1;
245 u32 pkt_type : 5;
246 u32 state : 2;
247 u32 udp : 1;
248 u32 sta : 1; /* static entry */
249} __packed;
250
251struct hnat_info_blk2 {
252 u32 qid : 7; /* QID in Qos Port */
253 u32 port_mg : 1;
254 u32 fqos : 1; /* force to PSE QoS port */
255 u32 dp : 4; /* force to PSE port x */
256 u32 mcast : 1; /* multicast this packet to CPU */
257 u32 pcpl : 1; /* OSBN */
258 u32 mibf : 1;
259 u32 alen : 1;
260 u32 rxid : 2;
261 u32 winfoi : 1;
262 u32 port_ag : 4;
263 u32 dscp : 8; /* DSCP value */
264} __packed;
265
developerd35bbcc2022-09-28 22:46:01 +0800266#if defined(CONFIG_MEDIATEK_NETSYS_V3)
267struct hnat_winfo {
268 u32 wcid : 16; /* WiFi wtable Idx */
269 u32 bssid : 8; /* WiFi Bssidx */
270 u32 resv : 8;
271} __packed;
272
273struct hnat_winfo_pao {
274 u32 usr_info : 16;
275 u32 tid : 4;
276 u32 is_fixedrate : 1;
277 u32 is_prior : 1;
278 u32 is_sp : 1;
279 u32 hf : 1;
280 u32 amsdu : 1;
281 u32 resv : 7;
282} __packed;
283#elif defined(CONFIG_MEDIATEK_NETSYS_V2)
developerfd40db22021-04-29 10:08:25 +0800284struct hnat_winfo {
285 u32 bssid : 6; /* WiFi Bssidx */
286 u32 wcid : 10; /* WiFi wtable Idx */
287} __packed;
developerd35bbcc2022-09-28 22:46:01 +0800288#endif
developerfd40db22021-04-29 10:08:25 +0800289
290#else
291struct hnat_unbind_info_blk {
292 u32 time_stamp : 8;
293 u32 pcnt : 16; /* packet count */
294 u32 preb : 1;
295 u32 pkt_type : 3;
296 u32 state : 2;
297 u32 udp : 1;
298 u32 sta : 1; /* static entry */
299} __packed;
300
301struct hnat_bind_info_blk {
302 u32 time_stamp : 15;
303 u32 ka : 1; /* keep alive */
304 u32 vlan_layer : 3;
305 u32 psn : 1; /* egress packet has PPPoE session */
306 u32 vpm : 1; /* 0:ethertype remark, 1:0x8100(CR default) */
307 u32 ps : 1; /* packet sampling */
308 u32 cah : 1; /* cacheable flag */
309 u32 rmt : 1; /* remove tunnel ip header (6rd/dslite only) */
310 u32 ttl : 1;
311 u32 pkt_type : 3;
312 u32 state : 2;
313 u32 udp : 1;
314 u32 sta : 1; /* static entry */
315} __packed;
316
317struct hnat_info_blk2 {
318 u32 qid : 4; /* QID in Qos Port */
319 u32 fqos : 1; /* force to PSE QoS port */
320 u32 dp : 3; /* force to PSE port x
321 * 0:PSE,1:GSW, 2:GMAC,4:PPE,5:QDMA,7=DROP
322 */
323 u32 mcast : 1; /* multicast this packet to CPU */
324 u32 pcpl : 1; /* OSBN */
325 u32 mibf : 1; /* 0:off 1:on PPE MIB counter */
326 u32 alen : 1; /* 0:post 1:pre packet length in accounting */
327 u32 port_mg : 6; /* port meter group */
328 u32 port_ag : 6; /* port account group */
329 u32 dscp : 8; /* DSCP value */
330} __packed;
331
332struct hnat_winfo {
333 u32 bssid : 6; /* WiFi Bssidx */
334 u32 wcid : 8; /* WiFi wtable Idx */
335 u32 rxid : 2; /* WiFi Ring idx */
336} __packed;
337#endif
338
339/* info blk2 for WHNAT */
340struct hnat_info_blk2_whnat {
341 u32 qid : 4; /* QID[3:0] in Qos Port */
342 u32 fqos : 1; /* force to PSE QoS port */
343 u32 dp : 3; /* force to PSE port x
344 * 0:PSE,1:GSW, 2:GMAC,4:PPE,5:QDMA,7=DROP
345 */
346 u32 mcast : 1; /* multicast this packet to CPU */
347 u32 pcpl : 1; /* OSBN */
348 u32 mibf : 1; /* 0:off 1:on PPE MIB counter */
349 u32 alen : 1; /* 0:post 1:pre packet length in accounting */
350 u32 qid2 : 2; /* QID[5:4] in Qos Port */
351 u32 resv : 2;
352 u32 wdmaid : 1; /* 0:to pcie0 dev 1:to pcie1 dev */
353 u32 winfoi : 1; /* 0:off 1:on Wi-Fi hwnat support */
354 u32 port_ag : 6; /* port account group */
355 u32 dscp : 8; /* DSCP value */
356} __packed;
357
358struct hnat_ipv4_hnapt {
359 union {
360 struct hnat_bind_info_blk bfib1;
361 struct hnat_unbind_info_blk udib1;
362 u32 info_blk1;
363 };
364 u32 sip;
365 u32 dip;
366 u16 dport;
367 u16 sport;
368 union {
369 struct hnat_info_blk2 iblk2;
370 struct hnat_info_blk2_whnat iblk2w;
371 u32 info_blk2;
372 };
373 u32 new_sip;
374 u32 new_dip;
375 u16 new_dport;
376 u16 new_sport;
377 u16 m_timestamp; /* For mcast*/
378 u16 resv1;
379 u32 resv2;
380 u32 resv3 : 26;
381 u32 act_dp : 6; /* UDF */
382 u16 vlan1;
383 u16 etype;
384 u32 dmac_hi;
385 union {
developerd35bbcc2022-09-28 22:46:01 +0800386#if !defined(CONFIG_MEDIATEK_NETSYS_V2) && !defined(CONFIG_MEDIATEK_NETSYS_V3)
developerfd40db22021-04-29 10:08:25 +0800387 struct hnat_winfo winfo;
388#endif
389 u16 vlan2;
390 };
391 u16 dmac_lo;
392 u32 smac_hi;
393 u16 pppoe_id;
394 u16 smac_lo;
developer22fd7712022-10-06 14:13:52 +0800395#if defined(CONFIG_MEDIATEK_NETSYS_V3)
developerd35bbcc2022-09-28 22:46:01 +0800396 u16 minfo;
397 u16 resv4;
developerfd40db22021-04-29 10:08:25 +0800398 struct hnat_winfo winfo;
developerd35bbcc2022-09-28 22:46:01 +0800399 struct hnat_winfo_pao winfo_pao;
400 u32 cdrt_id : 8;
401 u32 tops_entry : 6;
402 u32 resv5 : 2;
403 u32 tport_id : 4;
404 u32 resv6 : 12;
developer22fd7712022-10-06 14:13:52 +0800405#elif defined(CONFIG_MEDIATEK_NETSYS_V2)
406 u16 minfo;
407 struct hnat_winfo winfo;
developerfd40db22021-04-29 10:08:25 +0800408#endif
409} __packed;
410
411struct hnat_ipv4_dslite {
412 union {
413 struct hnat_bind_info_blk bfib1;
414 struct hnat_unbind_info_blk udib1;
415 u32 info_blk1;
416 };
417 u32 sip;
418 u32 dip;
419 u16 dport;
420 u16 sport;
421
422 u32 tunnel_sipv6_0;
423 u32 tunnel_sipv6_1;
424 u32 tunnel_sipv6_2;
425 u32 tunnel_sipv6_3;
426
427 u32 tunnel_dipv6_0;
428 u32 tunnel_dipv6_1;
429 u32 tunnel_dipv6_2;
430 u32 tunnel_dipv6_3;
431
432 u8 flow_lbl[3]; /* in order to consist with Linux kernel (should be 20bits) */
433 u8 priority; /* in order to consist with Linux kernel (should be 8bits) */
434 u32 hop_limit : 8;
435 u32 resv2 : 18;
436 u32 act_dp : 6; /* UDF */
437
438 union {
439 struct hnat_info_blk2 iblk2;
440 struct hnat_info_blk2_whnat iblk2w;
441 u32 info_blk2;
442 };
443
444 u16 vlan1;
445 u16 etype;
446 u32 dmac_hi;
447 union {
developerd35bbcc2022-09-28 22:46:01 +0800448#if !defined(CONFIG_MEDIATEK_NETSYS_V2) && !defined(CONFIG_MEDIATEK_NETSYS_V3)
developerfd40db22021-04-29 10:08:25 +0800449 struct hnat_winfo winfo;
450#endif
451 u16 vlan2;
452 };
453 u16 dmac_lo;
454 u32 smac_hi;
455 u16 pppoe_id;
456 u16 smac_lo;
developer22fd7712022-10-06 14:13:52 +0800457#if defined(CONFIG_MEDIATEK_NETSYS_V3)
developerd35bbcc2022-09-28 22:46:01 +0800458 u16 minfo;
459 u16 resv3;
460 struct hnat_winfo winfo;
461 struct hnat_winfo_pao winfo_pao;
462 u32 cdrt_id : 8;
463 u32 tops_entry : 6;
464 u32 resv4 : 2;
465 u32 tport_id : 4;
466 u32 resv5 : 12;
developer22fd7712022-10-06 14:13:52 +0800467#elif defined(CONFIG_MEDIATEK_NETSYS_V2)
468 u16 minfo;
469 struct hnat_winfo winfo;
developerd35bbcc2022-09-28 22:46:01 +0800470#endif
471} __packed;
472
473struct hnat_ipv4_mape {
474 union {
475 struct hnat_bind_info_blk bfib1;
476 struct hnat_unbind_info_blk udib1;
477 u32 info_blk1;
478 };
479 u32 sip;
480 u32 dip;
481 u16 dport;
482 u16 sport;
483
484 u32 tunnel_sipv6_0;
485 u32 tunnel_sipv6_1;
486 u32 tunnel_sipv6_2;
487 u32 tunnel_sipv6_3;
488
489 u32 tunnel_dipv6_0;
490 u32 tunnel_dipv6_1;
491 u32 tunnel_dipv6_2;
492 u32 tunnel_dipv6_3;
493
494 u8 flow_lbl[3]; /* in order to consist with Linux kernel (should be 20bits) */
495 u8 priority; /* in order to consist with Linux kernel (should be 8bits) */
496 u32 hop_limit : 8;
497 u32 resv2 : 18;
498 u32 act_dp : 6; /* UDF */
499
500 union {
501 struct hnat_info_blk2 iblk2;
502 struct hnat_info_blk2_whnat iblk2w;
503 u32 info_blk2;
504 };
505
506 u16 vlan1;
507 u16 etype;
508 u32 dmac_hi;
509 union {
510#if !defined(CONFIG_MEDIATEK_NETSYS_V2) && !defined(CONFIG_MEDIATEK_NETSYS_V3)
511 struct hnat_winfo winfo;
512#endif
513 u16 vlan2;
514 };
515 u16 dmac_lo;
516 u32 smac_hi;
517 u16 pppoe_id;
518 u16 smac_lo;
developer22fd7712022-10-06 14:13:52 +0800519#if defined(CONFIG_MEDIATEK_NETSYS_V3)
developerd35bbcc2022-09-28 22:46:01 +0800520 u16 minfo;
521 u16 resv3;
522 u32 new_sip;
523 u32 new_dip;
524 u16 new_dport;
525 u16 new_sport;
526 struct hnat_winfo winfo;
527 struct hnat_winfo_pao winfo_pao;
528 u32 cdrt_id : 8;
529 u32 tops_entry : 6;
530 u32 resv4 : 2;
531 u32 tport_id : 4;
532 u32 resv5 : 12;
developer22fd7712022-10-06 14:13:52 +0800533#elif defined(CONFIG_MEDIATEK_NETSYS_V2)
534 u16 minfo;
535 struct hnat_winfo winfo;
536 u32 new_sip;
537 u32 new_dip;
538 u16 new_dport;
539 u16 new_sport;
developerfd40db22021-04-29 10:08:25 +0800540#endif
541} __packed;
542
543struct hnat_ipv6_3t_route {
544 union {
545 struct hnat_bind_info_blk bfib1;
546 struct hnat_unbind_info_blk udib1;
547 u32 info_blk1;
548 };
549 u32 ipv6_sip0;
550 u32 ipv6_sip1;
551 u32 ipv6_sip2;
552 u32 ipv6_sip3;
553 u32 ipv6_dip0;
554 u32 ipv6_dip1;
555 u32 ipv6_dip2;
556 u32 ipv6_dip3;
557 u32 prot : 8;
developer729f0272021-06-09 17:28:38 +0800558 u32 hph : 24; /* hash placeholder */
developerfd40db22021-04-29 10:08:25 +0800559
560 u32 resv1;
561 u32 resv2;
562 u32 resv3;
563 u32 resv4 : 26;
564 u32 act_dp : 6; /* UDF */
565
566 union {
567 struct hnat_info_blk2 iblk2;
568 struct hnat_info_blk2_whnat iblk2w;
569 u32 info_blk2;
570 };
571 u16 vlan1;
572 u16 etype;
573 u32 dmac_hi;
574 union {
developerd35bbcc2022-09-28 22:46:01 +0800575#if !defined(CONFIG_MEDIATEK_NETSYS_V2) && !defined(CONFIG_MEDIATEK_NETSYS_V3)
developerfd40db22021-04-29 10:08:25 +0800576 struct hnat_winfo winfo;
577#endif
578 u16 vlan2;
579 };
580 u16 dmac_lo;
581 u32 smac_hi;
582 u16 pppoe_id;
583 u16 smac_lo;
developer22fd7712022-10-06 14:13:52 +0800584#if defined(CONFIG_MEDIATEK_NETSYS_V3)
developerd35bbcc2022-09-28 22:46:01 +0800585 u16 minfo;
586 u16 resv5;
587 struct hnat_winfo winfo;
588 struct hnat_winfo_pao winfo_pao;
589 u32 cdrt_id : 8;
590 u32 tops_entry : 6;
591 u32 resv6 : 2;
592 u32 tport_id : 4;
593 u32 resv7 : 12;
developer22fd7712022-10-06 14:13:52 +0800594#elif defined(CONFIG_MEDIATEK_NETSYS_V2)
595 u16 minfo;
596 struct hnat_winfo winfo;
developerfd40db22021-04-29 10:08:25 +0800597#endif
598} __packed;
599
600struct hnat_ipv6_5t_route {
601 union {
602 struct hnat_bind_info_blk bfib1;
603 struct hnat_unbind_info_blk udib1;
604 u32 info_blk1;
605 };
606 u32 ipv6_sip0;
607 u32 ipv6_sip1;
608 u32 ipv6_sip2;
609 u32 ipv6_sip3;
610 u32 ipv6_dip0;
611 u32 ipv6_dip1;
612 u32 ipv6_dip2;
613 u32 ipv6_dip3;
614 u16 dport;
615 u16 sport;
616
617 u32 resv1;
618 u32 resv2;
619 u32 resv3;
620 u32 resv4 : 26;
621 u32 act_dp : 6; /* UDF */
622
623 union {
624 struct hnat_info_blk2 iblk2;
625 struct hnat_info_blk2_whnat iblk2w;
626 u32 info_blk2;
627 };
628
629 u16 vlan1;
630 u16 etype;
631 u32 dmac_hi;
632 union {
developerd35bbcc2022-09-28 22:46:01 +0800633#if !defined(CONFIG_MEDIATEK_NETSYS_V2) && !defined(CONFIG_MEDIATEK_NETSYS_V3)
developerfd40db22021-04-29 10:08:25 +0800634 struct hnat_winfo winfo;
635#endif
636 u16 vlan2;
637 };
638 u16 dmac_lo;
639 u32 smac_hi;
640 u16 pppoe_id;
641 u16 smac_lo;
developer22fd7712022-10-06 14:13:52 +0800642#if defined(CONFIG_MEDIATEK_NETSYS_V3)
developerd35bbcc2022-09-28 22:46:01 +0800643 u16 minfo;
644 u16 resv5;
developerfd40db22021-04-29 10:08:25 +0800645 struct hnat_winfo winfo;
developerd35bbcc2022-09-28 22:46:01 +0800646 struct hnat_winfo_pao winfo_pao;
647 u32 cdrt_id : 8;
648 u32 tops_entry : 6;
649 u32 resv6 : 2;
650 u32 tport_id : 4;
651 u32 resv7 : 12;
developer22fd7712022-10-06 14:13:52 +0800652#elif defined(CONFIG_MEDIATEK_NETSYS_V2)
653 u16 minfo;
654 struct hnat_winfo winfo;
developerfd40db22021-04-29 10:08:25 +0800655#endif
656} __packed;
657
658struct hnat_ipv6_6rd {
659 union {
660 struct hnat_bind_info_blk bfib1;
661 struct hnat_unbind_info_blk udib1;
662 u32 info_blk1;
663 };
664 u32 ipv6_sip0;
665 u32 ipv6_sip1;
666 u32 ipv6_sip2;
667 u32 ipv6_sip3;
668 u32 ipv6_dip0;
669 u32 ipv6_dip1;
670 u32 ipv6_dip2;
671 u32 ipv6_dip3;
672 u16 dport;
673 u16 sport;
674
675 u32 tunnel_sipv4;
676 u32 tunnel_dipv4;
677 u32 hdr_chksum : 16;
678 u32 dscp : 8;
679 u32 ttl : 8;
680 u32 flag : 3;
681 u32 resv1 : 13;
682 u32 per_flow_6rd_id : 1;
683 u32 resv2 : 9;
684 u32 act_dp : 6; /* UDF */
685
686 union {
687 struct hnat_info_blk2 iblk2;
688 struct hnat_info_blk2_whnat iblk2w;
689 u32 info_blk2;
690 };
691
692 u16 vlan1;
693 u16 etype;
694 u32 dmac_hi;
695 union {
developerd35bbcc2022-09-28 22:46:01 +0800696#if !defined(CONFIG_MEDIATEK_NETSYS_V2) && !defined(CONFIG_MEDIATEK_NETSYS_V3)
developerfd40db22021-04-29 10:08:25 +0800697 struct hnat_winfo winfo;
698#endif
699 u16 vlan2;
700 };
701 u16 dmac_lo;
702 u32 smac_hi;
703 u16 pppoe_id;
704 u16 smac_lo;
developer22fd7712022-10-06 14:13:52 +0800705#if defined(CONFIG_MEDIATEK_NETSYS_V3)
developerd35bbcc2022-09-28 22:46:01 +0800706 u16 minfo;
707 u16 resv3;
708 struct hnat_winfo winfo;
709 struct hnat_winfo_pao winfo_pao;
710 u32 cdrt_id : 8;
711 u32 tops_entry : 6;
712 u32 resv4 : 2;
713 u32 tport_id : 4;
714 u32 resv5 : 12;
715 u32 resv6;
716 u32 resv7;
717 u32 resv8;
718 u32 resv9;
719 u32 resv10;
720 u32 resv11;
721 u32 resv12;
722 u32 resv13;
developer22fd7712022-10-06 14:13:52 +0800723#elif defined(CONFIG_MEDIATEK_NETSYS_V2)
724 u16 minfo;
725 struct hnat_winfo winfo;
726 u32 resv3;
727 u32 resv4;
728 u16 new_dport;
729 u16 new_sport;
developerfd40db22021-04-29 10:08:25 +0800730#endif
731} __packed;
732
733struct foe_entry {
734 union {
735 struct hnat_unbind_info_blk udib1;
736 struct hnat_bind_info_blk bfib1;
737 struct hnat_ipv4_hnapt ipv4_hnapt;
738 struct hnat_ipv4_dslite ipv4_dslite;
developerd35bbcc2022-09-28 22:46:01 +0800739 struct hnat_ipv4_mape ipv4_mape;
developerfd40db22021-04-29 10:08:25 +0800740 struct hnat_ipv6_3t_route ipv6_3t_route;
741 struct hnat_ipv6_5t_route ipv6_5t_route;
742 struct hnat_ipv6_6rd ipv6_6rd;
743 };
744};
745
746/* If user wants to change default FOE entry number, both DEF_ETRY_NUM and
747 * DEF_ETRY_NUM_CFG need to be modified.
748 */
749#define DEF_ETRY_NUM 8192
developerbc53e5f2021-05-21 10:07:17 +0800750/* feasible values : 32768, 16384, 8192, 4096, 2048, 1024 */
developerfd40db22021-04-29 10:08:25 +0800751#define DEF_ETRY_NUM_CFG TABLE_8K
developerbc53e5f2021-05-21 10:07:17 +0800752/* corresponding values : TABLE_32K, TABLE_16K, TABLE_8K, TABLE_4K, TABLE_2K,
753 * TABLE_1K
754 */
developerfd40db22021-04-29 10:08:25 +0800755#define MAX_EXT_DEVS (0x3fU)
756#define MAX_IF_NUM 64
757
developerd35bbcc2022-09-28 22:46:01 +0800758#if defined(CONFIG_MEDIATEK_NETSYS_V3)
759#define MAX_PPE_NUM 3
760#elif defined(CONFIG_MEDIATEK_NETSYS_V2)
developer471f6562021-05-10 20:48:34 +0800761#define MAX_PPE_NUM 2
762#else
763#define MAX_PPE_NUM 1
764#endif
765#define CFG_PPE_NUM (hnat_priv->ppe_num)
766
developerfd40db22021-04-29 10:08:25 +0800767struct mib_entry {
768 u32 byt_cnt_l;
769 u16 byt_cnt_h;
770 u32 pkt_cnt_l;
771 u8 pkt_cnt_h;
772 u8 resv0;
773 u32 resv1;
774} __packed;
775
776struct hnat_accounting {
777 u64 bytes;
778 u64 packets;
779};
780
781enum mtk_hnat_version {
developerd35bbcc2022-09-28 22:46:01 +0800782 MTK_HNAT_V1 = 1, /* version 1: mt7621, mt7623 */
783 MTK_HNAT_V2, /* version 2: mt7622 */
784 MTK_HNAT_V3, /* version 3: mt7629 */
785 MTK_HNAT_V4, /* version 4: mt7981, mt7986 */
786 MTK_HNAT_V5, /* version 5: mt7988 */
developerfd40db22021-04-29 10:08:25 +0800787};
788
789struct mtk_hnat_data {
790 u8 num_of_sch;
791 bool whnat;
792 bool per_flow_accounting;
793 bool mcast;
794 enum mtk_hnat_version version;
795};
796
797struct mtk_hnat {
798 struct device *dev;
799 void __iomem *fe_base;
developer471f6562021-05-10 20:48:34 +0800800 void __iomem *ppe_base[MAX_PPE_NUM];
801 struct foe_entry *foe_table_cpu[MAX_PPE_NUM];
802 dma_addr_t foe_table_dev[MAX_PPE_NUM];
developerfd40db22021-04-29 10:08:25 +0800803 u8 enable;
804 u8 enable1;
805 struct dentry *root;
developer471f6562021-05-10 20:48:34 +0800806 struct debugfs_regset32 *regset[MAX_PPE_NUM];
developerfd40db22021-04-29 10:08:25 +0800807
developer471f6562021-05-10 20:48:34 +0800808 struct mib_entry *foe_mib_cpu[MAX_PPE_NUM];
809 dma_addr_t foe_mib_dev[MAX_PPE_NUM];
810 struct hnat_accounting *acct[MAX_PPE_NUM];
developerfd40db22021-04-29 10:08:25 +0800811 const struct mtk_hnat_data *data;
812
813 /*devices we plays for*/
814 char wan[IFNAMSIZ];
815 char lan[IFNAMSIZ];
developerd35bbcc2022-09-28 22:46:01 +0800816 char lan2[IFNAMSIZ];
developerfd40db22021-04-29 10:08:25 +0800817 char ppd[IFNAMSIZ];
818 u16 lvid;
819 u16 wvid;
820
821 struct reset_control *rstc;
822
developer471f6562021-05-10 20:48:34 +0800823 u8 ppe_num;
developerfd40db22021-04-29 10:08:25 +0800824 u8 gmac_num;
825 u8 wan_dsa_port;
826 struct ppe_mcast_table *pmcast;
827
828 u32 foe_etry_num;
developer8051e042022-04-08 13:26:36 +0800829 u32 etry_num_cfg;
developerfd40db22021-04-29 10:08:25 +0800830 struct net_device *g_ppdev;
developer8c9c0d02021-06-18 16:15:37 +0800831 struct net_device *g_wandev;
developerfd40db22021-04-29 10:08:25 +0800832 struct net_device *wifi_hook_if[MAX_IF_NUM];
833 struct extdev_entry *ext_if[MAX_EXT_DEVS];
834 struct timer_list hnat_sma_build_entry_timer;
835 struct timer_list hnat_reset_timestamp_timer;
836 struct timer_list hnat_mcast_check_timer;
developer30a47682021-11-02 17:06:14 +0800837 bool nf_stat_en;
developerfd40db22021-04-29 10:08:25 +0800838};
839
840struct extdev_entry {
841 char name[IFNAMSIZ];
842 struct net_device *dev;
843};
844
845struct tcpudphdr {
846 __be16 src;
847 __be16 dst;
848};
849
850enum FoeEntryState { INVALID = 0, UNBIND = 1, BIND = 2, FIN = 3 };
851
852enum FoeIpAct {
853 IPV4_HNAPT = 0,
854 IPV4_HNAT = 1,
855 IPV4_DSLITE = 3,
856 IPV6_3T_ROUTE = 4,
857 IPV6_5T_ROUTE = 5,
858 IPV6_6RD = 7,
developerd35bbcc2022-09-28 22:46:01 +0800859#if defined(CONFIG_MEDIATEK_NETSYS_V2) || defined(CONFIG_MEDIATEK_NETSYS_V3)
developerfd40db22021-04-29 10:08:25 +0800860 IPV4_MAP_T = 8,
861 IPV4_MAP_E = 9,
862#else
863 IPV4_MAP_T = 6,
864 IPV4_MAP_E = 6,
865#endif
866};
867
868/*--------------------------------------------------------------------------*/
869/* Common Definition*/
870/*--------------------------------------------------------------------------*/
871
872#define HNAT_SW_VER "1.1.0"
873#define HASH_SEED_KEY 0x12345678
874
875/*PPE_TB_CFG value*/
developerd35bbcc2022-09-28 22:46:01 +0800876#define ENTRY_128B 0
877#define ENTRY_96B 1
developerfd40db22021-04-29 10:08:25 +0800878#define ENTRY_80B 1
developerfd40db22021-04-29 10:08:25 +0800879#define TABLE_1K 0
880#define TABLE_2K 1
881#define TABLE_4K 2
882#define TABLE_8K 3
883#define TABLE_16K 4
developerbc53e5f2021-05-21 10:07:17 +0800884#define TABLE_32K 5
developerfd40db22021-04-29 10:08:25 +0800885#define SMA_DROP 0 /* Drop the packet */
886#define SMA_DROP2 1 /* Drop the packet */
887#define SMA_ONLY_FWD_CPU 2 /* Only Forward to CPU */
888#define SMA_FWD_CPU_BUILD_ENTRY 3 /* Forward to CPU and build new FOE entry */
889#define HASH_MODE_0 0
890#define HASH_MODE_1 1
891#define HASH_MODE_2 2
892#define HASH_MODE_3 3
893
894/*PPE_FLOW_CFG*/
895#define BIT_FUC_FOE BIT(2)
896#define BIT_FMC_FOE BIT(1)
897#define BIT_FBC_FOE BIT(0)
898#define BIT_UDP_IP4F_NAT_EN BIT(7) /*Enable IPv4 fragment + UDP packet NAT*/
899#define BIT_IPV6_3T_ROUTE_EN BIT(8)
900#define BIT_IPV6_5T_ROUTE_EN BIT(9)
901#define BIT_IPV6_6RD_EN BIT(10)
902#define BIT_IPV4_NAT_EN BIT(12)
903#define BIT_IPV4_NAPT_EN BIT(13)
904#define BIT_IPV4_DSL_EN BIT(14)
905#define BIT_MIB_BUSY BIT(16)
906#define BIT_IPV4_NAT_FRAG_EN BIT(17)
907#define BIT_IPV4_HASH_GREK BIT(19)
908#define BIT_IPV6_HASH_GREK BIT(20)
909#define BIT_IPV4_MAPE_EN BIT(21)
910#define BIT_IPV4_MAPT_EN BIT(22)
911
912/*GDMA_FWD_CFG value*/
developer471f6562021-05-10 20:48:34 +0800913#define BITS_GDM_UFRC_P_PPE (NR_PPE0_PORT << 12)
914#define BITS_GDM_BFRC_P_PPE (NR_PPE0_PORT << 8)
915#define BITS_GDM_MFRC_P_PPE (NR_PPE0_PORT << 4)
916#define BITS_GDM_OFRC_P_PPE (NR_PPE0_PORT << 0)
developerfd40db22021-04-29 10:08:25 +0800917#define BITS_GDM_ALL_FRC_P_PPE \
918 (BITS_GDM_UFRC_P_PPE | BITS_GDM_BFRC_P_PPE | BITS_GDM_MFRC_P_PPE | \
919 BITS_GDM_OFRC_P_PPE)
920
developerd35bbcc2022-09-28 22:46:01 +0800921#define BITS_GDM_UFRC_P_PPE1 (NR_PPE1_PORT << 12)
922#define BITS_GDM_BFRC_P_PPE1 (NR_PPE1_PORT << 8)
923#define BITS_GDM_MFRC_P_PPE1 (NR_PPE1_PORT << 4)
924#define BITS_GDM_OFRC_P_PPE1 (NR_PPE1_PORT << 0)
925#define BITS_GDM_ALL_FRC_P_PPE1 \
926 (BITS_GDM_UFRC_P_PPE1 | BITS_GDM_BFRC_P_PPE1 | \
927 BITS_GDM_MFRC_P_PPE1 | BITS_GDM_OFRC_P_PPE1)
928
929#define BITS_GDM_UFRC_P_PPE2 (NR_PPE2_PORT << 12)
930#define BITS_GDM_BFRC_P_PPE2 (NR_PPE2_PORT << 8)
931#define BITS_GDM_MFRC_P_PPE2 (NR_PPE2_PORT << 4)
932#define BITS_GDM_OFRC_P_PPE2 (NR_PPE2_PORT << 0)
933#define BITS_GDM_ALL_FRC_P_PPE2 \
934 (BITS_GDM_UFRC_P_PPE2 | BITS_GDM_BFRC_P_PPE2 | \
935 BITS_GDM_MFRC_P_PPE2 | BITS_GDM_OFRC_P_PPE2)
936
developerfd40db22021-04-29 10:08:25 +0800937#define BITS_GDM_UFRC_P_CPU_PDMA (NR_PDMA_PORT << 12)
938#define BITS_GDM_BFRC_P_CPU_PDMA (NR_PDMA_PORT << 8)
939#define BITS_GDM_MFRC_P_CPU_PDMA (NR_PDMA_PORT << 4)
940#define BITS_GDM_OFRC_P_CPU_PDMA (NR_PDMA_PORT << 0)
941#define BITS_GDM_ALL_FRC_P_CPU_PDMA \
942 (BITS_GDM_UFRC_P_CPU_PDMA | BITS_GDM_BFRC_P_CPU_PDMA | \
943 BITS_GDM_MFRC_P_CPU_PDMA | BITS_GDM_OFRC_P_CPU_PDMA)
944
945#define BITS_GDM_UFRC_P_CPU_QDMA (NR_QDMA_PORT << 12)
946#define BITS_GDM_BFRC_P_CPU_QDMA (NR_QDMA_PORT << 8)
947#define BITS_GDM_MFRC_P_CPU_QDMA (NR_QDMA_PORT << 4)
948#define BITS_GDM_OFRC_P_CPU_QDMA (NR_QDMA_PORT << 0)
949#define BITS_GDM_ALL_FRC_P_CPU_QDMA \
950 (BITS_GDM_UFRC_P_CPU_QDMA | BITS_GDM_BFRC_P_CPU_QDMA | \
951 BITS_GDM_MFRC_P_CPU_QDMA | BITS_GDM_OFRC_P_CPU_QDMA)
952
953#define BITS_GDM_UFRC_P_DISCARD (NR_DISCARD << 12)
954#define BITS_GDM_BFRC_P_DISCARD (NR_DISCARD << 8)
955#define BITS_GDM_MFRC_P_DISCARD (NR_DISCARD << 4)
956#define BITS_GDM_OFRC_P_DISCARD (NR_DISCARD << 0)
957#define BITS_GDM_ALL_FRC_P_DISCARD \
958 (BITS_GDM_UFRC_P_DISCARD | BITS_GDM_BFRC_P_DISCARD | \
959 BITS_GDM_MFRC_P_DISCARD | BITS_GDM_OFRC_P_DISCARD)
960
961#define hnat_is_enabled(hnat_priv) (hnat_priv->enable)
962#define hnat_enabled(hnat_priv) (hnat_priv->enable = 1)
963#define hnat_disabled(hnat_priv) (hnat_priv->enable = 0)
964#define hnat_is_enabled1(hnat_priv) (hnat_priv->enable1)
965#define hnat_enabled1(hnat_priv) (hnat_priv->enable1 = 1)
966#define hnat_disabled1(hnat_priv) (hnat_priv->enable1 = 0)
967
968#define entry_hnat_is_bound(e) (e->bfib1.state == BIND)
969#define entry_hnat_state(e) (e->bfib1.state)
970
971#define skb_hnat_is_hashed(skb) \
972 (skb_hnat_entry(skb) != 0x3fff && skb_hnat_entry(skb) < hnat_priv->foe_etry_num)
developerd35bbcc2022-09-28 22:46:01 +0800973#define FROM_GE_LAN_GRP(skb) (FROM_GE_LAN(skb) | FROM_GE_LAN2(skb))
developerfd40db22021-04-29 10:08:25 +0800974#define FROM_GE_LAN(skb) (skb_hnat_iface(skb) == FOE_MAGIC_GE_LAN)
developerd35bbcc2022-09-28 22:46:01 +0800975#define FROM_GE_LAN2(skb) (skb_hnat_iface(skb) == FOE_MAGIC_GE_LAN2)
developerfd40db22021-04-29 10:08:25 +0800976#define FROM_GE_WAN(skb) (skb_hnat_iface(skb) == FOE_MAGIC_GE_WAN)
977#define FROM_GE_PPD(skb) (skb_hnat_iface(skb) == FOE_MAGIC_GE_PPD)
978#define FROM_GE_VIRTUAL(skb) (skb_hnat_iface(skb) == FOE_MAGIC_GE_VIRTUAL)
979#define FROM_EXT(skb) (skb_hnat_iface(skb) == FOE_MAGIC_EXT)
developere567ad32021-05-25 17:16:17 +0800980#define FROM_WED(skb) ((skb_hnat_iface(skb) == FOE_MAGIC_WED0) || \
981 (skb_hnat_iface(skb) == FOE_MAGIC_WED1))
developerfd40db22021-04-29 10:08:25 +0800982#define FOE_MAGIC_GE_LAN 0x1
983#define FOE_MAGIC_GE_WAN 0x2
984#define FOE_MAGIC_EXT 0x3
985#define FOE_MAGIC_GE_VIRTUAL 0x4
986#define FOE_MAGIC_GE_PPD 0x5
developerd35bbcc2022-09-28 22:46:01 +0800987#define FOE_MAGIC_GE_LAN2 0x6
developere567ad32021-05-25 17:16:17 +0800988#define FOE_MAGIC_WED0 0x78
989#define FOE_MAGIC_WED1 0x79
developerd35bbcc2022-09-28 22:46:01 +0800990#define FOE_MAGIC_WED2 0x7A
developerfd40db22021-04-29 10:08:25 +0800991#define FOE_INVALID 0xf
992#define index6b(i) (0x3fU - i)
993
994#define IPV4_HNAPT 0
995#define IPV4_HNAT 1
996#define IP_FORMAT(addr) \
997 (((unsigned char *)&addr)[3], ((unsigned char *)&addr)[2], \
998 ((unsigned char *)&addr)[1], ((unsigned char *)&addr)[0])
999
1000/*PSE Ports*/
1001#define NR_PDMA_PORT 0
1002#define NR_GMAC1_PORT 1
1003#define NR_GMAC2_PORT 2
developerd35bbcc2022-09-28 22:46:01 +08001004#if defined(CONFIG_MEDIATEK_NETSYS_V2) || defined(CONFIG_MEDIATEK_NETSYS_V3)
developer471f6562021-05-10 20:48:34 +08001005#define NR_WHNAT_WDMA_PORT EINVAL
1006#define NR_PPE0_PORT 3
1007#define NR_PPE1_PORT 4
developerd35bbcc2022-09-28 22:46:01 +08001008#define NR_PPE2_PORT 0xC
developer471f6562021-05-10 20:48:34 +08001009#else
developerfd40db22021-04-29 10:08:25 +08001010#define NR_WHNAT_WDMA_PORT 3
developer471f6562021-05-10 20:48:34 +08001011#define NR_PPE0_PORT 4
1012#endif
developerfd40db22021-04-29 10:08:25 +08001013#define NR_QDMA_PORT 5
1014#define NR_DISCARD 7
1015#define NR_WDMA0_PORT 8
1016#define NR_WDMA1_PORT 9
developerd35bbcc2022-09-28 22:46:01 +08001017#define NR_GMAC3_PORT 15
developerfd40db22021-04-29 10:08:25 +08001018#define LAN_DEV_NAME hnat_priv->lan
developerd35bbcc2022-09-28 22:46:01 +08001019#define LAN2_DEV_NAME hnat_priv->lan2
developerfd40db22021-04-29 10:08:25 +08001020#define IS_WAN(dev) \
1021 (!strncmp((dev)->name, hnat_priv->wan, strlen(hnat_priv->wan)))
developerd35bbcc2022-09-28 22:46:01 +08001022#define IS_LAN_GRP(dev) (IS_LAN(dev) | IS_LAN2(dev))
developerfd40db22021-04-29 10:08:25 +08001023#define IS_LAN(dev) (!strncmp(dev->name, LAN_DEV_NAME, strlen(LAN_DEV_NAME)))
developerd35bbcc2022-09-28 22:46:01 +08001024#define IS_LAN2(dev) (!strncmp(dev->name, LAN2_DEV_NAME, \
1025 strlen(LAN2_DEV_NAME)))
developerfd40db22021-04-29 10:08:25 +08001026#define IS_BR(dev) (!strncmp(dev->name, "br", 2))
1027#define IS_WHNAT(dev) \
1028 ((hnat_priv->data->whnat && \
1029 (get_wifi_hook_if_index_from_dev(dev) != 0)) ? 1 : 0)
1030#define IS_EXT(dev) ((get_index_from_dev(dev) != 0) ? 1 : 0)
1031#define IS_PPD(dev) (!strcmp(dev->name, hnat_priv->ppd))
1032#define IS_IPV4_HNAPT(x) (((x)->bfib1.pkt_type == IPV4_HNAPT) ? 1 : 0)
1033#define IS_IPV4_HNAT(x) (((x)->bfib1.pkt_type == IPV4_HNAT) ? 1 : 0)
1034#define IS_IPV4_GRP(x) (IS_IPV4_HNAPT(x) | IS_IPV4_HNAT(x))
1035#define IS_IPV4_DSLITE(x) (((x)->bfib1.pkt_type == IPV4_DSLITE) ? 1 : 0)
1036#define IS_IPV4_MAPE(x) (((x)->bfib1.pkt_type == IPV4_MAP_E) ? 1 : 0)
1037#define IS_IPV4_MAPT(x) (((x)->bfib1.pkt_type == IPV4_MAP_T) ? 1 : 0)
1038#define IS_IPV6_3T_ROUTE(x) (((x)->bfib1.pkt_type == IPV6_3T_ROUTE) ? 1 : 0)
1039#define IS_IPV6_5T_ROUTE(x) (((x)->bfib1.pkt_type == IPV6_5T_ROUTE) ? 1 : 0)
1040#define IS_IPV6_6RD(x) (((x)->bfib1.pkt_type == IPV6_6RD) ? 1 : 0)
1041#define IS_IPV6_GRP(x) \
1042 (IS_IPV6_3T_ROUTE(x) | IS_IPV6_5T_ROUTE(x) | IS_IPV6_6RD(x) | \
1043 IS_IPV4_DSLITE(x) | IS_IPV4_MAPE(x) | IS_IPV4_MAPT(x))
1044#define IS_BOND_MODE (!strncmp(LAN_DEV_NAME, "bond", 4))
1045#define IS_GMAC1_MODE ((hnat_priv->gmac_num == 1) ? 1 : 0)
developeraf07fad2021-11-19 17:53:42 +08001046#define IS_HQOS_MODE (qos_toggle == 1)
1047#define IS_PPPQ_MODE (qos_toggle == 2) /* Per Port Per Queue */
developer70cdf6e2021-12-07 18:58:35 +08001048#define MAX_PPPQ_PORT_NUM 6
developerfd40db22021-04-29 10:08:25 +08001049
1050#define es(entry) (entry_state[entry->bfib1.state])
1051#define ei(entry, end) (hnat_priv->foe_etry_num - (int)(end - entry))
1052#define pt(entry) (packet_type[entry->ipv4_hnapt.bfib1.pkt_type])
1053#define ipv4_smac(mac, e) \
1054 ({ \
1055 mac[0] = e->ipv4_hnapt.smac_hi[3]; \
1056 mac[1] = e->ipv4_hnapt.smac_hi[2]; \
1057 mac[2] = e->ipv4_hnapt.smac_hi[1]; \
1058 mac[3] = e->ipv4_hnapt.smac_hi[0]; \
1059 mac[4] = e->ipv4_hnapt.smac_lo[1]; \
1060 mac[5] = e->ipv4_hnapt.smac_lo[0]; \
1061 })
1062#define ipv4_dmac(mac, e) \
1063 ({ \
1064 mac[0] = e->ipv4_hnapt.dmac_hi[3]; \
1065 mac[1] = e->ipv4_hnapt.dmac_hi[2]; \
1066 mac[2] = e->ipv4_hnapt.dmac_hi[1]; \
1067 mac[3] = e->ipv4_hnapt.dmac_hi[0]; \
1068 mac[4] = e->ipv4_hnapt.dmac_lo[1]; \
1069 mac[5] = e->ipv4_hnapt.dmac_lo[0]; \
1070 })
1071
1072#define IS_DSA_LAN(dev) (!strncmp(dev->name, "lan", 3))
developer399ec072022-06-24 16:07:41 +08001073#define IS_DSA_1G_LAN(dev) (!strncmp(dev->name, "lan", 3) && \
1074 strcmp(dev->name, "lan5"))
developerfd40db22021-04-29 10:08:25 +08001075#define IS_DSA_WAN(dev) (!strncmp(dev->name, "wan", 3))
1076#define NONE_DSA_PORT 0xff
1077#define MAX_CRSN_NUM 32
1078#define IPV6_HDR_LEN 40
1079
1080/*QDMA_PAGE value*/
1081#define NUM_OF_Q_PER_PAGE 16
1082
1083/*IPv6 Header*/
1084#ifndef NEXTHDR_IPIP
1085#define NEXTHDR_IPIP 4
1086#endif
1087
1088extern const struct of_device_id of_hnat_match[];
1089extern struct mtk_hnat *hnat_priv;
1090
1091#if defined(CONFIG_NET_DSA_MT7530)
developeraf07fad2021-11-19 17:53:42 +08001092u32 hnat_dsa_fill_stag(const struct net_device *netdev,
1093 struct foe_entry *entry,
1094 struct flow_offload_hw_path *hw_path,
1095 u16 eth_proto, int mape);
developerfd40db22021-04-29 10:08:25 +08001096
1097static inline bool hnat_dsa_is_enable(struct mtk_hnat *priv)
1098{
1099 return (priv->wan_dsa_port != NONE_DSA_PORT);
1100}
1101#else
developeraf07fad2021-11-19 17:53:42 +08001102static inline u32 hnat_dsa_fill_stag(const struct net_device *netdev,
1103 struct foe_entry *entry,
1104 struct flow_offload_hw_path *hw_path,
1105 u16 eth_proto, int mape)
developerfd40db22021-04-29 10:08:25 +08001106{
developerd35bbcc2022-09-28 22:46:01 +08001107 return 0;
developerfd40db22021-04-29 10:08:25 +08001108}
1109
1110static inline bool hnat_dsa_is_enable(struct mtk_hnat *priv)
1111{
1112 return false;
1113}
1114#endif
1115
1116void hnat_deinit_debugfs(struct mtk_hnat *h);
1117int hnat_init_debugfs(struct mtk_hnat *h);
1118int hnat_register_nf_hooks(void);
1119void hnat_unregister_nf_hooks(void);
1120int whnat_adjust_nf_hooks(void);
1121int mtk_hqos_ptype_cb(struct sk_buff *skb, struct net_device *dev,
1122 struct packet_type *pt, struct net_device *unused);
1123extern int dbg_cpu_reason;
1124extern int debug_level;
1125extern int hook_toggle;
1126extern int mape_toggle;
developeraf07fad2021-11-19 17:53:42 +08001127extern int qos_toggle;
developerfd40db22021-04-29 10:08:25 +08001128
1129int ext_if_add(struct extdev_entry *ext_entry);
1130int ext_if_del(struct extdev_entry *ext_entry);
1131void cr_set_field(void __iomem *reg, u32 field, u32 val);
1132int mtk_sw_nat_hook_tx(struct sk_buff *skb, int gmac_no);
1133int mtk_sw_nat_hook_rx(struct sk_buff *skb);
1134void mtk_ppe_dev_register_hook(struct net_device *dev);
1135void mtk_ppe_dev_unregister_hook(struct net_device *dev);
1136int nf_hnat_netdevice_event(struct notifier_block *unused, unsigned long event,
1137 void *ptr);
1138int nf_hnat_netevent_handler(struct notifier_block *unused, unsigned long event,
1139 void *ptr);
1140uint32_t foe_dump_pkt(struct sk_buff *skb);
1141uint32_t hnat_cpu_reason_cnt(struct sk_buff *skb);
1142int hnat_enable_hook(void);
1143int hnat_disable_hook(void);
1144void hnat_cache_ebl(int enable);
developer70cdf6e2021-12-07 18:58:35 +08001145void hnat_qos_shaper_ebl(u32 id, u32 enable);
developerfd40db22021-04-29 10:08:25 +08001146void set_gmac_ppe_fwd(int gmac_no, int enable);
developer4c32b7a2021-11-13 16:46:43 +08001147int entry_detail(u32 ppe_id, int index);
developer731b98f2021-09-17 17:44:37 +08001148int entry_delete_by_mac(u8 *mac);
developer4c32b7a2021-11-13 16:46:43 +08001149int entry_delete(u32 ppe_id, int index);
developer8051e042022-04-08 13:26:36 +08001150int hnat_warm_init(void);
1151
developer4c32b7a2021-11-13 16:46:43 +08001152struct hnat_accounting *hnat_get_count(struct mtk_hnat *h, u32 ppe_id,
developer30a47682021-11-02 17:06:14 +08001153 u32 index, struct hnat_accounting *diff);
developerfd40db22021-04-29 10:08:25 +08001154
1155static inline u16 foe_timestamp(struct mtk_hnat *h)
1156{
1157 return (readl(hnat_priv->fe_base + 0x0010)) & 0xffff;
1158}