blob: 018c7b9c06209ab953be5295bc7539491899e558 [file] [log] [blame]
developerde9ecce2023-05-22 11:17:16 +08001From 9cf11ae2bfdf56babbdfe4fe03f61f492c06ce1a Mon Sep 17 00:00:00 2001
developer1bc2ce22023-03-25 00:47:41 +08002From: Shayne Chen <shayne.chen@mediatek.com>
3Date: Fri, 24 Mar 2023 14:02:32 +0800
developerde9ecce2023-05-22 11:17:16 +08004Subject: [PATCH 1000/1001] mt76: mt7996: add debug tool
developer1bc2ce22023-03-25 00:47:41 +08005
6Change-Id: Ie10390b01f17db893dbfbf3221bf63a4bd1fe38f
7---
8 mt7996/Makefile | 3 +
9 mt7996/debugfs.c | 31 +-
10 mt7996/mcu.c | 4 +
11 mt7996/mt7996.h | 15 +
12 mt7996/mtk_debug.h | 2166 ++++++++++++++++++++++++++++++++++++++
13 mt7996/mtk_debugfs.c | 2344 ++++++++++++++++++++++++++++++++++++++++++
14 mt7996/mtk_mcu.c | 18 +
15 mt7996/mtk_mcu.h | 16 +
16 tools/fwlog.c | 25 +-
17 9 files changed, 4606 insertions(+), 16 deletions(-)
18 create mode 100644 mt7996/mtk_debug.h
19 create mode 100644 mt7996/mtk_debugfs.c
20 create mode 100644 mt7996/mtk_mcu.c
21 create mode 100644 mt7996/mtk_mcu.h
22
23diff --git a/mt7996/Makefile b/mt7996/Makefile
developerde9ecce2023-05-22 11:17:16 +080024index bed9efd6..9ef0b824 100644
developer1bc2ce22023-03-25 00:47:41 +080025--- a/mt7996/Makefile
26+++ b/mt7996/Makefile
27@@ -1,4 +1,5 @@
28 # SPDX-License-Identifier: ISC
29+EXTRA_CFLAGS += -DCONFIG_MTK_DEBUG
30
31 obj-$(CONFIG_MT7996E) += mt7996e.o
32
developerde9ecce2023-05-22 11:17:16 +080033@@ -8,3 +9,5 @@ mt7996e-y := pci.o init.o dma.o eeprom.o main.o mcu.o mac.o \
34 mt7996e-$(CONFIG_DEV_COREDUMP) += coredump.o
developer1bc2ce22023-03-25 00:47:41 +080035
36 mt7996e-$(CONFIG_NL80211_TESTMODE) += testmode.o
37+
38+mt7996e-y += mtk_debugfs.o mtk_mcu.o
39diff --git a/mt7996/debugfs.c b/mt7996/debugfs.c
developerde9ecce2023-05-22 11:17:16 +080040index 04220180..0bfded17 100644
developer1bc2ce22023-03-25 00:47:41 +080041--- a/mt7996/debugfs.c
42+++ b/mt7996/debugfs.c
developerde9ecce2023-05-22 11:17:16 +080043@@ -301,6 +301,9 @@ mt7996_fw_debug_wm_set(void *data, u64 val)
developer1bc2ce22023-03-25 00:47:41 +080044 int ret;
45
46 dev->fw_debug_wm = val ? MCU_FW_LOG_TO_HOST : 0;
47+#ifdef CONFIG_MTK_DEBUG
48+ dev->fw_debug_wm = val;
49+#endif
50
51 if (dev->fw_debug_bin)
52 val = MCU_FW_LOG_RELAY;
developerde9ecce2023-05-22 11:17:16 +080053@@ -407,16 +410,22 @@ mt7996_fw_debug_bin_set(void *data, u64 val)
developer1bc2ce22023-03-25 00:47:41 +080054 };
55 struct mt7996_dev *dev = data;
56
57- if (!dev->relay_fwlog)
58+ if (!dev->relay_fwlog) {
59 dev->relay_fwlog = relay_open("fwlog_data", dev->debugfs_dir,
60 1500, 512, &relay_cb, NULL);
61- if (!dev->relay_fwlog)
62- return -ENOMEM;
63+ if (!dev->relay_fwlog)
64+ return -ENOMEM;
65+ }
66
67 dev->fw_debug_bin = val;
68
69 relay_reset(dev->relay_fwlog);
70
71+ if (dev->relay_fwlog && !val) {
72+ relay_close(dev->relay_fwlog);
73+ dev->relay_fwlog = NULL;
74+ }
75+
76 return mt7996_fw_debug_wm_set(dev, dev->fw_debug_wm);
77 }
78
developerde9ecce2023-05-22 11:17:16 +080079@@ -821,8 +830,13 @@ int mt7996_init_debugfs(struct mt7996_phy *phy)
developer1bc2ce22023-03-25 00:47:41 +080080 mt7996_rdd_monitor);
81 }
82
83- if (phy == &dev->phy)
84+ if (phy == &dev->phy) {
85 dev->debugfs_dir = dir;
86+#ifdef CONFIG_MTK_DEBUG
87+ debugfs_create_u16("wlan_idx", 0600, dir, &dev->wlan_idx);
88+ mt7996_mtk_init_debugfs(phy, dir);
89+#endif
90+ }
91
92 return 0;
93 }
developerde9ecce2023-05-22 11:17:16 +080094@@ -836,6 +850,12 @@ mt7996_debugfs_write_fwlog(struct mt7996_dev *dev, const void *hdr, int hdrlen,
developer1bc2ce22023-03-25 00:47:41 +080095 void *dest;
96
97 spin_lock_irqsave(&lock, flags);
98+
99+ if (!dev->relay_fwlog) {
100+ spin_unlock_irqrestore(&lock, flags);
101+ return;
102+ }
103+
104 dest = relay_reserve(dev->relay_fwlog, hdrlen + len + 4);
105 if (dest) {
106 *(u32 *)dest = hdrlen + len;
developerde9ecce2023-05-22 11:17:16 +0800107@@ -868,9 +888,6 @@ void mt7996_debugfs_rx_fw_monitor(struct mt7996_dev *dev, const void *data, int
developer1bc2ce22023-03-25 00:47:41 +0800108 .msg_type = cpu_to_le16(PKT_TYPE_RX_FW_MONITOR),
109 };
110
111- if (!dev->relay_fwlog)
112- return;
113-
114 hdr.serial_id = cpu_to_le16(dev->fw_debug_seq++);
115 hdr.timestamp = cpu_to_le32(mt76_rr(dev, MT_LPON_FRCR(0)));
116 hdr.len = *(__le16 *)data;
117diff --git a/mt7996/mcu.c b/mt7996/mcu.c
developerde9ecce2023-05-22 11:17:16 +0800118index f2bfbd8a..ef779cf9 100644
developer1bc2ce22023-03-25 00:47:41 +0800119--- a/mt7996/mcu.c
120+++ b/mt7996/mcu.c
developerde9ecce2023-05-22 11:17:16 +0800121@@ -2324,6 +2324,7 @@ static int mt7996_load_patch(struct mt7996_dev *dev)
developer1bc2ce22023-03-25 00:47:41 +0800122
123 dev_info(dev->mt76.dev, "HW/SW Version: 0x%x, Build Time: %.16s\n",
124 be32_to_cpu(hdr->hw_sw_ver), hdr->build_date);
125+ memcpy(dev->dbg.patch_build_date, hdr->build_date, sizeof(dev->dbg.patch_build_date));
126
127 for (i = 0; i < be32_to_cpu(hdr->desc.n_region); i++) {
128 struct mt7996_patch_sec *sec;
developerde9ecce2023-05-22 11:17:16 +0800129@@ -2453,6 +2454,9 @@ static int mt7996_load_ram(struct mt7996_dev *dev)
developer1bc2ce22023-03-25 00:47:41 +0800130 hdr = (const struct mt7996_fw_trailer *) \
131 (fw->data + fw->size - sizeof(*hdr)); \
132 \
133+ memcpy(dev->dbg.ram_build_date[MT7996_RAM_TYPE_##_type], \
134+ hdr->build_date, \
135+ sizeof(dev->dbg.ram_build_date[MT7996_RAM_TYPE_##_type]));\
136 dev_info(dev->mt76.dev, \
137 "%s Firmware Version: %.10s, Build Time: %.15s\n", \
138 #_type, hdr->fw_ver, hdr->build_date); \
139diff --git a/mt7996/mt7996.h b/mt7996/mt7996.h
developerde9ecce2023-05-22 11:17:16 +0800140index 9bf3bf1a..1ac54520 100644
developer1bc2ce22023-03-25 00:47:41 +0800141--- a/mt7996/mt7996.h
142+++ b/mt7996/mt7996.h
developerde9ecce2023-05-22 11:17:16 +0800143@@ -339,6 +339,17 @@ struct mt7996_dev {
developer1bc2ce22023-03-25 00:47:41 +0800144 u32 reg_l2_backup;
145
146 u8 wtbl_size_group;
147+
148+#ifdef CONFIG_MTK_DEBUG
149+ u16 wlan_idx;
150+ struct {
151+ char patch_build_date[16];
152+ char ram_build_date[3][15];
153+ u32 fw_dbg_module;
154+ u8 fw_dbg_lv;
155+ u32 bcn_total_cnt[__MT_MAX_BAND];
156+ } dbg;
157+#endif
158 };
159
160 enum {
developerde9ecce2023-05-22 11:17:16 +0800161@@ -608,4 +619,8 @@ void mt7996_sta_add_debugfs(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
developer1bc2ce22023-03-25 00:47:41 +0800162 struct ieee80211_sta *sta, struct dentry *dir);
163 #endif
164
165+#ifdef CONFIG_MTK_DEBUG
166+int mt7996_mtk_init_debugfs(struct mt7996_phy *phy, struct dentry *dir);
167+#endif
168+
169 #endif
170diff --git a/mt7996/mtk_debug.h b/mt7996/mtk_debug.h
171new file mode 100644
developerde9ecce2023-05-22 11:17:16 +0800172index 00000000..a48bac50
developer1bc2ce22023-03-25 00:47:41 +0800173--- /dev/null
174+++ b/mt7996/mtk_debug.h
175@@ -0,0 +1,2166 @@
176+#ifndef __MTK_DEBUG_H
177+#define __MTK_DEBUG_H
178+
179+#ifdef CONFIG_MTK_DEBUG
180+#define NO_SHIFT_DEFINE 0xFFFFFFFF
181+#define BITS(m, n) (~(BIT(m)-1) & ((BIT(n) - 1) | BIT(n)))
182+
183+#define GET_FIELD(_field, _reg) \
184+ ({ \
185+ (((_reg) & (_field##_MASK)) >> (_field##_SHIFT)); \
186+ })
187+
188+/* AGG */
189+#define BN0_WF_AGG_TOP_BASE 0x820e2000
190+#define BN1_WF_AGG_TOP_BASE 0x820f2000
191+#define IP1_BN0_WF_AGG_TOP_BASE 0x830e2000
192+
193+#define BN0_WF_AGG_TOP_SCR_ADDR (BN0_WF_AGG_TOP_BASE + 0x0) // 2000
194+#define BN0_WF_AGG_TOP_SCR0_ADDR (BN0_WF_AGG_TOP_BASE + 0x4) // 2004
195+#define BN0_WF_AGG_TOP_SCR1_ADDR (BN0_WF_AGG_TOP_BASE + 0x8) // 2008
196+#define BN0_WF_AGG_TOP_BCR_ADDR (BN0_WF_AGG_TOP_BASE + 0xc) // 200C
197+#define BN0_WF_AGG_TOP_BWCR_ADDR (BN0_WF_AGG_TOP_BASE + 0x10) // 2010
198+#define BN0_WF_AGG_TOP_ARCR0_ADDR (BN0_WF_AGG_TOP_BASE + 0x14) // 2014
199+#define BN0_WF_AGG_TOP_ARUCR_ADDR (BN0_WF_AGG_TOP_BASE + 0x18) // 2018
200+#define BN0_WF_AGG_TOP_ARDCR_ADDR (BN0_WF_AGG_TOP_BASE + 0x1c) // 201C
201+#define BN0_WF_AGG_TOP_AALCR0_ADDR (BN0_WF_AGG_TOP_BASE + 0x20) // 2020
202+#define BN0_WF_AGG_TOP_AALCR1_ADDR (BN0_WF_AGG_TOP_BASE + 0x24) // 2024
203+#define BN0_WF_AGG_TOP_PCR0_ADDR (BN0_WF_AGG_TOP_BASE + 0x28) // 2028
204+#define BN0_WF_AGG_TOP_PCR1_ADDR (BN0_WF_AGG_TOP_BASE + 0x2c) // 202C
205+#define BN0_WF_AGG_TOP_TTCR0_ADDR (BN0_WF_AGG_TOP_BASE + 0x30) // 2030
206+#define BN0_WF_AGG_TOP_TTCR1_ADDR (BN0_WF_AGG_TOP_BASE + 0x34) // 2034
207+#define BN0_WF_AGG_TOP_ACR1_ADDR (BN0_WF_AGG_TOP_BASE + 0x38) // 2038
208+#define BN0_WF_AGG_TOP_ACR4_ADDR (BN0_WF_AGG_TOP_BASE + 0x3c) // 203C
209+#define BN0_WF_AGG_TOP_ACR5_ADDR (BN0_WF_AGG_TOP_BASE + 0x40) // 2040
210+#define BN0_WF_AGG_TOP_ACR6_ADDR (BN0_WF_AGG_TOP_BASE + 0x44) // 2044
211+#define BN0_WF_AGG_TOP_ACR8_ADDR (BN0_WF_AGG_TOP_BASE + 0x4c) // 204C
212+#define BN0_WF_AGG_TOP_MRCR_ADDR (BN0_WF_AGG_TOP_BASE + 0x50) // 2050
213+#define BN0_WF_AGG_TOP_MMPDR_ADDR (BN0_WF_AGG_TOP_BASE + 0x54) // 2054
214+#define BN0_WF_AGG_TOP_GFPDR_ADDR (BN0_WF_AGG_TOP_BASE + 0x58) // 2058
215+#define BN0_WF_AGG_TOP_VHTPDR_ADDR (BN0_WF_AGG_TOP_BASE + 0x5c) // 205C
216+#define BN0_WF_AGG_TOP_HEPDR_ADDR (BN0_WF_AGG_TOP_BASE + 0x60) // 2060
217+#define BN0_WF_AGG_TOP_CTCR_ADDR (BN0_WF_AGG_TOP_BASE + 0x64) // 2064
218+#define BN0_WF_AGG_TOP_ATCR3_ADDR (BN0_WF_AGG_TOP_BASE + 0x68) // 2068
219+#define BN0_WF_AGG_TOP_SRCR_ADDR (BN0_WF_AGG_TOP_BASE + 0x6c) // 206C
220+#define BN0_WF_AGG_TOP_VBCR_ADDR (BN0_WF_AGG_TOP_BASE + 0x70) // 2070
221+#define BN0_WF_AGG_TOP_TCR_ADDR (BN0_WF_AGG_TOP_BASE + 0x74) // 2074
222+#define BN0_WF_AGG_TOP_SRHS_ADDR (BN0_WF_AGG_TOP_BASE + 0x78) // 2078
223+#define BN0_WF_AGG_TOP_DBRCR0_ADDR (BN0_WF_AGG_TOP_BASE + 0x7c) // 207C
224+#define BN0_WF_AGG_TOP_DBRCR1_ADDR (BN0_WF_AGG_TOP_BASE + 0x80) // 2080
225+#define BN0_WF_AGG_TOP_CTETCR_ADDR (BN0_WF_AGG_TOP_BASE + 0x84) // 2084
226+#define BN0_WF_AGG_TOP_WPDR_ADDR (BN0_WF_AGG_TOP_BASE + 0x88) // 2088
227+#define BN0_WF_AGG_TOP_PLRPDR_ADDR (BN0_WF_AGG_TOP_BASE + 0x8c) // 208C
228+#define BN0_WF_AGG_TOP_CECR_ADDR (BN0_WF_AGG_TOP_BASE + 0x90) // 2090
229+#define BN0_WF_AGG_TOP_OMRCR0_ADDR (BN0_WF_AGG_TOP_BASE + 0x94) // 2094
230+#define BN0_WF_AGG_TOP_OMRCR1_ADDR (BN0_WF_AGG_TOP_BASE + 0x98) // 2098
231+#define BN0_WF_AGG_TOP_OMRCR2_ADDR (BN0_WF_AGG_TOP_BASE + 0x9c) // 209C
232+#define BN0_WF_AGG_TOP_OMRCR3_ADDR (BN0_WF_AGG_TOP_BASE + 0xa0) // 20A0
233+#define BN0_WF_AGG_TOP_TMCR_ADDR (BN0_WF_AGG_TOP_BASE + 0xa4) // 20A4
234+#define BN0_WF_AGG_TOP_TWTCR_ADDR (BN0_WF_AGG_TOP_BASE + 0xa8) // 20A8
235+#define BN0_WF_AGG_TOP_TWTSTACR_ADDR (BN0_WF_AGG_TOP_BASE + 0xac) // 20AC
236+#define BN0_WF_AGG_TOP_TWTE0TB_ADDR (BN0_WF_AGG_TOP_BASE + 0xb0) // 20B0
237+#define BN0_WF_AGG_TOP_TWTE1TB_ADDR (BN0_WF_AGG_TOP_BASE + 0xb4) // 20B4
238+#define BN0_WF_AGG_TOP_TWTE2TB_ADDR (BN0_WF_AGG_TOP_BASE + 0xb8) // 20B8
239+#define BN0_WF_AGG_TOP_TWTE3TB_ADDR (BN0_WF_AGG_TOP_BASE + 0xbc) // 20BC
240+#define BN0_WF_AGG_TOP_TWTE4TB_ADDR (BN0_WF_AGG_TOP_BASE + 0xc0) // 20C0
241+#define BN0_WF_AGG_TOP_TWTE5TB_ADDR (BN0_WF_AGG_TOP_BASE + 0xc4) // 20C4
242+#define BN0_WF_AGG_TOP_TWTE6TB_ADDR (BN0_WF_AGG_TOP_BASE + 0xc8) // 20C8
243+#define BN0_WF_AGG_TOP_TWTE7TB_ADDR (BN0_WF_AGG_TOP_BASE + 0xcc) // 20CC
244+#define BN0_WF_AGG_TOP_TWTE8TB_ADDR (BN0_WF_AGG_TOP_BASE + 0xd0) // 20D0
245+#define BN0_WF_AGG_TOP_TWTE9TB_ADDR (BN0_WF_AGG_TOP_BASE + 0xd4) // 20D4
246+#define BN0_WF_AGG_TOP_TWTEATB_ADDR (BN0_WF_AGG_TOP_BASE + 0xd8) // 20D8
247+#define BN0_WF_AGG_TOP_TWTEBTB_ADDR (BN0_WF_AGG_TOP_BASE + 0xdc) // 20DC
248+#define BN0_WF_AGG_TOP_TWTECTB_ADDR (BN0_WF_AGG_TOP_BASE + 0xe0) // 20E0
249+#define BN0_WF_AGG_TOP_TWTEDTB_ADDR (BN0_WF_AGG_TOP_BASE + 0xe4) // 20E4
250+#define BN0_WF_AGG_TOP_TWTEETB_ADDR (BN0_WF_AGG_TOP_BASE + 0xe8) // 20E8
251+#define BN0_WF_AGG_TOP_TWTEFTB_ADDR (BN0_WF_AGG_TOP_BASE + 0xec) // 20EC
252+#define BN0_WF_AGG_TOP_AALCR2_ADDR (BN0_WF_AGG_TOP_BASE + 0xf0) // 20F0
253+#define BN0_WF_AGG_TOP_AALCR3_ADDR (BN0_WF_AGG_TOP_BASE + 0xf4) // 20F4
254+#define BN0_WF_AGG_TOP_AALCR4_ADDR (BN0_WF_AGG_TOP_BASE + 0xf8) // 20F8
255+#define BN0_WF_AGG_TOP_AALCR5_ADDR (BN0_WF_AGG_TOP_BASE + 0xfc) // 20FC
256+#define BN0_WF_AGG_TOP_AALCR6_ADDR (BN0_WF_AGG_TOP_BASE + 0x100) // 2100
257+#define BN0_WF_AGG_TOP_AALCR7_ADDR (BN0_WF_AGG_TOP_BASE + 0x104) // 2104
258+#define BN0_WF_AGG_TOP_ATCR0_ADDR (BN0_WF_AGG_TOP_BASE + 0x108) // 2108
259+#define BN0_WF_AGG_TOP_ATCR1_ADDR (BN0_WF_AGG_TOP_BASE + 0x10c) // 210C
260+#define BN0_WF_AGG_TOP_TCCR_ADDR (BN0_WF_AGG_TOP_BASE + 0x110) // 2110
261+#define BN0_WF_AGG_TOP_TFCR_ADDR (BN0_WF_AGG_TOP_BASE + 0x114) // 2114
262+#define BN0_WF_AGG_TOP_MUCR0_ADDR (BN0_WF_AGG_TOP_BASE + 0x118) // 2118
263+#define BN0_WF_AGG_TOP_MUCR1_ADDR (BN0_WF_AGG_TOP_BASE + 0x11c) // 211C
264+#define BN0_WF_AGG_TOP_CSDCR0_ADDR (BN0_WF_AGG_TOP_BASE + 0x120) // 2120
265+#define BN0_WF_AGG_TOP_CSDCR1_ADDR (BN0_WF_AGG_TOP_BASE + 0x124) // 2124
266+#define BN0_WF_AGG_TOP_CSDCR2_ADDR (BN0_WF_AGG_TOP_BASE + 0x128) // 2128
267+#define BN0_WF_AGG_TOP_CSDCR3_ADDR (BN0_WF_AGG_TOP_BASE + 0x12c) // 212C
268+#define BN0_WF_AGG_TOP_CSDCR4_ADDR (BN0_WF_AGG_TOP_BASE + 0x130) // 2130
269+#define BN0_WF_AGG_TOP_DYNSCR_ADDR (BN0_WF_AGG_TOP_BASE + 0x178) // 2178
270+#define BN0_WF_AGG_TOP_DYNSSCR_ADDR (BN0_WF_AGG_TOP_BASE + 0x198) // 2198
271+#define BN0_WF_AGG_TOP_TCDCNT0_ADDR (BN0_WF_AGG_TOP_BASE + 0x2c8) // 22C8
272+#define BN0_WF_AGG_TOP_TCDCNT1_ADDR (BN0_WF_AGG_TOP_BASE + 0x2cc) // 22CC
273+#define BN0_WF_AGG_TOP_TCSR0_ADDR (BN0_WF_AGG_TOP_BASE + 0x2d0) // 22D0
274+#define BN0_WF_AGG_TOP_TCSR1_ADDR (BN0_WF_AGG_TOP_BASE + 0x2d4) // 22D4
275+#define BN0_WF_AGG_TOP_TCSR2_ADDR (BN0_WF_AGG_TOP_BASE + 0x2d8) // 22D8
276+#define BN0_WF_AGG_TOP_DCR_ADDR (BN0_WF_AGG_TOP_BASE + 0x2e4) // 22E4
277+#define BN0_WF_AGG_TOP_SMDCR_ADDR (BN0_WF_AGG_TOP_BASE + 0x2e8) // 22E8
278+#define BN0_WF_AGG_TOP_TXCMDSMCR_ADDR (BN0_WF_AGG_TOP_BASE + 0x2ec) // 22EC
279+#define BN0_WF_AGG_TOP_SMCR0_ADDR (BN0_WF_AGG_TOP_BASE + 0x2f0) // 22F0
280+#define BN0_WF_AGG_TOP_SMCR1_ADDR (BN0_WF_AGG_TOP_BASE + 0x2f4) // 22F4
281+#define BN0_WF_AGG_TOP_SMCR2_ADDR (BN0_WF_AGG_TOP_BASE + 0x2f8) // 22F8
282+#define BN0_WF_AGG_TOP_SMCR3_ADDR (BN0_WF_AGG_TOP_BASE + 0x2fc) // 22FC
283+
284+#define BN0_WF_AGG_TOP_AALCR0_AC01_AGG_LIMIT_ADDR BN0_WF_AGG_TOP_AALCR0_ADDR
285+#define BN0_WF_AGG_TOP_AALCR0_AC01_AGG_LIMIT_MASK 0x03FF0000 // AC01_AGG_LIMIT[25..16]
286+#define BN0_WF_AGG_TOP_AALCR0_AC01_AGG_LIMIT_SHFT 16
287+#define BN0_WF_AGG_TOP_AALCR0_AC00_AGG_LIMIT_ADDR BN0_WF_AGG_TOP_AALCR0_ADDR
288+#define BN0_WF_AGG_TOP_AALCR0_AC00_AGG_LIMIT_MASK 0x000003FF // AC00_AGG_LIMIT[9..0]
289+#define BN0_WF_AGG_TOP_AALCR0_AC00_AGG_LIMIT_SHFT 0
290+
291+#define BN0_WF_AGG_TOP_AALCR1_AC03_AGG_LIMIT_ADDR BN0_WF_AGG_TOP_AALCR1_ADDR
292+#define BN0_WF_AGG_TOP_AALCR1_AC03_AGG_LIMIT_MASK 0x03FF0000 // AC03_AGG_LIMIT[25..16]
293+#define BN0_WF_AGG_TOP_AALCR1_AC03_AGG_LIMIT_SHFT 16
294+#define BN0_WF_AGG_TOP_AALCR1_AC02_AGG_LIMIT_ADDR BN0_WF_AGG_TOP_AALCR1_ADDR
295+#define BN0_WF_AGG_TOP_AALCR1_AC02_AGG_LIMIT_MASK 0x000003FF // AC02_AGG_LIMIT[9..0]
296+#define BN0_WF_AGG_TOP_AALCR1_AC02_AGG_LIMIT_SHFT 0
297+
298+#define BN0_WF_AGG_TOP_AALCR2_AC11_AGG_LIMIT_ADDR BN0_WF_AGG_TOP_AALCR2_ADDR
299+#define BN0_WF_AGG_TOP_AALCR2_AC11_AGG_LIMIT_MASK 0x03FF0000 // AC11_AGG_LIMIT[25..16]
300+#define BN0_WF_AGG_TOP_AALCR2_AC11_AGG_LIMIT_SHFT 16
301+#define BN0_WF_AGG_TOP_AALCR2_AC10_AGG_LIMIT_ADDR BN0_WF_AGG_TOP_AALCR2_ADDR
302+#define BN0_WF_AGG_TOP_AALCR2_AC10_AGG_LIMIT_MASK 0x000003FF // AC10_AGG_LIMIT[9..0]
303+#define BN0_WF_AGG_TOP_AALCR2_AC10_AGG_LIMIT_SHFT 0
304+
305+#define BN0_WF_AGG_TOP_AALCR3_AC13_AGG_LIMIT_ADDR BN0_WF_AGG_TOP_AALCR3_ADDR
306+#define BN0_WF_AGG_TOP_AALCR3_AC13_AGG_LIMIT_MASK 0x03FF0000 // AC13_AGG_LIMIT[25..16]
307+#define BN0_WF_AGG_TOP_AALCR3_AC13_AGG_LIMIT_SHFT 16
308+#define BN0_WF_AGG_TOP_AALCR3_AC12_AGG_LIMIT_ADDR BN0_WF_AGG_TOP_AALCR3_ADDR
309+#define BN0_WF_AGG_TOP_AALCR3_AC12_AGG_LIMIT_MASK 0x000003FF // AC12_AGG_LIMIT[9..0]
310+#define BN0_WF_AGG_TOP_AALCR3_AC12_AGG_LIMIT_SHFT 0
311+
312+#define BN0_WF_AGG_TOP_AALCR4_AC21_AGG_LIMIT_ADDR BN0_WF_AGG_TOP_AALCR4_ADDR
313+#define BN0_WF_AGG_TOP_AALCR4_AC21_AGG_LIMIT_MASK 0x03FF0000 // AC21_AGG_LIMIT[25..16]
314+#define BN0_WF_AGG_TOP_AALCR4_AC21_AGG_LIMIT_SHFT 16
315+#define BN0_WF_AGG_TOP_AALCR4_AC20_AGG_LIMIT_ADDR BN0_WF_AGG_TOP_AALCR4_ADDR
316+#define BN0_WF_AGG_TOP_AALCR4_AC20_AGG_LIMIT_MASK 0x000003FF // AC20_AGG_LIMIT[9..0]
317+#define BN0_WF_AGG_TOP_AALCR4_AC20_AGG_LIMIT_SHFT 0
318+
319+#define BN0_WF_AGG_TOP_AALCR5_AC23_AGG_LIMIT_ADDR BN0_WF_AGG_TOP_AALCR5_ADDR
320+#define BN0_WF_AGG_TOP_AALCR5_AC23_AGG_LIMIT_MASK 0x03FF0000 // AC23_AGG_LIMIT[25..16]
321+#define BN0_WF_AGG_TOP_AALCR5_AC23_AGG_LIMIT_SHFT 16
322+#define BN0_WF_AGG_TOP_AALCR5_AC22_AGG_LIMIT_ADDR BN0_WF_AGG_TOP_AALCR5_ADDR
323+#define BN0_WF_AGG_TOP_AALCR5_AC22_AGG_LIMIT_MASK 0x000003FF // AC22_AGG_LIMIT[9..0]
324+#define BN0_WF_AGG_TOP_AALCR5_AC22_AGG_LIMIT_SHFT 0
325+
326+#define BN0_WF_AGG_TOP_AALCR6_AC31_AGG_LIMIT_ADDR BN0_WF_AGG_TOP_AALCR6_ADDR
327+#define BN0_WF_AGG_TOP_AALCR6_AC31_AGG_LIMIT_MASK 0x03FF0000 // AC31_AGG_LIMIT[25..16]
328+#define BN0_WF_AGG_TOP_AALCR6_AC31_AGG_LIMIT_SHFT 16
329+#define BN0_WF_AGG_TOP_AALCR6_AC30_AGG_LIMIT_ADDR BN0_WF_AGG_TOP_AALCR6_ADDR
330+#define BN0_WF_AGG_TOP_AALCR6_AC30_AGG_LIMIT_MASK 0x000003FF // AC30_AGG_LIMIT[9..0]
331+#define BN0_WF_AGG_TOP_AALCR6_AC30_AGG_LIMIT_SHFT 0
332+#define BN0_WF_AGG_TOP_AALCR7_AC33_AGG_LIMIT_ADDR BN0_WF_AGG_TOP_AALCR7_ADDR
333+#define BN0_WF_AGG_TOP_AALCR7_AC33_AGG_LIMIT_MASK 0x03FF0000 // AC33_AGG_LIMIT[25..16]
334+#define BN0_WF_AGG_TOP_AALCR7_AC33_AGG_LIMIT_SHFT 16
335+#define BN0_WF_AGG_TOP_AALCR7_AC32_AGG_LIMIT_ADDR BN0_WF_AGG_TOP_AALCR7_ADDR
336+#define BN0_WF_AGG_TOP_AALCR7_AC32_AGG_LIMIT_MASK 0x000003FF // AC32_AGG_LIMIT[9..0]
337+#define BN0_WF_AGG_TOP_AALCR7_AC32_AGG_LIMIT_SHFT 0
338+
339+/* DMA */
340+struct queue_desc {
341+ u32 hw_desc_base;
342+ u16 ring_size;
343+ char *const ring_info;
344+};
345+// HOST DMA
346+//#define CONN_INFRA_REMAPPING_OFFSET 0x64000000
347+//#define WF_WFDMA_HOST_DMA0_BASE (0x18024000 + CONN_INFRA_REMAPPING_OFFSET)
348+#define WF_WFDMA_HOST_DMA0_BASE 0xd4000
349+
350+#define WF_WFDMA_HOST_DMA0_HOST_INT_STA_ADDR \
351+ (WF_WFDMA_HOST_DMA0_BASE + 0x200) /* 4200 */
352+#define WF_WFDMA_HOST_DMA0_HOST_INT_ENA_ADDR \
353+ (WF_WFDMA_HOST_DMA0_BASE + 0X204) /* 4204 */
354+#define WF_WFDMA_HOST_DMA0_WPDMA_GLO_CFG_ADDR \
355+ (WF_WFDMA_HOST_DMA0_BASE + 0x208) /* 4208 */
356+
357+#define WF_WFDMA_HOST_DMA0_WPDMA_GLO_CFG_RX_DMA_BUSY_ADDR \
358+ WF_WFDMA_HOST_DMA0_WPDMA_GLO_CFG_ADDR
359+#define WF_WFDMA_HOST_DMA0_WPDMA_GLO_CFG_RX_DMA_BUSY_MASK \
360+ 0x00000008 /* RX_DMA_BUSY[3] */
361+#define WF_WFDMA_HOST_DMA0_WPDMA_GLO_CFG_RX_DMA_BUSY_SHFT 3
362+#define WF_WFDMA_HOST_DMA0_WPDMA_GLO_CFG_RX_DMA_EN_ADDR \
363+ WF_WFDMA_HOST_DMA0_WPDMA_GLO_CFG_ADDR
364+#define WF_WFDMA_HOST_DMA0_WPDMA_GLO_CFG_RX_DMA_EN_MASK \
365+ 0x00000004 /* RX_DMA_EN[2] */
366+#define WF_WFDMA_HOST_DMA0_WPDMA_GLO_CFG_RX_DMA_EN_SHFT 2
367+#define WF_WFDMA_HOST_DMA0_WPDMA_GLO_CFG_TX_DMA_BUSY_ADDR \
368+ WF_WFDMA_HOST_DMA0_WPDMA_GLO_CFG_ADDR
369+#define WF_WFDMA_HOST_DMA0_WPDMA_GLO_CFG_TX_DMA_BUSY_MASK \
370+ 0x00000002 /* TX_DMA_BUSY[1] */
371+#define WF_WFDMA_HOST_DMA0_WPDMA_GLO_CFG_TX_DMA_BUSY_SHFT 1
372+#define WF_WFDMA_HOST_DMA0_WPDMA_GLO_CFG_TX_DMA_EN_ADDR \
373+ WF_WFDMA_HOST_DMA0_WPDMA_GLO_CFG_ADDR
374+#define WF_WFDMA_HOST_DMA0_WPDMA_GLO_CFG_TX_DMA_EN_MASK \
375+ 0x00000001 /* TX_DMA_EN[0] */
376+#define WF_WFDMA_HOST_DMA0_WPDMA_GLO_CFG_TX_DMA_EN_SHFT 0
377+
378+
379+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING0_CTRL0_ADDR \
380+ (WF_WFDMA_HOST_DMA0_BASE + 0x300) /* 4300 */
381+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING0_CTRL1_ADDR \
382+ (WF_WFDMA_HOST_DMA0_BASE + 0x304) /* 4304 */
383+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING0_CTRL2_ADDR \
384+ (WF_WFDMA_HOST_DMA0_BASE + 0x308) /* 4308 */
385+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING0_CTRL3_ADDR \
386+ (WF_WFDMA_HOST_DMA0_BASE + 0x30c) /* 430C */
387+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING1_CTRL0_ADDR \
388+ (WF_WFDMA_HOST_DMA0_BASE + 0x310) /* 4310 */
389+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING1_CTRL1_ADDR \
390+ (WF_WFDMA_HOST_DMA0_BASE + 0x314) /* 4314 */
391+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING1_CTRL2_ADDR \
392+ (WF_WFDMA_HOST_DMA0_BASE + 0x318) /* 4318 */
393+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING1_CTRL3_ADDR \
394+ (WF_WFDMA_HOST_DMA0_BASE + 0x31c) /* 431C */
395+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING2_CTRL0_ADDR \
396+ (WF_WFDMA_HOST_DMA0_BASE + 0x320) /* 4320 */
397+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING2_CTRL1_ADDR \
398+ (WF_WFDMA_HOST_DMA0_BASE + 0x324) /* 4324 */
399+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING2_CTRL2_ADDR \
400+ (WF_WFDMA_HOST_DMA0_BASE + 0x328) /* 4328 */
401+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING2_CTRL3_ADDR \
402+ (WF_WFDMA_HOST_DMA0_BASE + 0x32c) /* 432C */
403+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING3_CTRL0_ADDR \
404+ (WF_WFDMA_HOST_DMA0_BASE + 0x330) /* 4330 */
405+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING3_CTRL1_ADDR \
406+ (WF_WFDMA_HOST_DMA0_BASE + 0x334) /* 4334 */
407+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING3_CTRL2_ADDR \
408+ (WF_WFDMA_HOST_DMA0_BASE + 0x338) /* 4338 */
409+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING3_CTRL3_ADDR \
410+ (WF_WFDMA_HOST_DMA0_BASE + 0x33c) /* 433C */
411+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING4_CTRL0_ADDR \
412+ (WF_WFDMA_HOST_DMA0_BASE + 0x340) /* 4340 */
413+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING4_CTRL1_ADDR \
414+ (WF_WFDMA_HOST_DMA0_BASE + 0x344) /* 4344 */
415+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING4_CTRL2_ADDR \
416+ (WF_WFDMA_HOST_DMA0_BASE + 0x348) /* 4348 */
417+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING4_CTRL3_ADDR \
418+ (WF_WFDMA_HOST_DMA0_BASE + 0x34c) /* 434C */
419+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING5_CTRL0_ADDR \
420+ (WF_WFDMA_HOST_DMA0_BASE + 0x350) /* 4350 */
421+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING5_CTRL1_ADDR \
422+ (WF_WFDMA_HOST_DMA0_BASE + 0x354) /* 4354 */
423+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING5_CTRL2_ADDR \
424+ (WF_WFDMA_HOST_DMA0_BASE + 0x358) /* 4358 */
425+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING5_CTRL3_ADDR \
426+ (WF_WFDMA_HOST_DMA0_BASE + 0x35c) /* 435C */
427+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING6_CTRL0_ADDR \
428+ (WF_WFDMA_HOST_DMA0_BASE + 0x360) /* 4360 */
429+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING6_CTRL1_ADDR \
430+ (WF_WFDMA_HOST_DMA0_BASE + 0x364) /* 4364 */
431+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING6_CTRL2_ADDR \
432+ (WF_WFDMA_HOST_DMA0_BASE + 0x368) /* 4368 */
433+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING6_CTRL3_ADDR \
434+ (WF_WFDMA_HOST_DMA0_BASE + 0x36c) /* 436C */
435+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING16_CTRL0_ADDR \
436+ (WF_WFDMA_HOST_DMA0_BASE + 0x400) /* 4400 */
437+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING16_CTRL1_ADDR \
438+ (WF_WFDMA_HOST_DMA0_BASE + 0x404) /* 4404 */
439+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING16_CTRL2_ADDR \
440+ (WF_WFDMA_HOST_DMA0_BASE + 0x408) /* 4408 */
441+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING16_CTRL3_ADDR \
442+ (WF_WFDMA_HOST_DMA0_BASE + 0x40c) /* 440C */
443+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING17_CTRL0_ADDR \
444+ (WF_WFDMA_HOST_DMA0_BASE + 0x410) /* 4410 */
445+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING17_CTRL1_ADDR \
446+ (WF_WFDMA_HOST_DMA0_BASE + 0x414) /* 4414 */
447+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING17_CTRL2_ADDR \
448+ (WF_WFDMA_HOST_DMA0_BASE + 0x418) /* 4418 */
449+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING17_CTRL3_ADDR \
450+ (WF_WFDMA_HOST_DMA0_BASE + 0x41c) /* 441C */
451+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING18_CTRL0_ADDR \
452+ (WF_WFDMA_HOST_DMA0_BASE + 0x420) /* 4420 */
453+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING18_CTRL1_ADDR \
454+ (WF_WFDMA_HOST_DMA0_BASE + 0x424) /* 4424 */
455+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING18_CTRL2_ADDR \
456+ (WF_WFDMA_HOST_DMA0_BASE + 0x428) /* 4428 */
457+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING18_CTRL3_ADDR \
458+ (WF_WFDMA_HOST_DMA0_BASE + 0x42c) /* 442C */
459+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING19_CTRL0_ADDR \
460+ (WF_WFDMA_HOST_DMA0_BASE + 0x430) /* 4430 */
461+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING19_CTRL1_ADDR \
462+ (WF_WFDMA_HOST_DMA0_BASE + 0x434) /* 4434 */
463+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING19_CTRL2_ADDR \
464+ (WF_WFDMA_HOST_DMA0_BASE + 0x438) /* 4438 */
465+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING19_CTRL3_ADDR \
466+ (WF_WFDMA_HOST_DMA0_BASE + 0x43c) /* 443C */
467+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING20_CTRL0_ADDR \
468+ (WF_WFDMA_HOST_DMA0_BASE + 0x440) /* 4440 */
469+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING20_CTRL1_ADDR \
470+ (WF_WFDMA_HOST_DMA0_BASE + 0x444) /* 4444 */
471+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING20_CTRL2_ADDR \
472+ (WF_WFDMA_HOST_DMA0_BASE + 0x448) /* 4448 */
473+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING20_CTRL3_ADDR \
474+ (WF_WFDMA_HOST_DMA0_BASE + 0x44c) /* 444C */
475+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING21_CTRL0_ADDR \
476+ (WF_WFDMA_HOST_DMA0_BASE + 0x450) /* 4450 */
477+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING21_CTRL1_ADDR \
478+ (WF_WFDMA_HOST_DMA0_BASE + 0x454) /* 4454 */
479+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING21_CTRL2_ADDR \
480+ (WF_WFDMA_HOST_DMA0_BASE + 0x458) /* 4458 */
481+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING21_CTRL3_ADDR \
482+ (WF_WFDMA_HOST_DMA0_BASE + 0x45c) /* 445c */
483+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING22_CTRL0_ADDR (WF_WFDMA_HOST_DMA0_BASE + 0x460) // 4460
484+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING22_CTRL1_ADDR (WF_WFDMA_HOST_DMA0_BASE + 0x464) // 4464
485+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING22_CTRL2_ADDR (WF_WFDMA_HOST_DMA0_BASE + 0x468) // 4468
486+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING22_CTRL3_ADDR (WF_WFDMA_HOST_DMA0_BASE + 0x46c) // 446C
487+
488+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING0_CTRL0_ADDR \
489+ (WF_WFDMA_HOST_DMA0_BASE + 0x500) /* 4500 */
490+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING0_CTRL1_ADDR \
491+ (WF_WFDMA_HOST_DMA0_BASE + 0x504) /* 4504 */
492+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING0_CTRL2_ADDR \
493+ (WF_WFDMA_HOST_DMA0_BASE + 0x508) /* 4508 */
494+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING0_CTRL3_ADDR \
495+ (WF_WFDMA_HOST_DMA0_BASE + 0x50c) /* 450C */
496+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING1_CTRL0_ADDR \
497+ (WF_WFDMA_HOST_DMA0_BASE + 0x510) /* 4510 */
498+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING1_CTRL1_ADDR \
499+ (WF_WFDMA_HOST_DMA0_BASE + 0x514) /* 4514 */
500+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING1_CTRL2_ADDR \
501+ (WF_WFDMA_HOST_DMA0_BASE + 0x518) /* 4518 */
502+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING1_CTRL3_ADDR \
503+ (WF_WFDMA_HOST_DMA0_BASE + 0x51c) /* 451C */
504+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING2_CTRL0_ADDR \
505+ (WF_WFDMA_HOST_DMA0_BASE + 0x520) /* 4520 */
506+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING2_CTRL1_ADDR \
507+ (WF_WFDMA_HOST_DMA0_BASE + 0x524) /* 4524 */
508+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING2_CTRL2_ADDR \
509+ (WF_WFDMA_HOST_DMA0_BASE + 0x528) /* 4528 */
510+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING2_CTRL3_ADDR \
511+ (WF_WFDMA_HOST_DMA0_BASE + 0x52C) /* 452C */
512+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING3_CTRL0_ADDR \
513+ (WF_WFDMA_HOST_DMA0_BASE + 0x530) /* 4530 */
514+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING3_CTRL1_ADDR \
515+ (WF_WFDMA_HOST_DMA0_BASE + 0x534) /* 4534 */
516+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING3_CTRL2_ADDR \
517+ (WF_WFDMA_HOST_DMA0_BASE + 0x538) /* 4538 */
518+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING3_CTRL3_ADDR \
519+ (WF_WFDMA_HOST_DMA0_BASE + 0x53C) /* 453C */
520+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING4_CTRL0_ADDR \
521+ (WF_WFDMA_HOST_DMA0_BASE + 0x540) /* 4540 */
522+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING4_CTRL1_ADDR \
523+ (WF_WFDMA_HOST_DMA0_BASE + 0x544) /* 4544 */
524+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING4_CTRL2_ADDR \
525+ (WF_WFDMA_HOST_DMA0_BASE + 0x548) /* 4548 */
526+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING4_CTRL3_ADDR \
527+ (WF_WFDMA_HOST_DMA0_BASE + 0x54c) /* 454C */
528+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING5_CTRL0_ADDR \
529+ (WF_WFDMA_HOST_DMA0_BASE + 0x550) /* 4550 */
530+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING5_CTRL1_ADDR \
531+ (WF_WFDMA_HOST_DMA0_BASE + 0x554) /* 4554 */
532+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING5_CTRL2_ADDR \
533+ (WF_WFDMA_HOST_DMA0_BASE + 0x558) /* 4558 */
534+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING5_CTRL3_ADDR \
535+ (WF_WFDMA_HOST_DMA0_BASE + 0x55c) /* 455C */
536+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING6_CTRL0_ADDR \
537+ (WF_WFDMA_HOST_DMA0_BASE + 0x560) /* 4560 */
538+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING6_CTRL1_ADDR \
539+ (WF_WFDMA_HOST_DMA0_BASE + 0x564) /* 4564 */
540+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING6_CTRL2_ADDR \
541+ (WF_WFDMA_HOST_DMA0_BASE + 0x568) /* 4568 */
542+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING6_CTRL3_ADDR \
543+ (WF_WFDMA_HOST_DMA0_BASE + 0x56c) /* 456C */
544+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING7_CTRL0_ADDR \
545+ (WF_WFDMA_HOST_DMA0_BASE + 0x570) /* 4570 */
546+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING7_CTRL1_ADDR \
547+ (WF_WFDMA_HOST_DMA0_BASE + 0x574) /* 4574 */
548+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING7_CTRL2_ADDR \
549+ (WF_WFDMA_HOST_DMA0_BASE + 0x578) /* 4578 */
550+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING7_CTRL3_ADDR \
551+ (WF_WFDMA_HOST_DMA0_BASE + 0x57c) /* 457C */
552+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING8_CTRL0_ADDR \
553+ (WF_WFDMA_HOST_DMA0_BASE + 0x580) /* 4580 */
554+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING8_CTRL1_ADDR \
555+ (WF_WFDMA_HOST_DMA0_BASE + 0x584) /* 4584 */
556+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING8_CTRL2_ADDR \
557+ (WF_WFDMA_HOST_DMA0_BASE + 0x588) /* 4588 */
558+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING8_CTRL3_ADDR \
559+ (WF_WFDMA_HOST_DMA0_BASE + 0x58c) /* 458C */
560+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING9_CTRL0_ADDR \
561+ (WF_WFDMA_HOST_DMA0_BASE + 0x590) /* 4590 */
562+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING9_CTRL1_ADDR \
563+ (WF_WFDMA_HOST_DMA0_BASE + 0x594) /* 4594 */
564+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING9_CTRL2_ADDR \
565+ (WF_WFDMA_HOST_DMA0_BASE + 0x598) /* 4598 */
566+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING9_CTRL3_ADDR \
567+ (WF_WFDMA_HOST_DMA0_BASE + 0x59c) /* 459C */
568+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING10_CTRL0_ADDR (WF_WFDMA_HOST_DMA0_BASE + 0x5a0) // 45A0
569+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING10_CTRL1_ADDR (WF_WFDMA_HOST_DMA0_BASE + 0x5a4) // 45A4
570+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING10_CTRL2_ADDR (WF_WFDMA_HOST_DMA0_BASE + 0x5a8) // 45A8
571+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING10_CTRL3_ADDR (WF_WFDMA_HOST_DMA0_BASE + 0x5ac) // 45AC
572+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING11_CTRL0_ADDR (WF_WFDMA_HOST_DMA0_BASE + 0x5b0) // 45B0
573+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING11_CTRL1_ADDR (WF_WFDMA_HOST_DMA0_BASE + 0x5b4) // 45B4
574+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING11_CTRL2_ADDR (WF_WFDMA_HOST_DMA0_BASE + 0x5b8) // 45B8
575+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING11_CTRL3_ADDR (WF_WFDMA_HOST_DMA0_BASE + 0x5bc) // 45BC
576+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING12_CTRL0_ADDR (WF_WFDMA_HOST_DMA0_BASE + 0x5C0) // 45C0
577+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING12_CTRL1_ADDR (WF_WFDMA_HOST_DMA0_BASE + 0x5C4) // 45C4
578+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING12_CTRL2_ADDR (WF_WFDMA_HOST_DMA0_BASE + 0x5C8) // 45C8
579+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING12_CTRL3_ADDR (WF_WFDMA_HOST_DMA0_BASE + 0x5CC) // 45CC
580+
581+// HOST PCIE1 DMA
582+#define WF_WFDMA_HOST_DMA0_PCIE1_BASE 0xd8000
583+
584+#define WF_WFDMA_HOST_DMA0_PCIE1_HOST_INT_STA_ADDR (WF_WFDMA_HOST_DMA0_PCIE1_BASE + 0x200) // 8200
585+#define WF_WFDMA_HOST_DMA0_PCIE1_HOST_INT_ENA_ADDR (WF_WFDMA_HOST_DMA0_PCIE1_BASE + 0X204) // 8204
586+#define WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_GLO_CFG_ADDR (WF_WFDMA_HOST_DMA0_PCIE1_BASE + 0x208) // 8208
587+
588+#define WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_GLO_CFG_PDMA_BT_SIZE_SHFT 4
589+#define WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_GLO_CFG_RX_DMA_BUSY_MASK 0x00000008
590+#define WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_GLO_CFG_RX_DMA_BUSY_SHFT 3
591+#define WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_GLO_CFG_RX_DMA_EN_MASK 0x00000004
592+#define WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_GLO_CFG_RX_DMA_EN_SHFT 2
593+#define WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_GLO_CFG_TX_DMA_BUSY_MASK 0x00000002
594+#define WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_GLO_CFG_TX_DMA_BUSY_SHFT 1
595+#define WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_GLO_CFG_TX_DMA_EN_MASK 0x00000001
596+#define WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_GLO_CFG_TX_DMA_EN_SHFT 0
597+
598+#define WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_TX_RING21_CTRL0_ADDR (WF_WFDMA_HOST_DMA0_PCIE1_BASE + 0x450) // 8450
599+#define WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_TX_RING21_CTRL1_ADDR (WF_WFDMA_HOST_DMA0_PCIE1_BASE + 0x454) // 8454
600+#define WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_TX_RING21_CTRL2_ADDR (WF_WFDMA_HOST_DMA0_PCIE1_BASE + 0x458) // 8458
601+#define WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_TX_RING21_CTRL3_ADDR (WF_WFDMA_HOST_DMA0_PCIE1_BASE + 0x45c) // 845C
602+#define WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_TX_RING22_CTRL0_ADDR (WF_WFDMA_HOST_DMA0_PCIE1_BASE + 0x460) // 8460
603+#define WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_TX_RING22_CTRL1_ADDR (WF_WFDMA_HOST_DMA0_PCIE1_BASE + 0x464) // 8464
604+#define WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_TX_RING22_CTRL2_ADDR (WF_WFDMA_HOST_DMA0_PCIE1_BASE + 0x468) // 8468
605+#define WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_TX_RING22_CTRL3_ADDR (WF_WFDMA_HOST_DMA0_PCIE1_BASE + 0x46c) // 846C
606+
607+#define WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_RX_RING3_CTRL0_ADDR (WF_WFDMA_HOST_DMA0_PCIE1_BASE + 0x530) // 8530
608+#define WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_RX_RING3_CTRL1_ADDR (WF_WFDMA_HOST_DMA0_PCIE1_BASE + 0x534) // 8534
609+#define WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_RX_RING3_CTRL2_ADDR (WF_WFDMA_HOST_DMA0_PCIE1_BASE + 0x538) // 8538
610+#define WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_RX_RING3_CTRL3_ADDR (WF_WFDMA_HOST_DMA0_PCIE1_BASE + 0x53C) // 853C
611+#define WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_RX_RING5_CTRL0_ADDR (WF_WFDMA_HOST_DMA0_PCIE1_BASE + 0x550) // 8550
612+#define WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_RX_RING5_CTRL1_ADDR (WF_WFDMA_HOST_DMA0_PCIE1_BASE + 0x554) // 8554
613+#define WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_RX_RING5_CTRL2_ADDR (WF_WFDMA_HOST_DMA0_PCIE1_BASE + 0x558) // 8558
614+#define WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_RX_RING5_CTRL3_ADDR (WF_WFDMA_HOST_DMA0_PCIE1_BASE + 0x55c) // 855C
615+#define WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_RX_RING6_CTRL0_ADDR (WF_WFDMA_HOST_DMA0_PCIE1_BASE + 0x560) // 8560
616+#define WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_RX_RING6_CTRL1_ADDR (WF_WFDMA_HOST_DMA0_PCIE1_BASE + 0x564) // 8564
617+#define WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_RX_RING6_CTRL2_ADDR (WF_WFDMA_HOST_DMA0_PCIE1_BASE + 0x568) // 8568
618+#define WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_RX_RING6_CTRL3_ADDR (WF_WFDMA_HOST_DMA0_PCIE1_BASE + 0x56c) // 856C
619+#define WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_RX_RING7_CTRL0_ADDR (WF_WFDMA_HOST_DMA0_PCIE1_BASE + 0x570) // 8570
620+#define WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_RX_RING7_CTRL1_ADDR (WF_WFDMA_HOST_DMA0_PCIE1_BASE + 0x574) // 8574
621+#define WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_RX_RING7_CTRL2_ADDR (WF_WFDMA_HOST_DMA0_PCIE1_BASE + 0x578) // 8578
622+#define WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_RX_RING7_CTRL3_ADDR (WF_WFDMA_HOST_DMA0_PCIE1_BASE + 0x57c) // 857C
623+//MCU DMA
624+//#define WF_WFDMA_MCU_DMA0_BASE 0x02000
625+#define WF_WFDMA_MCU_DMA0_BASE 0x54000000
626+
627+#define WF_WFDMA_MCU_DMA0_HOST_INT_STA_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x200) // 0200
628+#define WF_WFDMA_MCU_DMA0_HOST_INT_ENA_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0X204) // 0204
629+#define WF_WFDMA_MCU_DMA0_WPDMA_GLO_CFG_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x208) // 0208
630+
631+#define WF_WFDMA_MCU_DMA0_WPDMA_GLO_CFG_RX_DMA_BUSY_ADDR WF_WFDMA_MCU_DMA0_WPDMA_GLO_CFG_ADDR
632+#define WF_WFDMA_MCU_DMA0_WPDMA_GLO_CFG_RX_DMA_BUSY_MASK 0x00000008 // RX_DMA_BUSY[3]
633+#define WF_WFDMA_MCU_DMA0_WPDMA_GLO_CFG_RX_DMA_BUSY_SHFT 3
634+#define WF_WFDMA_MCU_DMA0_WPDMA_GLO_CFG_RX_DMA_EN_ADDR WF_WFDMA_MCU_DMA0_WPDMA_GLO_CFG_ADDR
635+#define WF_WFDMA_MCU_DMA0_WPDMA_GLO_CFG_RX_DMA_EN_MASK 0x00000004 // RX_DMA_EN[2]
636+#define WF_WFDMA_MCU_DMA0_WPDMA_GLO_CFG_RX_DMA_EN_SHFT 2
637+#define WF_WFDMA_MCU_DMA0_WPDMA_GLO_CFG_TX_DMA_BUSY_ADDR WF_WFDMA_MCU_DMA0_WPDMA_GLO_CFG_ADDR
638+#define WF_WFDMA_MCU_DMA0_WPDMA_GLO_CFG_TX_DMA_BUSY_MASK 0x00000002 // TX_DMA_BUSY[1]
639+#define WF_WFDMA_MCU_DMA0_WPDMA_GLO_CFG_TX_DMA_BUSY_SHFT 1
640+#define WF_WFDMA_MCU_DMA0_WPDMA_GLO_CFG_TX_DMA_EN_ADDR WF_WFDMA_MCU_DMA0_WPDMA_GLO_CFG_ADDR
641+#define WF_WFDMA_MCU_DMA0_WPDMA_GLO_CFG_TX_DMA_EN_MASK 0x00000001 // TX_DMA_EN[0]
642+#define WF_WFDMA_MCU_DMA0_WPDMA_GLO_CFG_TX_DMA_EN_SHFT 0
643+
644+#define WF_WFDMA_MCU_DMA0_WPDMA_TX_RING0_CTRL0_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x300) // 0300
645+#define WF_WFDMA_MCU_DMA0_WPDMA_TX_RING0_CTRL1_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x304) // 0304
646+#define WF_WFDMA_MCU_DMA0_WPDMA_TX_RING0_CTRL2_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x308) // 0308
647+#define WF_WFDMA_MCU_DMA0_WPDMA_TX_RING0_CTRL3_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x30c) // 030C
648+#define WF_WFDMA_MCU_DMA0_WPDMA_TX_RING1_CTRL0_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x310) // 0310
649+#define WF_WFDMA_MCU_DMA0_WPDMA_TX_RING1_CTRL1_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x314) // 0314
650+#define WF_WFDMA_MCU_DMA0_WPDMA_TX_RING1_CTRL2_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x318) // 0318
651+#define WF_WFDMA_MCU_DMA0_WPDMA_TX_RING1_CTRL3_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x31c) // 031C
652+#define WF_WFDMA_MCU_DMA0_WPDMA_TX_RING2_CTRL0_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x320) // 0320
653+#define WF_WFDMA_MCU_DMA0_WPDMA_TX_RING2_CTRL1_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x324) // 0324
654+#define WF_WFDMA_MCU_DMA0_WPDMA_TX_RING2_CTRL2_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x328) // 0328
655+#define WF_WFDMA_MCU_DMA0_WPDMA_TX_RING2_CTRL3_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x32c) // 032C
656+#define WF_WFDMA_MCU_DMA0_WPDMA_TX_RING3_CTRL0_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x330) // 0330
657+#define WF_WFDMA_MCU_DMA0_WPDMA_TX_RING3_CTRL1_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x334) // 0334
658+#define WF_WFDMA_MCU_DMA0_WPDMA_TX_RING3_CTRL2_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x338) // 0338
659+#define WF_WFDMA_MCU_DMA0_WPDMA_TX_RING3_CTRL3_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x33c) // 033C
660+#define WF_WFDMA_MCU_DMA0_WPDMA_TX_RING4_CTRL0_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x340) // 0340
661+#define WF_WFDMA_MCU_DMA0_WPDMA_TX_RING4_CTRL1_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x344) // 0344
662+#define WF_WFDMA_MCU_DMA0_WPDMA_TX_RING4_CTRL2_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x348) // 0348
663+#define WF_WFDMA_MCU_DMA0_WPDMA_TX_RING4_CTRL3_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x34c) // 034C
664+#define WF_WFDMA_MCU_DMA0_WPDMA_TX_RING5_CTRL0_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x350) // 0350
665+#define WF_WFDMA_MCU_DMA0_WPDMA_TX_RING5_CTRL1_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x354) // 0354
666+#define WF_WFDMA_MCU_DMA0_WPDMA_TX_RING5_CTRL2_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x358) // 0358
667+#define WF_WFDMA_MCU_DMA0_WPDMA_TX_RING5_CTRL3_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x35c) // 035C
668+#define WF_WFDMA_MCU_DMA0_WPDMA_TX_RING6_CTRL0_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x360) // 0360
669+#define WF_WFDMA_MCU_DMA0_WPDMA_TX_RING6_CTRL1_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x364) // 0364
670+#define WF_WFDMA_MCU_DMA0_WPDMA_TX_RING6_CTRL2_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x368) // 0368
671+#define WF_WFDMA_MCU_DMA0_WPDMA_TX_RING6_CTRL3_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x36c) // 036C
672+#define WF_WFDMA_MCU_DMA0_WPDMA_TX_RING7_CTRL0_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x370) // 0370
673+#define WF_WFDMA_MCU_DMA0_WPDMA_TX_RING7_CTRL1_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x374) // 0374
674+#define WF_WFDMA_MCU_DMA0_WPDMA_TX_RING7_CTRL2_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x378) // 0378
675+#define WF_WFDMA_MCU_DMA0_WPDMA_TX_RING7_CTRL3_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x37c) // 037C
676+
677+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING0_CTRL0_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x500) // 0500
678+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING0_CTRL1_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x504) // 0504
679+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING0_CTRL2_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x508) // 0508
680+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING0_CTRL3_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x50c) // 050C
681+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING1_CTRL0_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x510) // 0510
682+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING1_CTRL1_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x514) // 0514
683+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING1_CTRL2_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x518) // 0518
684+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING1_CTRL3_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x51c) // 051C
685+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING2_CTRL0_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x520) // 0520
686+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING2_CTRL1_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x524) // 0524
687+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING2_CTRL2_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x528) // 0528
688+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING2_CTRL3_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x52C) // 052C
689+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING3_CTRL0_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x530) // 0530
690+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING3_CTRL1_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x534) // 0534
691+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING3_CTRL2_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x538) // 0538
692+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING3_CTRL3_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x53C) // 053C
693+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING4_CTRL0_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x540) // 0540
694+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING4_CTRL1_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x544) // 0544
695+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING4_CTRL2_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x548) // 0548
696+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING4_CTRL3_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x54C) // 054C
697+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING5_CTRL0_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x550) // 0550
698+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING5_CTRL1_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x554) // 0554
699+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING5_CTRL2_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x558) // 0558
700+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING5_CTRL3_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x55C) // 055C
701+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING6_CTRL0_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x560) // 0560
702+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING6_CTRL1_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x564) // 0564
703+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING6_CTRL2_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x568) // 0568
704+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING6_CTRL3_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x56c) // 056C
705+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING7_CTRL0_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x570) // 0570
706+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING7_CTRL1_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x574) // 0574
707+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING7_CTRL2_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x578) // 0578
708+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING7_CTRL3_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x57c) // 057C
709+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING8_CTRL0_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x580) // 0580
710+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING8_CTRL1_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x584) // 0584
711+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING8_CTRL2_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x588) // 0588
712+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING8_CTRL3_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x58c) // 058C
713+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING9_CTRL0_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x590) // 0590
714+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING9_CTRL1_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x594) // 0594
715+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING9_CTRL2_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x598) // 0598
716+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING9_CTRL3_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x59c) // 059C
717+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING10_CTRL0_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x5A0) // 05A0
718+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING10_CTRL1_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x5A4) // 05A4
719+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING10_CTRL2_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x5A8) // 05A8
720+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING10_CTRL3_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x5Ac) // 05AC
721+
722+// MEM DMA
723+#define WF_WFDMA_MEM_DMA_BASE 0x58000000
724+
725+#define WF_WFDMA_MEM_DMA_HOST_INT_STA_ADDR (WF_WFDMA_MEM_DMA_BASE + 0x200) // 0200
726+#define WF_WFDMA_MEM_DMA_HOST_INT_ENA_ADDR (WF_WFDMA_MEM_DMA_BASE + 0X204) // 0204
727+#define WF_WFDMA_MEM_DMA_WPDMA_GLO_CFG_ADDR (WF_WFDMA_MEM_DMA_BASE + 0x208) // 0208
728+
729+#define WF_WFDMA_MEM_DMA_WPDMA_GLO_CFG_RX_DMA_BUSY_ADDR WF_WFDMA_MEM_DMA_WPDMA_GLO_CFG_ADDR
730+#define WF_WFDMA_MEM_DMA_WPDMA_GLO_CFG_RX_DMA_BUSY_MASK 0x00000008 // RX_DMA_BUSY[3]
731+#define WF_WFDMA_MEM_DMA_WPDMA_GLO_CFG_RX_DMA_BUSY_SHFT 3
732+#define WF_WFDMA_MEM_DMA_WPDMA_GLO_CFG_RX_DMA_EN_ADDR WF_WFDMA_MEM_DMA_WPDMA_GLO_CFG_ADDR
733+#define WF_WFDMA_MEM_DMA_WPDMA_GLO_CFG_RX_DMA_EN_MASK 0x00000004 // RX_DMA_EN[2]
734+#define WF_WFDMA_MEM_DMA_WPDMA_GLO_CFG_RX_DMA_EN_SHFT 2
735+#define WF_WFDMA_MEM_DMA_WPDMA_GLO_CFG_TX_DMA_BUSY_ADDR WF_WFDMA_MEM_DMA_WPDMA_GLO_CFG_ADDR
736+#define WF_WFDMA_MEM_DMA_WPDMA_GLO_CFG_TX_DMA_BUSY_MASK 0x00000002 // TX_DMA_BUSY[1]
737+#define WF_WFDMA_MEM_DMA_WPDMA_GLO_CFG_TX_DMA_BUSY_SHFT 1
738+#define WF_WFDMA_MEM_DMA_WPDMA_GLO_CFG_TX_DMA_EN_ADDR WF_WFDMA_MEM_DMA_WPDMA_GLO_CFG_ADDR
739+#define WF_WFDMA_MEM_DMA_WPDMA_GLO_CFG_TX_DMA_EN_MASK 0x00000001 // TX_DMA_EN[0]
740+#define WF_WFDMA_MEM_DMA_WPDMA_GLO_CFG_TX_DMA_EN_SHFT 0
741+
742+#define WF_WFDMA_MEM_DMA_WPDMA_TX_RING0_CTRL0_ADDR (WF_WFDMA_MEM_DMA_BASE + 0x300) // 0300
743+#define WF_WFDMA_MEM_DMA_WPDMA_TX_RING0_CTRL1_ADDR (WF_WFDMA_MEM_DMA_BASE + 0x304) // 0304
744+#define WF_WFDMA_MEM_DMA_WPDMA_TX_RING0_CTRL2_ADDR (WF_WFDMA_MEM_DMA_BASE + 0x308) // 0308
745+#define WF_WFDMA_MEM_DMA_WPDMA_TX_RING0_CTRL3_ADDR (WF_WFDMA_MEM_DMA_BASE + 0x30c) // 030C
746+#define WF_WFDMA_MEM_DMA_WPDMA_TX_RING1_CTRL0_ADDR (WF_WFDMA_MEM_DMA_BASE + 0x310) // 0310
747+#define WF_WFDMA_MEM_DMA_WPDMA_TX_RING1_CTRL1_ADDR (WF_WFDMA_MEM_DMA_BASE + 0x314) // 0314
748+#define WF_WFDMA_MEM_DMA_WPDMA_TX_RING1_CTRL2_ADDR (WF_WFDMA_MEM_DMA_BASE + 0x318) // 0318
749+#define WF_WFDMA_MEM_DMA_WPDMA_TX_RING1_CTRL3_ADDR (WF_WFDMA_MEM_DMA_BASE + 0x31c) // 031C
750+#define WF_WFDMA_MEM_DMA_WPDMA_TX_RING2_CTRL0_ADDR (WF_WFDMA_MEM_DMA_BASE + 0x320) // 0320
751+#define WF_WFDMA_MEM_DMA_WPDMA_TX_RING2_CTRL1_ADDR (WF_WFDMA_MEM_DMA_BASE + 0x324) // 0324
752+#define WF_WFDMA_MEM_DMA_WPDMA_TX_RING2_CTRL2_ADDR (WF_WFDMA_MEM_DMA_BASE + 0x328) // 0328
753+#define WF_WFDMA_MEM_DMA_WPDMA_TX_RING2_CTRL3_ADDR (WF_WFDMA_MEM_DMA_BASE + 0x32c) // 032C
754+
755+#define WF_WFDMA_MEM_DMA_WPDMA_RX_RING0_CTRL0_ADDR (WF_WFDMA_MEM_DMA_BASE + 0x500) // 0500
756+#define WF_WFDMA_MEM_DMA_WPDMA_RX_RING0_CTRL1_ADDR (WF_WFDMA_MEM_DMA_BASE + 0x504) // 0504
757+#define WF_WFDMA_MEM_DMA_WPDMA_RX_RING0_CTRL2_ADDR (WF_WFDMA_MEM_DMA_BASE + 0x508) // 0508
758+#define WF_WFDMA_MEM_DMA_WPDMA_RX_RING0_CTRL3_ADDR (WF_WFDMA_MEM_DMA_BASE + 0x50c) // 050C
759+#define WF_WFDMA_MEM_DMA_WPDMA_RX_RING1_CTRL0_ADDR (WF_WFDMA_MEM_DMA_BASE + 0x510) // 0510
760+#define WF_WFDMA_MEM_DMA_WPDMA_RX_RING1_CTRL1_ADDR (WF_WFDMA_MEM_DMA_BASE + 0x514) // 0514
761+#define WF_WFDMA_MEM_DMA_WPDMA_RX_RING1_CTRL2_ADDR (WF_WFDMA_MEM_DMA_BASE + 0x518) // 0518
762+#define WF_WFDMA_MEM_DMA_WPDMA_RX_RING1_CTRL3_ADDR (WF_WFDMA_MEM_DMA_BASE + 0x51c) // 051C
763+#define WF_WFDMA_MEM_DMA_WPDMA_RX_RING2_CTRL0_ADDR (WF_WFDMA_MEM_DMA_BASE + 0x520) // 0520
764+#define WF_WFDMA_MEM_DMA_WPDMA_RX_RING2_CTRL1_ADDR (WF_WFDMA_MEM_DMA_BASE + 0x524) // 0524
765+#define WF_WFDMA_MEM_DMA_WPDMA_RX_RING2_CTRL2_ADDR (WF_WFDMA_MEM_DMA_BASE + 0x528) // 0528
766+#define WF_WFDMA_MEM_DMA_WPDMA_RX_RING2_CTRL3_ADDR (WF_WFDMA_MEM_DMA_BASE + 0x52C) // 052C
767+
768+/* MIB */
769+#define WF_UMIB_TOP_BASE 0x820cd000
770+#define BN0_WF_MIB_TOP_BASE 0x820ed000
771+#define BN1_WF_MIB_TOP_BASE 0x820fd000
772+#define IP1_BN0_WF_MIB_TOP_BASE 0x830ed000
773+
774+#define WF_UMIB_TOP_B0BROCR_ADDR (WF_UMIB_TOP_BASE + 0x484) // D484
775+#define WF_UMIB_TOP_B0BRBCR_ADDR (WF_UMIB_TOP_BASE + 0x4D4) // D4D4
776+#define WF_UMIB_TOP_B0BRDCR_ADDR (WF_UMIB_TOP_BASE + 0x524) // D524
777+#define WF_UMIB_TOP_B1BROCR_ADDR (WF_UMIB_TOP_BASE + 0x5E8) // D5E8
778+#define WF_UMIB_TOP_B2BROCR_ADDR (WF_UMIB_TOP_BASE + 0x74C) // D74C
779+
780+#define BN0_WF_MIB_TOP_M0SCR0_ADDR (BN0_WF_MIB_TOP_BASE + 0x000) // D000
781+#define BN0_WF_MIB_TOP_M0SDR6_ADDR (BN0_WF_MIB_TOP_BASE + 0x020) // D020
782+#define BN0_WF_MIB_TOP_M0SDR9_ADDR (BN0_WF_MIB_TOP_BASE + 0x024) // D024
783+#define BN0_WF_MIB_TOP_M0SDR18_ADDR (BN0_WF_MIB_TOP_BASE + 0x030) // D030
784+#define BN0_WF_MIB_TOP_BTOCR_ADDR (BN0_WF_MIB_TOP_BASE + 0x400) // D400
785+#define BN0_WF_MIB_TOP_BTBCR_ADDR (BN0_WF_MIB_TOP_BASE + 0x450) // D450
786+#define BN0_WF_MIB_TOP_BTDCR_ADDR (BN0_WF_MIB_TOP_BASE + 0x590) // D590
787+#define BN0_WF_MIB_TOP_BTCR_ADDR (BN0_WF_MIB_TOP_BASE + 0x5A0) // D5A0
788+#define BN0_WF_MIB_TOP_RVSR0_ADDR (BN0_WF_MIB_TOP_BASE + 0x720) // D720
789+
790+#define BN0_WF_MIB_TOP_TSCR0_ADDR (BN0_WF_MIB_TOP_BASE + 0x6B0) // D6B0
791+#define BN0_WF_MIB_TOP_TSCR3_ADDR (BN0_WF_MIB_TOP_BASE + 0x6BC) // D6BC
792+#define BN0_WF_MIB_TOP_TSCR4_ADDR (BN0_WF_MIB_TOP_BASE + 0x6C0) // D6C0
793+#define BN0_WF_MIB_TOP_TSCR5_ADDR (BN0_WF_MIB_TOP_BASE + 0x6C4) // D6C4
794+#define BN0_WF_MIB_TOP_TSCR6_ADDR (BN0_WF_MIB_TOP_BASE + 0x6C8) // D6C8
795+#define BN0_WF_MIB_TOP_TSCR7_ADDR (BN0_WF_MIB_TOP_BASE + 0x6D0) // D6D0
796+#define BN0_WF_MIB_TOP_TSCR8_ADDR (BN0_WF_MIB_TOP_BASE + 0x6CC) // D6CC
797+
798+#define BN0_WF_MIB_TOP_TBCR0_ADDR (BN0_WF_MIB_TOP_BASE + 0x6EC) // D6EC
799+#define BN0_WF_MIB_TOP_TBCR1_ADDR (BN0_WF_MIB_TOP_BASE + 0x6F0) // D6F0
800+#define BN0_WF_MIB_TOP_TBCR2_ADDR (BN0_WF_MIB_TOP_BASE + 0x6F4) // D6F4
801+#define BN0_WF_MIB_TOP_TBCR3_ADDR (BN0_WF_MIB_TOP_BASE + 0x6F8) // D6F8
802+#define BN0_WF_MIB_TOP_TBCR4_ADDR (BN0_WF_MIB_TOP_BASE + 0x6FC) // D6FC
803+
804+#define BN0_WF_MIB_TOP_TDRCR0_ADDR (BN0_WF_MIB_TOP_BASE + 0x728) // D728
805+#define BN0_WF_MIB_TOP_TDRCR1_ADDR (BN0_WF_MIB_TOP_BASE + 0x72C) // D72C
806+#define BN0_WF_MIB_TOP_TDRCR2_ADDR (BN0_WF_MIB_TOP_BASE + 0x730) // D730
807+#define BN0_WF_MIB_TOP_TDRCR3_ADDR (BN0_WF_MIB_TOP_BASE + 0x734) // D734
808+#define BN0_WF_MIB_TOP_TDRCR4_ADDR (BN0_WF_MIB_TOP_BASE + 0x738) // D738
809+
810+#define BN0_WF_MIB_TOP_BTSCR0_ADDR (BN0_WF_MIB_TOP_BASE + 0x5E0) // D5E0
811+#define BN0_WF_MIB_TOP_BTSCR1_ADDR (BN0_WF_MIB_TOP_BASE + 0x5F0) // D5F0
812+#define BN0_WF_MIB_TOP_BTSCR2_ADDR (BN0_WF_MIB_TOP_BASE + 0x600) // D600
813+#define BN0_WF_MIB_TOP_BTSCR3_ADDR (BN0_WF_MIB_TOP_BASE + 0x610) // D610
814+#define BN0_WF_MIB_TOP_BTSCR4_ADDR (BN0_WF_MIB_TOP_BASE + 0x620) // D620
815+#define BN0_WF_MIB_TOP_BTSCR5_ADDR (BN0_WF_MIB_TOP_BASE + 0x788) // D788
816+#define BN0_WF_MIB_TOP_BTSCR6_ADDR (BN0_WF_MIB_TOP_BASE + 0x798) // D798
817+
818+#define BN0_WF_MIB_TOP_RSCR1_ADDR (BN0_WF_MIB_TOP_BASE + 0x7AC) // D7AC
819+#define BN0_WF_MIB_TOP_BSCR2_ADDR (BN0_WF_MIB_TOP_BASE + 0x9D4) // D9D4
820+#define BN0_WF_MIB_TOP_TSCR18_ADDR (BN0_WF_MIB_TOP_BASE + 0xA1C) // DA1C
821+
822+#define BN0_WF_MIB_TOP_MSR0_ADDR (BN0_WF_MIB_TOP_BASE + 0xA64) // DA64
823+#define BN0_WF_MIB_TOP_MSR1_ADDR (BN0_WF_MIB_TOP_BASE + 0xA68) // DA68
824+#define BN0_WF_MIB_TOP_MSR2_ADDR (BN0_WF_MIB_TOP_BASE + 0xA6C) // DA6C
825+#define BN0_WF_MIB_TOP_MCTR5_ADDR (BN0_WF_MIB_TOP_BASE + 0xA70) // DA70
826+#define BN0_WF_MIB_TOP_MCTR6_ADDR (BN0_WF_MIB_TOP_BASE + 0xA74) // DA74
827+
828+#define BN0_WF_MIB_TOP_RSCR26_ADDR (BN0_WF_MIB_TOP_BASE + 0x950) // D950
829+#define BN0_WF_MIB_TOP_RSCR27_ADDR (BN0_WF_MIB_TOP_BASE + 0x954) // D954
830+#define BN0_WF_MIB_TOP_RSCR28_ADDR (BN0_WF_MIB_TOP_BASE + 0x958) // D958
831+#define BN0_WF_MIB_TOP_RSCR31_ADDR (BN0_WF_MIB_TOP_BASE + 0x964) // D964
832+#define BN0_WF_MIB_TOP_RSCR33_ADDR (BN0_WF_MIB_TOP_BASE + 0x96C) // D96C
833+#define BN0_WF_MIB_TOP_RSCR35_ADDR (BN0_WF_MIB_TOP_BASE + 0x974) // D974
834+#define BN0_WF_MIB_TOP_RSCR36_ADDR (BN0_WF_MIB_TOP_BASE + 0x978) // D978
835+
836+#define BN0_WF_MIB_TOP_TSCR3_AMPDU_MPDU_COUNT_MASK 0xFFFFFFFF // AMPDU_MPDU_COUNT[31..0]
837+#define BN0_WF_MIB_TOP_TSCR4_AMPDU_ACKED_COUNT_MASK 0xFFFFFFFF // AMPDU_ACKED_COUNT[31..0]
838+#define BN0_WF_MIB_TOP_M0SDR6_CHANNEL_IDLE_COUNT_MASK 0x0000FFFF // CHANNEL_IDLE_COUNT[15..0]
839+#define BN0_WF_MIB_TOP_M0SDR9_CCA_NAV_TX_TIME_MASK 0x00FFFFFF // CCA_NAV_TX_TIME[23..0]
840+#define BN0_WF_MIB_TOP_RSCR26_RX_MDRDY_COUNT_MASK 0xFFFFFFFF // RX_MDRDY_COUNT[31..0]
841+#define BN0_WF_MIB_TOP_MSR0_CCK_MDRDY_TIME_MASK 0xFFFFFFFF // CCK_MDRDY_TIME[31..0]
842+#define BN0_WF_MIB_TOP_MSR1_OFDM_LG_MIXED_VHT_MDRDY_TIME_MASK 0xFFFFFFFF // OFDM_LG_MIXED_VHT_MDRDY_TIME[31..0]
843+#define BN0_WF_MIB_TOP_MSR2_OFDM_GREEN_MDRDY_TIME_MASK 0xFFFFFFFF // OFDM_GREEN_MDRDY_TIME[31..0]
844+#define BN0_WF_MIB_TOP_MCTR5_P_CCA_TIME_MASK 0xFFFFFFFF // P_CCA_TIME[31..0]
845+#define BN0_WF_MIB_TOP_MCTR6_S_CCA_TIME_MASK 0xFFFFFFFF // S_CCA_TIME[31..0]
846+#define BN0_WF_MIB_TOP_M0SDR18_P_ED_TIME_MASK 0x00FFFFFF // P_ED_TIME[23..0]
847+#define BN0_WF_MIB_TOP_TSCR18_BEACONTXCOUNT_MASK 0xFFFFFFFF // BEACONTXCOUNT[31..0]
848+#define BN0_WF_MIB_TOP_TBCR0_TX_20MHZ_CNT_MASK 0xFFFFFFFF // TX_20MHZ_CNT[31..0]
849+#define BN0_WF_MIB_TOP_TBCR1_TX_40MHZ_CNT_MASK 0xFFFFFFFF // TX_40MHZ_CNT[31..0]
850+#define BN0_WF_MIB_TOP_TBCR2_TX_80MHZ_CNT_MASK 0xFFFFFFFF // TX_80MHZ_CNT[31..0]
851+#define BN0_WF_MIB_TOP_TBCR3_TX_160MHZ_CNT_MASK 0xFFFFFFFF // TX_160MHZ_CNT[31..0]
852+#define BN0_WF_MIB_TOP_TBCR4_TX_320MHZ_CNT_MASK 0xFFFFFFFF // TX_320MHZ_CNT[31..0]
853+#define BN0_WF_MIB_TOP_BSCR2_MUBF_TX_COUNT_MASK 0xFFFFFFFF // MUBF_TX_COUNT[31..0]
854+#define BN0_WF_MIB_TOP_RVSR0_VEC_MISS_COUNT_MASK 0xFFFFFFFF // VEC_MISS_COUNT[31..0]
855+#define BN0_WF_MIB_TOP_RSCR35_DELIMITER_FAIL_COUNT_MASK 0xFFFFFFFF // DELIMITER_FAIL_COUNT[31..0]
856+#define BN0_WF_MIB_TOP_RSCR1_RX_FCS_ERROR_COUNT_MASK 0xFFFFFFFF // RX_FCS_ERROR_COUNT[31..0]
857+#define BN0_WF_MIB_TOP_RSCR33_RX_FIFO_FULL_COUNT_MASK 0xFFFFFFFF // RX_FIFO_FULL_COUNT[31..0]
858+#define BN0_WF_MIB_TOP_RSCR36_RX_LEN_MISMATCH_MASK 0xFFFFFFFF // RX_LEN_MISMATCH[31..0]
859+#define BN0_WF_MIB_TOP_RSCR31_RX_MPDU_COUNT_MASK 0xFFFFFFFF // RX_MPDU_COUNT[31..0]
860+#define BN0_WF_MIB_TOP_BTSCR5_RTSTXCOUNTn_MASK 0xFFFFFFFF // RTSTXCOUNTn[31..0]
861+#define BN0_WF_MIB_TOP_BTSCR6_RTSRETRYCOUNTn_MASK 0xFFFFFFFF // RTSRETRYCOUNTn[31..0]
862+#define BN0_WF_MIB_TOP_BTSCR0_BAMISSCOUNTn_MASK 0xFFFFFFFF // BAMISSCOUNTn[31..0]
863+#define BN0_WF_MIB_TOP_BTSCR1_ACKFAILCOUNTn_MASK 0xFFFFFFFF // ACKFAILCOUNTn[31..0]
864+#define BN0_WF_MIB_TOP_BTSCR2_FRAMERETRYCOUNTn_MASK 0xFFFFFFFF // FRAMERETRYCOUNTn[31..0]
865+#define BN0_WF_MIB_TOP_BTSCR3_FRAMERETRY2COUNTn_MASK 0xFFFFFFFF // FRAMERETRY2COUNTn[31..0]
866+#define BN0_WF_MIB_TOP_BTSCR4_FRAMERETRY3COUNTn_MASK 0xFFFFFFFF // FRAMERETRY3COUNTn[31..0]
867+#define BN0_WF_MIB_TOP_TRARC0_ADDR (BN0_WF_MIB_TOP_BASE + 0x0B0) // D0B0
868+#define BN0_WF_MIB_TOP_TRARC1_ADDR (BN0_WF_MIB_TOP_BASE + 0x0B4) // D0B4
869+#define BN0_WF_MIB_TOP_TRARC2_ADDR (BN0_WF_MIB_TOP_BASE + 0x0B8) // D0B8
870+#define BN0_WF_MIB_TOP_TRARC3_ADDR (BN0_WF_MIB_TOP_BASE + 0x0BC) // D0BC
871+#define BN0_WF_MIB_TOP_TRARC4_ADDR (BN0_WF_MIB_TOP_BASE + 0x0C0) // D0C0
872+#define BN0_WF_MIB_TOP_TRARC5_ADDR (BN0_WF_MIB_TOP_BASE + 0x0C4) // D0C4
873+#define BN0_WF_MIB_TOP_TRARC6_ADDR (BN0_WF_MIB_TOP_BASE + 0x0C8) // D0C8
874+#define BN0_WF_MIB_TOP_TRARC7_ADDR (BN0_WF_MIB_TOP_BASE + 0x0CC) // D0CC
875+
876+#define BN0_WF_MIB_TOP_TRDR0_ADDR (BN0_WF_MIB_TOP_BASE + 0x9B4) // D9B4
877+#define BN0_WF_MIB_TOP_TRDR1_ADDR (BN0_WF_MIB_TOP_BASE + 0x9B8) // D9B8
878+#define BN0_WF_MIB_TOP_TRDR2_ADDR (BN0_WF_MIB_TOP_BASE + 0x9BC) // D9BC
879+#define BN0_WF_MIB_TOP_TRDR3_ADDR (BN0_WF_MIB_TOP_BASE + 0x9C0) // D9C0
880+#define BN0_WF_MIB_TOP_TRDR4_ADDR (BN0_WF_MIB_TOP_BASE + 0x9C4) // D9C4
881+#define BN0_WF_MIB_TOP_TRDR5_ADDR (BN0_WF_MIB_TOP_BASE + 0x9C8) // D9C8
882+#define BN0_WF_MIB_TOP_TRDR6_ADDR (BN0_WF_MIB_TOP_BASE + 0x9CC) // D9CC
883+#define BN0_WF_MIB_TOP_TRDR7_ADDR (BN0_WF_MIB_TOP_BASE + 0x9D0) // D9D0
884+#define BN0_WF_MIB_TOP_TRDR8_ADDR (BN0_WF_MIB_TOP_BASE + 0x9D4) // D9D4
885+#define BN0_WF_MIB_TOP_TRDR9_ADDR (BN0_WF_MIB_TOP_BASE + 0x9D8) // D9D8
886+#define BN0_WF_MIB_TOP_TRDR10_ADDR (BN0_WF_MIB_TOP_BASE + 0x9DC) // D9DC
887+#define BN0_WF_MIB_TOP_TRDR11_ADDR (BN0_WF_MIB_TOP_BASE + 0x9E0) // D9E0
888+#define BN0_WF_MIB_TOP_TRDR12_ADDR (BN0_WF_MIB_TOP_BASE + 0x9E4) // D9E4
889+#define BN0_WF_MIB_TOP_TRDR13_ADDR (BN0_WF_MIB_TOP_BASE + 0x9E8) // D9E8
890+#define BN0_WF_MIB_TOP_TRDR14_ADDR (BN0_WF_MIB_TOP_BASE + 0x9EC) // D9EC
891+#define BN0_WF_MIB_TOP_TRDR15_ADDR (BN0_WF_MIB_TOP_BASE + 0x9F0) // D9F0
892+
893+#define BN0_WF_MIB_TOP_TRARC0_AGG_RANG_SEL_1_ADDR BN0_WF_MIB_TOP_TRARC0_ADDR
894+#define BN0_WF_MIB_TOP_TRARC0_AGG_RANG_SEL_1_MASK 0x03FF0000 // AGG_RANG_SEL_1[25..16]
895+#define BN0_WF_MIB_TOP_TRARC0_AGG_RANG_SEL_1_SHFT 16
896+#define BN0_WF_MIB_TOP_TRARC0_AGG_RANG_SEL_0_ADDR BN0_WF_MIB_TOP_TRARC0_ADDR
897+#define BN0_WF_MIB_TOP_TRARC0_AGG_RANG_SEL_0_MASK 0x000003FF // AGG_RANG_SEL_0[9..0]
898+#define BN0_WF_MIB_TOP_TRARC0_AGG_RANG_SEL_0_SHFT 0
899+
900+#define BN0_WF_MIB_TOP_TRARC1_AGG_RANG_SEL_3_ADDR BN0_WF_MIB_TOP_TRARC1_ADDR
901+#define BN0_WF_MIB_TOP_TRARC1_AGG_RANG_SEL_3_MASK 0x03FF0000 // AGG_RANG_SEL_3[25..16]
902+#define BN0_WF_MIB_TOP_TRARC1_AGG_RANG_SEL_3_SHFT 16
903+#define BN0_WF_MIB_TOP_TRARC1_AGG_RANG_SEL_2_ADDR BN0_WF_MIB_TOP_TRARC1_ADDR
904+#define BN0_WF_MIB_TOP_TRARC1_AGG_RANG_SEL_2_MASK 0x000003FF // AGG_RANG_SEL_2[9..0]
905+#define BN0_WF_MIB_TOP_TRARC1_AGG_RANG_SEL_2_SHFT 0
906+
907+#define BN0_WF_MIB_TOP_TRARC2_AGG_RANG_SEL_5_ADDR BN0_WF_MIB_TOP_TRARC2_ADDR
908+#define BN0_WF_MIB_TOP_TRARC2_AGG_RANG_SEL_5_MASK 0x03FF0000 // AGG_RANG_SEL_5[25..16]
909+#define BN0_WF_MIB_TOP_TRARC2_AGG_RANG_SEL_5_SHFT 16
910+#define BN0_WF_MIB_TOP_TRARC2_AGG_RANG_SEL_4_ADDR BN0_WF_MIB_TOP_TRARC2_ADDR
911+#define BN0_WF_MIB_TOP_TRARC2_AGG_RANG_SEL_4_MASK 0x000003FF // AGG_RANG_SEL_4[9..0]
912+#define BN0_WF_MIB_TOP_TRARC2_AGG_RANG_SEL_4_SHFT 0
913+
914+#define BN0_WF_MIB_TOP_TRARC3_AGG_RANG_SEL_7_ADDR BN0_WF_MIB_TOP_TRARC3_ADDR
915+#define BN0_WF_MIB_TOP_TRARC3_AGG_RANG_SEL_7_MASK 0x03FF0000 // AGG_RANG_SEL_7[25..16]
916+#define BN0_WF_MIB_TOP_TRARC3_AGG_RANG_SEL_7_SHFT 16
917+#define BN0_WF_MIB_TOP_TRARC3_AGG_RANG_SEL_6_ADDR BN0_WF_MIB_TOP_TRARC3_ADDR
918+#define BN0_WF_MIB_TOP_TRARC3_AGG_RANG_SEL_6_MASK 0x000003FF // AGG_RANG_SEL_6[9..0]
919+#define BN0_WF_MIB_TOP_TRARC3_AGG_RANG_SEL_6_SHFT 0
920+
921+#define BN0_WF_MIB_TOP_TRARC4_AGG_RANG_SEL_9_ADDR BN0_WF_MIB_TOP_TRARC4_ADDR
922+#define BN0_WF_MIB_TOP_TRARC4_AGG_RANG_SEL_9_MASK 0x03FF0000 // AGG_RANG_SEL_9[25..16]
923+#define BN0_WF_MIB_TOP_TRARC4_AGG_RANG_SEL_9_SHFT 16
924+#define BN0_WF_MIB_TOP_TRARC4_AGG_RANG_SEL_8_ADDR BN0_WF_MIB_TOP_TRARC4_ADDR
925+#define BN0_WF_MIB_TOP_TRARC4_AGG_RANG_SEL_8_MASK 0x000003FF // AGG_RANG_SEL_8[9..0]
926+#define BN0_WF_MIB_TOP_TRARC4_AGG_RANG_SEL_8_SHFT 0
927+
928+#define BN0_WF_MIB_TOP_TRARC5_AGG_RANG_SEL_11_ADDR BN0_WF_MIB_TOP_TRARC5_ADDR
929+#define BN0_WF_MIB_TOP_TRARC5_AGG_RANG_SEL_11_MASK 0x03FF0000 // AGG_RANG_SEL_11[25..16]
930+#define BN0_WF_MIB_TOP_TRARC5_AGG_RANG_SEL_11_SHFT 16
931+#define BN0_WF_MIB_TOP_TRARC5_AGG_RANG_SEL_10_ADDR BN0_WF_MIB_TOP_TRARC5_ADDR
932+#define BN0_WF_MIB_TOP_TRARC5_AGG_RANG_SEL_10_MASK 0x000003FF // AGG_RANG_SEL_10[9..0]
933+#define BN0_WF_MIB_TOP_TRARC5_AGG_RANG_SEL_10_SHFT 0
934+
935+#define BN0_WF_MIB_TOP_TRARC6_AGG_RANG_SEL_13_ADDR BN0_WF_MIB_TOP_TRARC6_ADDR
936+#define BN0_WF_MIB_TOP_TRARC6_AGG_RANG_SEL_13_MASK 0x03FF0000 // AGG_RANG_SEL_13[25..16]
937+#define BN0_WF_MIB_TOP_TRARC6_AGG_RANG_SEL_13_SHFT 16
938+#define BN0_WF_MIB_TOP_TRARC6_AGG_RANG_SEL_12_ADDR BN0_WF_MIB_TOP_TRARC6_ADDR
939+#define BN0_WF_MIB_TOP_TRARC6_AGG_RANG_SEL_12_MASK 0x000003FF // AGG_RANG_SEL_12[9..0]
940+#define BN0_WF_MIB_TOP_TRARC6_AGG_RANG_SEL_12_SHFT 0
941+
942+#define BN0_WF_MIB_TOP_TRARC7_AGG_RANG_SEL_14_ADDR BN0_WF_MIB_TOP_TRARC7_ADDR
943+#define BN0_WF_MIB_TOP_TRARC7_AGG_RANG_SEL_14_MASK 0x000003FF // AGG_RANG_SEL_14[9..0]
944+#define BN0_WF_MIB_TOP_TRARC7_AGG_RANG_SEL_14_SHFT 0
945+
946+/* RRO TOP */
947+#define WF_RRO_TOP_BASE 0xA000 /*0x820C2000 */
948+#define WF_RRO_TOP_IND_CMD_0_CTRL0_ADDR (WF_RRO_TOP_BASE + 0x40) // 2040
949+ //
950+/* WTBL */
951+enum mt7996_wtbl_type {
952+ WTBL_TYPE_LMAC, /* WTBL in LMAC */
953+ WTBL_TYPE_UMAC, /* WTBL in UMAC */
954+ WTBL_TYPE_KEY, /* Key Table */
955+ MAX_NUM_WTBL_TYPE
956+};
957+
958+struct berse_wtbl_parse {
959+ u8 *name;
960+ u32 mask;
961+ u32 shift;
962+ u8 new_line;
963+};
964+
965+enum muar_idx {
966+ MUAR_INDEX_OWN_MAC_ADDR_0 = 0,
967+ MUAR_INDEX_OWN_MAC_ADDR_1,
968+ MUAR_INDEX_OWN_MAC_ADDR_2,
969+ MUAR_INDEX_OWN_MAC_ADDR_3,
970+ MUAR_INDEX_OWN_MAC_ADDR_4,
971+ MUAR_INDEX_OWN_MAC_ADDR_BC_MC = 0xE,
972+ MUAR_INDEX_UNMATCHED = 0xF,
973+ MUAR_INDEX_OWN_MAC_ADDR_11 = 0x11,
974+ MUAR_INDEX_OWN_MAC_ADDR_12,
975+ MUAR_INDEX_OWN_MAC_ADDR_13,
976+ MUAR_INDEX_OWN_MAC_ADDR_14,
977+ MUAR_INDEX_OWN_MAC_ADDR_15,
978+ MUAR_INDEX_OWN_MAC_ADDR_16,
979+ MUAR_INDEX_OWN_MAC_ADDR_17,
980+ MUAR_INDEX_OWN_MAC_ADDR_18,
981+ MUAR_INDEX_OWN_MAC_ADDR_19,
982+ MUAR_INDEX_OWN_MAC_ADDR_1A,
983+ MUAR_INDEX_OWN_MAC_ADDR_1B,
984+ MUAR_INDEX_OWN_MAC_ADDR_1C,
985+ MUAR_INDEX_OWN_MAC_ADDR_1D,
986+ MUAR_INDEX_OWN_MAC_ADDR_1E,
987+ MUAR_INDEX_OWN_MAC_ADDR_1F,
988+ MUAR_INDEX_OWN_MAC_ADDR_20,
989+ MUAR_INDEX_OWN_MAC_ADDR_21,
990+ MUAR_INDEX_OWN_MAC_ADDR_22,
991+ MUAR_INDEX_OWN_MAC_ADDR_23,
992+ MUAR_INDEX_OWN_MAC_ADDR_24,
993+ MUAR_INDEX_OWN_MAC_ADDR_25,
994+ MUAR_INDEX_OWN_MAC_ADDR_26,
995+ MUAR_INDEX_OWN_MAC_ADDR_27,
996+ MUAR_INDEX_OWN_MAC_ADDR_28,
997+ MUAR_INDEX_OWN_MAC_ADDR_29,
998+ MUAR_INDEX_OWN_MAC_ADDR_2A,
999+ MUAR_INDEX_OWN_MAC_ADDR_2B,
1000+ MUAR_INDEX_OWN_MAC_ADDR_2C,
1001+ MUAR_INDEX_OWN_MAC_ADDR_2D,
1002+ MUAR_INDEX_OWN_MAC_ADDR_2E,
1003+ MUAR_INDEX_OWN_MAC_ADDR_2F
1004+};
1005+
1006+enum cipher_suit {
1007+ IGTK_CIPHER_SUIT_NONE = 0,
1008+ IGTK_CIPHER_SUIT_BIP,
1009+ IGTK_CIPHER_SUIT_BIP_256
1010+};
1011+
1012+#define LWTBL_LEN_IN_DW 36
1013+#define UWTBL_LEN_IN_DW 10
1014+
1015+#define MT_DBG_WTBL_BASE 0x820D8000
1016+
1017+#define MT_DBG_WTBLON_TOP_BASE 0x820d4000
1018+#define MT_DBG_WTBLON_TOP_WDUCR_ADDR (MT_DBG_WTBLON_TOP_BASE + 0x0370) // 4370
1019+#define MT_DBG_WTBLON_TOP_WDUCR_GROUP GENMASK(4, 0)
1020+
1021+#define MT_DBG_UWTBL_TOP_BASE 0x820c4000
1022+#define MT_DBG_UWTBL_TOP_WDUCR_ADDR (MT_DBG_UWTBL_TOP_BASE + 0x0104) // 4104
1023+#define MT_DBG_UWTBL_TOP_WDUCR_GROUP GENMASK(5, 0)
1024+#define MT_DBG_UWTBL_TOP_WDUCR_TARGET BIT(31)
1025+
1026+#define LWTBL_IDX2BASE_ID GENMASK(14, 8)
1027+#define LWTBL_IDX2BASE_DW GENMASK(7, 2)
1028+#define LWTBL_IDX2BASE(_id, _dw) (MT_DBG_WTBL_BASE | \
1029+ FIELD_PREP(LWTBL_IDX2BASE_ID, _id) | \
1030+ FIELD_PREP(LWTBL_IDX2BASE_DW, _dw))
1031+
1032+#define UWTBL_IDX2BASE_ID GENMASK(12, 6)
1033+#define UWTBL_IDX2BASE_DW GENMASK(5, 2)
1034+#define UWTBL_IDX2BASE(_id, _dw) (MT_DBG_UWTBL_TOP_BASE | 0x2000 | \
1035+ FIELD_PREP(UWTBL_IDX2BASE_ID, _id) | \
1036+ FIELD_PREP(UWTBL_IDX2BASE_DW, _dw))
1037+
1038+#define KEYTBL_IDX2BASE_KEY GENMASK(12, 6)
1039+#define KEYTBL_IDX2BASE_DW GENMASK(5, 2)
1040+#define KEYTBL_IDX2BASE(_key, _dw) (MT_DBG_UWTBL_TOP_BASE | 0x2000 | \
1041+ FIELD_PREP(KEYTBL_IDX2BASE_KEY, _key) | \
1042+ FIELD_PREP(KEYTBL_IDX2BASE_DW, _dw))
1043+
1044+// UMAC WTBL
1045+// DW0
1046+#define WF_UWTBL_PEER_MLD_ADDRESS_47_32__DW 0
1047+#define WF_UWTBL_PEER_MLD_ADDRESS_47_32__ADDR 0
1048+#define WF_UWTBL_PEER_MLD_ADDRESS_47_32__MASK 0x0000ffff // 15- 0
1049+#define WF_UWTBL_PEER_MLD_ADDRESS_47_32__SHIFT 0
1050+#define WF_UWTBL_OWN_MLD_ID_DW 0
1051+#define WF_UWTBL_OWN_MLD_ID_ADDR 0
1052+#define WF_UWTBL_OWN_MLD_ID_MASK 0x003f0000 // 21-16
1053+#define WF_UWTBL_OWN_MLD_ID_SHIFT 16
1054+// DW1
1055+#define WF_UWTBL_PEER_MLD_ADDRESS_31_0__DW 1
1056+#define WF_UWTBL_PEER_MLD_ADDRESS_31_0__ADDR 4
1057+#define WF_UWTBL_PEER_MLD_ADDRESS_31_0__MASK 0xffffffff // 31- 0
1058+#define WF_UWTBL_PEER_MLD_ADDRESS_31_0__SHIFT 0
1059+// DW2
1060+#define WF_UWTBL_PN_31_0__DW 2
1061+#define WF_UWTBL_PN_31_0__ADDR 8
1062+#define WF_UWTBL_PN_31_0__MASK 0xffffffff // 31- 0
1063+#define WF_UWTBL_PN_31_0__SHIFT 0
1064+// DW3
1065+#define WF_UWTBL_PN_47_32__DW 3
1066+#define WF_UWTBL_PN_47_32__ADDR 12
1067+#define WF_UWTBL_PN_47_32__MASK 0x0000ffff // 15- 0
1068+#define WF_UWTBL_PN_47_32__SHIFT 0
1069+#define WF_UWTBL_COM_SN_DW 3
1070+#define WF_UWTBL_COM_SN_ADDR 12
1071+#define WF_UWTBL_COM_SN_MASK 0x0fff0000 // 27-16
1072+#define WF_UWTBL_COM_SN_SHIFT 16
1073+// DW4
1074+#define WF_UWTBL_TID0_SN_DW 4
1075+#define WF_UWTBL_TID0_SN_ADDR 16
1076+#define WF_UWTBL_TID0_SN_MASK 0x00000fff // 11- 0
1077+#define WF_UWTBL_TID0_SN_SHIFT 0
1078+#define WF_UWTBL_RX_BIPN_31_0__DW 4
1079+#define WF_UWTBL_RX_BIPN_31_0__ADDR 16
1080+#define WF_UWTBL_RX_BIPN_31_0__MASK 0xffffffff // 31- 0
1081+#define WF_UWTBL_RX_BIPN_31_0__SHIFT 0
1082+#define WF_UWTBL_TID1_SN_DW 4
1083+#define WF_UWTBL_TID1_SN_ADDR 16
1084+#define WF_UWTBL_TID1_SN_MASK 0x00fff000 // 23-12
1085+#define WF_UWTBL_TID1_SN_SHIFT 12
1086+#define WF_UWTBL_TID2_SN_7_0__DW 4
1087+#define WF_UWTBL_TID2_SN_7_0__ADDR 16
1088+#define WF_UWTBL_TID2_SN_7_0__MASK 0xff000000 // 31-24
1089+#define WF_UWTBL_TID2_SN_7_0__SHIFT 24
1090+// DW5
1091+#define WF_UWTBL_TID2_SN_11_8__DW 5
1092+#define WF_UWTBL_TID2_SN_11_8__ADDR 20
1093+#define WF_UWTBL_TID2_SN_11_8__MASK 0x0000000f // 3- 0
1094+#define WF_UWTBL_TID2_SN_11_8__SHIFT 0
1095+#define WF_UWTBL_RX_BIPN_47_32__DW 5
1096+#define WF_UWTBL_RX_BIPN_47_32__ADDR 20
1097+#define WF_UWTBL_RX_BIPN_47_32__MASK 0x0000ffff // 15- 0
1098+#define WF_UWTBL_RX_BIPN_47_32__SHIFT 0
1099+#define WF_UWTBL_TID3_SN_DW 5
1100+#define WF_UWTBL_TID3_SN_ADDR 20
1101+#define WF_UWTBL_TID3_SN_MASK 0x0000fff0 // 15- 4
1102+#define WF_UWTBL_TID3_SN_SHIFT 4
1103+#define WF_UWTBL_TID4_SN_DW 5
1104+#define WF_UWTBL_TID4_SN_ADDR 20
1105+#define WF_UWTBL_TID4_SN_MASK 0x0fff0000 // 27-16
1106+#define WF_UWTBL_TID4_SN_SHIFT 16
1107+#define WF_UWTBL_TID5_SN_3_0__DW 5
1108+#define WF_UWTBL_TID5_SN_3_0__ADDR 20
1109+#define WF_UWTBL_TID5_SN_3_0__MASK 0xf0000000 // 31-28
1110+#define WF_UWTBL_TID5_SN_3_0__SHIFT 28
1111+// DW6
1112+#define WF_UWTBL_TID5_SN_11_4__DW 6
1113+#define WF_UWTBL_TID5_SN_11_4__ADDR 24
1114+#define WF_UWTBL_TID5_SN_11_4__MASK 0x000000ff // 7- 0
1115+#define WF_UWTBL_TID5_SN_11_4__SHIFT 0
1116+#define WF_UWTBL_KEY_LOC2_DW 6
1117+#define WF_UWTBL_KEY_LOC2_ADDR 24
1118+#define WF_UWTBL_KEY_LOC2_MASK 0x00001fff // 12- 0
1119+#define WF_UWTBL_KEY_LOC2_SHIFT 0
1120+#define WF_UWTBL_TID6_SN_DW 6
1121+#define WF_UWTBL_TID6_SN_ADDR 24
1122+#define WF_UWTBL_TID6_SN_MASK 0x000fff00 // 19- 8
1123+#define WF_UWTBL_TID6_SN_SHIFT 8
1124+#define WF_UWTBL_TID7_SN_DW 6
1125+#define WF_UWTBL_TID7_SN_ADDR 24
1126+#define WF_UWTBL_TID7_SN_MASK 0xfff00000 // 31-20
1127+#define WF_UWTBL_TID7_SN_SHIFT 20
1128+// DW7
1129+#define WF_UWTBL_KEY_LOC0_DW 7
1130+#define WF_UWTBL_KEY_LOC0_ADDR 28
1131+#define WF_UWTBL_KEY_LOC0_MASK 0x00001fff // 12- 0
1132+#define WF_UWTBL_KEY_LOC0_SHIFT 0
1133+#define WF_UWTBL_KEY_LOC1_DW 7
1134+#define WF_UWTBL_KEY_LOC1_ADDR 28
1135+#define WF_UWTBL_KEY_LOC1_MASK 0x1fff0000 // 28-16
1136+#define WF_UWTBL_KEY_LOC1_SHIFT 16
1137+// DW8
1138+#define WF_UWTBL_AMSDU_CFG_DW 8
1139+#define WF_UWTBL_AMSDU_CFG_ADDR 32
1140+#define WF_UWTBL_AMSDU_CFG_MASK 0x00000fff // 11- 0
1141+#define WF_UWTBL_AMSDU_CFG_SHIFT 0
1142+#define WF_UWTBL_WMM_Q_DW 8
1143+#define WF_UWTBL_WMM_Q_ADDR 32
1144+#define WF_UWTBL_WMM_Q_MASK 0x06000000 // 26-25
1145+#define WF_UWTBL_WMM_Q_SHIFT 25
1146+#define WF_UWTBL_QOS_DW 8
1147+#define WF_UWTBL_QOS_ADDR 32
1148+#define WF_UWTBL_QOS_MASK 0x08000000 // 27-27
1149+#define WF_UWTBL_QOS_SHIFT 27
1150+#define WF_UWTBL_HT_DW 8
1151+#define WF_UWTBL_HT_ADDR 32
1152+#define WF_UWTBL_HT_MASK 0x10000000 // 28-28
1153+#define WF_UWTBL_HT_SHIFT 28
1154+#define WF_UWTBL_HDRT_MODE_DW 8
1155+#define WF_UWTBL_HDRT_MODE_ADDR 32
1156+#define WF_UWTBL_HDRT_MODE_MASK 0x20000000 // 29-29
1157+#define WF_UWTBL_HDRT_MODE_SHIFT 29
1158+// DW9
1159+#define WF_UWTBL_RELATED_IDX0_DW 9
1160+#define WF_UWTBL_RELATED_IDX0_ADDR 36
1161+#define WF_UWTBL_RELATED_IDX0_MASK 0x00000fff // 11- 0
1162+#define WF_UWTBL_RELATED_IDX0_SHIFT 0
1163+#define WF_UWTBL_RELATED_BAND0_DW 9
1164+#define WF_UWTBL_RELATED_BAND0_ADDR 36
1165+#define WF_UWTBL_RELATED_BAND0_MASK 0x00003000 // 13-12
1166+#define WF_UWTBL_RELATED_BAND0_SHIFT 12
1167+#define WF_UWTBL_PRIMARY_MLD_BAND_DW 9
1168+#define WF_UWTBL_PRIMARY_MLD_BAND_ADDR 36
1169+#define WF_UWTBL_PRIMARY_MLD_BAND_MASK 0x0000c000 // 15-14
1170+#define WF_UWTBL_PRIMARY_MLD_BAND_SHIFT 14
1171+#define WF_UWTBL_RELATED_IDX1_DW 9
1172+#define WF_UWTBL_RELATED_IDX1_ADDR 36
1173+#define WF_UWTBL_RELATED_IDX1_MASK 0x0fff0000 // 27-16
1174+#define WF_UWTBL_RELATED_IDX1_SHIFT 16
1175+#define WF_UWTBL_RELATED_BAND1_DW 9
1176+#define WF_UWTBL_RELATED_BAND1_ADDR 36
1177+#define WF_UWTBL_RELATED_BAND1_MASK 0x30000000 // 29-28
1178+#define WF_UWTBL_RELATED_BAND1_SHIFT 28
1179+#define WF_UWTBL_SECONDARY_MLD_BAND_DW 9
1180+#define WF_UWTBL_SECONDARY_MLD_BAND_ADDR 36
1181+#define WF_UWTBL_SECONDARY_MLD_BAND_MASK 0xc0000000 // 31-30
1182+#define WF_UWTBL_SECONDARY_MLD_BAND_SHIFT 30
1183+
1184+/* LMAC WTBL */
1185+// DW0
1186+#define WF_LWTBL_PEER_LINK_ADDRESS_47_32__DW 0
1187+#define WF_LWTBL_PEER_LINK_ADDRESS_47_32__ADDR 0
1188+#define WF_LWTBL_PEER_LINK_ADDRESS_47_32__MASK \
1189+ 0x0000ffff // 15- 0
1190+#define WF_LWTBL_PEER_LINK_ADDRESS_47_32__SHIFT 0
1191+#define WF_LWTBL_MUAR_DW 0
1192+#define WF_LWTBL_MUAR_ADDR 0
1193+#define WF_LWTBL_MUAR_MASK \
1194+ 0x003f0000 // 21-16
1195+#define WF_LWTBL_MUAR_SHIFT 16
1196+#define WF_LWTBL_RCA1_DW 0
1197+#define WF_LWTBL_RCA1_ADDR 0
1198+#define WF_LWTBL_RCA1_MASK \
1199+ 0x00400000 // 22-22
1200+#define WF_LWTBL_RCA1_SHIFT 22
1201+#define WF_LWTBL_KID_DW 0
1202+#define WF_LWTBL_KID_ADDR 0
1203+#define WF_LWTBL_KID_MASK \
1204+ 0x01800000 // 24-23
1205+#define WF_LWTBL_KID_SHIFT 23
1206+#define WF_LWTBL_RCID_DW 0
1207+#define WF_LWTBL_RCID_ADDR 0
1208+#define WF_LWTBL_RCID_MASK \
1209+ 0x02000000 // 25-25
1210+#define WF_LWTBL_RCID_SHIFT 25
1211+#define WF_LWTBL_BAND_DW 0
1212+#define WF_LWTBL_BAND_ADDR 0
1213+#define WF_LWTBL_BAND_MASK \
1214+ 0x0c000000 // 27-26
1215+#define WF_LWTBL_BAND_SHIFT 26
1216+#define WF_LWTBL_RV_DW 0
1217+#define WF_LWTBL_RV_ADDR 0
1218+#define WF_LWTBL_RV_MASK \
1219+ 0x10000000 // 28-28
1220+#define WF_LWTBL_RV_SHIFT 28
1221+#define WF_LWTBL_RCA2_DW 0
1222+#define WF_LWTBL_RCA2_ADDR 0
1223+#define WF_LWTBL_RCA2_MASK \
1224+ 0x20000000 // 29-29
1225+#define WF_LWTBL_RCA2_SHIFT 29
1226+#define WF_LWTBL_WPI_FLAG_DW 0
1227+#define WF_LWTBL_WPI_FLAG_ADDR 0
1228+#define WF_LWTBL_WPI_FLAG_MASK \
1229+ 0x40000000 // 30-30
1230+#define WF_LWTBL_WPI_FLAG_SHIFT 30
1231+// DW1
1232+#define WF_LWTBL_PEER_LINK_ADDRESS_31_0__DW 1
1233+#define WF_LWTBL_PEER_LINK_ADDRESS_31_0__ADDR 4
1234+#define WF_LWTBL_PEER_LINK_ADDRESS_31_0__MASK \
1235+ 0xffffffff // 31- 0
1236+#define WF_LWTBL_PEER_LINK_ADDRESS_31_0__SHIFT 0
1237+// DW2
1238+#define WF_LWTBL_AID_DW 2
1239+#define WF_LWTBL_AID_ADDR 8
1240+#define WF_LWTBL_AID_MASK \
1241+ 0x00000fff // 11- 0
1242+#define WF_LWTBL_AID_SHIFT 0
1243+#define WF_LWTBL_GID_SU_DW 2
1244+#define WF_LWTBL_GID_SU_ADDR 8
1245+#define WF_LWTBL_GID_SU_MASK \
1246+ 0x00001000 // 12-12
1247+#define WF_LWTBL_GID_SU_SHIFT 12
1248+#define WF_LWTBL_SPP_EN_DW 2
1249+#define WF_LWTBL_SPP_EN_ADDR 8
1250+#define WF_LWTBL_SPP_EN_MASK \
1251+ 0x00002000 // 13-13
1252+#define WF_LWTBL_SPP_EN_SHIFT 13
1253+#define WF_LWTBL_WPI_EVEN_DW 2
1254+#define WF_LWTBL_WPI_EVEN_ADDR 8
1255+#define WF_LWTBL_WPI_EVEN_MASK \
1256+ 0x00004000 // 14-14
1257+#define WF_LWTBL_WPI_EVEN_SHIFT 14
1258+#define WF_LWTBL_AAD_OM_DW 2
1259+#define WF_LWTBL_AAD_OM_ADDR 8
1260+#define WF_LWTBL_AAD_OM_MASK \
1261+ 0x00008000 // 15-15
1262+#define WF_LWTBL_AAD_OM_SHIFT 15
1263+#define WF_LWTBL_CIPHER_SUIT_PGTK_DW 2
1264+#define WF_LWTBL_CIPHER_SUIT_PGTK_ADDR 8
1265+#define WF_LWTBL_CIPHER_SUIT_PGTK_MASK \
1266+ 0x001f0000 // 20-16
1267+#define WF_LWTBL_CIPHER_SUIT_PGTK_SHIFT 16
1268+#define WF_LWTBL_FD_DW 2
1269+#define WF_LWTBL_FD_ADDR 8
1270+#define WF_LWTBL_FD_MASK \
1271+ 0x00200000 // 21-21
1272+#define WF_LWTBL_FD_SHIFT 21
1273+#define WF_LWTBL_TD_DW 2
1274+#define WF_LWTBL_TD_ADDR 8
1275+#define WF_LWTBL_TD_MASK \
1276+ 0x00400000 // 22-22
1277+#define WF_LWTBL_TD_SHIFT 22
1278+#define WF_LWTBL_SW_DW 2
1279+#define WF_LWTBL_SW_ADDR 8
1280+#define WF_LWTBL_SW_MASK \
1281+ 0x00800000 // 23-23
1282+#define WF_LWTBL_SW_SHIFT 23
1283+#define WF_LWTBL_UL_DW 2
1284+#define WF_LWTBL_UL_ADDR 8
1285+#define WF_LWTBL_UL_MASK \
1286+ 0x01000000 // 24-24
1287+#define WF_LWTBL_UL_SHIFT 24
1288+#define WF_LWTBL_TX_PS_DW 2
1289+#define WF_LWTBL_TX_PS_ADDR 8
1290+#define WF_LWTBL_TX_PS_MASK \
1291+ 0x02000000 // 25-25
1292+#define WF_LWTBL_TX_PS_SHIFT 25
1293+#define WF_LWTBL_QOS_DW 2
1294+#define WF_LWTBL_QOS_ADDR 8
1295+#define WF_LWTBL_QOS_MASK \
1296+ 0x04000000 // 26-26
1297+#define WF_LWTBL_QOS_SHIFT 26
1298+#define WF_LWTBL_HT_DW 2
1299+#define WF_LWTBL_HT_ADDR 8
1300+#define WF_LWTBL_HT_MASK \
1301+ 0x08000000 // 27-27
1302+#define WF_LWTBL_HT_SHIFT 27
1303+#define WF_LWTBL_VHT_DW 2
1304+#define WF_LWTBL_VHT_ADDR 8
1305+#define WF_LWTBL_VHT_MASK \
1306+ 0x10000000 // 28-28
1307+#define WF_LWTBL_VHT_SHIFT 28
1308+#define WF_LWTBL_HE_DW 2
1309+#define WF_LWTBL_HE_ADDR 8
1310+#define WF_LWTBL_HE_MASK \
1311+ 0x20000000 // 29-29
1312+#define WF_LWTBL_HE_SHIFT 29
1313+#define WF_LWTBL_EHT_DW 2
1314+#define WF_LWTBL_EHT_ADDR 8
1315+#define WF_LWTBL_EHT_MASK \
1316+ 0x40000000 // 30-30
1317+#define WF_LWTBL_EHT_SHIFT 30
1318+#define WF_LWTBL_MESH_DW 2
1319+#define WF_LWTBL_MESH_ADDR 8
1320+#define WF_LWTBL_MESH_MASK \
1321+ 0x80000000 // 31-31
1322+#define WF_LWTBL_MESH_SHIFT 31
1323+// DW3
1324+#define WF_LWTBL_WMM_Q_DW 3
1325+#define WF_LWTBL_WMM_Q_ADDR 12
1326+#define WF_LWTBL_WMM_Q_MASK \
1327+ 0x00000003 // 1- 0
1328+#define WF_LWTBL_WMM_Q_SHIFT 0
1329+#define WF_LWTBL_EHT_SIG_MCS_DW 3
1330+#define WF_LWTBL_EHT_SIG_MCS_ADDR 12
1331+#define WF_LWTBL_EHT_SIG_MCS_MASK \
1332+ 0x0000000c // 3- 2
1333+#define WF_LWTBL_EHT_SIG_MCS_SHIFT 2
1334+#define WF_LWTBL_HDRT_MODE_DW 3
1335+#define WF_LWTBL_HDRT_MODE_ADDR 12
1336+#define WF_LWTBL_HDRT_MODE_MASK \
1337+ 0x00000010 // 4- 4
1338+#define WF_LWTBL_HDRT_MODE_SHIFT 4
1339+#define WF_LWTBL_BEAM_CHG_DW 3
1340+#define WF_LWTBL_BEAM_CHG_ADDR 12
1341+#define WF_LWTBL_BEAM_CHG_MASK \
1342+ 0x00000020 // 5- 5
1343+#define WF_LWTBL_BEAM_CHG_SHIFT 5
1344+#define WF_LWTBL_EHT_LTF_SYM_NUM_OPT_DW 3
1345+#define WF_LWTBL_EHT_LTF_SYM_NUM_OPT_ADDR 12
1346+#define WF_LWTBL_EHT_LTF_SYM_NUM_OPT_MASK \
1347+ 0x000000c0 // 7- 6
1348+#define WF_LWTBL_EHT_LTF_SYM_NUM_OPT_SHIFT 6
1349+#define WF_LWTBL_PFMU_IDX_DW 3
1350+#define WF_LWTBL_PFMU_IDX_ADDR 12
1351+#define WF_LWTBL_PFMU_IDX_MASK \
1352+ 0x0000ff00 // 15- 8
1353+#define WF_LWTBL_PFMU_IDX_SHIFT 8
1354+#define WF_LWTBL_ULPF_IDX_DW 3
1355+#define WF_LWTBL_ULPF_IDX_ADDR 12
1356+#define WF_LWTBL_ULPF_IDX_MASK \
1357+ 0x00ff0000 // 23-16
1358+#define WF_LWTBL_ULPF_IDX_SHIFT 16
1359+#define WF_LWTBL_RIBF_DW 3
1360+#define WF_LWTBL_RIBF_ADDR 12
1361+#define WF_LWTBL_RIBF_MASK \
1362+ 0x01000000 // 24-24
1363+#define WF_LWTBL_RIBF_SHIFT 24
1364+#define WF_LWTBL_ULPF_DW 3
1365+#define WF_LWTBL_ULPF_ADDR 12
1366+#define WF_LWTBL_ULPF_MASK \
1367+ 0x02000000 // 25-25
1368+#define WF_LWTBL_ULPF_SHIFT 25
1369+#define WF_LWTBL_TBF_HT_DW 3
1370+#define WF_LWTBL_TBF_HT_ADDR 12
1371+#define WF_LWTBL_TBF_HT_MASK \
1372+ 0x08000000 // 27-27
1373+#define WF_LWTBL_TBF_HT_SHIFT 27
1374+#define WF_LWTBL_TBF_VHT_DW 3
1375+#define WF_LWTBL_TBF_VHT_ADDR 12
1376+#define WF_LWTBL_TBF_VHT_MASK \
1377+ 0x10000000 // 28-28
1378+#define WF_LWTBL_TBF_VHT_SHIFT 28
1379+#define WF_LWTBL_TBF_HE_DW 3
1380+#define WF_LWTBL_TBF_HE_ADDR 12
1381+#define WF_LWTBL_TBF_HE_MASK \
1382+ 0x20000000 // 29-29
1383+#define WF_LWTBL_TBF_HE_SHIFT 29
1384+#define WF_LWTBL_TBF_EHT_DW 3
1385+#define WF_LWTBL_TBF_EHT_ADDR 12
1386+#define WF_LWTBL_TBF_EHT_MASK \
1387+ 0x40000000 // 30-30
1388+#define WF_LWTBL_TBF_EHT_SHIFT 30
1389+#define WF_LWTBL_IGN_FBK_DW 3
1390+#define WF_LWTBL_IGN_FBK_ADDR 12
1391+#define WF_LWTBL_IGN_FBK_MASK \
1392+ 0x80000000 // 31-31
1393+#define WF_LWTBL_IGN_FBK_SHIFT 31
1394+// DW4
1395+#define WF_LWTBL_ANT_ID0_DW 4
1396+#define WF_LWTBL_ANT_ID0_ADDR 16
1397+#define WF_LWTBL_ANT_ID0_MASK \
1398+ 0x00000007 // 2- 0
1399+#define WF_LWTBL_ANT_ID0_SHIFT 0
1400+#define WF_LWTBL_ANT_ID1_DW 4
1401+#define WF_LWTBL_ANT_ID1_ADDR 16
1402+#define WF_LWTBL_ANT_ID1_MASK \
1403+ 0x00000038 // 5- 3
1404+#define WF_LWTBL_ANT_ID1_SHIFT 3
1405+#define WF_LWTBL_ANT_ID2_DW 4
1406+#define WF_LWTBL_ANT_ID2_ADDR 16
1407+#define WF_LWTBL_ANT_ID2_MASK \
1408+ 0x000001c0 // 8- 6
1409+#define WF_LWTBL_ANT_ID2_SHIFT 6
1410+#define WF_LWTBL_ANT_ID3_DW 4
1411+#define WF_LWTBL_ANT_ID3_ADDR 16
1412+#define WF_LWTBL_ANT_ID3_MASK \
1413+ 0x00000e00 // 11- 9
1414+#define WF_LWTBL_ANT_ID3_SHIFT 9
1415+#define WF_LWTBL_ANT_ID4_DW 4
1416+#define WF_LWTBL_ANT_ID4_ADDR 16
1417+#define WF_LWTBL_ANT_ID4_MASK \
1418+ 0x00007000 // 14-12
1419+#define WF_LWTBL_ANT_ID4_SHIFT 12
1420+#define WF_LWTBL_ANT_ID5_DW 4
1421+#define WF_LWTBL_ANT_ID5_ADDR 16
1422+#define WF_LWTBL_ANT_ID5_MASK \
1423+ 0x00038000 // 17-15
1424+#define WF_LWTBL_ANT_ID5_SHIFT 15
1425+#define WF_LWTBL_ANT_ID6_DW 4
1426+#define WF_LWTBL_ANT_ID6_ADDR 16
1427+#define WF_LWTBL_ANT_ID6_MASK \
1428+ 0x001c0000 // 20-18
1429+#define WF_LWTBL_ANT_ID6_SHIFT 18
1430+#define WF_LWTBL_ANT_ID7_DW 4
1431+#define WF_LWTBL_ANT_ID7_ADDR 16
1432+#define WF_LWTBL_ANT_ID7_MASK \
1433+ 0x00e00000 // 23-21
1434+#define WF_LWTBL_ANT_ID7_SHIFT 21
1435+#define WF_LWTBL_PE_DW 4
1436+#define WF_LWTBL_PE_ADDR 16
1437+#define WF_LWTBL_PE_MASK \
1438+ 0x03000000 // 25-24
1439+#define WF_LWTBL_PE_SHIFT 24
1440+#define WF_LWTBL_DIS_RHTR_DW 4
1441+#define WF_LWTBL_DIS_RHTR_ADDR 16
1442+#define WF_LWTBL_DIS_RHTR_MASK \
1443+ 0x04000000 // 26-26
1444+#define WF_LWTBL_DIS_RHTR_SHIFT 26
1445+#define WF_LWTBL_LDPC_HT_DW 4
1446+#define WF_LWTBL_LDPC_HT_ADDR 16
1447+#define WF_LWTBL_LDPC_HT_MASK \
1448+ 0x08000000 // 27-27
1449+#define WF_LWTBL_LDPC_HT_SHIFT 27
1450+#define WF_LWTBL_LDPC_VHT_DW 4
1451+#define WF_LWTBL_LDPC_VHT_ADDR 16
1452+#define WF_LWTBL_LDPC_VHT_MASK \
1453+ 0x10000000 // 28-28
1454+#define WF_LWTBL_LDPC_VHT_SHIFT 28
1455+#define WF_LWTBL_LDPC_HE_DW 4
1456+#define WF_LWTBL_LDPC_HE_ADDR 16
1457+#define WF_LWTBL_LDPC_HE_MASK \
1458+ 0x20000000 // 29-29
1459+#define WF_LWTBL_LDPC_HE_SHIFT 29
1460+#define WF_LWTBL_LDPC_EHT_DW 4
1461+#define WF_LWTBL_LDPC_EHT_ADDR 16
1462+#define WF_LWTBL_LDPC_EHT_MASK \
1463+ 0x40000000 // 30-30
1464+#define WF_LWTBL_LDPC_EHT_SHIFT 30
1465+// DW5
1466+#define WF_LWTBL_AF_DW 5
1467+#define WF_LWTBL_AF_ADDR 20
1468+#define WF_LWTBL_AF_MASK \
1469+ 0x00000007 // 2- 0
1470+#define WF_LWTBL_AF_SHIFT 0
1471+#define WF_LWTBL_AF_HE_DW 5
1472+#define WF_LWTBL_AF_HE_ADDR 20
1473+#define WF_LWTBL_AF_HE_MASK \
1474+ 0x00000018 // 4- 3
1475+#define WF_LWTBL_AF_HE_SHIFT 3
1476+#define WF_LWTBL_RTS_DW 5
1477+#define WF_LWTBL_RTS_ADDR 20
1478+#define WF_LWTBL_RTS_MASK \
1479+ 0x00000020 // 5- 5
1480+#define WF_LWTBL_RTS_SHIFT 5
1481+#define WF_LWTBL_SMPS_DW 5
1482+#define WF_LWTBL_SMPS_ADDR 20
1483+#define WF_LWTBL_SMPS_MASK \
1484+ 0x00000040 // 6- 6
1485+#define WF_LWTBL_SMPS_SHIFT 6
1486+#define WF_LWTBL_DYN_BW_DW 5
1487+#define WF_LWTBL_DYN_BW_ADDR 20
1488+#define WF_LWTBL_DYN_BW_MASK \
1489+ 0x00000080 // 7- 7
1490+#define WF_LWTBL_DYN_BW_SHIFT 7
1491+#define WF_LWTBL_MMSS_DW 5
1492+#define WF_LWTBL_MMSS_ADDR 20
1493+#define WF_LWTBL_MMSS_MASK \
1494+ 0x00000700 // 10- 8
1495+#define WF_LWTBL_MMSS_SHIFT 8
1496+#define WF_LWTBL_USR_DW 5
1497+#define WF_LWTBL_USR_ADDR 20
1498+#define WF_LWTBL_USR_MASK \
1499+ 0x00000800 // 11-11
1500+#define WF_LWTBL_USR_SHIFT 11
1501+#define WF_LWTBL_SR_R_DW 5
1502+#define WF_LWTBL_SR_R_ADDR 20
1503+#define WF_LWTBL_SR_R_MASK \
1504+ 0x00007000 // 14-12
1505+#define WF_LWTBL_SR_R_SHIFT 12
1506+#define WF_LWTBL_SR_ABORT_DW 5
1507+#define WF_LWTBL_SR_ABORT_ADDR 20
1508+#define WF_LWTBL_SR_ABORT_MASK \
1509+ 0x00008000 // 15-15
1510+#define WF_LWTBL_SR_ABORT_SHIFT 15
1511+#define WF_LWTBL_TX_POWER_OFFSET_DW 5
1512+#define WF_LWTBL_TX_POWER_OFFSET_ADDR 20
1513+#define WF_LWTBL_TX_POWER_OFFSET_MASK \
1514+ 0x003f0000 // 21-16
1515+#define WF_LWTBL_TX_POWER_OFFSET_SHIFT 16
1516+#define WF_LWTBL_LTF_EHT_DW 5
1517+#define WF_LWTBL_LTF_EHT_ADDR 20
1518+#define WF_LWTBL_LTF_EHT_MASK \
1519+ 0x00c00000 // 23-22
1520+#define WF_LWTBL_LTF_EHT_SHIFT 22
1521+#define WF_LWTBL_GI_EHT_DW 5
1522+#define WF_LWTBL_GI_EHT_ADDR 20
1523+#define WF_LWTBL_GI_EHT_MASK \
1524+ 0x03000000 // 25-24
1525+#define WF_LWTBL_GI_EHT_SHIFT 24
1526+#define WF_LWTBL_DOPPL_DW 5
1527+#define WF_LWTBL_DOPPL_ADDR 20
1528+#define WF_LWTBL_DOPPL_MASK \
1529+ 0x04000000 // 26-26
1530+#define WF_LWTBL_DOPPL_SHIFT 26
1531+#define WF_LWTBL_TXOP_PS_CAP_DW 5
1532+#define WF_LWTBL_TXOP_PS_CAP_ADDR 20
1533+#define WF_LWTBL_TXOP_PS_CAP_MASK \
1534+ 0x08000000 // 27-27
1535+#define WF_LWTBL_TXOP_PS_CAP_SHIFT 27
1536+#define WF_LWTBL_DU_I_PSM_DW 5
1537+#define WF_LWTBL_DU_I_PSM_ADDR 20
1538+#define WF_LWTBL_DU_I_PSM_MASK \
1539+ 0x10000000 // 28-28
1540+#define WF_LWTBL_DU_I_PSM_SHIFT 28
1541+#define WF_LWTBL_I_PSM_DW 5
1542+#define WF_LWTBL_I_PSM_ADDR 20
1543+#define WF_LWTBL_I_PSM_MASK \
1544+ 0x20000000 // 29-29
1545+#define WF_LWTBL_I_PSM_SHIFT 29
1546+#define WF_LWTBL_PSM_DW 5
1547+#define WF_LWTBL_PSM_ADDR 20
1548+#define WF_LWTBL_PSM_MASK \
1549+ 0x40000000 // 30-30
1550+#define WF_LWTBL_PSM_SHIFT 30
1551+#define WF_LWTBL_SKIP_TX_DW 5
1552+#define WF_LWTBL_SKIP_TX_ADDR 20
1553+#define WF_LWTBL_SKIP_TX_MASK \
1554+ 0x80000000 // 31-31
1555+#define WF_LWTBL_SKIP_TX_SHIFT 31
1556+// DW6
1557+#define WF_LWTBL_CBRN_DW 6
1558+#define WF_LWTBL_CBRN_ADDR 24
1559+#define WF_LWTBL_CBRN_MASK \
1560+ 0x00000007 // 2- 0
1561+#define WF_LWTBL_CBRN_SHIFT 0
1562+#define WF_LWTBL_DBNSS_EN_DW 6
1563+#define WF_LWTBL_DBNSS_EN_ADDR 24
1564+#define WF_LWTBL_DBNSS_EN_MASK \
1565+ 0x00000008 // 3- 3
1566+#define WF_LWTBL_DBNSS_EN_SHIFT 3
1567+#define WF_LWTBL_BAF_EN_DW 6
1568+#define WF_LWTBL_BAF_EN_ADDR 24
1569+#define WF_LWTBL_BAF_EN_MASK \
1570+ 0x00000010 // 4- 4
1571+#define WF_LWTBL_BAF_EN_SHIFT 4
1572+#define WF_LWTBL_RDGBA_DW 6
1573+#define WF_LWTBL_RDGBA_ADDR 24
1574+#define WF_LWTBL_RDGBA_MASK \
1575+ 0x00000020 // 5- 5
1576+#define WF_LWTBL_RDGBA_SHIFT 5
1577+#define WF_LWTBL_R_DW 6
1578+#define WF_LWTBL_R_ADDR 24
1579+#define WF_LWTBL_R_MASK \
1580+ 0x00000040 // 6- 6
1581+#define WF_LWTBL_R_SHIFT 6
1582+#define WF_LWTBL_SPE_IDX_DW 6
1583+#define WF_LWTBL_SPE_IDX_ADDR 24
1584+#define WF_LWTBL_SPE_IDX_MASK \
1585+ 0x00000f80 // 11- 7
1586+#define WF_LWTBL_SPE_IDX_SHIFT 7
1587+#define WF_LWTBL_G2_DW 6
1588+#define WF_LWTBL_G2_ADDR 24
1589+#define WF_LWTBL_G2_MASK \
1590+ 0x00001000 // 12-12
1591+#define WF_LWTBL_G2_SHIFT 12
1592+#define WF_LWTBL_G4_DW 6
1593+#define WF_LWTBL_G4_ADDR 24
1594+#define WF_LWTBL_G4_MASK \
1595+ 0x00002000 // 13-13
1596+#define WF_LWTBL_G4_SHIFT 13
1597+#define WF_LWTBL_G8_DW 6
1598+#define WF_LWTBL_G8_ADDR 24
1599+#define WF_LWTBL_G8_MASK \
1600+ 0x00004000 // 14-14
1601+#define WF_LWTBL_G8_SHIFT 14
1602+#define WF_LWTBL_G16_DW 6
1603+#define WF_LWTBL_G16_ADDR 24
1604+#define WF_LWTBL_G16_MASK \
1605+ 0x00008000 // 15-15
1606+#define WF_LWTBL_G16_SHIFT 15
1607+#define WF_LWTBL_G2_LTF_DW 6
1608+#define WF_LWTBL_G2_LTF_ADDR 24
1609+#define WF_LWTBL_G2_LTF_MASK \
1610+ 0x00030000 // 17-16
1611+#define WF_LWTBL_G2_LTF_SHIFT 16
1612+#define WF_LWTBL_G4_LTF_DW 6
1613+#define WF_LWTBL_G4_LTF_ADDR 24
1614+#define WF_LWTBL_G4_LTF_MASK \
1615+ 0x000c0000 // 19-18
1616+#define WF_LWTBL_G4_LTF_SHIFT 18
1617+#define WF_LWTBL_G8_LTF_DW 6
1618+#define WF_LWTBL_G8_LTF_ADDR 24
1619+#define WF_LWTBL_G8_LTF_MASK \
1620+ 0x00300000 // 21-20
1621+#define WF_LWTBL_G8_LTF_SHIFT 20
1622+#define WF_LWTBL_G16_LTF_DW 6
1623+#define WF_LWTBL_G16_LTF_ADDR 24
1624+#define WF_LWTBL_G16_LTF_MASK \
1625+ 0x00c00000 // 23-22
1626+#define WF_LWTBL_G16_LTF_SHIFT 22
1627+#define WF_LWTBL_G2_HE_DW 6
1628+#define WF_LWTBL_G2_HE_ADDR 24
1629+#define WF_LWTBL_G2_HE_MASK \
1630+ 0x03000000 // 25-24
1631+#define WF_LWTBL_G2_HE_SHIFT 24
1632+#define WF_LWTBL_G4_HE_DW 6
1633+#define WF_LWTBL_G4_HE_ADDR 24
1634+#define WF_LWTBL_G4_HE_MASK \
1635+ 0x0c000000 // 27-26
1636+#define WF_LWTBL_G4_HE_SHIFT 26
1637+#define WF_LWTBL_G8_HE_DW 6
1638+#define WF_LWTBL_G8_HE_ADDR 24
1639+#define WF_LWTBL_G8_HE_MASK \
1640+ 0x30000000 // 29-28
1641+#define WF_LWTBL_G8_HE_SHIFT 28
1642+#define WF_LWTBL_G16_HE_DW 6
1643+#define WF_LWTBL_G16_HE_ADDR 24
1644+#define WF_LWTBL_G16_HE_MASK \
1645+ 0xc0000000 // 31-30
1646+#define WF_LWTBL_G16_HE_SHIFT 30
1647+// DW7
1648+#define WF_LWTBL_BA_WIN_SIZE0_DW 7
1649+#define WF_LWTBL_BA_WIN_SIZE0_ADDR 28
1650+#define WF_LWTBL_BA_WIN_SIZE0_MASK \
1651+ 0x0000000f // 3- 0
1652+#define WF_LWTBL_BA_WIN_SIZE0_SHIFT 0
1653+#define WF_LWTBL_BA_WIN_SIZE1_DW 7
1654+#define WF_LWTBL_BA_WIN_SIZE1_ADDR 28
1655+#define WF_LWTBL_BA_WIN_SIZE1_MASK \
1656+ 0x000000f0 // 7- 4
1657+#define WF_LWTBL_BA_WIN_SIZE1_SHIFT 4
1658+#define WF_LWTBL_BA_WIN_SIZE2_DW 7
1659+#define WF_LWTBL_BA_WIN_SIZE2_ADDR 28
1660+#define WF_LWTBL_BA_WIN_SIZE2_MASK \
1661+ 0x00000f00 // 11- 8
1662+#define WF_LWTBL_BA_WIN_SIZE2_SHIFT 8
1663+#define WF_LWTBL_BA_WIN_SIZE3_DW 7
1664+#define WF_LWTBL_BA_WIN_SIZE3_ADDR 28
1665+#define WF_LWTBL_BA_WIN_SIZE3_MASK \
1666+ 0x0000f000 // 15-12
1667+#define WF_LWTBL_BA_WIN_SIZE3_SHIFT 12
1668+#define WF_LWTBL_BA_WIN_SIZE4_DW 7
1669+#define WF_LWTBL_BA_WIN_SIZE4_ADDR 28
1670+#define WF_LWTBL_BA_WIN_SIZE4_MASK \
1671+ 0x000f0000 // 19-16
1672+#define WF_LWTBL_BA_WIN_SIZE4_SHIFT 16
1673+#define WF_LWTBL_BA_WIN_SIZE5_DW 7
1674+#define WF_LWTBL_BA_WIN_SIZE5_ADDR 28
1675+#define WF_LWTBL_BA_WIN_SIZE5_MASK \
1676+ 0x00f00000 // 23-20
1677+#define WF_LWTBL_BA_WIN_SIZE5_SHIFT 20
1678+#define WF_LWTBL_BA_WIN_SIZE6_DW 7
1679+#define WF_LWTBL_BA_WIN_SIZE6_ADDR 28
1680+#define WF_LWTBL_BA_WIN_SIZE6_MASK \
1681+ 0x0f000000 // 27-24
1682+#define WF_LWTBL_BA_WIN_SIZE6_SHIFT 24
1683+#define WF_LWTBL_BA_WIN_SIZE7_DW 7
1684+#define WF_LWTBL_BA_WIN_SIZE7_ADDR 28
1685+#define WF_LWTBL_BA_WIN_SIZE7_MASK \
1686+ 0xf0000000 // 31-28
1687+#define WF_LWTBL_BA_WIN_SIZE7_SHIFT 28
1688+// DW8
1689+#define WF_LWTBL_AC0_RTS_FAIL_CNT_DW 8
1690+#define WF_LWTBL_AC0_RTS_FAIL_CNT_ADDR 32
1691+#define WF_LWTBL_AC0_RTS_FAIL_CNT_MASK \
1692+ 0x0000001f // 4- 0
1693+#define WF_LWTBL_AC0_RTS_FAIL_CNT_SHIFT 0
1694+#define WF_LWTBL_AC1_RTS_FAIL_CNT_DW 8
1695+#define WF_LWTBL_AC1_RTS_FAIL_CNT_ADDR 32
1696+#define WF_LWTBL_AC1_RTS_FAIL_CNT_MASK \
1697+ 0x000003e0 // 9- 5
1698+#define WF_LWTBL_AC1_RTS_FAIL_CNT_SHIFT 5
1699+#define WF_LWTBL_AC2_RTS_FAIL_CNT_DW 8
1700+#define WF_LWTBL_AC2_RTS_FAIL_CNT_ADDR 32
1701+#define WF_LWTBL_AC2_RTS_FAIL_CNT_MASK \
1702+ 0x00007c00 // 14-10
1703+#define WF_LWTBL_AC2_RTS_FAIL_CNT_SHIFT 10
1704+#define WF_LWTBL_AC3_RTS_FAIL_CNT_DW 8
1705+#define WF_LWTBL_AC3_RTS_FAIL_CNT_ADDR 32
1706+#define WF_LWTBL_AC3_RTS_FAIL_CNT_MASK \
1707+ 0x000f8000 // 19-15
1708+#define WF_LWTBL_AC3_RTS_FAIL_CNT_SHIFT 15
1709+#define WF_LWTBL_PARTIAL_AID_DW 8
1710+#define WF_LWTBL_PARTIAL_AID_ADDR 32
1711+#define WF_LWTBL_PARTIAL_AID_MASK \
1712+ 0x1ff00000 // 28-20
1713+#define WF_LWTBL_PARTIAL_AID_SHIFT 20
1714+#define WF_LWTBL_CHK_PER_DW 8
1715+#define WF_LWTBL_CHK_PER_ADDR 32
1716+#define WF_LWTBL_CHK_PER_MASK \
1717+ 0x80000000 // 31-31
1718+#define WF_LWTBL_CHK_PER_SHIFT 31
1719+// DW9
1720+#define WF_LWTBL_RX_AVG_MPDU_SIZE_DW 9
1721+#define WF_LWTBL_RX_AVG_MPDU_SIZE_ADDR 36
1722+#define WF_LWTBL_RX_AVG_MPDU_SIZE_MASK \
1723+ 0x00003fff // 13- 0
1724+#define WF_LWTBL_RX_AVG_MPDU_SIZE_SHIFT 0
1725+#define WF_LWTBL_PRITX_SW_MODE_DW 9
1726+#define WF_LWTBL_PRITX_SW_MODE_ADDR 36
1727+#define WF_LWTBL_PRITX_SW_MODE_MASK \
1728+ 0x00008000 // 15-15
1729+#define WF_LWTBL_PRITX_SW_MODE_SHIFT 15
1730+#define WF_LWTBL_PRITX_ERSU_DW 9
1731+#define WF_LWTBL_PRITX_ERSU_ADDR 36
1732+#define WF_LWTBL_PRITX_ERSU_MASK \
1733+ 0x00010000 // 16-16
1734+#define WF_LWTBL_PRITX_ERSU_SHIFT 16
1735+#define WF_LWTBL_PRITX_PLR_DW 9
1736+#define WF_LWTBL_PRITX_PLR_ADDR 36
1737+#define WF_LWTBL_PRITX_PLR_MASK \
1738+ 0x00020000 // 17-17
1739+#define WF_LWTBL_PRITX_PLR_SHIFT 17
1740+#define WF_LWTBL_PRITX_DCM_DW 9
1741+#define WF_LWTBL_PRITX_DCM_ADDR 36
1742+#define WF_LWTBL_PRITX_DCM_MASK \
1743+ 0x00040000 // 18-18
1744+#define WF_LWTBL_PRITX_DCM_SHIFT 18
1745+#define WF_LWTBL_PRITX_ER106T_DW 9
1746+#define WF_LWTBL_PRITX_ER106T_ADDR 36
1747+#define WF_LWTBL_PRITX_ER106T_MASK \
1748+ 0x00080000 // 19-19
1749+#define WF_LWTBL_PRITX_ER106T_SHIFT 19
1750+#define WF_LWTBL_FCAP_DW 9
1751+#define WF_LWTBL_FCAP_ADDR 36
1752+#define WF_LWTBL_FCAP_MASK \
1753+ 0x00700000 // 22-20
1754+#define WF_LWTBL_FCAP_SHIFT 20
1755+#define WF_LWTBL_MPDU_FAIL_CNT_DW 9
1756+#define WF_LWTBL_MPDU_FAIL_CNT_ADDR 36
1757+#define WF_LWTBL_MPDU_FAIL_CNT_MASK \
1758+ 0x03800000 // 25-23
1759+#define WF_LWTBL_MPDU_FAIL_CNT_SHIFT 23
1760+#define WF_LWTBL_MPDU_OK_CNT_DW 9
1761+#define WF_LWTBL_MPDU_OK_CNT_ADDR 36
1762+#define WF_LWTBL_MPDU_OK_CNT_MASK \
1763+ 0x1c000000 // 28-26
1764+#define WF_LWTBL_MPDU_OK_CNT_SHIFT 26
1765+#define WF_LWTBL_RATE_IDX_DW 9
1766+#define WF_LWTBL_RATE_IDX_ADDR 36
1767+#define WF_LWTBL_RATE_IDX_MASK \
1768+ 0xe0000000 // 31-29
1769+#define WF_LWTBL_RATE_IDX_SHIFT 29
1770+// DW10
1771+#define WF_LWTBL_RATE1_DW 10
1772+#define WF_LWTBL_RATE1_ADDR 40
1773+#define WF_LWTBL_RATE1_MASK \
1774+ 0x00007fff // 14- 0
1775+#define WF_LWTBL_RATE1_SHIFT 0
1776+#define WF_LWTBL_RATE2_DW 10
1777+#define WF_LWTBL_RATE2_ADDR 40
1778+#define WF_LWTBL_RATE2_MASK \
1779+ 0x7fff0000 // 30-16
1780+#define WF_LWTBL_RATE2_SHIFT 16
1781+// DW11
1782+#define WF_LWTBL_RATE3_DW 11
1783+#define WF_LWTBL_RATE3_ADDR 44
1784+#define WF_LWTBL_RATE3_MASK \
1785+ 0x00007fff // 14- 0
1786+#define WF_LWTBL_RATE3_SHIFT 0
1787+#define WF_LWTBL_RATE4_DW 11
1788+#define WF_LWTBL_RATE4_ADDR 44
1789+#define WF_LWTBL_RATE4_MASK \
1790+ 0x7fff0000 // 30-16
1791+#define WF_LWTBL_RATE4_SHIFT 16
1792+// DW12
1793+#define WF_LWTBL_RATE5_DW 12
1794+#define WF_LWTBL_RATE5_ADDR 48
1795+#define WF_LWTBL_RATE5_MASK \
1796+ 0x00007fff // 14- 0
1797+#define WF_LWTBL_RATE5_SHIFT 0
1798+#define WF_LWTBL_RATE6_DW 12
1799+#define WF_LWTBL_RATE6_ADDR 48
1800+#define WF_LWTBL_RATE6_MASK \
1801+ 0x7fff0000 // 30-16
1802+#define WF_LWTBL_RATE6_SHIFT 16
1803+// DW13
1804+#define WF_LWTBL_RATE7_DW 13
1805+#define WF_LWTBL_RATE7_ADDR 52
1806+#define WF_LWTBL_RATE7_MASK \
1807+ 0x00007fff // 14- 0
1808+#define WF_LWTBL_RATE7_SHIFT 0
1809+#define WF_LWTBL_RATE8_DW 13
1810+#define WF_LWTBL_RATE8_ADDR 52
1811+#define WF_LWTBL_RATE8_MASK \
1812+ 0x7fff0000 // 30-16
1813+#define WF_LWTBL_RATE8_SHIFT 16
1814+// DW14
1815+#define WF_LWTBL_RATE1_TX_CNT_DW 14
1816+#define WF_LWTBL_RATE1_TX_CNT_ADDR 56
1817+#define WF_LWTBL_RATE1_TX_CNT_MASK \
1818+ 0x0000ffff // 15- 0
1819+#define WF_LWTBL_RATE1_TX_CNT_SHIFT 0
1820+#define WF_LWTBL_CIPHER_SUIT_IGTK_DW 14
1821+#define WF_LWTBL_CIPHER_SUIT_IGTK_ADDR 56
1822+#define WF_LWTBL_CIPHER_SUIT_IGTK_MASK \
1823+ 0x00003000 // 13-12
1824+#define WF_LWTBL_CIPHER_SUIT_IGTK_SHIFT 12
1825+#define WF_LWTBL_CIPHER_SUIT_BIGTK_DW 14
1826+#define WF_LWTBL_CIPHER_SUIT_BIGTK_ADDR 56
1827+#define WF_LWTBL_CIPHER_SUIT_BIGTK_MASK \
1828+ 0x0000c000 // 15-14
1829+#define WF_LWTBL_CIPHER_SUIT_BIGTK_SHIFT 14
1830+#define WF_LWTBL_RATE1_FAIL_CNT_DW 14
1831+#define WF_LWTBL_RATE1_FAIL_CNT_ADDR 56
1832+#define WF_LWTBL_RATE1_FAIL_CNT_MASK \
1833+ 0xffff0000 // 31-16
1834+#define WF_LWTBL_RATE1_FAIL_CNT_SHIFT 16
1835+// DW15
1836+#define WF_LWTBL_RATE2_OK_CNT_DW 15
1837+#define WF_LWTBL_RATE2_OK_CNT_ADDR 60
1838+#define WF_LWTBL_RATE2_OK_CNT_MASK \
1839+ 0x0000ffff // 15- 0
1840+#define WF_LWTBL_RATE2_OK_CNT_SHIFT 0
1841+#define WF_LWTBL_RATE3_OK_CNT_DW 15
1842+#define WF_LWTBL_RATE3_OK_CNT_ADDR 60
1843+#define WF_LWTBL_RATE3_OK_CNT_MASK \
1844+ 0xffff0000 // 31-16
1845+#define WF_LWTBL_RATE3_OK_CNT_SHIFT 16
1846+// DW16
1847+#define WF_LWTBL_CURRENT_BW_TX_CNT_DW 16
1848+#define WF_LWTBL_CURRENT_BW_TX_CNT_ADDR 64
1849+#define WF_LWTBL_CURRENT_BW_TX_CNT_MASK \
1850+ 0x0000ffff // 15- 0
1851+#define WF_LWTBL_CURRENT_BW_TX_CNT_SHIFT 0
1852+#define WF_LWTBL_CURRENT_BW_FAIL_CNT_DW 16
1853+#define WF_LWTBL_CURRENT_BW_FAIL_CNT_ADDR 64
1854+#define WF_LWTBL_CURRENT_BW_FAIL_CNT_MASK \
1855+ 0xffff0000 // 31-16
1856+#define WF_LWTBL_CURRENT_BW_FAIL_CNT_SHIFT 16
1857+// DW17
1858+#define WF_LWTBL_OTHER_BW_TX_CNT_DW 17
1859+#define WF_LWTBL_OTHER_BW_TX_CNT_ADDR 68
1860+#define WF_LWTBL_OTHER_BW_TX_CNT_MASK \
1861+ 0x0000ffff // 15- 0
1862+#define WF_LWTBL_OTHER_BW_TX_CNT_SHIFT 0
1863+#define WF_LWTBL_OTHER_BW_FAIL_CNT_DW 17
1864+#define WF_LWTBL_OTHER_BW_FAIL_CNT_ADDR 68
1865+#define WF_LWTBL_OTHER_BW_FAIL_CNT_MASK \
1866+ 0xffff0000 // 31-16
1867+#define WF_LWTBL_OTHER_BW_FAIL_CNT_SHIFT 16
1868+// DW18
1869+#define WF_LWTBL_RTS_OK_CNT_DW 18
1870+#define WF_LWTBL_RTS_OK_CNT_ADDR 72
1871+#define WF_LWTBL_RTS_OK_CNT_MASK \
1872+ 0x0000ffff // 15- 0
1873+#define WF_LWTBL_RTS_OK_CNT_SHIFT 0
1874+#define WF_LWTBL_RTS_FAIL_CNT_DW 18
1875+#define WF_LWTBL_RTS_FAIL_CNT_ADDR 72
1876+#define WF_LWTBL_RTS_FAIL_CNT_MASK \
1877+ 0xffff0000 // 31-16
1878+#define WF_LWTBL_RTS_FAIL_CNT_SHIFT 16
1879+// DW19
1880+#define WF_LWTBL_DATA_RETRY_CNT_DW 19
1881+#define WF_LWTBL_DATA_RETRY_CNT_ADDR 76
1882+#define WF_LWTBL_DATA_RETRY_CNT_MASK \
1883+ 0x0000ffff // 15- 0
1884+#define WF_LWTBL_DATA_RETRY_CNT_SHIFT 0
1885+#define WF_LWTBL_MGNT_RETRY_CNT_DW 19
1886+#define WF_LWTBL_MGNT_RETRY_CNT_ADDR 76
1887+#define WF_LWTBL_MGNT_RETRY_CNT_MASK \
1888+ 0xffff0000 // 31-16
1889+#define WF_LWTBL_MGNT_RETRY_CNT_SHIFT 16
1890+// DW20
1891+#define WF_LWTBL_AC0_CTT_CDT_CRB_DW 20
1892+#define WF_LWTBL_AC0_CTT_CDT_CRB_ADDR 80
1893+#define WF_LWTBL_AC0_CTT_CDT_CRB_MASK \
1894+ 0xffffffff // 31- 0
1895+#define WF_LWTBL_AC0_CTT_CDT_CRB_SHIFT 0
1896+// DW21
1897+// DO NOT process repeat field(adm[0])
1898+// DW22
1899+#define WF_LWTBL_AC1_CTT_CDT_CRB_DW 22
1900+#define WF_LWTBL_AC1_CTT_CDT_CRB_ADDR 88
1901+#define WF_LWTBL_AC1_CTT_CDT_CRB_MASK \
1902+ 0xffffffff // 31- 0
1903+#define WF_LWTBL_AC1_CTT_CDT_CRB_SHIFT 0
1904+// DW23
1905+// DO NOT process repeat field(adm[1])
1906+// DW24
1907+#define WF_LWTBL_AC2_CTT_CDT_CRB_DW 24
1908+#define WF_LWTBL_AC2_CTT_CDT_CRB_ADDR 96
1909+#define WF_LWTBL_AC2_CTT_CDT_CRB_MASK \
1910+ 0xffffffff // 31- 0
1911+#define WF_LWTBL_AC2_CTT_CDT_CRB_SHIFT 0
1912+// DW25
1913+// DO NOT process repeat field(adm[2])
1914+// DW26
1915+#define WF_LWTBL_AC3_CTT_CDT_CRB_DW 26
1916+#define WF_LWTBL_AC3_CTT_CDT_CRB_ADDR 104
1917+#define WF_LWTBL_AC3_CTT_CDT_CRB_MASK \
1918+ 0xffffffff // 31- 0
1919+#define WF_LWTBL_AC3_CTT_CDT_CRB_SHIFT 0
1920+// DW27
1921+// DO NOT process repeat field(adm[3])
1922+// DW28
1923+#define WF_LWTBL_RELATED_IDX0_DW 28
1924+#define WF_LWTBL_RELATED_IDX0_ADDR 112
1925+#define WF_LWTBL_RELATED_IDX0_MASK \
1926+ 0x00000fff // 11- 0
1927+#define WF_LWTBL_RELATED_IDX0_SHIFT 0
1928+#define WF_LWTBL_RELATED_BAND0_DW 28
1929+#define WF_LWTBL_RELATED_BAND0_ADDR 112
1930+#define WF_LWTBL_RELATED_BAND0_MASK \
1931+ 0x00003000 // 13-12
1932+#define WF_LWTBL_RELATED_BAND0_SHIFT 12
1933+#define WF_LWTBL_PRIMARY_MLD_BAND_DW 28
1934+#define WF_LWTBL_PRIMARY_MLD_BAND_ADDR 112
1935+#define WF_LWTBL_PRIMARY_MLD_BAND_MASK \
1936+ 0x0000c000 // 15-14
1937+#define WF_LWTBL_PRIMARY_MLD_BAND_SHIFT 14
1938+#define WF_LWTBL_RELATED_IDX1_DW 28
1939+#define WF_LWTBL_RELATED_IDX1_ADDR 112
1940+#define WF_LWTBL_RELATED_IDX1_MASK \
1941+ 0x0fff0000 // 27-16
1942+#define WF_LWTBL_RELATED_IDX1_SHIFT 16
1943+#define WF_LWTBL_RELATED_BAND1_DW 28
1944+#define WF_LWTBL_RELATED_BAND1_ADDR 112
1945+#define WF_LWTBL_RELATED_BAND1_MASK \
1946+ 0x30000000 // 29-28
1947+#define WF_LWTBL_RELATED_BAND1_SHIFT 28
1948+#define WF_LWTBL_SECONDARY_MLD_BAND_DW 28
1949+#define WF_LWTBL_SECONDARY_MLD_BAND_ADDR 112
1950+#define WF_LWTBL_SECONDARY_MLD_BAND_MASK \
1951+ 0xc0000000 // 31-30
1952+#define WF_LWTBL_SECONDARY_MLD_BAND_SHIFT 30
1953+// DW29
1954+#define WF_LWTBL_DISPATCH_POLICY0_DW 29
1955+#define WF_LWTBL_DISPATCH_POLICY0_ADDR 116
1956+#define WF_LWTBL_DISPATCH_POLICY0_MASK \
1957+ 0x00000003 // 1- 0
1958+#define WF_LWTBL_DISPATCH_POLICY0_SHIFT 0
1959+#define WF_LWTBL_DISPATCH_POLICY1_DW 29
1960+#define WF_LWTBL_DISPATCH_POLICY1_ADDR 116
1961+#define WF_LWTBL_DISPATCH_POLICY1_MASK \
1962+ 0x0000000c // 3- 2
1963+#define WF_LWTBL_DISPATCH_POLICY1_SHIFT 2
1964+#define WF_LWTBL_DISPATCH_POLICY2_DW 29
1965+#define WF_LWTBL_DISPATCH_POLICY2_ADDR 116
1966+#define WF_LWTBL_DISPATCH_POLICY2_MASK \
1967+ 0x00000030 // 5- 4
1968+#define WF_LWTBL_DISPATCH_POLICY2_SHIFT 4
1969+#define WF_LWTBL_DISPATCH_POLICY3_DW 29
1970+#define WF_LWTBL_DISPATCH_POLICY3_ADDR 116
1971+#define WF_LWTBL_DISPATCH_POLICY3_MASK \
1972+ 0x000000c0 // 7- 6
1973+#define WF_LWTBL_DISPATCH_POLICY3_SHIFT 6
1974+#define WF_LWTBL_DISPATCH_POLICY4_DW 29
1975+#define WF_LWTBL_DISPATCH_POLICY4_ADDR 116
1976+#define WF_LWTBL_DISPATCH_POLICY4_MASK \
1977+ 0x00000300 // 9- 8
1978+#define WF_LWTBL_DISPATCH_POLICY4_SHIFT 8
1979+#define WF_LWTBL_DISPATCH_POLICY5_DW 29
1980+#define WF_LWTBL_DISPATCH_POLICY5_ADDR 116
1981+#define WF_LWTBL_DISPATCH_POLICY5_MASK \
1982+ 0x00000c00 // 11-10
1983+#define WF_LWTBL_DISPATCH_POLICY5_SHIFT 10
1984+#define WF_LWTBL_DISPATCH_POLICY6_DW 29
1985+#define WF_LWTBL_DISPATCH_POLICY6_ADDR 116
1986+#define WF_LWTBL_DISPATCH_POLICY6_MASK \
1987+ 0x00003000 // 13-12
1988+#define WF_LWTBL_DISPATCH_POLICY6_SHIFT 12
1989+#define WF_LWTBL_DISPATCH_POLICY7_DW 29
1990+#define WF_LWTBL_DISPATCH_POLICY7_ADDR 116
1991+#define WF_LWTBL_DISPATCH_POLICY7_MASK \
1992+ 0x0000c000 // 15-14
1993+#define WF_LWTBL_DISPATCH_POLICY7_SHIFT 14
1994+#define WF_LWTBL_OWN_MLD_ID_DW 29
1995+#define WF_LWTBL_OWN_MLD_ID_ADDR 116
1996+#define WF_LWTBL_OWN_MLD_ID_MASK \
1997+ 0x003f0000 // 21-16
1998+#define WF_LWTBL_OWN_MLD_ID_SHIFT 16
1999+#define WF_LWTBL_EMLSR0_DW 29
2000+#define WF_LWTBL_EMLSR0_ADDR 116
2001+#define WF_LWTBL_EMLSR0_MASK \
2002+ 0x00400000 // 22-22
2003+#define WF_LWTBL_EMLSR0_SHIFT 22
2004+#define WF_LWTBL_EMLMR0_DW 29
2005+#define WF_LWTBL_EMLMR0_ADDR 116
2006+#define WF_LWTBL_EMLMR0_MASK \
2007+ 0x00800000 // 23-23
2008+#define WF_LWTBL_EMLMR0_SHIFT 23
2009+#define WF_LWTBL_EMLSR1_DW 29
2010+#define WF_LWTBL_EMLSR1_ADDR 116
2011+#define WF_LWTBL_EMLSR1_MASK \
2012+ 0x01000000 // 24-24
2013+#define WF_LWTBL_EMLSR1_SHIFT 24
2014+#define WF_LWTBL_EMLMR1_DW 29
2015+#define WF_LWTBL_EMLMR1_ADDR 116
2016+#define WF_LWTBL_EMLMR1_MASK \
2017+ 0x02000000 // 25-25
2018+#define WF_LWTBL_EMLMR1_SHIFT 25
2019+#define WF_LWTBL_EMLSR2_DW 29
2020+#define WF_LWTBL_EMLSR2_ADDR 116
2021+#define WF_LWTBL_EMLSR2_MASK \
2022+ 0x04000000 // 26-26
2023+#define WF_LWTBL_EMLSR2_SHIFT 26
2024+#define WF_LWTBL_EMLMR2_DW 29
2025+#define WF_LWTBL_EMLMR2_ADDR 116
2026+#define WF_LWTBL_EMLMR2_MASK \
2027+ 0x08000000 // 27-27
2028+#define WF_LWTBL_EMLMR2_SHIFT 27
2029+#define WF_LWTBL_STR_BITMAP_DW 29
2030+#define WF_LWTBL_STR_BITMAP_ADDR 116
2031+#define WF_LWTBL_STR_BITMAP_MASK \
2032+ 0xe0000000 // 31-29
2033+#define WF_LWTBL_STR_BITMAP_SHIFT 29
2034+// DW30
2035+#define WF_LWTBL_DISPATCH_ORDER_DW 30
2036+#define WF_LWTBL_DISPATCH_ORDER_ADDR 120
2037+#define WF_LWTBL_DISPATCH_ORDER_MASK \
2038+ 0x0000007f // 6- 0
2039+#define WF_LWTBL_DISPATCH_ORDER_SHIFT 0
2040+#define WF_LWTBL_DISPATCH_RATIO_DW 30
2041+#define WF_LWTBL_DISPATCH_RATIO_ADDR 120
2042+#define WF_LWTBL_DISPATCH_RATIO_MASK \
2043+ 0x00003f80 // 13- 7
2044+#define WF_LWTBL_DISPATCH_RATIO_SHIFT 7
2045+#define WF_LWTBL_LINK_MGF_DW 30
2046+#define WF_LWTBL_LINK_MGF_ADDR 120
2047+#define WF_LWTBL_LINK_MGF_MASK \
2048+ 0xffff0000 // 31-16
2049+#define WF_LWTBL_LINK_MGF_SHIFT 16
2050+// DW31
2051+#define WF_LWTBL_NEGOTIATED_WINSIZE0_DW 31
2052+#define WF_LWTBL_NEGOTIATED_WINSIZE0_ADDR 124
2053+#define WF_LWTBL_NEGOTIATED_WINSIZE0_MASK \
2054+ 0x00000007 // 2- 0
2055+#define WF_LWTBL_NEGOTIATED_WINSIZE0_SHIFT 0
2056+#define WF_LWTBL_NEGOTIATED_WINSIZE1_DW 31
2057+#define WF_LWTBL_NEGOTIATED_WINSIZE1_ADDR 124
2058+#define WF_LWTBL_NEGOTIATED_WINSIZE1_MASK \
2059+ 0x00000038 // 5- 3
2060+#define WF_LWTBL_NEGOTIATED_WINSIZE1_SHIFT 3
2061+#define WF_LWTBL_NEGOTIATED_WINSIZE2_DW 31
2062+#define WF_LWTBL_NEGOTIATED_WINSIZE2_ADDR 124
2063+#define WF_LWTBL_NEGOTIATED_WINSIZE2_MASK \
2064+ 0x000001c0 // 8- 6
2065+#define WF_LWTBL_NEGOTIATED_WINSIZE2_SHIFT 6
2066+#define WF_LWTBL_NEGOTIATED_WINSIZE3_DW 31
2067+#define WF_LWTBL_NEGOTIATED_WINSIZE3_ADDR 124
2068+#define WF_LWTBL_NEGOTIATED_WINSIZE3_MASK \
2069+ 0x00000e00 // 11- 9
2070+#define WF_LWTBL_NEGOTIATED_WINSIZE3_SHIFT 9
2071+#define WF_LWTBL_NEGOTIATED_WINSIZE4_DW 31
2072+#define WF_LWTBL_NEGOTIATED_WINSIZE4_ADDR 124
2073+#define WF_LWTBL_NEGOTIATED_WINSIZE4_MASK \
2074+ 0x00007000 // 14-12
2075+#define WF_LWTBL_NEGOTIATED_WINSIZE4_SHIFT 12
2076+#define WF_LWTBL_NEGOTIATED_WINSIZE5_DW 31
2077+#define WF_LWTBL_NEGOTIATED_WINSIZE5_ADDR 124
2078+#define WF_LWTBL_NEGOTIATED_WINSIZE5_MASK \
2079+ 0x00038000 // 17-15
2080+#define WF_LWTBL_NEGOTIATED_WINSIZE5_SHIFT 15
2081+#define WF_LWTBL_NEGOTIATED_WINSIZE6_DW 31
2082+#define WF_LWTBL_NEGOTIATED_WINSIZE6_ADDR 124
2083+#define WF_LWTBL_NEGOTIATED_WINSIZE6_MASK \
2084+ 0x001c0000 // 20-18
2085+#define WF_LWTBL_NEGOTIATED_WINSIZE6_SHIFT 18
2086+#define WF_LWTBL_NEGOTIATED_WINSIZE7_DW 31
2087+#define WF_LWTBL_NEGOTIATED_WINSIZE7_ADDR 124
2088+#define WF_LWTBL_NEGOTIATED_WINSIZE7_MASK \
2089+ 0x00e00000 // 23-21
2090+#define WF_LWTBL_NEGOTIATED_WINSIZE7_SHIFT 21
2091+#define WF_LWTBL_CASCAD_DW 31
2092+#define WF_LWTBL_CASCAD_ADDR 124
2093+#define WF_LWTBL_CASCAD_MASK \
2094+ 0x02000000 // 25-25
2095+#define WF_LWTBL_CASCAD_SHIFT 25
2096+#define WF_LWTBL_ALL_ACK_DW 31
2097+#define WF_LWTBL_ALL_ACK_ADDR 124
2098+#define WF_LWTBL_ALL_ACK_MASK \
2099+ 0x04000000 // 26-26
2100+#define WF_LWTBL_ALL_ACK_SHIFT 26
2101+#define WF_LWTBL_MPDU_SIZE_DW 31
2102+#define WF_LWTBL_MPDU_SIZE_ADDR 124
2103+#define WF_LWTBL_MPDU_SIZE_MASK \
2104+ 0x18000000 // 28-27
2105+#define WF_LWTBL_MPDU_SIZE_SHIFT 27
2106+#define WF_LWTBL_BA_MODE_DW 31
2107+#define WF_LWTBL_BA_MODE_ADDR 124
2108+#define WF_LWTBL_BA_MODE_MASK \
2109+ 0xe0000000 // 31-29
2110+#define WF_LWTBL_BA_MODE_SHIFT 29
2111+// DW32
2112+#define WF_LWTBL_OM_INFO_DW 32
2113+#define WF_LWTBL_OM_INFO_ADDR 128
2114+#define WF_LWTBL_OM_INFO_MASK \
2115+ 0x00000fff // 11- 0
2116+#define WF_LWTBL_OM_INFO_SHIFT 0
2117+#define WF_LWTBL_RXD_DUP_FOR_OM_CHG_DW 32
2118+#define WF_LWTBL_RXD_DUP_FOR_OM_CHG_ADDR 128
2119+#define WF_LWTBL_RXD_DUP_FOR_OM_CHG_MASK \
2120+ 0x00001000 // 12-12
2121+#define WF_LWTBL_RXD_DUP_FOR_OM_CHG_SHIFT 12
2122+#define WF_LWTBL_RXD_DUP_WHITE_LIST_DW 32
2123+#define WF_LWTBL_RXD_DUP_WHITE_LIST_ADDR 128
2124+#define WF_LWTBL_RXD_DUP_WHITE_LIST_MASK \
2125+ 0x01ffe000 // 24-13
2126+#define WF_LWTBL_RXD_DUP_WHITE_LIST_SHIFT 13
2127+#define WF_LWTBL_RXD_DUP_MODE_DW 32
2128+#define WF_LWTBL_RXD_DUP_MODE_ADDR 128
2129+#define WF_LWTBL_RXD_DUP_MODE_MASK \
2130+ 0x06000000 // 26-25
2131+#define WF_LWTBL_RXD_DUP_MODE_SHIFT 25
2132+#define WF_LWTBL_DROP_DW 32
2133+#define WF_LWTBL_DROP_ADDR 128
2134+#define WF_LWTBL_DROP_MASK \
2135+ 0x40000000 // 30-30
2136+#define WF_LWTBL_DROP_SHIFT 30
2137+#define WF_LWTBL_ACK_EN_DW 32
2138+#define WF_LWTBL_ACK_EN_ADDR 128
2139+#define WF_LWTBL_ACK_EN_MASK \
2140+ 0x80000000 // 31-31
2141+#define WF_LWTBL_ACK_EN_SHIFT 31
2142+// DW33
2143+#define WF_LWTBL_USER_RSSI_DW 33
2144+#define WF_LWTBL_USER_RSSI_ADDR 132
2145+#define WF_LWTBL_USER_RSSI_MASK \
2146+ 0x000001ff // 8- 0
2147+#define WF_LWTBL_USER_RSSI_SHIFT 0
2148+#define WF_LWTBL_USER_SNR_DW 33
2149+#define WF_LWTBL_USER_SNR_ADDR 132
2150+#define WF_LWTBL_USER_SNR_MASK \
2151+ 0x00007e00 // 14- 9
2152+#define WF_LWTBL_USER_SNR_SHIFT 9
2153+#define WF_LWTBL_RAPID_REACTION_RATE_DW 33
2154+#define WF_LWTBL_RAPID_REACTION_RATE_ADDR 132
2155+#define WF_LWTBL_RAPID_REACTION_RATE_MASK \
2156+ 0x0fff0000 // 27-16
2157+#define WF_LWTBL_RAPID_REACTION_RATE_SHIFT 16
2158+#define WF_LWTBL_HT_AMSDU_DW 33
2159+#define WF_LWTBL_HT_AMSDU_ADDR 132
2160+#define WF_LWTBL_HT_AMSDU_MASK \
2161+ 0x40000000 // 30-30
2162+#define WF_LWTBL_HT_AMSDU_SHIFT 30
2163+#define WF_LWTBL_AMSDU_CROSS_LG_DW 33
2164+#define WF_LWTBL_AMSDU_CROSS_LG_ADDR 132
2165+#define WF_LWTBL_AMSDU_CROSS_LG_MASK \
2166+ 0x80000000 // 31-31
2167+#define WF_LWTBL_AMSDU_CROSS_LG_SHIFT 31
2168+// DW34
2169+#define WF_LWTBL_RESP_RCPI0_DW 34
2170+#define WF_LWTBL_RESP_RCPI0_ADDR 136
2171+#define WF_LWTBL_RESP_RCPI0_MASK \
2172+ 0x000000ff // 7- 0
2173+#define WF_LWTBL_RESP_RCPI0_SHIFT 0
2174+#define WF_LWTBL_RESP_RCPI1_DW 34
2175+#define WF_LWTBL_RESP_RCPI1_ADDR 136
2176+#define WF_LWTBL_RESP_RCPI1_MASK \
2177+ 0x0000ff00 // 15- 8
2178+#define WF_LWTBL_RESP_RCPI1_SHIFT 8
2179+#define WF_LWTBL_RESP_RCPI2_DW 34
2180+#define WF_LWTBL_RESP_RCPI2_ADDR 136
2181+#define WF_LWTBL_RESP_RCPI2_MASK \
2182+ 0x00ff0000 // 23-16
2183+#define WF_LWTBL_RESP_RCPI2_SHIFT 16
2184+#define WF_LWTBL_RESP_RCPI3_DW 34
2185+#define WF_LWTBL_RESP_RCPI3_ADDR 136
2186+#define WF_LWTBL_RESP_RCPI3_MASK \
2187+ 0xff000000 // 31-24
2188+#define WF_LWTBL_RESP_RCPI3_SHIFT 24
2189+// DW35
2190+#define WF_LWTBL_SNR_RX0_DW 35
2191+#define WF_LWTBL_SNR_RX0_ADDR 140
2192+#define WF_LWTBL_SNR_RX0_MASK \
2193+ 0x0000003f // 5- 0
2194+#define WF_LWTBL_SNR_RX0_SHIFT 0
2195+#define WF_LWTBL_SNR_RX1_DW 35
2196+#define WF_LWTBL_SNR_RX1_ADDR 140
2197+#define WF_LWTBL_SNR_RX1_MASK \
2198+ 0x00000fc0 // 11- 6
2199+#define WF_LWTBL_SNR_RX1_SHIFT 6
2200+#define WF_LWTBL_SNR_RX2_DW 35
2201+#define WF_LWTBL_SNR_RX2_ADDR 140
2202+#define WF_LWTBL_SNR_RX2_MASK \
2203+ 0x0003f000 // 17-12
2204+#define WF_LWTBL_SNR_RX2_SHIFT 12
2205+#define WF_LWTBL_SNR_RX3_DW 35
2206+#define WF_LWTBL_SNR_RX3_ADDR 140
2207+#define WF_LWTBL_SNR_RX3_MASK \
2208+ 0x00fc0000 // 23-18
2209+#define WF_LWTBL_SNR_RX3_SHIFT 18
2210+
2211+/* WTBL Group - Packet Number */
2212+/* DW 2 */
2213+#define WTBL_PN0_MASK BITS(0, 7)
2214+#define WTBL_PN0_OFFSET 0
2215+#define WTBL_PN1_MASK BITS(8, 15)
2216+#define WTBL_PN1_OFFSET 8
2217+#define WTBL_PN2_MASK BITS(16, 23)
2218+#define WTBL_PN2_OFFSET 16
2219+#define WTBL_PN3_MASK BITS(24, 31)
2220+#define WTBL_PN3_OFFSET 24
2221+
2222+/* DW 3 */
2223+#define WTBL_PN4_MASK BITS(0, 7)
2224+#define WTBL_PN4_OFFSET 0
2225+#define WTBL_PN5_MASK BITS(8, 15)
2226+#define WTBL_PN5_OFFSET 8
2227+
2228+/* DW 4 */
2229+#define WTBL_BIPN0_MASK BITS(0, 7)
2230+#define WTBL_BIPN0_OFFSET 0
2231+#define WTBL_BIPN1_MASK BITS(8, 15)
2232+#define WTBL_BIPN1_OFFSET 8
2233+#define WTBL_BIPN2_MASK BITS(16, 23)
2234+#define WTBL_BIPN2_OFFSET 16
2235+#define WTBL_BIPN3_MASK BITS(24, 31)
2236+#define WTBL_BIPN3_OFFSET 24
2237+
2238+/* DW 5 */
2239+#define WTBL_BIPN4_MASK BITS(0, 7)
2240+#define WTBL_BIPN4_OFFSET 0
2241+#define WTBL_BIPN5_MASK BITS(8, 15)
2242+#define WTBL_BIPN5_OFFSET 8
2243+
2244+/* UWTBL DW 6 */
2245+#define WTBL_AMSDU_LEN_MASK BITS(0, 5)
2246+#define WTBL_AMSDU_LEN_OFFSET 0
2247+#define WTBL_AMSDU_NUM_MASK BITS(6, 10)
2248+#define WTBL_AMSDU_NUM_OFFSET 6
2249+#define WTBL_AMSDU_EN_MASK BIT(11)
2250+#define WTBL_AMSDU_EN_OFFSET 11
2251+
2252+/* LWTBL Rate field */
2253+#define WTBL_RATE_TX_RATE_MASK BITS(0, 5)
2254+#define WTBL_RATE_TX_RATE_OFFSET 0
2255+#define WTBL_RATE_TX_MODE_MASK BITS(6, 9)
2256+#define WTBL_RATE_TX_MODE_OFFSET 6
2257+#define WTBL_RATE_NSTS_MASK BITS(10, 13)
2258+#define WTBL_RATE_NSTS_OFFSET 10
2259+#define WTBL_RATE_STBC_MASK BIT(14)
2260+#define WTBL_RATE_STBC_OFFSET 14
2261+
2262+/***** WTBL(LMAC) DW Offset *****/
2263+/* LMAC WTBL Group - Peer Unique Information */
2264+#define WTBL_GROUP_PEER_INFO_DW_0 0
2265+#define WTBL_GROUP_PEER_INFO_DW_1 1
2266+
2267+/* WTBL Group - TxRx Capability/Information */
2268+#define WTBL_GROUP_TRX_CAP_DW_2 2
2269+#define WTBL_GROUP_TRX_CAP_DW_3 3
2270+#define WTBL_GROUP_TRX_CAP_DW_4 4
2271+#define WTBL_GROUP_TRX_CAP_DW_5 5
2272+#define WTBL_GROUP_TRX_CAP_DW_6 6
2273+#define WTBL_GROUP_TRX_CAP_DW_7 7
2274+#define WTBL_GROUP_TRX_CAP_DW_8 8
2275+#define WTBL_GROUP_TRX_CAP_DW_9 9
2276+
2277+/* WTBL Group - Auto Rate Table*/
2278+#define WTBL_GROUP_AUTO_RATE_1_2 10
2279+#define WTBL_GROUP_AUTO_RATE_3_4 11
2280+#define WTBL_GROUP_AUTO_RATE_5_6 12
2281+#define WTBL_GROUP_AUTO_RATE_7_8 13
2282+
2283+/* WTBL Group - Tx Counter */
2284+#define WTBL_GROUP_TX_CNT_LINE_1 14
2285+#define WTBL_GROUP_TX_CNT_LINE_2 15
2286+#define WTBL_GROUP_TX_CNT_LINE_3 16
2287+#define WTBL_GROUP_TX_CNT_LINE_4 17
2288+#define WTBL_GROUP_TX_CNT_LINE_5 18
2289+#define WTBL_GROUP_TX_CNT_LINE_6 19
2290+
2291+/* WTBL Group - Admission Control Counter */
2292+#define WTBL_GROUP_ADM_CNT_LINE_1 20
2293+#define WTBL_GROUP_ADM_CNT_LINE_2 21
2294+#define WTBL_GROUP_ADM_CNT_LINE_3 22
2295+#define WTBL_GROUP_ADM_CNT_LINE_4 23
2296+#define WTBL_GROUP_ADM_CNT_LINE_5 24
2297+#define WTBL_GROUP_ADM_CNT_LINE_6 25
2298+#define WTBL_GROUP_ADM_CNT_LINE_7 26
2299+#define WTBL_GROUP_ADM_CNT_LINE_8 27
2300+
2301+/* WTBL Group -MLO Info */
2302+#define WTBL_GROUP_MLO_INFO_LINE_1 28
2303+#define WTBL_GROUP_MLO_INFO_LINE_2 29
2304+#define WTBL_GROUP_MLO_INFO_LINE_3 30
2305+
2306+/* WTBL Group -RESP Info */
2307+#define WTBL_GROUP_RESP_INFO_DW_31 31
2308+
2309+/* WTBL Group -RX DUP Info */
2310+#define WTBL_GROUP_RX_DUP_INFO_DW_32 32
2311+
2312+/* WTBL Group - Rx Statistics Counter */
2313+#define WTBL_GROUP_RX_STAT_CNT_LINE_1 33
2314+#define WTBL_GROUP_RX_STAT_CNT_LINE_2 34
2315+#define WTBL_GROUP_RX_STAT_CNT_LINE_3 35
2316+
2317+/* UWTBL Group - HW AMSDU */
2318+#define UWTBL_HW_AMSDU_DW WF_UWTBL_AMSDU_CFG_DW
2319+
2320+/* LWTBL DW 4 */
2321+#define WTBL_DIS_RHTR WF_LWTBL_DIS_RHTR_MASK
2322+
2323+/* UWTBL DW 5 */
2324+#define WTBL_KEY_LINK_DW_KEY_LOC0_MASK BITS(0, 10)
2325+#define WTBL_PSM WF_LWTBL_PSM_MASK
2326+
2327+/* Need to sync with FW define */
2328+#define INVALID_KEY_ENTRY WTBL_KEY_LINK_DW_KEY_LOC0_MASK
2329+
2330+// RATE
2331+#define WTBL_RATE_TX_RATE_MASK BITS(0, 5)
2332+#define WTBL_RATE_TX_RATE_OFFSET 0
2333+#define WTBL_RATE_TX_MODE_MASK BITS(6, 9)
2334+#define WTBL_RATE_TX_MODE_OFFSET 6
2335+#define WTBL_RATE_NSTS_MASK BITS(10, 13)
2336+#define WTBL_RATE_NSTS_OFFSET 10
2337+#define WTBL_RATE_STBC_MASK BIT(14)
2338+#define WTBL_RATE_STBC_OFFSET 14
2339+#endif
2340+
2341+#endif
2342diff --git a/mt7996/mtk_debugfs.c b/mt7996/mtk_debugfs.c
2343new file mode 100644
developerde9ecce2023-05-22 11:17:16 +08002344index 00000000..080f756e
developer1bc2ce22023-03-25 00:47:41 +08002345--- /dev/null
2346+++ b/mt7996/mtk_debugfs.c
2347@@ -0,0 +1,2344 @@
2348+// SPDX-License-Identifier: ISC
2349+/*
2350+ * Copyright (C) 2023 MediaTek Inc.
2351+ */
2352+#include "mt7996.h"
2353+#include "../mt76.h"
2354+#include "mcu.h"
2355+#include "mac.h"
2356+#include "eeprom.h"
2357+#include "mtk_debug.h"
2358+#include "mtk_mcu.h"
2359+
2360+#ifdef CONFIG_MTK_DEBUG
2361+
2362+/* AGG INFO */
2363+static int
2364+mt7996_agginfo_read_per_band(struct seq_file *s, int band_idx)
2365+{
2366+ struct mt7996_dev *dev = dev_get_drvdata(s->private);
2367+ u64 total_burst, total_ampdu, ampdu_cnt[16];
2368+ u32 value, idx, row_idx, col_idx, start_range, agg_rang_sel[16], burst_cnt[16], band_offset = 0;
2369+ u8 readFW = 0, partial_str[16] = {}, full_str[64] = {};
2370+
2371+ switch (band_idx) {
2372+ case 0:
2373+ band_offset = 0;
2374+ break;
2375+ case 1:
2376+ band_offset = BN1_WF_AGG_TOP_BASE - BN0_WF_AGG_TOP_BASE;
2377+ break;
2378+ case 2:
2379+ band_offset = IP1_BN0_WF_AGG_TOP_BASE - BN0_WF_AGG_TOP_BASE;
2380+ break;
2381+ default:
2382+ return 0;
2383+ }
2384+
2385+ seq_printf(s, "Band %d AGG Status\n", band_idx);
2386+ seq_printf(s, "===============================\n");
2387+ value = mt76_rr(dev, BN0_WF_AGG_TOP_AALCR0_ADDR + band_offset);
2388+ seq_printf(s, "AC00 Agg limit = %d\t", (value & BN0_WF_AGG_TOP_AALCR0_AC00_AGG_LIMIT_MASK) >> BN0_WF_AGG_TOP_AALCR0_AC00_AGG_LIMIT_SHFT);
2389+ seq_printf(s, "AC01 Agg limit = %d\t", (value & BN0_WF_AGG_TOP_AALCR0_AC01_AGG_LIMIT_MASK) >> BN0_WF_AGG_TOP_AALCR0_AC01_AGG_LIMIT_SHFT);
2390+ value = mt76_rr(dev, BN0_WF_AGG_TOP_AALCR1_ADDR + band_offset);
2391+ seq_printf(s, "AC02 Agg limit = %d\t", (value & BN0_WF_AGG_TOP_AALCR1_AC02_AGG_LIMIT_MASK) >> BN0_WF_AGG_TOP_AALCR1_AC02_AGG_LIMIT_SHFT);
2392+ seq_printf(s, "AC03 Agg limit = %d\t", (value & BN0_WF_AGG_TOP_AALCR1_AC03_AGG_LIMIT_MASK) >> BN0_WF_AGG_TOP_AALCR1_AC03_AGG_LIMIT_SHFT);
2393+ value = mt76_rr(dev, BN0_WF_AGG_TOP_AALCR2_ADDR + band_offset);
2394+ seq_printf(s, "AC10 Agg limit = %d\t", (value & BN0_WF_AGG_TOP_AALCR2_AC10_AGG_LIMIT_MASK) >> BN0_WF_AGG_TOP_AALCR2_AC10_AGG_LIMIT_SHFT);
2395+ seq_printf(s, "AC11 Agg limit = %d\t", (value & BN0_WF_AGG_TOP_AALCR2_AC11_AGG_LIMIT_MASK) >> BN0_WF_AGG_TOP_AALCR2_AC11_AGG_LIMIT_SHFT);
2396+ value = mt76_rr(dev, BN0_WF_AGG_TOP_AALCR3_ADDR + band_offset);
2397+ seq_printf(s, "AC12 Agg limit = %d\t", (value & BN0_WF_AGG_TOP_AALCR3_AC12_AGG_LIMIT_MASK) >> BN0_WF_AGG_TOP_AALCR3_AC12_AGG_LIMIT_SHFT);
2398+ seq_printf(s, "AC13 Agg limit = %d\t", (value & BN0_WF_AGG_TOP_AALCR3_AC13_AGG_LIMIT_MASK) >> BN0_WF_AGG_TOP_AALCR3_AC13_AGG_LIMIT_SHFT);
2399+ value = mt76_rr(dev, BN0_WF_AGG_TOP_AALCR4_ADDR + band_offset);
2400+ seq_printf(s, "AC20 Agg limit = %d\t", (value & BN0_WF_AGG_TOP_AALCR4_AC20_AGG_LIMIT_MASK) >> BN0_WF_AGG_TOP_AALCR4_AC20_AGG_LIMIT_SHFT);
2401+ seq_printf(s, "AC21 Agg limit = %d\t", (value & BN0_WF_AGG_TOP_AALCR4_AC21_AGG_LIMIT_MASK) >> BN0_WF_AGG_TOP_AALCR4_AC21_AGG_LIMIT_SHFT);
2402+ value = mt76_rr(dev, BN0_WF_AGG_TOP_AALCR5_ADDR + band_offset);
2403+ seq_printf(s, "AC22 Agg limit = %d\t", (value & BN0_WF_AGG_TOP_AALCR5_AC22_AGG_LIMIT_MASK) >> BN0_WF_AGG_TOP_AALCR5_AC22_AGG_LIMIT_SHFT);
2404+ seq_printf(s, "AC23 Agg limit = %d\t", (value & BN0_WF_AGG_TOP_AALCR5_AC23_AGG_LIMIT_MASK) >> BN0_WF_AGG_TOP_AALCR5_AC23_AGG_LIMIT_SHFT);
2405+ value = mt76_rr(dev, BN0_WF_AGG_TOP_AALCR6_ADDR + band_offset);
2406+ seq_printf(s, "AC30 Agg limit = %d\t", (value & BN0_WF_AGG_TOP_AALCR6_AC30_AGG_LIMIT_MASK) >> BN0_WF_AGG_TOP_AALCR6_AC30_AGG_LIMIT_SHFT);
2407+ seq_printf(s, "AC31 Agg limit = %d\t", (value & BN0_WF_AGG_TOP_AALCR6_AC31_AGG_LIMIT_MASK) >> BN0_WF_AGG_TOP_AALCR6_AC31_AGG_LIMIT_SHFT);
2408+ value = mt76_rr(dev, BN0_WF_AGG_TOP_AALCR7_ADDR + band_offset);
2409+ seq_printf(s, "AC32 Agg limit = %d\t", (value & BN0_WF_AGG_TOP_AALCR7_AC32_AGG_LIMIT_MASK) >> BN0_WF_AGG_TOP_AALCR7_AC32_AGG_LIMIT_SHFT);
2410+ seq_printf(s, "AC33 Agg limit = %d\t", (value & BN0_WF_AGG_TOP_AALCR7_AC33_AGG_LIMIT_MASK) >> BN0_WF_AGG_TOP_AALCR7_AC33_AGG_LIMIT_SHFT);
2411+
2412+ switch (band_idx) {
2413+ case 0:
2414+ band_offset = 0;
2415+ break;
2416+ case 1:
2417+ band_offset = BN1_WF_MIB_TOP_BASE - BN0_WF_MIB_TOP_BASE;
2418+ break;
2419+ case 2:
2420+ band_offset = IP1_BN0_WF_MIB_TOP_BASE - BN0_WF_MIB_TOP_BASE;
2421+ break;
2422+ default:
2423+ return 0;
2424+ }
2425+
2426+ seq_printf(s, "===AMPDU Related Counters===\n");
2427+
2428+ if (readFW) {
2429+ /* BELLWETHER TODO: Wait MIB counter API implement complete */
2430+ } else {
2431+ value = mt76_rr(dev, BN0_WF_MIB_TOP_TRARC0_ADDR + band_offset);
2432+ agg_rang_sel[0] = (value & BN0_WF_MIB_TOP_TRARC0_AGG_RANG_SEL_0_MASK) >> BN0_WF_MIB_TOP_TRARC0_AGG_RANG_SEL_0_SHFT;
2433+ agg_rang_sel[1] = (value & BN0_WF_MIB_TOP_TRARC0_AGG_RANG_SEL_1_MASK) >> BN0_WF_MIB_TOP_TRARC0_AGG_RANG_SEL_1_SHFT;
2434+ value = mt76_rr(dev, BN0_WF_MIB_TOP_TRARC1_ADDR + band_offset);
2435+ agg_rang_sel[2] = (value & BN0_WF_MIB_TOP_TRARC1_AGG_RANG_SEL_2_MASK) >> BN0_WF_MIB_TOP_TRARC1_AGG_RANG_SEL_2_SHFT;
2436+ agg_rang_sel[3] = (value & BN0_WF_MIB_TOP_TRARC1_AGG_RANG_SEL_3_MASK) >> BN0_WF_MIB_TOP_TRARC1_AGG_RANG_SEL_3_SHFT;
2437+ value = mt76_rr(dev, BN0_WF_MIB_TOP_TRARC2_ADDR + band_offset);
2438+ agg_rang_sel[4] = (value & BN0_WF_MIB_TOP_TRARC2_AGG_RANG_SEL_4_MASK) >> BN0_WF_MIB_TOP_TRARC2_AGG_RANG_SEL_4_SHFT;
2439+ agg_rang_sel[5] = (value & BN0_WF_MIB_TOP_TRARC2_AGG_RANG_SEL_5_MASK) >> BN0_WF_MIB_TOP_TRARC2_AGG_RANG_SEL_5_SHFT;
2440+ value = mt76_rr(dev, BN0_WF_MIB_TOP_TRARC3_ADDR + band_offset);
2441+ agg_rang_sel[6] = (value & BN0_WF_MIB_TOP_TRARC3_AGG_RANG_SEL_6_MASK) >> BN0_WF_MIB_TOP_TRARC3_AGG_RANG_SEL_6_SHFT;
2442+ agg_rang_sel[7] = (value & BN0_WF_MIB_TOP_TRARC3_AGG_RANG_SEL_7_MASK) >> BN0_WF_MIB_TOP_TRARC3_AGG_RANG_SEL_7_SHFT;
2443+ value = mt76_rr(dev, BN0_WF_MIB_TOP_TRARC4_ADDR + band_offset);
2444+ agg_rang_sel[8] = (value & BN0_WF_MIB_TOP_TRARC4_AGG_RANG_SEL_8_MASK) >> BN0_WF_MIB_TOP_TRARC4_AGG_RANG_SEL_8_SHFT;
2445+ agg_rang_sel[9] = (value & BN0_WF_MIB_TOP_TRARC4_AGG_RANG_SEL_9_MASK) >> BN0_WF_MIB_TOP_TRARC4_AGG_RANG_SEL_9_SHFT;
2446+ value = mt76_rr(dev, BN0_WF_MIB_TOP_TRARC5_ADDR + band_offset);
2447+ agg_rang_sel[10] = (value & BN0_WF_MIB_TOP_TRARC5_AGG_RANG_SEL_10_MASK) >> BN0_WF_MIB_TOP_TRARC5_AGG_RANG_SEL_10_SHFT;
2448+ agg_rang_sel[11] = (value & BN0_WF_MIB_TOP_TRARC5_AGG_RANG_SEL_11_MASK) >> BN0_WF_MIB_TOP_TRARC5_AGG_RANG_SEL_11_SHFT;
2449+ value = mt76_rr(dev, BN0_WF_MIB_TOP_TRARC6_ADDR + band_offset);
2450+ agg_rang_sel[12] = (value & BN0_WF_MIB_TOP_TRARC6_AGG_RANG_SEL_12_MASK) >> BN0_WF_MIB_TOP_TRARC6_AGG_RANG_SEL_12_SHFT;
2451+ agg_rang_sel[13] = (value & BN0_WF_MIB_TOP_TRARC6_AGG_RANG_SEL_13_MASK) >> BN0_WF_MIB_TOP_TRARC6_AGG_RANG_SEL_13_SHFT;
2452+ value = mt76_rr(dev, BN0_WF_MIB_TOP_TRARC7_ADDR + band_offset);
2453+ agg_rang_sel[14] = (value & BN0_WF_MIB_TOP_TRARC7_AGG_RANG_SEL_14_MASK) >> BN0_WF_MIB_TOP_TRARC7_AGG_RANG_SEL_14_SHFT;
2454+
2455+ burst_cnt[0] = mt76_rr(dev, BN0_WF_MIB_TOP_TRDR0_ADDR + band_offset);
2456+ burst_cnt[1] = mt76_rr(dev, BN0_WF_MIB_TOP_TRDR1_ADDR + band_offset);
2457+ burst_cnt[2] = mt76_rr(dev, BN0_WF_MIB_TOP_TRDR2_ADDR + band_offset);
2458+ burst_cnt[3] = mt76_rr(dev, BN0_WF_MIB_TOP_TRDR3_ADDR + band_offset);
2459+ burst_cnt[4] = mt76_rr(dev, BN0_WF_MIB_TOP_TRDR4_ADDR + band_offset);
2460+ burst_cnt[5] = mt76_rr(dev, BN0_WF_MIB_TOP_TRDR5_ADDR + band_offset);
2461+ burst_cnt[6] = mt76_rr(dev, BN0_WF_MIB_TOP_TRDR6_ADDR + band_offset);
2462+ burst_cnt[7] = mt76_rr(dev, BN0_WF_MIB_TOP_TRDR7_ADDR + band_offset);
2463+ burst_cnt[8] = mt76_rr(dev, BN0_WF_MIB_TOP_TRDR8_ADDR + band_offset);
2464+ burst_cnt[9] = mt76_rr(dev, BN0_WF_MIB_TOP_TRDR9_ADDR + band_offset);
2465+ burst_cnt[10] = mt76_rr(dev, BN0_WF_MIB_TOP_TRDR10_ADDR + band_offset);
2466+ burst_cnt[11] = mt76_rr(dev, BN0_WF_MIB_TOP_TRDR11_ADDR + band_offset);
2467+ burst_cnt[12] = mt76_rr(dev, BN0_WF_MIB_TOP_TRDR12_ADDR + band_offset);
2468+ burst_cnt[13] = mt76_rr(dev, BN0_WF_MIB_TOP_TRDR13_ADDR + band_offset);
2469+ burst_cnt[14] = mt76_rr(dev, BN0_WF_MIB_TOP_TRDR14_ADDR + band_offset);
2470+ burst_cnt[15] = mt76_rr(dev, BN0_WF_MIB_TOP_TRDR15_ADDR + band_offset);
2471+ }
2472+
2473+ start_range = 1;
2474+ total_burst = 0;
2475+ total_ampdu = 0;
2476+ agg_rang_sel[15] = 1023;
2477+
2478+ /* Need to add 1 after read from AGG_RANG_SEL CR */
2479+ for (idx = 0; idx < 16; idx++) {
2480+ agg_rang_sel[idx]++;
2481+ total_burst += burst_cnt[idx];
2482+
2483+ if (start_range == agg_rang_sel[idx])
2484+ ampdu_cnt[idx] = (u64) start_range * burst_cnt[idx];
2485+ else
2486+ ampdu_cnt[idx] = (u64) ((start_range + agg_rang_sel[idx]) >> 1) * burst_cnt[idx];
2487+
2488+ start_range = agg_rang_sel[idx] + 1;
2489+ total_ampdu += ampdu_cnt[idx];
2490+ }
2491+
2492+ start_range = 1;
2493+ sprintf(full_str, "%13s ", "Tx Agg Range:");
2494+
2495+ for (row_idx = 0; row_idx < 4; row_idx++) {
2496+ for (col_idx = 0; col_idx < 4; col_idx++, idx++) {
2497+ idx = 4 * row_idx + col_idx;
2498+
2499+ if (start_range == agg_rang_sel[idx])
2500+ sprintf(partial_str, "%d", agg_rang_sel[idx]);
2501+ else
2502+ sprintf(partial_str, "%d~%d", start_range, agg_rang_sel[idx]);
2503+
2504+ start_range = agg_rang_sel[idx] + 1;
2505+ sprintf(full_str + strlen(full_str), "%-11s ", partial_str);
2506+ }
2507+
2508+ idx = 4 * row_idx;
2509+
2510+ seq_printf(s, "%s\n", full_str);
2511+ seq_printf(s, "%13s 0x%-9x 0x%-9x 0x%-9x 0x%-9x\n",
2512+ row_idx ? "" : "Burst count:",
2513+ burst_cnt[idx], burst_cnt[idx + 1],
2514+ burst_cnt[idx + 2], burst_cnt[idx + 3]);
2515+
2516+ if (total_burst != 0) {
2517+ if (row_idx == 0)
2518+ sprintf(full_str, "%13s ",
2519+ "Burst ratio:");
2520+ else
2521+ sprintf(full_str, "%13s ", "");
2522+
2523+ for (col_idx = 0; col_idx < 4; col_idx++) {
2524+ u64 count = (u64) burst_cnt[idx + col_idx] * 100;
2525+
2526+ sprintf(partial_str, "(%llu%%)",
2527+ div64_u64(count, total_burst));
2528+ sprintf(full_str + strlen(full_str),
2529+ "%-11s ", partial_str);
2530+ }
2531+
2532+ seq_printf(s, "%s\n", full_str);
2533+
2534+ if (row_idx == 0)
2535+ sprintf(full_str, "%13s ",
2536+ "MDPU ratio:");
2537+ else
2538+ sprintf(full_str, "%13s ", "");
2539+
2540+ for (col_idx = 0; col_idx < 4; col_idx++) {
2541+ u64 count = ampdu_cnt[idx + col_idx] * 100;
2542+
2543+ sprintf(partial_str, "(%llu%%)",
2544+ div64_u64(count, total_ampdu));
2545+ sprintf(full_str + strlen(full_str),
2546+ "%-11s ", partial_str);
2547+ }
2548+
2549+ seq_printf(s, "%s\n", full_str);
2550+ }
2551+
2552+ sprintf(full_str, "%13s ", "");
2553+ }
2554+
2555+ return 0;
2556+}
2557+
2558+static int mt7996_agginfo_read_band0(struct seq_file *s, void *data)
2559+{
2560+ mt7996_agginfo_read_per_band(s, MT_BAND0);
2561+ return 0;
2562+}
2563+
2564+static int mt7996_agginfo_read_band1(struct seq_file *s, void *data)
2565+{
2566+ mt7996_agginfo_read_per_band(s, MT_BAND1);
2567+ return 0;
2568+}
2569+
2570+static int mt7996_agginfo_read_band2(struct seq_file *s, void *data)
2571+{
2572+ mt7996_agginfo_read_per_band(s, MT_BAND2);
2573+ return 0;
2574+}
2575+
2576+/* AMSDU INFO */
2577+static int mt7996_amsdu_result_read(struct seq_file *s, void *data)
2578+{
2579+#define HW_MSDU_CNT_ADDR 0xf400
2580+#define HW_MSDU_NUM_MAX 33
2581+ struct mt7996_dev *dev = dev_get_drvdata(s->private);
2582+ u32 ple_stat[HW_MSDU_NUM_MAX] = {0}, total_amsdu = 0;
2583+ u8 i;
2584+
2585+ for (i = 0; i < HW_MSDU_NUM_MAX; i++)
2586+ ple_stat[i] = mt76_rr(dev, HW_MSDU_CNT_ADDR + i * 0x04);
2587+
2588+ seq_printf(s, "TXD counter status of MSDU:\n");
2589+
2590+ for (i = 0; i < HW_MSDU_NUM_MAX; i++)
2591+ total_amsdu += ple_stat[i];
2592+
2593+ for (i = 0; i < HW_MSDU_NUM_MAX; i++) {
2594+ seq_printf(s, "AMSDU pack count of %d MSDU in TXD: 0x%x ", i, ple_stat[i]);
2595+ if (total_amsdu != 0)
2596+ seq_printf(s, "(%d%%)\n", ple_stat[i] * 100 / total_amsdu);
2597+ else
2598+ seq_printf(s, "\n");
2599+ }
2600+
2601+ return 0;
2602+}
2603+
2604+/* DBG MODLE */
2605+static int
2606+mt7996_fw_debug_module_set(void *data, u64 module)
2607+{
2608+ struct mt7996_dev *dev = data;
2609+
2610+ dev->dbg.fw_dbg_module = module;
2611+ return 0;
2612+}
2613+
2614+static int
2615+mt7996_fw_debug_module_get(void *data, u64 *module)
2616+{
2617+ struct mt7996_dev *dev = data;
2618+
2619+ *module = dev->dbg.fw_dbg_module;
2620+ return 0;
2621+}
2622+
2623+DEFINE_DEBUGFS_ATTRIBUTE(fops_fw_debug_module, mt7996_fw_debug_module_get,
2624+ mt7996_fw_debug_module_set, "%lld\n");
2625+
2626+static int
2627+mt7996_fw_debug_level_set(void *data, u64 level)
2628+{
2629+ struct mt7996_dev *dev = data;
2630+
2631+ dev->dbg.fw_dbg_lv = level;
2632+ mt7996_mcu_fw_dbg_ctrl(dev, dev->dbg.fw_dbg_module, dev->dbg.fw_dbg_lv);
2633+ return 0;
2634+}
2635+
2636+static int
2637+mt7996_fw_debug_level_get(void *data, u64 *level)
2638+{
2639+ struct mt7996_dev *dev = data;
2640+
2641+ *level = dev->dbg.fw_dbg_lv;
2642+ return 0;
2643+}
2644+
2645+DEFINE_DEBUGFS_ATTRIBUTE(fops_fw_debug_level, mt7996_fw_debug_level_get,
2646+ mt7996_fw_debug_level_set, "%lld\n");
2647+
2648+/* usage: echo 0x[arg3][arg2][arg1] > fw_wa_set */
2649+static int
2650+mt7996_wa_set(void *data, u64 val)
2651+{
2652+ struct mt7996_dev *dev = data;
2653+ u32 arg1, arg2, arg3;
2654+
2655+ arg1 = FIELD_GET(GENMASK_ULL(7, 0), val);
2656+ arg2 = FIELD_GET(GENMASK_ULL(15, 8), val);
2657+ arg3 = FIELD_GET(GENMASK_ULL(23, 16), val);
2658+
2659+ return mt7996_mcu_wa_cmd(dev, MCU_WA_PARAM_CMD(SET),
2660+ arg1, arg2, arg3);
2661+}
2662+
2663+DEFINE_DEBUGFS_ATTRIBUTE(fops_wa_set, NULL, mt7996_wa_set,
2664+ "0x%llx\n");
2665+
2666+/* usage: echo 0x[arg3][arg2][arg1] > fw_wa_query */
2667+static int
2668+mt7996_wa_query(void *data, u64 val)
2669+{
2670+ struct mt7996_dev *dev = data;
2671+ u32 arg1, arg2, arg3;
2672+
2673+ arg1 = FIELD_GET(GENMASK_ULL(7, 0), val);
2674+ arg2 = FIELD_GET(GENMASK_ULL(15, 8), val);
2675+ arg3 = FIELD_GET(GENMASK_ULL(23, 16), val);
2676+
2677+ return mt7996_mcu_wa_cmd(dev, MCU_WA_PARAM_CMD(QUERY),
2678+ arg1, arg2, arg3);
2679+ return 0;
2680+}
2681+
2682+DEFINE_DEBUGFS_ATTRIBUTE(fops_wa_query, NULL, mt7996_wa_query,
2683+ "0x%llx\n");
2684+
2685+static int mt7996_dump_version(struct seq_file *s, void *data)
2686+{
2687+ struct mt7996_dev *dev = dev_get_drvdata(s->private);
2688+ seq_printf(s, "Version: 3.3.10.0\n");
2689+
2690+ if (!test_bit(MT76_STATE_MCU_RUNNING, &dev->mphy.state))
2691+ return 0;
2692+
2693+ seq_printf(s, "Rom Patch Build Time: %.16s\n", dev->dbg.patch_build_date);
2694+ seq_printf(s, "WM Patch Build Time: %.15s\n",
2695+ dev->dbg.ram_build_date[MT7996_RAM_TYPE_WM]);
2696+ seq_printf(s, "WA Patch Build Time: %.15s\n",
2697+ dev->dbg.ram_build_date[MT7996_RAM_TYPE_WA]);
2698+ seq_printf(s, "DSP Patch Build Time: %.15s\n",
2699+ dev->dbg.ram_build_date[MT7996_RAM_TYPE_DSP]);
2700+ return 0;
2701+}
2702+
2703+/* dma info dump */
2704+const struct queue_desc mt7902_tx_ring_layout[] = {
2705+ {
2706+ .hw_desc_base = WF_WFDMA_HOST_DMA0_WPDMA_TX_RING18_CTRL0_ADDR,
2707+ .ring_size = 2048,
2708+ .ring_info = "band0 TXD"
2709+ },
2710+ {
2711+ .hw_desc_base = WF_WFDMA_HOST_DMA0_WPDMA_TX_RING19_CTRL0_ADDR,
2712+ .ring_size = 2048,
2713+ .ring_info = "band1 TXD"
2714+ },
2715+ {
2716+ .hw_desc_base = WF_WFDMA_HOST_DMA0_WPDMA_TX_RING21_CTRL0_ADDR,
2717+ .ring_size = 2048,
2718+ .ring_info = "band2 TXD"
2719+ },
2720+ {
2721+ .hw_desc_base = WF_WFDMA_HOST_DMA0_WPDMA_TX_RING16_CTRL0_ADDR,
2722+ .ring_size = 128,
2723+ .ring_info = "FWDL"
2724+ },
2725+ {
2726+ .hw_desc_base = WF_WFDMA_HOST_DMA0_WPDMA_TX_RING17_CTRL0_ADDR,
2727+ .ring_size = 256,
2728+ .ring_info = "cmd to WM"
2729+ },
2730+ {
2731+ .hw_desc_base = WF_WFDMA_HOST_DMA0_WPDMA_TX_RING20_CTRL0_ADDR,
2732+ .ring_size = 256,
2733+ .ring_info = "cmd to WA"
2734+ }
2735+};
2736+
2737+const struct queue_desc mt7902_rx_ring_layout[] = {
2738+ {
2739+ .hw_desc_base = WF_WFDMA_HOST_DMA0_WPDMA_RX_RING4_CTRL0_ADDR,
2740+ .ring_size = 1536,
2741+ .ring_info = "band0 RX data"
2742+ },
2743+ {
2744+ .hw_desc_base = WF_WFDMA_HOST_DMA0_WPDMA_RX_RING5_CTRL0_ADDR,
2745+ .ring_size = 1536,
2746+ .ring_info = "band1 RX data"
2747+ },
2748+ {
2749+ .hw_desc_base = WF_WFDMA_HOST_DMA0_WPDMA_RX_RING8_CTRL0_ADDR,
2750+ .ring_size = 1536,
2751+ .ring_info = "band2 RX data"
2752+ },
2753+ {
2754+ .hw_desc_base = WF_WFDMA_HOST_DMA0_WPDMA_RX_RING0_CTRL0_ADDR,
2755+ .ring_size = 512,
2756+ .ring_info = "event from WM"
2757+ },
2758+ {
2759+ .hw_desc_base = WF_WFDMA_HOST_DMA0_WPDMA_RX_RING1_CTRL0_ADDR,
2760+ .ring_size = 1024,
2761+ .ring_info = "event from WA"
2762+ },
2763+ {
2764+ .hw_desc_base = WF_WFDMA_HOST_DMA0_WPDMA_RX_RING2_CTRL0_ADDR,
2765+ .ring_size = 1024,
2766+ .ring_info = "band0/1/2 tx free done"
2767+ },
2768+};
2769+
2770+static void
2771+dump_dma_tx_ring_info(struct seq_file *s, struct mt7996_dev *dev, char *str1, char *str2, u32 ring_base)
2772+{
2773+ u32 base, cnt, cidx, didx, queue_cnt;
2774+
2775+ base= mt76_rr(dev, ring_base);
2776+ cnt = mt76_rr(dev, ring_base + 4);
2777+ cidx = mt76_rr(dev, ring_base + 8);
2778+ didx = mt76_rr(dev, ring_base + 12);
2779+ queue_cnt = (cidx >= didx) ? (cidx - didx) : (cidx - didx + cnt);
2780+
2781+ seq_printf(s, "%20s %6s %10x %15x %10x %10x %10x\n", str1, str2, base, cnt, cidx, didx, queue_cnt);
2782+}
2783+
2784+static void
2785+dump_dma_rx_ring_info(struct seq_file *s, struct mt7996_dev *dev, char *str1, char *str2, u32 ring_base)
2786+{
2787+ u32 base, ctrl1, cnt, cidx, didx, queue_cnt;
2788+
2789+ base= mt76_rr(dev, ring_base);
2790+ ctrl1 = mt76_rr(dev, ring_base + 4);
2791+ cidx = mt76_rr(dev, ring_base + 8) & 0xfff;
2792+ didx = mt76_rr(dev, ring_base + 12) & 0xfff;
2793+ cnt = ctrl1 & 0xfff;
2794+ queue_cnt = (didx > cidx) ? (didx - cidx - 1) : (didx - cidx + cnt - 1);
2795+
2796+ seq_printf(s, "%20s %6s %10x %10x(%3x) %10x %10x %10x\n",
2797+ str1, str2, base, ctrl1, cnt, cidx, didx, queue_cnt);
2798+}
2799+
2800+static void
2801+mt7996_show_dma_info(struct seq_file *s, struct mt7996_dev *dev)
2802+{
2803+ u32 sys_ctrl[10];
2804+
2805+ /* HOST DMA0 information */
2806+ sys_ctrl[0] = mt76_rr(dev, WF_WFDMA_HOST_DMA0_HOST_INT_STA_ADDR);
2807+ sys_ctrl[1] = mt76_rr(dev, WF_WFDMA_HOST_DMA0_HOST_INT_ENA_ADDR);
2808+ sys_ctrl[2] = mt76_rr(dev, WF_WFDMA_HOST_DMA0_WPDMA_GLO_CFG_ADDR);
2809+
2810+ seq_printf(s, "HOST_DMA Configuration\n");
2811+ seq_printf(s, "%10s %10s %10s %10s %10s %10s\n",
2812+ "DMA", "IntCSR", "IntMask", "Glocfg", "Tx/RxEn", "Tx/RxBusy");
2813+ seq_printf(s, "%10s %10x %10x %10x %4x/%5x %4x/%5x\n",
2814+ "DMA0", sys_ctrl[0], sys_ctrl[1], sys_ctrl[2],
2815+ (sys_ctrl[2] & WF_WFDMA_HOST_DMA0_WPDMA_GLO_CFG_TX_DMA_EN_MASK)
2816+ >> WF_WFDMA_HOST_DMA0_WPDMA_GLO_CFG_TX_DMA_EN_SHFT,
2817+ (sys_ctrl[2] & WF_WFDMA_HOST_DMA0_WPDMA_GLO_CFG_RX_DMA_EN_MASK)
2818+ >> WF_WFDMA_HOST_DMA0_WPDMA_GLO_CFG_RX_DMA_EN_SHFT,
2819+ (sys_ctrl[2] & WF_WFDMA_HOST_DMA0_WPDMA_GLO_CFG_TX_DMA_BUSY_MASK)
2820+ >> WF_WFDMA_HOST_DMA0_WPDMA_GLO_CFG_TX_DMA_BUSY_SHFT,
2821+ (sys_ctrl[2] & WF_WFDMA_HOST_DMA0_WPDMA_GLO_CFG_RX_DMA_BUSY_MASK)
2822+ >> WF_WFDMA_HOST_DMA0_WPDMA_GLO_CFG_RX_DMA_BUSY_SHFT);
2823+
2824+ if (dev->hif2) {
2825+ /* HOST DMA1 information */
2826+ sys_ctrl[0] = mt76_rr(dev, WF_WFDMA_HOST_DMA0_PCIE1_HOST_INT_STA_ADDR);
2827+ sys_ctrl[1] = mt76_rr(dev, WF_WFDMA_HOST_DMA0_PCIE1_HOST_INT_ENA_ADDR);
2828+ sys_ctrl[2] = mt76_rr(dev, WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_GLO_CFG_ADDR);
2829+
2830+ seq_printf(s, "%10s %10x %10x %10x %4x/%5x %4x/%5x\n",
2831+ "DMA0P1", sys_ctrl[0], sys_ctrl[1], sys_ctrl[2],
2832+ (sys_ctrl[2] & WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_GLO_CFG_TX_DMA_EN_MASK)
2833+ >> WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_GLO_CFG_TX_DMA_EN_SHFT,
2834+ (sys_ctrl[2] & WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_GLO_CFG_RX_DMA_EN_MASK)
2835+ >> WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_GLO_CFG_RX_DMA_EN_SHFT,
2836+ (sys_ctrl[2] & WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_GLO_CFG_TX_DMA_BUSY_MASK)
2837+ >> WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_GLO_CFG_TX_DMA_BUSY_SHFT,
2838+ (sys_ctrl[2] & WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_GLO_CFG_RX_DMA_BUSY_MASK)
2839+ >> WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_GLO_CFG_RX_DMA_BUSY_SHFT);
2840+ }
2841+
2842+ seq_printf(s, "HOST_DMA0 Ring Configuration\n");
2843+ seq_printf(s, "%20s %6s %10s %15s %10s %10s %10s\n",
2844+ "Name", "Used", "Base", "Ctrl1(Cnt)", "CIDX", "DIDX", "QCnt");
2845+ dump_dma_tx_ring_info(s, dev, "T0:TXD0(H2MAC)", "STA",
2846+ WF_WFDMA_HOST_DMA0_WPDMA_TX_RING0_CTRL0_ADDR);
2847+ dump_dma_tx_ring_info(s, dev, "T1:TXD1(H2MAC)", "STA",
2848+ WF_WFDMA_HOST_DMA0_WPDMA_TX_RING1_CTRL0_ADDR);
2849+ dump_dma_tx_ring_info(s, dev, "T2:TXD2(H2MAC)", "STA",
2850+ WF_WFDMA_HOST_DMA0_WPDMA_TX_RING2_CTRL0_ADDR);
2851+ dump_dma_tx_ring_info(s, dev, "T3:", "STA",
2852+ WF_WFDMA_HOST_DMA0_WPDMA_TX_RING3_CTRL0_ADDR);
2853+ dump_dma_tx_ring_info(s, dev, "T4:", "STA",
2854+ WF_WFDMA_HOST_DMA0_WPDMA_TX_RING4_CTRL0_ADDR);
2855+ dump_dma_tx_ring_info(s, dev, "T5:", "STA",
2856+ WF_WFDMA_HOST_DMA0_WPDMA_TX_RING5_CTRL0_ADDR);
2857+ dump_dma_tx_ring_info(s, dev, "T6:", "STA",
2858+ WF_WFDMA_HOST_DMA0_WPDMA_TX_RING6_CTRL0_ADDR);
2859+ dump_dma_tx_ring_info(s, dev, "T16:FWDL", "Both",
2860+ WF_WFDMA_HOST_DMA0_WPDMA_TX_RING16_CTRL0_ADDR);
2861+ dump_dma_tx_ring_info(s, dev, "T17:Cmd(H2WM)", "Both",
2862+ WF_WFDMA_HOST_DMA0_WPDMA_TX_RING17_CTRL0_ADDR);
2863+ dump_dma_tx_ring_info(s, dev, "T18:TXD0(H2WA)", "AP",
2864+ WF_WFDMA_HOST_DMA0_WPDMA_TX_RING18_CTRL0_ADDR);
2865+ dump_dma_tx_ring_info(s, dev, "T19:TXD1(H2WA)", "AP",
2866+ WF_WFDMA_HOST_DMA0_WPDMA_TX_RING19_CTRL0_ADDR);
2867+ dump_dma_tx_ring_info(s, dev, "T20:Cmd(H2WA)", "AP",
2868+ WF_WFDMA_HOST_DMA0_WPDMA_TX_RING20_CTRL0_ADDR);
2869+ dump_dma_tx_ring_info(s, dev, "T21:TXD2(H2WA)", "AP",
2870+ WF_WFDMA_HOST_DMA0_WPDMA_TX_RING21_CTRL0_ADDR);
2871+ dump_dma_tx_ring_info(s, dev, "T22:TXD3(H2WA)", "AP",
2872+ WF_WFDMA_HOST_DMA0_WPDMA_TX_RING22_CTRL0_ADDR);
2873+
2874+
2875+ dump_dma_rx_ring_info(s, dev, "R0:Event(WM2H)", "Both",
2876+ WF_WFDMA_HOST_DMA0_WPDMA_RX_RING0_CTRL0_ADDR);
2877+ dump_dma_rx_ring_info(s, dev, "R1:Event(WA2H)", "AP",
2878+ WF_WFDMA_HOST_DMA0_WPDMA_RX_RING1_CTRL0_ADDR);
2879+ dump_dma_rx_ring_info(s, dev, "R2:TxDone0(WA2H)", "AP",
2880+ WF_WFDMA_HOST_DMA0_WPDMA_RX_RING2_CTRL0_ADDR);
2881+ dump_dma_rx_ring_info(s, dev, "R3:TxDone1(WA2H)", "AP",
2882+ WF_WFDMA_HOST_DMA0_WPDMA_RX_RING3_CTRL0_ADDR);
2883+ dump_dma_rx_ring_info(s, dev, "R4:Data0(MAC2H)", "Both",
2884+ WF_WFDMA_HOST_DMA0_WPDMA_RX_RING4_CTRL0_ADDR);
2885+ dump_dma_rx_ring_info(s, dev, "R5:Data1(MAC2H)", "Both",
2886+ WF_WFDMA_HOST_DMA0_WPDMA_RX_RING5_CTRL0_ADDR);
2887+ dump_dma_rx_ring_info(s, dev, "R6:BUF1(MAC2H)", "Both",
2888+ WF_WFDMA_HOST_DMA0_WPDMA_RX_RING6_CTRL0_ADDR);
2889+ dump_dma_rx_ring_info(s, dev, "R7:TxDone1(MAC2H)", "Both",
2890+ WF_WFDMA_HOST_DMA0_WPDMA_RX_RING7_CTRL0_ADDR);
2891+ dump_dma_rx_ring_info(s, dev, "R8:BUF0(MAC2H)", "Both",
2892+ WF_WFDMA_HOST_DMA0_WPDMA_RX_RING8_CTRL0_ADDR);
2893+ dump_dma_rx_ring_info(s, dev, "R9:TxDone0(MAC2H)", "Both",
2894+ WF_WFDMA_HOST_DMA0_WPDMA_RX_RING9_CTRL0_ADDR);
2895+ dump_dma_rx_ring_info(s, dev, "R10:MSDU_PG0(MAC2H)", "Both",
2896+ WF_WFDMA_HOST_DMA0_WPDMA_RX_RING10_CTRL0_ADDR);
2897+ dump_dma_rx_ring_info(s, dev, "R11:MSDU_PG1(MAC2H)", "Both",
2898+ WF_WFDMA_HOST_DMA0_WPDMA_RX_RING11_CTRL0_ADDR);
2899+ dump_dma_rx_ring_info(s, dev, "R12:MSDU_PG2(MAC2H)", "Both",
2900+ WF_WFDMA_HOST_DMA0_WPDMA_RX_RING12_CTRL0_ADDR);
2901+ dump_dma_rx_ring_info(s, dev, "IND:IND_CMD(MAC2H)", "Both",
2902+ WF_RRO_TOP_IND_CMD_0_CTRL0_ADDR);
2903+
2904+ if (dev->hif2) {
2905+ seq_printf(s, "HOST_DMA0 PCIe1 Ring Configuration\n");
2906+ seq_printf(s, "%20s %6s %10s %15s %10s %10s %10s\n",
2907+ "Name", "Used", "Base", "Ctrl1(Cnt)", "CIDX", "DIDX", "QCnt");
2908+ dump_dma_tx_ring_info(s, dev, "T21:TXD2(H2WA)", "AP",
2909+ WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_TX_RING21_CTRL0_ADDR);
2910+ dump_dma_tx_ring_info(s, dev, "T22:TXD?(H2WA)", "AP",
2911+ WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_TX_RING22_CTRL0_ADDR);
2912+
2913+ dump_dma_rx_ring_info(s, dev, "R3:TxDone1(WA2H)", "AP",
2914+ WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_RX_RING3_CTRL0_ADDR);
2915+ dump_dma_rx_ring_info(s, dev, "R5:Data1(MAC2H)", "Both",
2916+ WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_RX_RING5_CTRL0_ADDR);
2917+ dump_dma_rx_ring_info(s, dev, "R6:BUF1(MAC2H)", "Both",
2918+ WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_RX_RING6_CTRL0_ADDR);
2919+ dump_dma_rx_ring_info(s, dev, "R7:TxDone1(MAC2H)", "Both",
2920+ WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_RX_RING7_CTRL0_ADDR);
2921+ }
2922+
2923+ /* MCU DMA information */
2924+ sys_ctrl[0] = mt76_rr(dev, WF_WFDMA_MCU_DMA0_WPDMA_GLO_CFG_ADDR);
2925+ sys_ctrl[1] = mt76_rr(dev, WF_WFDMA_MCU_DMA0_HOST_INT_STA_ADDR);
2926+ sys_ctrl[2] = mt76_rr(dev, WF_WFDMA_MCU_DMA0_HOST_INT_ENA_ADDR);
2927+
2928+ seq_printf(s, "MCU_DMA Configuration\n");
2929+ seq_printf(s, "%10s %10s %10s %10s %10s %10s\n",
2930+ "DMA", "IntCSR", "IntMask", "Glocfg", "Tx/RxEn", "Tx/RxBusy");
2931+ seq_printf(s, "%10s %10x %10x %10x %4x/%5x %4x/%5x\n",
2932+ "DMA0", sys_ctrl[1], sys_ctrl[2], sys_ctrl[0],
2933+ (sys_ctrl[0] & WF_WFDMA_MCU_DMA0_WPDMA_GLO_CFG_TX_DMA_EN_MASK)
2934+ >> WF_WFDMA_MCU_DMA0_WPDMA_GLO_CFG_TX_DMA_EN_SHFT,
2935+ (sys_ctrl[0] & WF_WFDMA_MCU_DMA0_WPDMA_GLO_CFG_RX_DMA_EN_MASK)
2936+ >> WF_WFDMA_MCU_DMA0_WPDMA_GLO_CFG_RX_DMA_EN_SHFT,
2937+ (sys_ctrl[0] & WF_WFDMA_MCU_DMA0_WPDMA_GLO_CFG_TX_DMA_BUSY_MASK)
2938+ >> WF_WFDMA_MCU_DMA0_WPDMA_GLO_CFG_TX_DMA_BUSY_SHFT,
2939+ (sys_ctrl[0] & WF_WFDMA_MCU_DMA0_WPDMA_GLO_CFG_RX_DMA_BUSY_MASK)
2940+ >> WF_WFDMA_MCU_DMA0_WPDMA_GLO_CFG_RX_DMA_BUSY_SHFT);
2941+
2942+ seq_printf(s, "MCU_DMA0 Ring Configuration\n");
2943+ seq_printf(s, "%20s %6s %10s %15s %10s %10s %10s\n",
2944+ "Name", "Used", "Base", "Cnt", "CIDX", "DIDX", "QCnt");
2945+ dump_dma_tx_ring_info(s, dev, "T0:Event(WM2H)", "Both",
2946+ WF_WFDMA_MCU_DMA0_WPDMA_TX_RING0_CTRL0_ADDR);
2947+ dump_dma_tx_ring_info(s, dev, "T1:Event(WA2H)", "AP",
2948+ WF_WFDMA_MCU_DMA0_WPDMA_TX_RING1_CTRL0_ADDR);
2949+ dump_dma_tx_ring_info(s, dev, "T2:TxDone0(WA2H)", "AP",
2950+ WF_WFDMA_MCU_DMA0_WPDMA_TX_RING2_CTRL0_ADDR);
2951+ dump_dma_tx_ring_info(s, dev, "T3:TxDone1(WA2H)", "AP",
2952+ WF_WFDMA_MCU_DMA0_WPDMA_TX_RING3_CTRL0_ADDR);
2953+ dump_dma_tx_ring_info(s, dev, "T4:TXD(WM2MAC)", "Both",
2954+ WF_WFDMA_MCU_DMA0_WPDMA_TX_RING4_CTRL0_ADDR);
2955+ dump_dma_tx_ring_info(s, dev, "T5:TXCMD(WM2MAC)", "Both",
2956+ WF_WFDMA_MCU_DMA0_WPDMA_TX_RING5_CTRL0_ADDR);
2957+ dump_dma_tx_ring_info(s, dev, "T6:TXD(WA2MAC)", "AP",
2958+ WF_WFDMA_MCU_DMA0_WPDMA_TX_RING6_CTRL0_ADDR);
2959+ dump_dma_rx_ring_info(s, dev, "R0:FWDL", "Both",
2960+ WF_WFDMA_MCU_DMA0_WPDMA_RX_RING0_CTRL0_ADDR);
2961+ dump_dma_rx_ring_info(s, dev, "R1:Cmd(H2WM)", "Both",
2962+ WF_WFDMA_MCU_DMA0_WPDMA_RX_RING1_CTRL0_ADDR);
2963+ dump_dma_rx_ring_info(s, dev, "R2:TXD0(H2WA)", "AP",
2964+ WF_WFDMA_MCU_DMA0_WPDMA_RX_RING2_CTRL0_ADDR);
2965+ dump_dma_rx_ring_info(s, dev, "R3:TXD1(H2WA)", "AP",
2966+ WF_WFDMA_MCU_DMA0_WPDMA_RX_RING3_CTRL0_ADDR);
2967+ dump_dma_rx_ring_info(s, dev, "R4:Cmd(H2WA)", "AP",
2968+ WF_WFDMA_MCU_DMA0_WPDMA_RX_RING4_CTRL0_ADDR);
2969+ dump_dma_rx_ring_info(s, dev, "R5:Data0(MAC2WM)", "Both",
2970+ WF_WFDMA_MCU_DMA0_WPDMA_RX_RING5_CTRL0_ADDR);
2971+ dump_dma_rx_ring_info(s, dev, "R6:TxDone(MAC2WM)", "Both",
2972+ WF_WFDMA_MCU_DMA0_WPDMA_RX_RING6_CTRL0_ADDR);
2973+ dump_dma_rx_ring_info(s, dev, "R7:SPL/RPT(MAC2WM)", "Both",
2974+ WF_WFDMA_MCU_DMA0_WPDMA_RX_RING7_CTRL0_ADDR);
2975+ dump_dma_rx_ring_info(s, dev, "R8:TxDone(MAC2WA)", "AP",
2976+ WF_WFDMA_MCU_DMA0_WPDMA_RX_RING8_CTRL0_ADDR);
2977+ dump_dma_rx_ring_info(s, dev, "R9:Data1(MAC2WM)", "Both",
2978+ WF_WFDMA_MCU_DMA0_WPDMA_RX_RING9_CTRL0_ADDR);
2979+ dump_dma_rx_ring_info(s, dev, "R10:TXD2(H2WA)", "AP",
2980+ WF_WFDMA_MCU_DMA0_WPDMA_RX_RING10_CTRL0_ADDR);
2981+
2982+ /* MEM DMA information */
2983+ sys_ctrl[0] = mt76_rr(dev, WF_WFDMA_MEM_DMA_WPDMA_GLO_CFG_ADDR);
2984+ sys_ctrl[1] = mt76_rr(dev, WF_WFDMA_MEM_DMA_HOST_INT_STA_ADDR);
2985+ sys_ctrl[2] = mt76_rr(dev, WF_WFDMA_MEM_DMA_HOST_INT_ENA_ADDR);
2986+
2987+ seq_printf(s, "MEM_DMA Configuration\n");
2988+ seq_printf(s, "%10s %10s %10s %10s %10s %10s\n",
2989+ "DMA", "IntCSR", "IntMask", "Glocfg", "Tx/RxEn", "Tx/RxBusy");
2990+ seq_printf(s, "%10s %10x %10x %10x %4x/%5x %4x/%5x\n",
2991+ "MEM", sys_ctrl[1], sys_ctrl[2], sys_ctrl[0],
2992+ (sys_ctrl[0] & WF_WFDMA_MEM_DMA_WPDMA_GLO_CFG_TX_DMA_EN_MASK)
2993+ >> WF_WFDMA_MEM_DMA_WPDMA_GLO_CFG_TX_DMA_EN_SHFT,
2994+ (sys_ctrl[0] & WF_WFDMA_MEM_DMA_WPDMA_GLO_CFG_RX_DMA_EN_MASK)
2995+ >> WF_WFDMA_MEM_DMA_WPDMA_GLO_CFG_RX_DMA_EN_SHFT,
2996+ (sys_ctrl[0] & WF_WFDMA_MEM_DMA_WPDMA_GLO_CFG_TX_DMA_BUSY_MASK)
2997+ >> WF_WFDMA_MEM_DMA_WPDMA_GLO_CFG_TX_DMA_BUSY_SHFT,
2998+ (sys_ctrl[0] & WF_WFDMA_MEM_DMA_WPDMA_GLO_CFG_RX_DMA_BUSY_MASK)
2999+ >> WF_WFDMA_MEM_DMA_WPDMA_GLO_CFG_RX_DMA_BUSY_SHFT);
3000+
3001+ seq_printf(s, "MEM_DMA Ring Configuration\n");
3002+ seq_printf(s, "%20s %6s %10s %10s %10s %10s %10s\n",
3003+ "Name", "Used", "Base", "Cnt", "CIDX", "DIDX", "QCnt");
3004+ dump_dma_tx_ring_info(s, dev, "T0:CmdEvent(WM2WA)", "AP",
3005+ WF_WFDMA_MEM_DMA_WPDMA_TX_RING0_CTRL0_ADDR);
3006+ dump_dma_tx_ring_info(s, dev, "T1:CmdEvent(WA2WM)", "AP",
3007+ WF_WFDMA_MEM_DMA_WPDMA_TX_RING1_CTRL0_ADDR);
3008+ dump_dma_rx_ring_info(s, dev, "R0:CmdEvent(WM2WA)", "AP",
3009+ WF_WFDMA_MEM_DMA_WPDMA_RX_RING0_CTRL0_ADDR);
3010+ dump_dma_rx_ring_info(s, dev, "R1:CmdEvent(WA2WM)", "AP",
3011+ WF_WFDMA_MEM_DMA_WPDMA_RX_RING1_CTRL0_ADDR);
3012+}
3013+
3014+static int mt7996_trinfo_read(struct seq_file *s, void *data)
3015+{
3016+ struct mt7996_dev *dev = dev_get_drvdata(s->private);
3017+ mt7996_show_dma_info(s, dev);
3018+ return 0;
3019+}
3020+
3021+/* MIB INFO */
3022+static int mt7996_mibinfo_read_per_band(struct seq_file *s, int band_idx)
3023+{
3024+#define BSS_NUM 4
3025+ struct mt7996_dev *dev = dev_get_drvdata(s->private);
3026+ u8 bss_nums = BSS_NUM;
3027+ u32 idx;
3028+ u32 mac_val, band_offset = 0, band_offset_umib = 0;
3029+ u32 msdr6, msdr9, msdr18;
3030+ u32 rvsr0, rscr26, rscr35, mctr5, mctr6, msr0, msr1, msr2;
3031+ u32 tbcr0, tbcr1, tbcr2, tbcr3, tbcr4;
3032+ u32 btscr[7];
3033+ u32 tdrcr[5];
3034+ u32 mbtocr[16], mbtbcr[16], mbrocr[16], mbrbcr[16];
3035+ u32 btcr, btbcr, brocr, brbcr, btdcr, brdcr;
3036+ u32 mu_cnt[5];
3037+ u32 ampdu_cnt[3];
3038+ u64 per;
3039+
3040+ switch (band_idx) {
3041+ case 0:
3042+ band_offset = 0;
3043+ band_offset_umib = 0;
3044+ break;
3045+ case 1:
3046+ band_offset = BN1_WF_MIB_TOP_BASE - BN0_WF_MIB_TOP_BASE;
3047+ band_offset_umib = WF_UMIB_TOP_B1BROCR_ADDR - WF_UMIB_TOP_B0BROCR_ADDR;
3048+ break;
3049+ case 2:
3050+ band_offset = IP1_BN0_WF_MIB_TOP_BASE - BN0_WF_MIB_TOP_BASE;
3051+ band_offset_umib = WF_UMIB_TOP_B2BROCR_ADDR - WF_UMIB_TOP_B0BROCR_ADDR;
3052+ break;
3053+ default:
3054+ return true;
3055+ }
3056+
3057+ seq_printf(s, "Band %d MIB Status\n", band_idx);
3058+ seq_printf(s, "===============================\n");
3059+ mac_val = mt76_rr(dev, BN0_WF_MIB_TOP_M0SCR0_ADDR + band_offset);
3060+ seq_printf(s, "MIB Status Control=0x%x\n", mac_val);
3061+
3062+ msdr6 = mt76_rr(dev, BN0_WF_MIB_TOP_M0SDR6_ADDR + band_offset);
3063+ rvsr0 = mt76_rr(dev, BN0_WF_MIB_TOP_RVSR0_ADDR + band_offset);
3064+ rscr35 = mt76_rr(dev, BN0_WF_MIB_TOP_RSCR35_ADDR + band_offset);
3065+ msdr9 = mt76_rr(dev, BN0_WF_MIB_TOP_M0SDR9_ADDR + band_offset);
3066+ rscr26 = mt76_rr(dev, BN0_WF_MIB_TOP_RSCR26_ADDR + band_offset);
3067+ mctr5 = mt76_rr(dev, BN0_WF_MIB_TOP_MCTR5_ADDR + band_offset);
3068+ mctr6 = mt76_rr(dev, BN0_WF_MIB_TOP_MCTR6_ADDR + band_offset);
3069+ msdr18 = mt76_rr(dev, BN0_WF_MIB_TOP_M0SDR18_ADDR + band_offset);
3070+ msr0 = mt76_rr(dev, BN0_WF_MIB_TOP_MSR0_ADDR + band_offset);
3071+ msr1 = mt76_rr(dev, BN0_WF_MIB_TOP_MSR1_ADDR + band_offset);
3072+ msr2 = mt76_rr(dev, BN0_WF_MIB_TOP_MSR2_ADDR + band_offset);
3073+ ampdu_cnt[0] = mt76_rr(dev, BN0_WF_MIB_TOP_TSCR0_ADDR + band_offset);
3074+ ampdu_cnt[1] = mt76_rr(dev, BN0_WF_MIB_TOP_TSCR3_ADDR + band_offset);
3075+ ampdu_cnt[2] = mt76_rr(dev, BN0_WF_MIB_TOP_TSCR4_ADDR + band_offset);
3076+ ampdu_cnt[1] &= BN0_WF_MIB_TOP_TSCR3_AMPDU_MPDU_COUNT_MASK;
3077+ ampdu_cnt[2] &= BN0_WF_MIB_TOP_TSCR4_AMPDU_ACKED_COUNT_MASK;
3078+
3079+ seq_printf(s, "===Phy/Timing Related Counters===\n");
3080+ seq_printf(s, "\tChannelIdleCnt=0x%x\n",
3081+ msdr6 & BN0_WF_MIB_TOP_M0SDR6_CHANNEL_IDLE_COUNT_MASK);
3082+ seq_printf(s, "\tCCA_NAV_Tx_Time=0x%x\n",
3083+ msdr9 & BN0_WF_MIB_TOP_M0SDR9_CCA_NAV_TX_TIME_MASK);
3084+ seq_printf(s, "\tRx_MDRDY_CNT=0x%x\n",
3085+ rscr26 & BN0_WF_MIB_TOP_RSCR26_RX_MDRDY_COUNT_MASK);
3086+ seq_printf(s, "\tCCK_MDRDY_TIME=0x%x, OFDM_MDRDY_TIME=0x%x",
3087+ msr0 & BN0_WF_MIB_TOP_MSR0_CCK_MDRDY_TIME_MASK,
3088+ msr1 & BN0_WF_MIB_TOP_MSR1_OFDM_LG_MIXED_VHT_MDRDY_TIME_MASK);
3089+ seq_printf(s, ", OFDM_GREEN_MDRDY_TIME=0x%x\n",
3090+ msr2 & BN0_WF_MIB_TOP_MSR2_OFDM_GREEN_MDRDY_TIME_MASK);
3091+ seq_printf(s, "\tPrim CCA Time=0x%x\n",
3092+ mctr5 & BN0_WF_MIB_TOP_MCTR5_P_CCA_TIME_MASK);
3093+ seq_printf(s, "\tSec CCA Time=0x%x\n",
3094+ mctr6 & BN0_WF_MIB_TOP_MCTR6_S_CCA_TIME_MASK);
3095+ seq_printf(s, "\tPrim ED Time=0x%x\n",
3096+ msdr18 & BN0_WF_MIB_TOP_M0SDR18_P_ED_TIME_MASK);
3097+
3098+ seq_printf(s, "===Tx Related Counters(Generic)===\n");
3099+ mac_val = mt76_rr(dev, BN0_WF_MIB_TOP_TSCR18_ADDR + band_offset);
3100+ dev->dbg.bcn_total_cnt[band_idx] +=
3101+ (mac_val & BN0_WF_MIB_TOP_TSCR18_BEACONTXCOUNT_MASK);
3102+ seq_printf(s, "\tBeaconTxCnt=0x%x\n", dev->dbg.bcn_total_cnt[band_idx]);
3103+ dev->dbg.bcn_total_cnt[band_idx] = 0;
3104+
3105+ tbcr0 = mt76_rr(dev, BN0_WF_MIB_TOP_TBCR0_ADDR + band_offset);
3106+ seq_printf(s, "\tTx 20MHz Cnt=0x%x\n",
3107+ tbcr0 & BN0_WF_MIB_TOP_TBCR0_TX_20MHZ_CNT_MASK);
3108+ tbcr1 = mt76_rr(dev, BN0_WF_MIB_TOP_TBCR1_ADDR + band_offset);
3109+ seq_printf(s, "\tTx 40MHz Cnt=0x%x\n",
3110+ tbcr1 & BN0_WF_MIB_TOP_TBCR1_TX_40MHZ_CNT_MASK);
3111+ tbcr2 = mt76_rr(dev, BN0_WF_MIB_TOP_TBCR2_ADDR + band_offset);
3112+ seq_printf(s, "\tTx 80MHz Cnt=0x%x\n",
3113+ tbcr2 & BN0_WF_MIB_TOP_TBCR2_TX_80MHZ_CNT_MASK);
3114+ tbcr3 = mt76_rr(dev, BN0_WF_MIB_TOP_TBCR3_ADDR + band_offset);
3115+ seq_printf(s, "\tTx 160MHz Cnt=0x%x\n",
3116+ tbcr3 & BN0_WF_MIB_TOP_TBCR3_TX_160MHZ_CNT_MASK);
3117+ tbcr4 = mt76_rr(dev, BN0_WF_MIB_TOP_TBCR4_ADDR + band_offset);
3118+ seq_printf(s, "\tTx 320MHz Cnt=0x%x\n",
3119+ tbcr4 & BN0_WF_MIB_TOP_TBCR4_TX_320MHZ_CNT_MASK);
3120+ seq_printf(s, "\tAMPDU Cnt=0x%x\n", ampdu_cnt[0]);
3121+ seq_printf(s, "\tAMPDU MPDU Cnt=0x%x\n", ampdu_cnt[1]);
3122+ seq_printf(s, "\tAMPDU MPDU Ack Cnt=0x%x\n", ampdu_cnt[2]);
3123+ per = (ampdu_cnt[2] == 0 ?
3124+ 0 : 1000 * (ampdu_cnt[1] - ampdu_cnt[2]) / ampdu_cnt[1]);
3125+ seq_printf(s, "\tAMPDU MPDU PER=%llu.%1llu%%\n", per / 10, per % 10);
3126+
3127+ seq_printf(s, "===MU Related Counters===\n");
3128+ mu_cnt[0] = mt76_rr(dev, BN0_WF_MIB_TOP_BSCR2_ADDR + band_offset);
3129+ mu_cnt[1] = mt76_rr(dev, BN0_WF_MIB_TOP_TSCR5_ADDR + band_offset);
3130+ mu_cnt[2] = mt76_rr(dev, BN0_WF_MIB_TOP_TSCR6_ADDR + band_offset);
3131+ mu_cnt[3] = mt76_rr(dev, BN0_WF_MIB_TOP_TSCR8_ADDR + band_offset);
3132+ mu_cnt[4] = mt76_rr(dev, BN0_WF_MIB_TOP_TSCR7_ADDR + band_offset);
3133+
3134+ seq_printf(s, "\tMUBF_TX_COUNT=0x%x\n",
3135+ mu_cnt[0] & BN0_WF_MIB_TOP_BSCR2_MUBF_TX_COUNT_MASK);
3136+ seq_printf(s, "\tMU_TX_MPDU_COUNT(Ok+Fail)=0x%x\n", mu_cnt[1]);
3137+ seq_printf(s, "\tMU_TX_OK_MPDU_COUNT=0x%x\n", mu_cnt[2]);
3138+ seq_printf(s, "\tMU_TO_MU_FAIL_PPDU_COUNT=0x%x\n", mu_cnt[3]);
3139+ seq_printf(s, "\tSU_TX_OK_MPDU_COUNT=0x%x\n", mu_cnt[4]);
3140+
3141+ seq_printf(s, "===Rx Related Counters(Generic)===\n");
3142+ seq_printf(s, "\tVector Mismacth Cnt=0x%x\n",
3143+ rvsr0 & BN0_WF_MIB_TOP_RVSR0_VEC_MISS_COUNT_MASK);
3144+ seq_printf(s, "\tDelimiter Fail Cnt=0x%x\n",
3145+ rscr35 & BN0_WF_MIB_TOP_RSCR35_DELIMITER_FAIL_COUNT_MASK);
3146+
3147+ mac_val = mt76_rr(dev, BN0_WF_MIB_TOP_RSCR1_ADDR + band_offset);
3148+ seq_printf(s, "\tRxFCSErrCnt=0x%x\n",
3149+ (mac_val & BN0_WF_MIB_TOP_RSCR1_RX_FCS_ERROR_COUNT_MASK));
3150+ mac_val = mt76_rr(dev, BN0_WF_MIB_TOP_RSCR33_ADDR + band_offset);
3151+ seq_printf(s, "\tRxFifoFullCnt=0x%x\n",
3152+ (mac_val & BN0_WF_MIB_TOP_RSCR33_RX_FIFO_FULL_COUNT_MASK));
3153+ mac_val = mt76_rr(dev, BN0_WF_MIB_TOP_RSCR36_ADDR + band_offset);
3154+ seq_printf(s, "\tRxLenMismatch=0x%x\n",
3155+ (mac_val & BN0_WF_MIB_TOP_RSCR36_RX_LEN_MISMATCH_MASK));
3156+ mac_val = mt76_rr(dev, BN0_WF_MIB_TOP_RSCR31_ADDR + band_offset);
3157+ seq_printf(s, "\tRxMPDUCnt=0x%x\n",
3158+ (mac_val & BN0_WF_MIB_TOP_RSCR31_RX_MPDU_COUNT_MASK));
3159+ mac_val = mt76_rr(dev, BN0_WF_MIB_TOP_RSCR27_ADDR + band_offset);
3160+ seq_printf(s, "\tRx AMPDU Cnt=0x%x\n", mac_val);
3161+ mac_val = mt76_rr(dev, BN0_WF_MIB_TOP_RSCR28_ADDR + band_offset);
3162+ seq_printf(s, "\tRx Total ByteCnt=0x%x\n", mac_val);
3163+
3164+
3165+ /* Per-BSS T/RX Counters */
3166+ seq_printf(s, "===Per-BSS Related Tx/Rx Counters===\n");
3167+ seq_printf(s, "BSS Idx TxCnt/DataCnt TxByteCnt RxOkCnt/DataCnt RxByteCnt\n");
3168+ for (idx = 0; idx < bss_nums; idx++) {
3169+ btcr = mt76_rr(dev, BN0_WF_MIB_TOP_BTCR_ADDR + band_offset + idx * 4);
3170+ btdcr = mt76_rr(dev, BN0_WF_MIB_TOP_BTDCR_ADDR + band_offset + idx * 4);
3171+ btbcr = mt76_rr(dev, BN0_WF_MIB_TOP_BTBCR_ADDR + band_offset + idx * 4);
3172+
3173+ brocr = mt76_rr(dev, WF_UMIB_TOP_B0BROCR_ADDR + band_offset_umib + idx * 4);
3174+ brdcr = mt76_rr(dev, WF_UMIB_TOP_B0BRDCR_ADDR + band_offset_umib + idx * 4);
3175+ brbcr = mt76_rr(dev, WF_UMIB_TOP_B0BRBCR_ADDR + band_offset_umib + idx * 4);
3176+
3177+ seq_printf(s, "%d\t 0x%x/0x%x\t 0x%x \t 0x%x/0x%x \t 0x%x\n",
3178+ idx, btcr, btdcr, btbcr, brocr, brdcr, brbcr);
3179+ }
3180+
3181+ seq_printf(s, "===Per-BSS Related MIB Counters===\n");
3182+ seq_printf(s, "BSS Idx RTSTx/RetryCnt BAMissCnt AckFailCnt FrmRetry1/2/3Cnt\n");
3183+
3184+ /* Per-BSS TX Status */
3185+ for (idx = 0; idx < bss_nums; idx++) {
3186+ btscr[0] = mt76_rr(dev, BN0_WF_MIB_TOP_BTSCR5_ADDR + band_offset + idx * 4);
3187+ btscr[1] = mt76_rr(dev, BN0_WF_MIB_TOP_BTSCR6_ADDR + band_offset + idx * 4);
3188+ btscr[2] = mt76_rr(dev, BN0_WF_MIB_TOP_BTSCR0_ADDR + band_offset + idx * 4);
3189+ btscr[3] = mt76_rr(dev, BN0_WF_MIB_TOP_BTSCR1_ADDR + band_offset + idx * 4);
3190+ btscr[4] = mt76_rr(dev, BN0_WF_MIB_TOP_BTSCR2_ADDR + band_offset + idx * 4);
3191+ btscr[5] = mt76_rr(dev, BN0_WF_MIB_TOP_BTSCR3_ADDR + band_offset + idx * 4);
3192+ btscr[6] = mt76_rr(dev, BN0_WF_MIB_TOP_BTSCR4_ADDR + band_offset + idx * 4);
3193+
3194+ seq_printf(s, "%d:\t0x%x/0x%x 0x%x \t 0x%x \t 0x%x/0x%x/0x%x\n",
3195+ idx, (btscr[0] & BN0_WF_MIB_TOP_BTSCR5_RTSTXCOUNTn_MASK),
3196+ (btscr[1] & BN0_WF_MIB_TOP_BTSCR6_RTSRETRYCOUNTn_MASK),
3197+ (btscr[2] & BN0_WF_MIB_TOP_BTSCR0_BAMISSCOUNTn_MASK),
3198+ (btscr[3] & BN0_WF_MIB_TOP_BTSCR1_ACKFAILCOUNTn_MASK),
3199+ (btscr[4] & BN0_WF_MIB_TOP_BTSCR2_FRAMERETRYCOUNTn_MASK),
3200+ (btscr[5] & BN0_WF_MIB_TOP_BTSCR3_FRAMERETRY2COUNTn_MASK),
3201+ (btscr[6] & BN0_WF_MIB_TOP_BTSCR4_FRAMERETRY3COUNTn_MASK));
3202+ }
3203+
3204+ /* Dummy delimiter insertion result */
3205+ seq_printf(s, "===Dummy delimiter insertion result===\n");
3206+ tdrcr[0] = mt76_rr(dev, BN0_WF_MIB_TOP_TDRCR0_ADDR + band_offset);
3207+ tdrcr[1] = mt76_rr(dev, BN0_WF_MIB_TOP_TDRCR1_ADDR + band_offset);
3208+ tdrcr[2] = mt76_rr(dev, BN0_WF_MIB_TOP_TDRCR2_ADDR + band_offset);
3209+ tdrcr[3] = mt76_rr(dev, BN0_WF_MIB_TOP_TDRCR3_ADDR + band_offset);
3210+ tdrcr[4] = mt76_rr(dev, BN0_WF_MIB_TOP_TDRCR4_ADDR + band_offset);
3211+
3212+ seq_printf(s, "Range0 = %d\t Range1 = %d\t Range2 = %d\t Range3 = %d\t Range4 = %d\n",
3213+ tdrcr[0],
3214+ tdrcr[1],
3215+ tdrcr[2],
3216+ tdrcr[3],
3217+ tdrcr[4]);
3218+
3219+ /* Per-MBSS T/RX Counters */
3220+ seq_printf(s, "===Per-MBSS Related Tx/Rx Counters===\n");
3221+ seq_printf(s, "MBSSIdx TxOkCnt TxByteCnt RxOkCnt RxByteCnt\n");
3222+
3223+ for (idx = 0; idx < 16; idx++) {
3224+ mbtocr[idx] = mt76_rr(dev, BN0_WF_MIB_TOP_BTOCR_ADDR + band_offset + (bss_nums + idx) * 4);
3225+ mbtbcr[idx] = mt76_rr(dev, BN0_WF_MIB_TOP_BTBCR_ADDR + band_offset + (bss_nums + idx) * 4);
3226+
3227+ mbrocr[idx] = mt76_rr(dev, WF_UMIB_TOP_B0BROCR_ADDR + band_offset_umib + (bss_nums + idx) * 4);
3228+ mbrbcr[idx] = mt76_rr(dev, WF_UMIB_TOP_B0BRBCR_ADDR + band_offset_umib + (bss_nums + idx) * 4);
3229+ }
3230+
3231+ for (idx = 0; idx < 16; idx++) {
3232+ seq_printf(s, "%d\t 0x%x\t 0x%x \t 0x%x \t 0x%x\n",
3233+ idx, mbtocr[idx], mbtbcr[idx], mbrocr[idx], mbrbcr[idx]);
3234+ }
3235+
3236+ return 0;
3237+}
3238+
3239+static int mt7996_mibinfo_band0(struct seq_file *s, void *data)
3240+{
3241+ mt7996_mibinfo_read_per_band(s, MT_BAND0);
3242+ return 0;
3243+}
3244+
3245+static int mt7996_mibinfo_band1(struct seq_file *s, void *data)
3246+{
3247+ mt7996_mibinfo_read_per_band(s, MT_BAND1);
3248+ return 0;
3249+}
3250+
3251+static int mt7996_mibinfo_band2(struct seq_file *s, void *data)
3252+{
3253+ mt7996_mibinfo_read_per_band(s, MT_BAND2);
3254+ return 0;
3255+}
3256+
3257+/* WTBL INFO */
3258+static int
3259+mt7996_wtbl_read_raw(struct mt7996_dev *dev, u16 idx,
3260+ enum mt7996_wtbl_type type, u16 start_dw,
3261+ u16 len, void *buf)
3262+{
3263+ u32 *dest_cpy = (u32 *)buf;
3264+ u32 size_dw = len;
3265+ u32 src = 0;
3266+
3267+ if (!buf)
3268+ return 0xFF;
3269+
3270+ if (type == WTBL_TYPE_LMAC) {
3271+ mt76_wr(dev, MT_DBG_WTBLON_TOP_WDUCR_ADDR,
3272+ FIELD_PREP(MT_DBG_WTBLON_TOP_WDUCR_GROUP, (idx >> 7)));
3273+ src = LWTBL_IDX2BASE(idx, start_dw);
3274+ } else if (type == WTBL_TYPE_UMAC) {
3275+ mt76_wr(dev, MT_DBG_UWTBL_TOP_WDUCR_ADDR,
3276+ FIELD_PREP(MT_DBG_UWTBL_TOP_WDUCR_GROUP, (idx >> 7)));
3277+ src = UWTBL_IDX2BASE(idx, start_dw);
3278+ } else if (type == WTBL_TYPE_KEY) {
3279+ mt76_wr(dev, MT_DBG_UWTBL_TOP_WDUCR_ADDR,
3280+ MT_DBG_UWTBL_TOP_WDUCR_TARGET |
3281+ FIELD_PREP(MT_DBG_UWTBL_TOP_WDUCR_GROUP, (idx >> 7)));
3282+ src = KEYTBL_IDX2BASE(idx, start_dw);
3283+ }
3284+
3285+ while (size_dw--) {
3286+ *dest_cpy++ = mt76_rr(dev, src);
3287+ src += 4;
3288+ };
3289+
3290+ return 0;
3291+}
3292+
3293+#if 0
3294+static int
3295+mt7996_wtbl_write_raw(struct mt7996_dev *dev, u16 idx,
3296+ enum mt7996_wtbl_type type, u16 start_dw,
3297+ u32 val)
3298+{
3299+ u32 addr = 0;
3300+
3301+ if (type == WTBL_TYPE_LMAC) {
3302+ mt76_wr(dev, MT_DBG_WTBLON_TOP_WDUCR_ADDR,
3303+ FIELD_PREP(MT_DBG_WTBLON_TOP_WDUCR_GROUP, (idx >> 7)));
3304+ addr = LWTBL_IDX2BASE(idx, start_dw);
3305+ } else if (type == WTBL_TYPE_UMAC) {
3306+ mt76_wr(dev, MT_DBG_UWTBL_TOP_WDUCR_ADDR,
3307+ FIELD_PREP(MT_DBG_UWTBL_TOP_WDUCR_GROUP, (idx >> 7)));
3308+ addr = UWTBL_IDX2BASE(idx, start_dw);
3309+ } else if (type == WTBL_TYPE_KEY) {
3310+ mt76_wr(dev, MT_DBG_UWTBL_TOP_WDUCR_ADDR,
3311+ MT_DBG_UWTBL_TOP_WDUCR_TARGET |
3312+ FIELD_PREP(MT_DBG_UWTBL_TOP_WDUCR_GROUP, (idx >> 7)));
3313+ addr = KEYTBL_IDX2BASE(idx, start_dw);
3314+ }
3315+
3316+ mt76_wr(dev, addr, val);
3317+
3318+ return 0;
3319+}
3320+#endif
3321+
3322+static const struct berse_wtbl_parse WTBL_LMAC_DW0[] = {
3323+ {"MUAR_IDX", WF_LWTBL_MUAR_MASK, WF_LWTBL_MUAR_SHIFT,false},
3324+ {"RCA1", WF_LWTBL_RCA1_MASK, NO_SHIFT_DEFINE, false},
3325+ {"KID", WF_LWTBL_KID_MASK, WF_LWTBL_KID_SHIFT, false},
3326+ {"RCID", WF_LWTBL_RCID_MASK, NO_SHIFT_DEFINE, false},
3327+ {"BAND", WF_LWTBL_BAND_MASK, WF_LWTBL_BAND_SHIFT,false},
3328+ {"RV", WF_LWTBL_RV_MASK, NO_SHIFT_DEFINE, false},
3329+ {"RCA2", WF_LWTBL_RCA2_MASK, NO_SHIFT_DEFINE, false},
3330+ {"WPI_FLAG", WF_LWTBL_WPI_FLAG_MASK, NO_SHIFT_DEFINE,true},
3331+ {NULL,}
3332+};
3333+
3334+static void parse_fmac_lwtbl_dw0_1(struct seq_file *s, u8 *lwtbl)
3335+{
3336+ u32 *addr = 0;
3337+ u32 dw_value = 0;
3338+ u16 i = 0;
3339+
3340+ seq_printf(s, "\t\n");
3341+ seq_printf(s, "LinkAddr: %02x:%02x:%02x:%02x:%02x:%02x(D0[B0~15], D1[B0~31])\n",
3342+ lwtbl[4], lwtbl[5], lwtbl[6], lwtbl[7], lwtbl[0], lwtbl[1]);
3343+
3344+ /* LMAC WTBL DW 0 */
3345+ seq_printf(s, "\t\n");
3346+ seq_printf(s, "LWTBL DW 0/1\n");
3347+ addr = (u32 *)&(lwtbl[WTBL_GROUP_PEER_INFO_DW_0*4]);
3348+ dw_value = *addr;
3349+
3350+ while (WTBL_LMAC_DW0[i].name) {
3351+
3352+ if (WTBL_LMAC_DW0[i].shift == NO_SHIFT_DEFINE)
3353+ seq_printf(s, "\t%s:%d\n", WTBL_LMAC_DW0[i].name,
3354+ (dw_value & WTBL_LMAC_DW0[i].mask) ? 1 : 0);
3355+ else
3356+ seq_printf(s, "\t%s:%u\n", WTBL_LMAC_DW0[i].name,
3357+ (dw_value & WTBL_LMAC_DW0[i].mask) >> WTBL_LMAC_DW0[i].shift);
3358+ i++;
3359+ }
3360+}
3361+
3362+static const struct berse_wtbl_parse WTBL_LMAC_DW2[] = {
3363+ {"AID", WF_LWTBL_AID_MASK, WF_LWTBL_AID_SHIFT, false},
3364+ {"GID_SU", WF_LWTBL_GID_SU_MASK, NO_SHIFT_DEFINE, false},
3365+ {"SPP_EN", WF_LWTBL_SPP_EN_MASK, NO_SHIFT_DEFINE, false},
3366+ {"WPI_EVEN", WF_LWTBL_WPI_EVEN_MASK, NO_SHIFT_DEFINE, false},
3367+ {"AAD_OM", WF_LWTBL_AAD_OM_MASK, NO_SHIFT_DEFINE, false},
3368+ {"CIPHER_PGTK",WF_LWTBL_CIPHER_SUIT_PGTK_MASK, WF_LWTBL_CIPHER_SUIT_PGTK_SHIFT, true},
3369+ {"FROM_DS", WF_LWTBL_FD_MASK, NO_SHIFT_DEFINE, false},
3370+ {"TO_DS", WF_LWTBL_TD_MASK, NO_SHIFT_DEFINE, false},
3371+ {"SW", WF_LWTBL_SW_MASK, NO_SHIFT_DEFINE, false},
3372+ {"UL", WF_LWTBL_UL_MASK, NO_SHIFT_DEFINE, false},
3373+ {"TX_POWER_SAVE", WF_LWTBL_TX_PS_MASK, NO_SHIFT_DEFINE, true},
3374+ {"QOS", WF_LWTBL_QOS_MASK, NO_SHIFT_DEFINE, false},
3375+ {"HT", WF_LWTBL_HT_MASK, NO_SHIFT_DEFINE, false},
3376+ {"VHT", WF_LWTBL_VHT_MASK, NO_SHIFT_DEFINE, false},
3377+ {"HE", WF_LWTBL_HE_MASK, NO_SHIFT_DEFINE, false},
3378+ {"EHT", WF_LWTBL_EHT_MASK, NO_SHIFT_DEFINE, false},
3379+ {"MESH", WF_LWTBL_MESH_MASK, NO_SHIFT_DEFINE, true},
3380+ {NULL,}
3381+};
3382+
3383+static void parse_fmac_lwtbl_dw2(struct seq_file *s, u8 *lwtbl)
3384+{
3385+ u32 *addr = 0;
3386+ u32 dw_value = 0;
3387+ u16 i = 0;
3388+
3389+ /* LMAC WTBL DW 2 */
3390+ seq_printf(s, "\t\n");
3391+ seq_printf(s, "LWTBL DW 2\n");
3392+ addr = (u32 *)&(lwtbl[WTBL_GROUP_TRX_CAP_DW_2*4]);
3393+ dw_value = *addr;
3394+
3395+ while (WTBL_LMAC_DW2[i].name) {
3396+
3397+ if (WTBL_LMAC_DW2[i].shift == NO_SHIFT_DEFINE)
3398+ seq_printf(s, "\t%s:%d\n", WTBL_LMAC_DW2[i].name,
3399+ (dw_value & WTBL_LMAC_DW2[i].mask) ? 1 : 0);
3400+ else
3401+ seq_printf(s, "\t%s:%u\n", WTBL_LMAC_DW2[i].name,
3402+ (dw_value & WTBL_LMAC_DW2[i].mask) >> WTBL_LMAC_DW2[i].shift);
3403+ i++;
3404+ }
3405+}
3406+
3407+static const struct berse_wtbl_parse WTBL_LMAC_DW3[] = {
3408+ {"WMM_Q", WF_LWTBL_WMM_Q_MASK, WF_LWTBL_WMM_Q_SHIFT, false},
3409+ {"EHT_SIG_MCS", WF_LWTBL_EHT_SIG_MCS_MASK, WF_LWTBL_EHT_SIG_MCS_SHIFT, false},
3410+ {"HDRT_MODE", WF_LWTBL_HDRT_MODE_MASK, NO_SHIFT_DEFINE, false},
3411+ {"BEAM_CHG", WF_LWTBL_BEAM_CHG_MASK, NO_SHIFT_DEFINE, false},
3412+ {"EHT_LTF_SYM_NUM", WF_LWTBL_EHT_LTF_SYM_NUM_OPT_MASK, WF_LWTBL_EHT_LTF_SYM_NUM_OPT_SHIFT, true},
3413+ {"PFMU_IDX", WF_LWTBL_PFMU_IDX_MASK, WF_LWTBL_PFMU_IDX_SHIFT, false},
3414+ {"ULPF_IDX", WF_LWTBL_ULPF_IDX_MASK, WF_LWTBL_ULPF_IDX_SHIFT, false},
3415+ {"RIBF", WF_LWTBL_RIBF_MASK, NO_SHIFT_DEFINE, false},
3416+ {"ULPF", WF_LWTBL_ULPF_MASK, NO_SHIFT_DEFINE, true},
3417+ {"TBF_HT", WF_LWTBL_TBF_HT_MASK, NO_SHIFT_DEFINE, false},
3418+ {"TBF_VHT", WF_LWTBL_TBF_VHT_MASK, NO_SHIFT_DEFINE, false},
3419+ {"TBF_HE", WF_LWTBL_TBF_HE_MASK, NO_SHIFT_DEFINE, false},
3420+ {"TBF_EHT", WF_LWTBL_TBF_EHT_MASK, NO_SHIFT_DEFINE, false},
3421+ {"IGN_FBK", WF_LWTBL_IGN_FBK_MASK, NO_SHIFT_DEFINE, true},
3422+ {NULL,}
3423+};
3424+
3425+static void parse_fmac_lwtbl_dw3(struct seq_file *s, u8 *lwtbl)
3426+{
3427+ u32 *addr = 0;
3428+ u32 dw_value = 0;
3429+ u16 i = 0;
3430+
3431+ /* LMAC WTBL DW 3 */
3432+ seq_printf(s, "\t\n");
3433+ seq_printf(s, "LWTBL DW 3\n");
3434+ addr = (u32 *)&(lwtbl[WTBL_GROUP_TRX_CAP_DW_3*4]);
3435+ dw_value = *addr;
3436+
3437+ while (WTBL_LMAC_DW3[i].name) {
3438+
3439+ if (WTBL_LMAC_DW3[i].shift == NO_SHIFT_DEFINE)
3440+ seq_printf(s, "\t%s:%d\n", WTBL_LMAC_DW3[i].name,
3441+ (dw_value & WTBL_LMAC_DW3[i].mask) ? 1 : 0);
3442+ else
3443+ seq_printf(s, "\t%s:%u\n", WTBL_LMAC_DW3[i].name,
3444+ (dw_value & WTBL_LMAC_DW3[i].mask) >> WTBL_LMAC_DW3[i].shift);
3445+ i++;
3446+ }
3447+}
3448+
3449+static const struct berse_wtbl_parse WTBL_LMAC_DW4[] = {
3450+ {"ANT_ID_STS0", WF_LWTBL_ANT_ID0_MASK, WF_LWTBL_ANT_ID0_SHIFT, false},
3451+ {"STS1", WF_LWTBL_ANT_ID1_MASK, WF_LWTBL_ANT_ID1_SHIFT, false},
3452+ {"STS2", WF_LWTBL_ANT_ID2_MASK, WF_LWTBL_ANT_ID2_SHIFT, false},
3453+ {"STS3", WF_LWTBL_ANT_ID3_MASK, WF_LWTBL_ANT_ID3_SHIFT, true},
3454+ {"ANT_ID_STS4", WF_LWTBL_ANT_ID4_MASK, WF_LWTBL_ANT_ID4_SHIFT, false},
3455+ {"STS5", WF_LWTBL_ANT_ID5_MASK, WF_LWTBL_ANT_ID5_SHIFT, false},
3456+ {"STS6", WF_LWTBL_ANT_ID6_MASK, WF_LWTBL_ANT_ID6_SHIFT, false},
3457+ {"STS7", WF_LWTBL_ANT_ID7_MASK, WF_LWTBL_ANT_ID7_SHIFT, true},
3458+ {"PE", WF_LWTBL_PE_MASK, WF_LWTBL_PE_SHIFT, false},
3459+ {"DIS_RHTR", WF_LWTBL_DIS_RHTR_MASK, NO_SHIFT_DEFINE, false},
3460+ {"LDPC_HT", WF_LWTBL_LDPC_HT_MASK, NO_SHIFT_DEFINE, false},
3461+ {"LDPC_VHT", WF_LWTBL_LDPC_VHT_MASK, NO_SHIFT_DEFINE, false},
3462+ {"LDPC_HE", WF_LWTBL_LDPC_HE_MASK, NO_SHIFT_DEFINE, false},
3463+ {"LDPC_EHT", WF_LWTBL_LDPC_EHT_MASK, NO_SHIFT_DEFINE, true},
3464+ {NULL,}
3465+};
3466+
3467+static void parse_fmac_lwtbl_dw4(struct seq_file *s, u8 *lwtbl)
3468+{
3469+ u32 *addr = 0;
3470+ u32 dw_value = 0;
3471+ u16 i = 0;
3472+
3473+ /* LMAC WTBL DW 4 */
3474+ seq_printf(s, "\t\n");
3475+ seq_printf(s, "LWTBL DW 4\n");
3476+ addr = (u32 *)&(lwtbl[WTBL_GROUP_TRX_CAP_DW_4*4]);
3477+ dw_value = *addr;
3478+
3479+ while (WTBL_LMAC_DW4[i].name) {
3480+ if (WTBL_LMAC_DW4[i].shift == NO_SHIFT_DEFINE)
3481+ seq_printf(s, "\t%s:%d\n", WTBL_LMAC_DW4[i].name,
3482+ (dw_value & WTBL_LMAC_DW4[i].mask) ? 1 : 0);
3483+ else
3484+ seq_printf(s, "\t%s:%u\n", WTBL_LMAC_DW4[i].name,
3485+ (dw_value & WTBL_LMAC_DW4[i].mask) >> WTBL_LMAC_DW4[i].shift);
3486+ i++;
3487+ }
3488+}
3489+
3490+static const struct berse_wtbl_parse WTBL_LMAC_DW5[] = {
3491+ {"AF", WF_LWTBL_AF_MASK, WF_LWTBL_AF_SHIFT, false},
3492+ {"AF_HE", WF_LWTBL_AF_HE_MASK, WF_LWTBL_AF_HE_SHIFT,false},
3493+ {"RTS", WF_LWTBL_RTS_MASK, NO_SHIFT_DEFINE, false},
3494+ {"SMPS", WF_LWTBL_SMPS_MASK, NO_SHIFT_DEFINE, false},
3495+ {"DYN_BW", WF_LWTBL_DYN_BW_MASK, NO_SHIFT_DEFINE, true},
3496+ {"MMSS", WF_LWTBL_MMSS_MASK, WF_LWTBL_MMSS_SHIFT,false},
3497+ {"USR", WF_LWTBL_USR_MASK, NO_SHIFT_DEFINE, false},
3498+ {"SR_RATE", WF_LWTBL_SR_R_MASK, WF_LWTBL_SR_R_SHIFT,false},
3499+ {"SR_ABORT", WF_LWTBL_SR_ABORT_MASK, NO_SHIFT_DEFINE, true},
3500+ {"TX_POWER_OFFSET", WF_LWTBL_TX_POWER_OFFSET_MASK, WF_LWTBL_TX_POWER_OFFSET_SHIFT, false},
3501+ {"LTF_EHT", WF_LWTBL_LTF_EHT_MASK, WF_LWTBL_LTF_EHT_SHIFT, false},
3502+ {"GI_EHT", WF_LWTBL_GI_EHT_MASK, WF_LWTBL_GI_EHT_SHIFT, false},
3503+ {"DOPPL", WF_LWTBL_DOPPL_MASK, NO_SHIFT_DEFINE, false},
3504+ {"TXOP_PS_CAP", WF_LWTBL_TXOP_PS_CAP_MASK, NO_SHIFT_DEFINE, false},
3505+ {"DONOT_UPDATE_I_PSM", WF_LWTBL_DU_I_PSM_MASK, NO_SHIFT_DEFINE, true},
3506+ {"I_PSM", WF_LWTBL_I_PSM_MASK, NO_SHIFT_DEFINE, false},
3507+ {"PSM", WF_LWTBL_PSM_MASK, NO_SHIFT_DEFINE, false},
3508+ {"SKIP_TX", WF_LWTBL_SKIP_TX_MASK, NO_SHIFT_DEFINE, true},
3509+ {NULL,}
3510+};
3511+
3512+static void parse_fmac_lwtbl_dw5(struct seq_file *s, u8 *lwtbl)
3513+{
3514+ u32 *addr = 0;
3515+ u32 dw_value = 0;
3516+ u16 i = 0;
3517+
3518+ /* LMAC WTBL DW 5 */
3519+ seq_printf(s, "\t\n");
3520+ seq_printf(s, "LWTBL DW 5\n");
3521+ addr = (u32 *)&(lwtbl[WTBL_GROUP_TRX_CAP_DW_5*4]);
3522+ dw_value = *addr;
3523+
3524+ while (WTBL_LMAC_DW5[i].name) {
3525+ if (WTBL_LMAC_DW5[i].shift == NO_SHIFT_DEFINE)
3526+ seq_printf(s, "\t%s:%d\n", WTBL_LMAC_DW5[i].name,
3527+ (dw_value & WTBL_LMAC_DW5[i].mask) ? 1 : 0);
3528+ else
3529+ seq_printf(s, "\t%s:%u\n", WTBL_LMAC_DW5[i].name,
3530+ (dw_value & WTBL_LMAC_DW5[i].mask) >> WTBL_LMAC_DW5[i].shift);
3531+ i++;
3532+ }
3533+}
3534+
3535+static const struct berse_wtbl_parse WTBL_LMAC_DW6[] = {
3536+ {"CBRN", WF_LWTBL_CBRN_MASK, WF_LWTBL_CBRN_SHIFT, false},
3537+ {"DBNSS_EN", WF_LWTBL_DBNSS_EN_MASK, NO_SHIFT_DEFINE, false},
3538+ {"BAF_EN", WF_LWTBL_BAF_EN_MASK, NO_SHIFT_DEFINE, false},
3539+ {"RDGBA", WF_LWTBL_RDGBA_MASK, NO_SHIFT_DEFINE, false},
3540+ {"RDG", WF_LWTBL_R_MASK, NO_SHIFT_DEFINE, false},
3541+ {"SPE_IDX", WF_LWTBL_SPE_IDX_MASK, WF_LWTBL_SPE_IDX_SHIFT, true},
3542+ {"G2", WF_LWTBL_G2_MASK, NO_SHIFT_DEFINE, false},
3543+ {"G4", WF_LWTBL_G4_MASK, NO_SHIFT_DEFINE, false},
3544+ {"G8", WF_LWTBL_G8_MASK, NO_SHIFT_DEFINE, false},
3545+ {"G16", WF_LWTBL_G16_MASK, NO_SHIFT_DEFINE, true},
3546+ {"G2_LTF", WF_LWTBL_G2_LTF_MASK, WF_LWTBL_G2_LTF_SHIFT, false},
3547+ {"G4_LTF", WF_LWTBL_G4_LTF_MASK, WF_LWTBL_G4_LTF_SHIFT, false},
3548+ {"G8_LTF", WF_LWTBL_G8_LTF_MASK, WF_LWTBL_G8_LTF_SHIFT, false},
3549+ {"G16_LTF", WF_LWTBL_G16_LTF_MASK, WF_LWTBL_G16_LTF_SHIFT, true},
3550+ {"G2_HE", WF_LWTBL_G2_HE_MASK, WF_LWTBL_G2_HE_SHIFT, false},
3551+ {"G4_HE", WF_LWTBL_G4_HE_MASK, WF_LWTBL_G4_HE_SHIFT, false},
3552+ {"G8_HE", WF_LWTBL_G8_HE_MASK, WF_LWTBL_G8_HE_SHIFT, false},
3553+ {"G16_HE", WF_LWTBL_G16_HE_MASK, WF_LWTBL_G16_HE_SHIFT, true},
3554+ {NULL,}
3555+};
3556+
3557+static void parse_fmac_lwtbl_dw6(struct seq_file *s, u8 *lwtbl)
3558+{
3559+ u32 *addr = 0;
3560+ u32 dw_value = 0;
3561+ u16 i = 0;
3562+
3563+ /* LMAC WTBL DW 6 */
3564+ seq_printf(s, "\t\n");
3565+ seq_printf(s, "LWTBL DW 6\n");
3566+ addr = (u32 *)&(lwtbl[WTBL_GROUP_TRX_CAP_DW_6*4]);
3567+ dw_value = *addr;
3568+
3569+ while (WTBL_LMAC_DW6[i].name) {
3570+ if (WTBL_LMAC_DW6[i].shift == NO_SHIFT_DEFINE)
3571+ seq_printf(s, "\t%s:%d\n", WTBL_LMAC_DW6[i].name,
3572+ (dw_value & WTBL_LMAC_DW6[i].mask) ? 1 : 0);
3573+ else
3574+ seq_printf(s, "\t%s:%u\n", WTBL_LMAC_DW6[i].name,
3575+ (dw_value & WTBL_LMAC_DW6[i].mask) >> WTBL_LMAC_DW6[i].shift);
3576+ i++;
3577+ }
3578+}
3579+
3580+static void parse_fmac_lwtbl_dw7(struct seq_file *s, u8 *lwtbl)
3581+{
3582+ u32 *addr = 0;
3583+ u32 dw_value = 0;
3584+ int i = 0;
3585+
3586+ /* LMAC WTBL DW 7 */
3587+ seq_printf(s, "\t\n");
3588+ seq_printf(s, "LWTBL DW 7\n");
3589+ addr = (u32 *)&(lwtbl[WTBL_GROUP_TRX_CAP_DW_7*4]);
3590+ dw_value = *addr;
3591+
3592+ for (i = 0; i < 8; i++) {
3593+ seq_printf(s, "\tBA_WIN_SIZE%u:%lu\n", i, ((dw_value & BITS(i*4, i*4+3)) >> i*4));
3594+ }
3595+}
3596+
3597+static const struct berse_wtbl_parse WTBL_LMAC_DW8[] = {
3598+ {"RTS_FAIL_CNT_AC0", WF_LWTBL_AC0_RTS_FAIL_CNT_MASK, WF_LWTBL_AC0_RTS_FAIL_CNT_SHIFT, false},
3599+ {"AC1", WF_LWTBL_AC1_RTS_FAIL_CNT_MASK, WF_LWTBL_AC1_RTS_FAIL_CNT_SHIFT, false},
3600+ {"AC2", WF_LWTBL_AC2_RTS_FAIL_CNT_MASK, WF_LWTBL_AC2_RTS_FAIL_CNT_SHIFT, false},
3601+ {"AC3", WF_LWTBL_AC3_RTS_FAIL_CNT_MASK, WF_LWTBL_AC3_RTS_FAIL_CNT_SHIFT, true},
3602+ {"PARTIAL_AID", WF_LWTBL_PARTIAL_AID_MASK, WF_LWTBL_PARTIAL_AID_SHIFT, false},
3603+ {"CHK_PER", WF_LWTBL_CHK_PER_MASK, NO_SHIFT_DEFINE, true},
3604+ {NULL,}
3605+};
3606+
3607+static void parse_fmac_lwtbl_dw8(struct seq_file *s, u8 *lwtbl)
3608+{
3609+ u32 *addr = 0;
3610+ u32 dw_value = 0;
3611+ u16 i = 0;
3612+
3613+ /* LMAC WTBL DW 8 */
3614+ seq_printf(s, "\t\n");
3615+ seq_printf(s, "LWTBL DW 8\n");
3616+ addr = (u32 *)&(lwtbl[WTBL_GROUP_TRX_CAP_DW_8*4]);
3617+ dw_value = *addr;
3618+
3619+ while (WTBL_LMAC_DW8[i].name) {
3620+ if (WTBL_LMAC_DW8[i].shift == NO_SHIFT_DEFINE)
3621+ seq_printf(s, "\t%s:%d\n", WTBL_LMAC_DW8[i].name,
3622+ (dw_value & WTBL_LMAC_DW8[i].mask) ? 1 : 0);
3623+ else
3624+ seq_printf(s, "\t%s:%u\n", WTBL_LMAC_DW8[i].name,
3625+ (dw_value & WTBL_LMAC_DW8[i].mask) >> WTBL_LMAC_DW8[i].shift);
3626+ i++;
3627+ }
3628+}
3629+
3630+static const struct berse_wtbl_parse WTBL_LMAC_DW9[] = {
3631+ {"RX_AVG_MPDU_SIZE", WF_LWTBL_RX_AVG_MPDU_SIZE_MASK, WF_LWTBL_RX_AVG_MPDU_SIZE_SHIFT, false},
3632+ {"PRITX_SW_MODE", WF_LWTBL_PRITX_SW_MODE_MASK, NO_SHIFT_DEFINE, false},
3633+ {"PRITX_ERSU", WF_LWTBL_PRITX_ERSU_MASK, NO_SHIFT_DEFINE, false},
3634+ {"PRITX_PLR", WF_LWTBL_PRITX_PLR_MASK, NO_SHIFT_DEFINE, true},
3635+ {"PRITX_DCM", WF_LWTBL_PRITX_DCM_MASK, NO_SHIFT_DEFINE, false},
3636+ {"PRITX_ER106T", WF_LWTBL_PRITX_ER106T_MASK, NO_SHIFT_DEFINE, true},
3637+ /* {"FCAP(0:20 1:~40)", WTBL_FCAP_20_TO_160_MHZ, WTBL_FCAP_20_TO_160_MHZ_OFFSET}, */
3638+ {"MPDU_FAIL_CNT", WF_LWTBL_MPDU_FAIL_CNT_MASK, WF_LWTBL_MPDU_FAIL_CNT_SHIFT, false},
3639+ {"MPDU_OK_CNT", WF_LWTBL_MPDU_OK_CNT_MASK, WF_LWTBL_MPDU_OK_CNT_SHIFT, false},
3640+ {"RATE_IDX", WF_LWTBL_RATE_IDX_MASK, WF_LWTBL_RATE_IDX_SHIFT, true},
3641+ {NULL,}
3642+};
3643+
3644+char *fcap_name[] = {"20MHz", "20/40MHz", "20/40/80MHz", "20/40/80/160/80+80MHz", "20/40/80/160/80+80/320MHz"};
3645+
3646+static void parse_fmac_lwtbl_dw9(struct seq_file *s, u8 *lwtbl)
3647+{
3648+ u32 *addr = 0;
3649+ u32 dw_value = 0;
3650+ u16 i = 0;
3651+
3652+ /* LMAC WTBL DW 9 */
3653+ seq_printf(s, "\t\n");
3654+ seq_printf(s, "LWTBL DW 9\n");
3655+ addr = (u32 *)&(lwtbl[WTBL_GROUP_TRX_CAP_DW_9*4]);
3656+ dw_value = *addr;
3657+
3658+ while (WTBL_LMAC_DW9[i].name) {
3659+ if (WTBL_LMAC_DW9[i].shift == NO_SHIFT_DEFINE)
3660+ seq_printf(s, "\t%s:%d\n", WTBL_LMAC_DW9[i].name,
3661+ (dw_value & WTBL_LMAC_DW9[i].mask) ? 1 : 0);
3662+ else
3663+ seq_printf(s, "\t%s:%u\n", WTBL_LMAC_DW9[i].name,
3664+ (dw_value & WTBL_LMAC_DW9[i].mask) >> WTBL_LMAC_DW9[i].shift);
3665+ i++;
3666+ }
3667+
3668+ /* FCAP parser */
3669+ seq_printf(s, "\t\n");
3670+ seq_printf(s, "FCAP:%s\n", fcap_name[(dw_value & WF_LWTBL_FCAP_MASK) >> WF_LWTBL_FCAP_SHIFT]);
3671+}
3672+
3673+#define HW_TX_RATE_TO_MODE(_x) (((_x) & WTBL_RATE_TX_MODE_MASK) >> WTBL_RATE_TX_MODE_OFFSET)
3674+#define HW_TX_RATE_TO_MCS(_x, _mode) ((_x) & WTBL_RATE_TX_RATE_MASK >> WTBL_RATE_TX_RATE_OFFSET)
3675+#define HW_TX_RATE_TO_NSS(_x) (((_x) & WTBL_RATE_NSTS_MASK) >> WTBL_RATE_NSTS_OFFSET)
3676+#define HW_TX_RATE_TO_STBC(_x) (((_x) & WTBL_RATE_STBC_MASK) >> WTBL_RATE_STBC_OFFSET)
3677+
3678+#define MAX_TX_MODE 16
3679+static char *HW_TX_MODE_STR[] = {"CCK", "OFDM", "HT-Mix", "HT-GF", "VHT",
3680+ "N/A", "N/A", "N/A",
3681+ "HE_SU", "HE_EXT_SU", "HE_TRIG", "HE_MU",
3682+ "N/A",
3683+ "EHT_EXT_SU", "EHT_TRIG", "EHT_MU",
3684+ "N/A"};
3685+static char *HW_TX_RATE_CCK_STR[] = {"1M", "2Mlong", "5.5Mlong", "11Mlong", "N/A", "2Mshort", "5.5Mshort", "11Mshort", "N/A"};
3686+static char *HW_TX_RATE_OFDM_STR[] = {"6M", "9M", "12M", "18M", "24M", "36M", "48M", "54M", "N/A"};
3687+
3688+static char *hw_rate_ofdm_str(uint16_t ofdm_idx)
3689+{
3690+ switch (ofdm_idx) {
3691+ case 11: /* 6M */
3692+ return HW_TX_RATE_OFDM_STR[0];
3693+
3694+ case 15: /* 9M */
3695+ return HW_TX_RATE_OFDM_STR[1];
3696+
3697+ case 10: /* 12M */
3698+ return HW_TX_RATE_OFDM_STR[2];
3699+
3700+ case 14: /* 18M */
3701+ return HW_TX_RATE_OFDM_STR[3];
3702+
3703+ case 9: /* 24M */
3704+ return HW_TX_RATE_OFDM_STR[4];
3705+
3706+ case 13: /* 36M */
3707+ return HW_TX_RATE_OFDM_STR[5];
3708+
3709+ case 8: /* 48M */
3710+ return HW_TX_RATE_OFDM_STR[6];
3711+
3712+ case 12: /* 54M */
3713+ return HW_TX_RATE_OFDM_STR[7];
3714+
3715+ default:
3716+ return HW_TX_RATE_OFDM_STR[8];
3717+ }
3718+}
3719+
3720+static char *hw_rate_str(u8 mode, uint16_t rate_idx)
3721+{
3722+ if (mode == 0)
3723+ return rate_idx < 8 ? HW_TX_RATE_CCK_STR[rate_idx] : HW_TX_RATE_CCK_STR[8];
3724+ else if (mode == 1)
3725+ return hw_rate_ofdm_str(rate_idx);
3726+ else
3727+ return "MCS";
3728+}
3729+
3730+static void
3731+parse_rate(struct seq_file *s, uint16_t rate_idx, uint16_t txrate)
3732+{
3733+ uint16_t txmode, mcs, nss, stbc;
3734+
3735+ txmode = HW_TX_RATE_TO_MODE(txrate);
3736+ mcs = HW_TX_RATE_TO_MCS(txrate, txmode);
3737+ nss = HW_TX_RATE_TO_NSS(txrate);
3738+ stbc = HW_TX_RATE_TO_STBC(txrate);
3739+
3740+ seq_printf(s, "\tRate%d(0x%x):TxMode=%d(%s), TxRate=%d(%s), Nsts=%d, STBC=%d\n",
3741+ rate_idx + 1, txrate,
3742+ txmode, (txmode < MAX_TX_MODE ? HW_TX_MODE_STR[txmode] : HW_TX_MODE_STR[MAX_TX_MODE]),
3743+ mcs, hw_rate_str(txmode, mcs), nss, stbc);
3744+}
3745+
3746+
3747+static const struct berse_wtbl_parse WTBL_LMAC_DW10[] = {
3748+ {"RATE1", WF_LWTBL_RATE1_MASK, WF_LWTBL_RATE1_SHIFT},
3749+ {"RATE2", WF_LWTBL_RATE2_MASK, WF_LWTBL_RATE2_SHIFT},
3750+ {NULL,}
3751+};
3752+
3753+static void parse_fmac_lwtbl_dw10(struct seq_file *s, u8 *lwtbl)
3754+{
3755+ u32 *addr = 0;
3756+ u32 dw_value = 0;
3757+ u16 i = 0;
3758+
3759+ /* LMAC WTBL DW 10 */
3760+ seq_printf(s, "\t\n");
3761+ seq_printf(s, "LWTBL DW 10\n");
3762+ addr = (u32 *)&(lwtbl[WTBL_GROUP_AUTO_RATE_1_2*4]);
3763+ dw_value = *addr;
3764+
3765+ while (WTBL_LMAC_DW10[i].name) {
3766+ parse_rate(s, i, (dw_value & WTBL_LMAC_DW10[i].mask) >> WTBL_LMAC_DW10[i].shift);
3767+ i++;
3768+ }
3769+}
3770+
3771+static const struct berse_wtbl_parse WTBL_LMAC_DW11[] = {
3772+ {"RATE3", WF_LWTBL_RATE3_MASK, WF_LWTBL_RATE3_SHIFT},
3773+ {"RATE4", WF_LWTBL_RATE4_MASK, WF_LWTBL_RATE4_SHIFT},
3774+ {NULL,}
3775+};
3776+
3777+static void parse_fmac_lwtbl_dw11(struct seq_file *s, u8 *lwtbl)
3778+{
3779+ u32 *addr = 0;
3780+ u32 dw_value = 0;
3781+ u16 i = 0;
3782+
3783+ /* LMAC WTBL DW 11 */
3784+ seq_printf(s, "\t\n");
3785+ seq_printf(s, "LWTBL DW 11\n");
3786+ addr = (u32 *)&(lwtbl[WTBL_GROUP_AUTO_RATE_3_4*4]);
3787+ dw_value = *addr;
3788+
3789+ while (WTBL_LMAC_DW11[i].name) {
3790+ parse_rate(s, i+2, (dw_value & WTBL_LMAC_DW11[i].mask) >> WTBL_LMAC_DW11[i].shift);
3791+ i++;
3792+ }
3793+}
3794+
3795+static const struct berse_wtbl_parse WTBL_LMAC_DW12[] = {
3796+ {"RATE5", WF_LWTBL_RATE5_MASK, WF_LWTBL_RATE5_SHIFT},
3797+ {"RATE6", WF_LWTBL_RATE6_MASK, WF_LWTBL_RATE6_SHIFT},
3798+ {NULL,}
3799+};
3800+
3801+static void parse_fmac_lwtbl_dw12(struct seq_file *s, u8 *lwtbl)
3802+{
3803+ u32 *addr = 0;
3804+ u32 dw_value = 0;
3805+ u16 i = 0;
3806+
3807+ /* LMAC WTBL DW 12 */
3808+ seq_printf(s, "\t\n");
3809+ seq_printf(s, "LWTBL DW 12\n");
3810+ addr = (u32 *)&(lwtbl[WTBL_GROUP_AUTO_RATE_5_6*4]);
3811+ dw_value = *addr;
3812+
3813+ while (WTBL_LMAC_DW12[i].name) {
3814+ parse_rate(s, i+4, (dw_value & WTBL_LMAC_DW12[i].mask) >> WTBL_LMAC_DW12[i].shift);
3815+ i++;
3816+ }
3817+}
3818+
3819+static const struct berse_wtbl_parse WTBL_LMAC_DW13[] = {
3820+ {"RATE7", WF_LWTBL_RATE7_MASK, WF_LWTBL_RATE7_SHIFT},
3821+ {"RATE8", WF_LWTBL_RATE8_MASK, WF_LWTBL_RATE8_SHIFT},
3822+ {NULL,}
3823+};
3824+
3825+static void parse_fmac_lwtbl_dw13(struct seq_file *s, u8 *lwtbl)
3826+{
3827+ u32 *addr = 0;
3828+ u32 dw_value = 0;
3829+ u16 i = 0;
3830+
3831+ /* LMAC WTBL DW 13 */
3832+ seq_printf(s, "\t\n");
3833+ seq_printf(s, "LWTBL DW 13\n");
3834+ addr = (u32 *)&(lwtbl[WTBL_GROUP_AUTO_RATE_7_8*4]);
3835+ dw_value = *addr;
3836+
3837+ while (WTBL_LMAC_DW13[i].name) {
3838+ parse_rate(s, i+6, (dw_value & WTBL_LMAC_DW13[i].mask) >> WTBL_LMAC_DW13[i].shift);
3839+ i++;
3840+ }
3841+}
3842+
3843+static const struct berse_wtbl_parse WTBL_LMAC_DW14_BMC[] = {
3844+ {"CIPHER_IGTK", WF_LWTBL_CIPHER_SUIT_IGTK_MASK, WF_LWTBL_CIPHER_SUIT_IGTK_SHIFT, false},
3845+ {"CIPHER_BIGTK", WF_LWTBL_CIPHER_SUIT_BIGTK_MASK, WF_LWTBL_CIPHER_SUIT_BIGTK_SHIFT, true},
3846+ {NULL,}
3847+};
3848+
3849+static void parse_fmac_lwtbl_dw14(struct seq_file *s, u8 *lwtbl)
3850+{
3851+ u32 *addr, *muar_addr = 0;
3852+ u32 dw_value, muar_dw_value = 0;
3853+ u16 i = 0;
3854+
3855+ /* DUMP DW14 for BMC entry only */
3856+ muar_addr = (u32 *)&(lwtbl[WF_LWTBL_MUAR_DW*4]);
3857+ muar_dw_value = *muar_addr;
3858+ if (((muar_dw_value & WF_LWTBL_MUAR_MASK) >> WF_LWTBL_MUAR_SHIFT)
3859+ == MUAR_INDEX_OWN_MAC_ADDR_BC_MC) {
3860+ /* LMAC WTBL DW 14 */
3861+ seq_printf(s, "\t\n");
3862+ seq_printf(s, "LWTBL DW 14\n");
3863+ addr = (u32 *)&(lwtbl[WF_LWTBL_CIPHER_SUIT_IGTK_DW*4]);
3864+ dw_value = *addr;
3865+
3866+ while (WTBL_LMAC_DW14_BMC[i].name) {
3867+ parse_rate(s, i+6, (dw_value & WTBL_LMAC_DW14_BMC[i].mask) >> WTBL_LMAC_DW14_BMC[i].shift);
3868+ i++;
3869+ }
3870+ }
3871+}
3872+
3873+static const struct berse_wtbl_parse WTBL_LMAC_DW28[] = {
3874+ {"RELATED_IDX0", WF_LWTBL_RELATED_IDX0_MASK, WF_LWTBL_RELATED_IDX0_SHIFT, false},
3875+ {"RELATED_BAND0", WF_LWTBL_RELATED_BAND0_MASK, WF_LWTBL_RELATED_BAND0_SHIFT, false},
3876+ {"PRI_MLD_BAND", WF_LWTBL_PRIMARY_MLD_BAND_MASK, WF_LWTBL_PRIMARY_MLD_BAND_SHIFT, true},
3877+ {"RELATED_IDX0", WF_LWTBL_RELATED_IDX1_MASK, WF_LWTBL_RELATED_IDX1_SHIFT, false},
3878+ {"RELATED_BAND1", WF_LWTBL_RELATED_BAND1_MASK, WF_LWTBL_RELATED_BAND1_SHIFT, false},
3879+ {"SEC_MLD_BAND", WF_LWTBL_SECONDARY_MLD_BAND_MASK, WF_LWTBL_SECONDARY_MLD_BAND_SHIFT, true},
3880+ {NULL,}
3881+};
3882+
3883+static void parse_fmac_lwtbl_dw28(struct seq_file *s, u8 *lwtbl)
3884+{
3885+ u32 *addr = 0;
3886+ u32 dw_value = 0;
3887+ u16 i = 0;
3888+
3889+ /* LMAC WTBL DW 28 */
3890+ seq_printf(s, "\t\n");
3891+ seq_printf(s, "LWTBL DW 28\n");
3892+ addr = (u32 *)&(lwtbl[WTBL_GROUP_MLO_INFO_LINE_1*4]);
3893+ dw_value = *addr;
3894+
3895+ while (WTBL_LMAC_DW28[i].name) {
3896+ if (WTBL_LMAC_DW28[i].shift == NO_SHIFT_DEFINE)
3897+ seq_printf(s, "\t%s:%d\n", WTBL_LMAC_DW28[i].name,
3898+ (dw_value & WTBL_LMAC_DW28[i].mask) ? 1 : 0);
3899+ else
3900+ seq_printf(s, "\t%s:%u\n", WTBL_LMAC_DW28[i].name,
3901+ (dw_value & WTBL_LMAC_DW28[i].mask) >>
3902+ WTBL_LMAC_DW28[i].shift);
3903+ i++;
3904+ }
3905+}
3906+
3907+static const struct berse_wtbl_parse WTBL_LMAC_DW29[] = {
3908+ {"DISPATCH_POLICY_MLD_TID0", WF_LWTBL_DISPATCH_POLICY0_MASK, WF_LWTBL_DISPATCH_POLICY0_SHIFT, false},
3909+ {"MLD_TID1", WF_LWTBL_DISPATCH_POLICY1_MASK, WF_LWTBL_DISPATCH_POLICY1_SHIFT, false},
3910+ {"MLD_TID2", WF_LWTBL_DISPATCH_POLICY2_MASK, WF_LWTBL_DISPATCH_POLICY2_SHIFT, false},
3911+ {"MLD_TID3", WF_LWTBL_DISPATCH_POLICY3_MASK, WF_LWTBL_DISPATCH_POLICY3_SHIFT, true},
3912+ {"MLD_TID4", WF_LWTBL_DISPATCH_POLICY4_MASK, WF_LWTBL_DISPATCH_POLICY4_SHIFT, false},
3913+ {"MLD_TID5", WF_LWTBL_DISPATCH_POLICY5_MASK, WF_LWTBL_DISPATCH_POLICY5_SHIFT, false},
3914+ {"MLD_TID6", WF_LWTBL_DISPATCH_POLICY6_MASK, WF_LWTBL_DISPATCH_POLICY6_SHIFT, false},
3915+ {"MLD_TID7", WF_LWTBL_DISPATCH_POLICY7_MASK, WF_LWTBL_DISPATCH_POLICY7_SHIFT, true},
3916+ {"OMLD_ID", WF_LWTBL_OWN_MLD_ID_MASK, WF_LWTBL_OWN_MLD_ID_SHIFT, false},
3917+ {"EMLSR0", WF_LWTBL_EMLSR0_MASK, NO_SHIFT_DEFINE, false},
3918+ {"EMLMR0", WF_LWTBL_EMLMR0_MASK, NO_SHIFT_DEFINE, false},
3919+ {"EMLSR1", WF_LWTBL_EMLSR1_MASK, NO_SHIFT_DEFINE, false},
3920+ {"EMLMR1", WF_LWTBL_EMLMR1_MASK, NO_SHIFT_DEFINE, true},
3921+ {"EMLSR2", WF_LWTBL_EMLSR2_MASK, NO_SHIFT_DEFINE, false},
3922+ {"EMLMR2", WF_LWTBL_EMLMR2_MASK, NO_SHIFT_DEFINE, false},
3923+ {"STR_BITMAP", WF_LWTBL_STR_BITMAP_MASK, WF_LWTBL_STR_BITMAP_SHIFT, true},
3924+ {NULL,}
3925+};
3926+
3927+static void parse_fmac_lwtbl_dw29(struct seq_file *s, u8 *lwtbl)
3928+{
3929+ u32 *addr = 0;
3930+ u32 dw_value = 0;
3931+ u16 i = 0;
3932+
3933+ /* LMAC WTBL DW 29 */
3934+ seq_printf(s, "\t\n");
3935+ seq_printf(s, "LWTBL DW 29\n");
3936+ addr = (u32 *)&(lwtbl[WTBL_GROUP_MLO_INFO_LINE_2*4]);
3937+ dw_value = *addr;
3938+
3939+ while (WTBL_LMAC_DW29[i].name) {
3940+ if (WTBL_LMAC_DW29[i].shift == NO_SHIFT_DEFINE)
3941+ seq_printf(s, "\t%s:%d\n", WTBL_LMAC_DW29[i].name,
3942+ (dw_value & WTBL_LMAC_DW29[i].mask) ? 1 : 0);
3943+ else
3944+ seq_printf(s, "\t%s:%u\n", WTBL_LMAC_DW29[i].name,
3945+ (dw_value & WTBL_LMAC_DW29[i].mask) >>
3946+ WTBL_LMAC_DW29[i].shift);
3947+ i++;
3948+ }
3949+}
3950+
3951+static const struct berse_wtbl_parse WTBL_LMAC_DW30[] = {
3952+ {"DISPATCH_ORDER", WF_LWTBL_DISPATCH_ORDER_MASK, WF_LWTBL_DISPATCH_ORDER_SHIFT, false},
3953+ {"DISPATCH_RATIO", WF_LWTBL_DISPATCH_RATIO_MASK, WF_LWTBL_DISPATCH_RATIO_SHIFT, false},
3954+ {"LINK_MGF", WF_LWTBL_LINK_MGF_MASK, WF_LWTBL_LINK_MGF_SHIFT, true},
3955+ {NULL,}
3956+};
3957+
3958+static void parse_fmac_lwtbl_dw30(struct seq_file *s, u8 *lwtbl)
3959+{
3960+ u32 *addr = 0;
3961+ u32 dw_value = 0;
3962+ u16 i = 0;
3963+
3964+ /* LMAC WTBL DW 30 */
3965+ seq_printf(s, "\t\n");
3966+ seq_printf(s, "LWTBL DW 30\n");
3967+ addr = (u32 *)&(lwtbl[WTBL_GROUP_MLO_INFO_LINE_3*4]);
3968+ dw_value = *addr;
3969+
3970+
3971+ while (WTBL_LMAC_DW30[i].name) {
3972+ if (WTBL_LMAC_DW30[i].shift == NO_SHIFT_DEFINE)
3973+ seq_printf(s, "\t%s:%d\n", WTBL_LMAC_DW30[i].name,
3974+ (dw_value & WTBL_LMAC_DW30[i].mask) ? 1 : 0);
3975+ else
3976+ seq_printf(s, "\t%s:%u\n", WTBL_LMAC_DW30[i].name,
3977+ (dw_value & WTBL_LMAC_DW30[i].mask) >> WTBL_LMAC_DW30[i].shift);
3978+ i++;
3979+ }
3980+}
3981+
3982+static const struct berse_wtbl_parse WTBL_LMAC_DW31[] = {
3983+ {"NEGO_WINSIZE0", WF_LWTBL_NEGOTIATED_WINSIZE0_MASK, WF_LWTBL_NEGOTIATED_WINSIZE0_SHIFT, false},
3984+ {"WINSIZE1", WF_LWTBL_NEGOTIATED_WINSIZE1_MASK, WF_LWTBL_NEGOTIATED_WINSIZE1_SHIFT, false},
3985+ {"WINSIZE2", WF_LWTBL_NEGOTIATED_WINSIZE2_MASK, WF_LWTBL_NEGOTIATED_WINSIZE2_SHIFT, false},
3986+ {"WINSIZE3", WF_LWTBL_NEGOTIATED_WINSIZE3_MASK, WF_LWTBL_NEGOTIATED_WINSIZE3_SHIFT, true},
3987+ {"WINSIZE4", WF_LWTBL_NEGOTIATED_WINSIZE4_MASK, WF_LWTBL_NEGOTIATED_WINSIZE4_SHIFT, false},
3988+ {"WINSIZE5", WF_LWTBL_NEGOTIATED_WINSIZE5_MASK, WF_LWTBL_NEGOTIATED_WINSIZE5_SHIFT, false},
3989+ {"WINSIZE6", WF_LWTBL_NEGOTIATED_WINSIZE6_MASK, WF_LWTBL_NEGOTIATED_WINSIZE6_SHIFT, false},
3990+ {"WINSIZE7", WF_LWTBL_NEGOTIATED_WINSIZE7_MASK, WF_LWTBL_NEGOTIATED_WINSIZE7_SHIFT, true},
3991+ {"CASCAD", WF_LWTBL_CASCAD_MASK, NO_SHIFT_DEFINE, false},
3992+ {"ALL_ACK", WF_LWTBL_ALL_ACK_MASK, NO_SHIFT_DEFINE, false},
3993+ {"MPDU_SIZE", WF_LWTBL_MPDU_SIZE_MASK, WF_LWTBL_MPDU_SIZE_SHIFT, false},
3994+ {"BA_MODE", WF_LWTBL_BA_MODE_MASK, WF_LWTBL_BA_MODE_SHIFT, true},
3995+ {NULL,}
3996+};
3997+
3998+static void parse_fmac_lwtbl_dw31(struct seq_file *s, u8 *lwtbl)
3999+{
4000+ u32 *addr = 0;
4001+ u32 dw_value = 0;
4002+ u16 i = 0;
4003+
4004+ /* LMAC WTBL DW 31 */
4005+ seq_printf(s, "\t\n");
4006+ seq_printf(s, "LWTBL DW 31\n");
4007+ addr = (u32 *)&(lwtbl[WTBL_GROUP_RESP_INFO_DW_31*4]);
4008+ dw_value = *addr;
4009+
4010+ while (WTBL_LMAC_DW31[i].name) {
4011+ if (WTBL_LMAC_DW31[i].shift == NO_SHIFT_DEFINE)
4012+ seq_printf(s, "\t%s:%d\n", WTBL_LMAC_DW31[i].name,
4013+ (dw_value & WTBL_LMAC_DW31[i].mask) ? 1 : 0);
4014+ else
4015+ seq_printf(s, "\t%s:%u\n", WTBL_LMAC_DW31[i].name,
4016+ (dw_value & WTBL_LMAC_DW31[i].mask) >>
4017+ WTBL_LMAC_DW31[i].shift);
4018+ i++;
4019+ }
4020+}
4021+
4022+static const struct berse_wtbl_parse WTBL_LMAC_DW32[] = {
4023+ {"OM_INFO", WF_LWTBL_OM_INFO_MASK, WF_LWTBL_OM_INFO_SHIFT, false},
4024+ {"OM_RXD_DUP_MODE", WF_LWTBL_RXD_DUP_FOR_OM_CHG_MASK, NO_SHIFT_DEFINE, false},
4025+ {"RXD_DUP_WHITE_LIST", WF_LWTBL_RXD_DUP_WHITE_LIST_MASK, WF_LWTBL_RXD_DUP_WHITE_LIST_SHIFT, false},
4026+ {"RXD_DUP_MODE", WF_LWTBL_RXD_DUP_MODE_MASK, WF_LWTBL_RXD_DUP_MODE_SHIFT, false},
4027+ {"DROP", WF_LWTBL_DROP_MASK, NO_SHIFT_DEFINE, false},
4028+ {"ACK_EN", WF_LWTBL_ACK_EN_MASK, NO_SHIFT_DEFINE, true},
4029+ {NULL,}
4030+};
4031+
4032+static void parse_fmac_lwtbl_dw32(struct seq_file *s, u8 *lwtbl)
4033+{
4034+ u32 *addr = 0;
4035+ u32 dw_value = 0;
4036+ u16 i = 0;
4037+
4038+ /* LMAC WTBL DW 32 */
4039+ seq_printf(s, "\t\n");
4040+ seq_printf(s, "LWTBL DW 32\n");
4041+ addr = (u32 *)&(lwtbl[WTBL_GROUP_RX_DUP_INFO_DW_32*4]);
4042+ dw_value = *addr;
4043+
4044+ while (WTBL_LMAC_DW32[i].name) {
4045+ if (WTBL_LMAC_DW32[i].shift == NO_SHIFT_DEFINE)
4046+ seq_printf(s, "\t%s:%d\n", WTBL_LMAC_DW32[i].name,
4047+ (dw_value & WTBL_LMAC_DW32[i].mask) ? 1 : 0);
4048+ else
4049+ seq_printf(s, "\t%s:%u\n", WTBL_LMAC_DW32[i].name,
4050+ (dw_value & WTBL_LMAC_DW32[i].mask) >>
4051+ WTBL_LMAC_DW32[i].shift);
4052+ i++;
4053+ }
4054+}
4055+
4056+static const struct berse_wtbl_parse WTBL_LMAC_DW33[] = {
4057+ {"USER_RSSI", WF_LWTBL_USER_RSSI_MASK, WF_LWTBL_USER_RSSI_SHIFT, false},
4058+ {"USER_SNR", WF_LWTBL_USER_SNR_MASK, WF_LWTBL_USER_SNR_SHIFT, false},
4059+ {"RAPID_REACTION_RATE", WF_LWTBL_RAPID_REACTION_RATE_MASK, WF_LWTBL_RAPID_REACTION_RATE_SHIFT, true},
4060+ {"HT_AMSDU(Read Only)", WF_LWTBL_HT_AMSDU_MASK, NO_SHIFT_DEFINE, false},
4061+ {"AMSDU_CROSS_LG(Read Only)", WF_LWTBL_AMSDU_CROSS_LG_MASK, NO_SHIFT_DEFINE, true},
4062+ {NULL,}
4063+};
4064+
4065+static void parse_fmac_lwtbl_dw33(struct seq_file *s, u8 *lwtbl)
4066+{
4067+ u32 *addr = 0;
4068+ u32 dw_value = 0;
4069+ u16 i = 0;
4070+
4071+ /* LMAC WTBL DW 33 */
4072+ seq_printf(s, "\t\n");
4073+ seq_printf(s, "LWTBL DW 33\n");
4074+ addr = (u32 *)&(lwtbl[WTBL_GROUP_RX_STAT_CNT_LINE_1*4]);
4075+ dw_value = *addr;
4076+
4077+ while (WTBL_LMAC_DW33[i].name) {
4078+ if (WTBL_LMAC_DW33[i].shift == NO_SHIFT_DEFINE)
4079+ seq_printf(s, "\t%s:%d\n", WTBL_LMAC_DW33[i].name,
4080+ (dw_value & WTBL_LMAC_DW33[i].mask) ? 1 : 0);
4081+ else
4082+ seq_printf(s, "\t%s:%u\n", WTBL_LMAC_DW33[i].name,
4083+ (dw_value & WTBL_LMAC_DW33[i].mask) >>
4084+ WTBL_LMAC_DW33[i].shift);
4085+ i++;
4086+ }
4087+}
4088+
4089+static const struct berse_wtbl_parse WTBL_LMAC_DW34[] = {
4090+ {"RESP_RCPI0", WF_LWTBL_RESP_RCPI0_MASK, WF_LWTBL_RESP_RCPI0_SHIFT, false},
4091+ {"RCPI1", WF_LWTBL_RESP_RCPI1_MASK, WF_LWTBL_RESP_RCPI1_SHIFT, false},
4092+ {"RCPI2", WF_LWTBL_RESP_RCPI2_MASK, WF_LWTBL_RESP_RCPI2_SHIFT, false},
4093+ {"RCPI3", WF_LWTBL_RESP_RCPI3_MASK, WF_LWTBL_RESP_RCPI3_SHIFT, true},
4094+ {NULL,}
4095+};
4096+
4097+static void parse_fmac_lwtbl_dw34(struct seq_file *s, u8 *lwtbl)
4098+{
4099+ u32 *addr = 0;
4100+ u32 dw_value = 0;
4101+ u16 i = 0;
4102+
4103+ /* LMAC WTBL DW 34 */
4104+ seq_printf(s, "\t\n");
4105+ seq_printf(s, "LWTBL DW 34\n");
4106+ addr = (u32 *)&(lwtbl[WTBL_GROUP_RX_STAT_CNT_LINE_2*4]);
4107+ dw_value = *addr;
4108+
4109+
4110+ while (WTBL_LMAC_DW34[i].name) {
4111+ if (WTBL_LMAC_DW34[i].shift == NO_SHIFT_DEFINE)
4112+ seq_printf(s, "\t%s:%d\n", WTBL_LMAC_DW34[i].name,
4113+ (dw_value & WTBL_LMAC_DW34[i].mask) ? 1 : 0);
4114+ else
4115+ seq_printf(s, "\t%s:%u\n", WTBL_LMAC_DW34[i].name,
4116+ (dw_value & WTBL_LMAC_DW34[i].mask) >>
4117+ WTBL_LMAC_DW34[i].shift);
4118+ i++;
4119+ }
4120+}
4121+
4122+static const struct berse_wtbl_parse WTBL_LMAC_DW35[] = {
4123+ {"SNR 0", WF_LWTBL_SNR_RX0_MASK, WF_LWTBL_SNR_RX0_SHIFT, false},
4124+ {"SNR 1", WF_LWTBL_SNR_RX1_MASK, WF_LWTBL_SNR_RX1_SHIFT, false},
4125+ {"SNR 2", WF_LWTBL_SNR_RX2_MASK, WF_LWTBL_SNR_RX2_SHIFT, false},
4126+ {"SNR 3", WF_LWTBL_SNR_RX3_MASK, WF_LWTBL_SNR_RX3_SHIFT, true},
4127+ {NULL,}
4128+};
4129+
4130+static void parse_fmac_lwtbl_dw35(struct seq_file *s, u8 *lwtbl)
4131+{
4132+ u32 *addr = 0;
4133+ u32 dw_value = 0;
4134+ u16 i = 0;
4135+
4136+ /* LMAC WTBL DW 35 */
4137+ seq_printf(s, "\t\n");
4138+ seq_printf(s, "LWTBL DW 35\n");
4139+ addr = (u32 *)&(lwtbl[WTBL_GROUP_RX_STAT_CNT_LINE_3*4]);
4140+ dw_value = *addr;
4141+
4142+
4143+ while (WTBL_LMAC_DW35[i].name) {
4144+ if (WTBL_LMAC_DW35[i].shift == NO_SHIFT_DEFINE)
4145+ seq_printf(s, "\t%s:%d\n", WTBL_LMAC_DW35[i].name,
4146+ (dw_value & WTBL_LMAC_DW35[i].mask) ? 1 : 0);
4147+ else
4148+ seq_printf(s, "\t%s:%u\n", WTBL_LMAC_DW35[i].name,
4149+ (dw_value & WTBL_LMAC_DW35[i].mask) >>
4150+ WTBL_LMAC_DW35[i].shift);
4151+ i++;
4152+ }
4153+}
4154+
4155+static void parse_fmac_lwtbl_rx_stats(struct seq_file *s, u8 *lwtbl)
4156+{
4157+ parse_fmac_lwtbl_dw33(s, lwtbl);
4158+ parse_fmac_lwtbl_dw34(s, lwtbl);
4159+ parse_fmac_lwtbl_dw35(s, lwtbl);
4160+}
4161+
4162+static void parse_fmac_lwtbl_mlo_info(struct seq_file *s, u8 *lwtbl)
4163+{
4164+ parse_fmac_lwtbl_dw28(s, lwtbl);
4165+ parse_fmac_lwtbl_dw29(s, lwtbl);
4166+ parse_fmac_lwtbl_dw30(s, lwtbl);
4167+}
4168+
4169+static const struct berse_wtbl_parse WTBL_UMAC_DW9[] = {
4170+ {"RELATED_IDX0", WF_UWTBL_RELATED_IDX0_MASK, WF_UWTBL_RELATED_IDX0_SHIFT, false},
4171+ {"RELATED_BAND0", WF_UWTBL_RELATED_BAND0_MASK, WF_UWTBL_RELATED_BAND0_SHIFT, false},
4172+ {"PRI_MLD_BAND", WF_UWTBL_PRIMARY_MLD_BAND_MASK, WF_UWTBL_PRIMARY_MLD_BAND_SHIFT, true},
4173+ {"RELATED_IDX0", WF_UWTBL_RELATED_IDX1_MASK, WF_UWTBL_RELATED_IDX1_SHIFT, false},
4174+ {"RELATED_BAND1", WF_UWTBL_RELATED_BAND1_MASK, WF_UWTBL_RELATED_BAND1_SHIFT, false},
4175+ {"SEC_MLD_BAND", WF_UWTBL_SECONDARY_MLD_BAND_MASK, WF_UWTBL_SECONDARY_MLD_BAND_SHIFT, true},
4176+ {NULL,}
4177+};
4178+
4179+static void parse_fmac_uwtbl_mlo_info(struct seq_file *s, u8 *uwtbl)
4180+{
4181+ u32 *addr = 0;
4182+ u32 dw_value = 0;
4183+ u16 i = 0;
4184+
4185+ seq_printf(s, "\t\n");
4186+ seq_printf(s, "MldAddr: %02x:%02x:%02x:%02x:%02x:%02x(D0[B0~15], D1[B0~31])\n",
4187+ uwtbl[4], uwtbl[5], uwtbl[6], uwtbl[7], uwtbl[0], uwtbl[1]);
4188+
4189+ /* UMAC WTBL DW 0 */
4190+ seq_printf(s, "\t\n");
4191+ seq_printf(s, "UWTBL DW 0\n");
4192+ addr = (u32 *)&(uwtbl[WF_UWTBL_OWN_MLD_ID_DW*4]);
4193+ dw_value = *addr;
4194+
4195+ seq_printf(s, "\t%s:%u\n", "OMLD_ID",
4196+ (dw_value & WF_UWTBL_OWN_MLD_ID_MASK) >> WF_UWTBL_OWN_MLD_ID_SHIFT);
4197+
4198+ /* UMAC WTBL DW 9 */
4199+ seq_printf(s, "\t\n");
4200+ seq_printf(s, "UWTBL DW 9\n");
4201+ addr = (u32 *)&(uwtbl[WF_UWTBL_RELATED_IDX0_DW*4]);
4202+ dw_value = *addr;
4203+
4204+ while (WTBL_UMAC_DW9[i].name) {
4205+
4206+ if (WTBL_UMAC_DW9[i].shift == NO_SHIFT_DEFINE)
4207+ seq_printf(s, "\t%s:%d\n", WTBL_UMAC_DW9[i].name,
4208+ (dw_value & WTBL_UMAC_DW9[i].mask) ? 1 : 0);
4209+ else
4210+ seq_printf(s, "\t%s:%u\n", WTBL_UMAC_DW9[i].name,
4211+ (dw_value & WTBL_UMAC_DW9[i].mask) >>
4212+ WTBL_UMAC_DW9[i].shift);
4213+ i++;
4214+ }
4215+}
4216+
4217+static bool
4218+is_wtbl_bigtk_exist(u8 *lwtbl)
4219+{
4220+ u32 *addr = 0;
4221+ u32 dw_value = 0;
4222+
4223+ addr = (u32 *)&(lwtbl[WF_LWTBL_MUAR_DW*4]);
4224+ dw_value = *addr;
4225+ if (((dw_value & WF_LWTBL_MUAR_MASK) >> WF_LWTBL_MUAR_SHIFT) ==
4226+ MUAR_INDEX_OWN_MAC_ADDR_BC_MC) {
4227+ addr = (u32 *)&(lwtbl[WF_LWTBL_CIPHER_SUIT_BIGTK_DW*4]);
4228+ dw_value = *addr;
4229+ if (((dw_value & WF_LWTBL_CIPHER_SUIT_BIGTK_MASK) >>
4230+ WF_LWTBL_CIPHER_SUIT_BIGTK_SHIFT) != IGTK_CIPHER_SUIT_NONE)
4231+ return true;
4232+ }
4233+
4234+ return false;
4235+}
4236+
4237+static const struct berse_wtbl_parse WTBL_UMAC_DW2[] = {
4238+ {"PN0", WTBL_PN0_MASK, WTBL_PN0_OFFSET, false},
4239+ {"PN1", WTBL_PN1_MASK, WTBL_PN1_OFFSET, false},
4240+ {"PN2", WTBL_PN2_MASK, WTBL_PN2_OFFSET, true},
4241+ {"PN3", WTBL_PN3_MASK, WTBL_PN3_OFFSET, false},
4242+ {NULL,}
4243+};
4244+
4245+static const struct berse_wtbl_parse WTBL_UMAC_DW3[] = {
4246+ {"PN4", WTBL_PN4_MASK, WTBL_PN4_OFFSET, false},
4247+ {"PN5", WTBL_PN5_MASK, WTBL_PN5_OFFSET, true},
4248+ {NULL,}
4249+};
4250+
4251+static const struct berse_wtbl_parse WTBL_UMAC_DW4_BIPN[] = {
4252+ {"BIPN0", WTBL_BIPN0_MASK, WTBL_BIPN0_OFFSET, false},
4253+ {"BIPN1", WTBL_BIPN1_MASK, WTBL_BIPN1_OFFSET, false},
4254+ {"BIPN2", WTBL_BIPN2_MASK, WTBL_BIPN2_OFFSET, true},
4255+ {"BIPN3", WTBL_BIPN3_MASK, WTBL_BIPN3_OFFSET, false},
4256+ {NULL,}
4257+};
4258+
4259+static const struct berse_wtbl_parse WTBL_UMAC_DW5_BIPN[] = {
4260+ {"BIPN4", WTBL_BIPN0_MASK, WTBL_BIPN0_OFFSET, false},
4261+ {"BIPN5", WTBL_BIPN1_MASK, WTBL_BIPN1_OFFSET, true},
4262+ {NULL,}
4263+};
4264+
4265+static void parse_fmac_uwtbl_pn(struct seq_file *s, u8 *uwtbl, u8 *lwtbl)
4266+{
4267+ u32 *addr = 0;
4268+ u32 dw_value = 0;
4269+ u16 i = 0;
4270+
4271+ seq_printf(s, "\t\n");
4272+ seq_printf(s, "UWTBL PN\n");
4273+
4274+ /* UMAC WTBL DW 2/3 */
4275+ addr = (u32 *)&(uwtbl[WF_UWTBL_PN_31_0__DW*4]);
4276+ dw_value = *addr;
4277+
4278+ while (WTBL_UMAC_DW2[i].name) {
4279+ seq_printf(s, "\t%s:%u\n", WTBL_UMAC_DW2[i].name,
4280+ (dw_value & WTBL_UMAC_DW2[i].mask) >>
4281+ WTBL_UMAC_DW2[i].shift);
4282+ i++;
4283+ }
4284+
4285+ i = 0;
4286+ addr = (u32 *)&(uwtbl[WF_UWTBL_PN_47_32__DW*4]);
4287+ dw_value = *addr;
4288+
4289+ while (WTBL_UMAC_DW3[i].name) {
4290+ seq_printf(s, "\t%s:%u\n", WTBL_UMAC_DW3[i].name,
4291+ (dw_value & WTBL_UMAC_DW3[i].mask) >>
4292+ WTBL_UMAC_DW3[i].shift);
4293+ i++;
4294+ }
4295+
4296+
4297+ /* UMAC WTBL DW 4/5 for BIGTK */
4298+ if (is_wtbl_bigtk_exist(lwtbl) == true) {
4299+ i = 0;
4300+ addr = (u32 *)&(uwtbl[WF_UWTBL_RX_BIPN_31_0__DW*4]);
4301+ dw_value = *addr;
4302+
4303+ while (WTBL_UMAC_DW4_BIPN[i].name) {
4304+ seq_printf(s, "\t%s:%u\n", WTBL_UMAC_DW4_BIPN[i].name,
4305+ (dw_value & WTBL_UMAC_DW4_BIPN[i].mask) >>
4306+ WTBL_UMAC_DW4_BIPN[i].shift);
4307+ i++;
4308+ }
4309+
4310+ i = 0;
4311+ addr = (u32 *)&(uwtbl[WF_UWTBL_RX_BIPN_47_32__DW*4]);
4312+ dw_value = *addr;
4313+
4314+ while (WTBL_UMAC_DW5_BIPN[i].name) {
4315+ seq_printf(s, "\t%s:%u\n", WTBL_UMAC_DW5_BIPN[i].name,
4316+ (dw_value & WTBL_UMAC_DW5_BIPN[i].mask) >>
4317+ WTBL_UMAC_DW5_BIPN[i].shift);
4318+ i++;
4319+ }
4320+ }
4321+}
4322+
4323+static void parse_fmac_uwtbl_sn(struct seq_file *s, u8 *uwtbl)
4324+{
4325+ u32 *addr = 0;
4326+ u32 u2SN = 0;
4327+
4328+ /* UMAC WTBL DW SN part */
4329+ seq_printf(s, "\t\n");
4330+ seq_printf(s, "UWTBL SN\n");
4331+
4332+ addr = (u32 *)&(uwtbl[WF_UWTBL_TID0_SN_DW*4]);
4333+ u2SN = ((*addr) & WF_UWTBL_TID0_SN_MASK) >> WF_UWTBL_TID0_SN_SHIFT;
4334+ seq_printf(s, "\t%s:%u\n", "TID0_AC0_SN", u2SN);
4335+
4336+ addr = (u32 *)&(uwtbl[WF_UWTBL_TID1_SN_DW*4]);
4337+ u2SN = ((*addr) & WF_UWTBL_TID1_SN_MASK) >> WF_UWTBL_TID1_SN_SHIFT;
4338+ seq_printf(s, "\t%s:%u\n", "TID1_AC1_SN", u2SN);
4339+
4340+ addr = (u32 *)&(uwtbl[WF_UWTBL_TID2_SN_7_0__DW*4]);
4341+ u2SN = ((*addr) & WF_UWTBL_TID2_SN_7_0__MASK) >>
4342+ WF_UWTBL_TID2_SN_7_0__SHIFT;
4343+ addr = (u32 *)&(uwtbl[WF_UWTBL_TID2_SN_11_8__DW*4]);
4344+ u2SN |= (((*addr) & WF_UWTBL_TID2_SN_11_8__MASK) >>
4345+ WF_UWTBL_TID2_SN_11_8__SHIFT) << 8;
4346+ seq_printf(s, "\t%s:%u\n", "TID2_AC2_SN", u2SN);
4347+
4348+ addr = (u32 *)&(uwtbl[WF_UWTBL_TID3_SN_DW*4]);
4349+ u2SN = ((*addr) & WF_UWTBL_TID3_SN_MASK) >> WF_UWTBL_TID3_SN_SHIFT;
4350+ seq_printf(s, "\t%s:%u\n", "TID3_AC3_SN", u2SN);
4351+
4352+ addr = (u32 *)&(uwtbl[WF_UWTBL_TID4_SN_DW*4]);
4353+ u2SN = ((*addr) & WF_UWTBL_TID4_SN_MASK) >> WF_UWTBL_TID4_SN_SHIFT;
4354+ seq_printf(s, "\t%s:%u\n", "TID4_SN", u2SN);
4355+
4356+ addr = (u32 *)&(uwtbl[WF_UWTBL_TID5_SN_3_0__DW*4]);
4357+ u2SN = ((*addr) & WF_UWTBL_TID5_SN_3_0__MASK) >>
4358+ WF_UWTBL_TID5_SN_3_0__SHIFT;
4359+ addr = (u32 *)&(uwtbl[WF_UWTBL_TID5_SN_11_4__DW*4]);
4360+ u2SN |= (((*addr) & WF_UWTBL_TID5_SN_11_4__MASK) >>
4361+ WF_UWTBL_TID5_SN_11_4__SHIFT) << 4;
4362+ seq_printf(s, "\t%s:%u\n", "TID5_SN", u2SN);
4363+
4364+ addr = (u32 *)&(uwtbl[WF_UWTBL_TID6_SN_DW*4]);
4365+ u2SN = ((*addr) & WF_UWTBL_TID6_SN_MASK) >> WF_UWTBL_TID6_SN_SHIFT;
4366+ seq_printf(s, "\t%s:%u\n", "TID6_SN", u2SN);
4367+
4368+ addr = (u32 *)&(uwtbl[WF_UWTBL_TID7_SN_DW*4]);
4369+ u2SN = ((*addr) & WF_UWTBL_TID7_SN_MASK) >> WF_UWTBL_TID7_SN_SHIFT;
4370+ seq_printf(s, "\t%s:%u\n", "TID7_SN", u2SN);
4371+
4372+ addr = (u32 *)&(uwtbl[WF_UWTBL_COM_SN_DW*4]);
4373+ u2SN = ((*addr) & WF_UWTBL_COM_SN_MASK) >> WF_UWTBL_COM_SN_SHIFT;
4374+ seq_printf(s, "\t%s:%u\n", "COM_SN", u2SN);
4375+}
4376+
4377+static void dump_key_table(
4378+ struct seq_file *s,
4379+ uint16_t keyloc0,
4380+ uint16_t keyloc1,
4381+ uint16_t keyloc2
4382+)
4383+{
4384+#define ONE_KEY_ENTRY_LEN_IN_DW 8
4385+ struct mt7996_dev *dev = dev_get_drvdata(s->private);
4386+ u8 keytbl[ONE_KEY_ENTRY_LEN_IN_DW*4] = {0};
4387+ uint16_t x;
4388+
4389+ seq_printf(s, "\t\n");
4390+ seq_printf(s, "\t%s:%d\n", "keyloc0", keyloc0);
4391+ if (keyloc0 != INVALID_KEY_ENTRY) {
4392+
4393+ /* Don't swap below two lines, halWtblReadRaw will
4394+ * write new value WF_WTBLON_TOP_WDUCR_ADDR
4395+ */
4396+ mt7996_wtbl_read_raw(dev, keyloc0,
4397+ WTBL_TYPE_KEY, 0, ONE_KEY_ENTRY_LEN_IN_DW, keytbl);
4398+ seq_printf(s, "\t\tKEY WTBL Addr: group:0x%x=0x%x addr: 0x%lx\n",
4399+ MT_DBG_UWTBL_TOP_WDUCR_ADDR,
4400+ mt76_rr(dev, MT_DBG_UWTBL_TOP_WDUCR_ADDR),
4401+ KEYTBL_IDX2BASE(keyloc0, 0));
4402+ for (x = 0; x < ONE_KEY_ENTRY_LEN_IN_DW; x++) {
4403+ seq_printf(s, "\t\tDW%02d: %02x %02x %02x %02x\n",
4404+ x,
4405+ keytbl[x * 4 + 3],
4406+ keytbl[x * 4 + 2],
4407+ keytbl[x * 4 + 1],
4408+ keytbl[x * 4]);
4409+ }
4410+ }
4411+
4412+ seq_printf(s, "\t%s:%d\n", "keyloc1", keyloc1);
4413+ if (keyloc1 != INVALID_KEY_ENTRY) {
4414+ /* Don't swap below two lines, halWtblReadRaw will
4415+ * write new value WF_WTBLON_TOP_WDUCR_ADDR
4416+ */
4417+ mt7996_wtbl_read_raw(dev, keyloc1,
4418+ WTBL_TYPE_KEY, 0, ONE_KEY_ENTRY_LEN_IN_DW, keytbl);
4419+ seq_printf(s, "\t\tKEY WTBL Addr: group:0x%x=0x%x addr: 0x%lx\n",
4420+ MT_DBG_UWTBL_TOP_WDUCR_ADDR,
4421+ mt76_rr(dev, MT_DBG_UWTBL_TOP_WDUCR_ADDR),
4422+ KEYTBL_IDX2BASE(keyloc1, 0));
4423+ for (x = 0; x < ONE_KEY_ENTRY_LEN_IN_DW; x++) {
4424+ seq_printf(s, "\t\tDW%02d: %02x %02x %02x %02x\n",
4425+ x,
4426+ keytbl[x * 4 + 3],
4427+ keytbl[x * 4 + 2],
4428+ keytbl[x * 4 + 1],
4429+ keytbl[x * 4]);
4430+ }
4431+ }
4432+
4433+ seq_printf(s, "\t%s:%d\n", "keyloc2", keyloc2);
4434+ if (keyloc2 != INVALID_KEY_ENTRY) {
4435+ /* Don't swap below two lines, halWtblReadRaw will
4436+ * write new value WF_WTBLON_TOP_WDUCR_ADDR
4437+ */
4438+ mt7996_wtbl_read_raw(dev, keyloc2,
4439+ WTBL_TYPE_KEY, 0, ONE_KEY_ENTRY_LEN_IN_DW, keytbl);
4440+ seq_printf(s, "\t\tKEY WTBL Addr: group:0x%x=0x%x addr: 0x%lx\n",
4441+ MT_DBG_UWTBL_TOP_WDUCR_ADDR,
4442+ mt76_rr(dev, MT_DBG_UWTBL_TOP_WDUCR_ADDR),
4443+ KEYTBL_IDX2BASE(keyloc2, 0));
4444+ for (x = 0; x < ONE_KEY_ENTRY_LEN_IN_DW; x++) {
4445+ seq_printf(s, "\t\tDW%02d: %02x %02x %02x %02x\n",
4446+ x,
4447+ keytbl[x * 4 + 3],
4448+ keytbl[x * 4 + 2],
4449+ keytbl[x * 4 + 1],
4450+ keytbl[x * 4]);
4451+ }
4452+ }
4453+}
4454+
4455+static void parse_fmac_uwtbl_key_info(struct seq_file *s, u8 *uwtbl, u8 *lwtbl)
4456+{
4457+ u32 *addr = 0;
4458+ u32 dw_value = 0;
4459+ uint16_t keyloc0 = INVALID_KEY_ENTRY;
4460+ uint16_t keyloc1 = INVALID_KEY_ENTRY;
4461+ uint16_t keyloc2 = INVALID_KEY_ENTRY;
4462+
4463+ /* UMAC WTBL DW 7 */
4464+ seq_printf(s, "\t\n");
4465+ seq_printf(s, "UWTBL key info\n");
4466+
4467+ addr = (u32 *)&(uwtbl[WF_UWTBL_KEY_LOC0_DW*4]);
4468+ dw_value = *addr;
4469+ keyloc0 = (dw_value & WF_UWTBL_KEY_LOC0_MASK) >> WF_UWTBL_KEY_LOC0_SHIFT;
4470+ keyloc1 = (dw_value & WF_UWTBL_KEY_LOC1_MASK) >> WF_UWTBL_KEY_LOC1_SHIFT;
4471+
4472+ seq_printf(s, "\t%s:%u/%u\n", "Key Loc 0/1", keyloc0, keyloc1);
4473+
4474+ /* UMAC WTBL DW 6 for BIGTK */
4475+ if (is_wtbl_bigtk_exist(lwtbl) == true) {
4476+ keyloc2 = (dw_value & WF_UWTBL_KEY_LOC2_MASK) >>
4477+ WF_UWTBL_KEY_LOC2_SHIFT;
4478+ seq_printf(s, "\t%s:%u\n", "Key Loc 2", keyloc2);
4479+ }
4480+
4481+ /* Parse KEY link */
4482+ dump_key_table(s, keyloc0, keyloc1, keyloc2);
4483+}
4484+
4485+static const struct berse_wtbl_parse WTBL_UMAC_DW8[] = {
4486+ {"UWTBL_WMM_Q", WF_UWTBL_WMM_Q_MASK, WF_UWTBL_WMM_Q_SHIFT, false},
4487+ {"UWTBL_QOS", WF_UWTBL_QOS_MASK, NO_SHIFT_DEFINE, false},
4488+ {"UWTBL_HT_VHT_HE", WF_UWTBL_HT_MASK, NO_SHIFT_DEFINE, false},
4489+ {"UWTBL_HDRT_MODE", WF_UWTBL_HDRT_MODE_MASK, NO_SHIFT_DEFINE, true},
4490+ {NULL,}
4491+};
4492+
4493+static void parse_fmac_uwtbl_msdu_info(struct seq_file *s, u8 *uwtbl)
4494+{
4495+ u32 *addr = 0;
4496+ u32 dw_value = 0;
4497+ u32 amsdu_len = 0;
4498+ u16 i = 0;
4499+
4500+ /* UMAC WTBL DW 8 */
4501+ seq_printf(s, "\t\n");
4502+ seq_printf(s, "UWTBL DW8\n");
4503+
4504+ addr = (u32 *)&(uwtbl[WF_UWTBL_AMSDU_CFG_DW*4]);
4505+ dw_value = *addr;
4506+
4507+ while (WTBL_UMAC_DW8[i].name) {
4508+
4509+ if (WTBL_UMAC_DW8[i].shift == NO_SHIFT_DEFINE)
4510+ seq_printf(s, "\t%s:%d\n", WTBL_UMAC_DW8[i].name,
4511+ (dw_value & WTBL_UMAC_DW8[i].mask) ? 1 : 0);
4512+ else
4513+ seq_printf(s, "\t%s:%u\n", WTBL_UMAC_DW8[i].name,
4514+ (dw_value & WTBL_UMAC_DW8[i].mask) >>
4515+ WTBL_UMAC_DW8[i].shift);
4516+ i++;
4517+ }
4518+
4519+ /* UMAC WTBL DW 8 - AMSDU_CFG */
4520+ seq_printf(s, "\t%s:%d\n", "HW AMSDU Enable",
4521+ (dw_value & WTBL_AMSDU_EN_MASK) ? 1 : 0);
4522+
4523+ amsdu_len = (dw_value & WTBL_AMSDU_LEN_MASK) >> WTBL_AMSDU_LEN_OFFSET;
4524+ if (amsdu_len == 0)
4525+ seq_printf(s, "\t%s:invalid (WTBL value=0x%x)\n", "HW AMSDU Len",
4526+ amsdu_len);
4527+ else if (amsdu_len == 1)
4528+ seq_printf(s, "\t%s:%d~%d (WTBL value=0x%x)\n", "HW AMSDU Len",
4529+ 1,
4530+ 255,
4531+ amsdu_len);
4532+ else if (amsdu_len == 2)
4533+ seq_printf(s, "\t%s:%d~%d (WTBL value=0x%x)\n", "HW AMSDU Len",
4534+ 256,
4535+ 511,
4536+ amsdu_len);
4537+ else if (amsdu_len == 3)
4538+ seq_printf(s, "\t%s:%d~%d (WTBL value=0x%x)\n", "HW AMSDU Len",
4539+ 512,
4540+ 767,
4541+ amsdu_len);
4542+ else
4543+ seq_printf(s, "\t%s:%d~%d (WTBL value=0x%x)\n", "HW AMSDU Len",
4544+ 256 * (amsdu_len - 1),
4545+ 256 * (amsdu_len - 1) + 255,
4546+ amsdu_len);
4547+
4548+ seq_printf(s, "\t%s:%lu (WTBL value=0x%lx)\n", "HW AMSDU Num",
4549+ ((dw_value & WTBL_AMSDU_NUM_MASK) >> WTBL_AMSDU_NUM_OFFSET) + 1,
4550+ (dw_value & WTBL_AMSDU_NUM_MASK) >> WTBL_AMSDU_NUM_OFFSET);
4551+}
4552+
4553+static int mt7996_wtbl_read(struct seq_file *s, void *data)
4554+{
4555+ struct mt7996_dev *dev = dev_get_drvdata(s->private);
4556+ u8 lwtbl[LWTBL_LEN_IN_DW * 4] = {0};
4557+ u8 uwtbl[UWTBL_LEN_IN_DW * 4] = {0};
4558+ int x;
4559+
4560+ mt7996_wtbl_read_raw(dev, dev->wlan_idx, WTBL_TYPE_LMAC, 0,
4561+ LWTBL_LEN_IN_DW, lwtbl);
4562+ seq_printf(s, "Dump WTBL info of WLAN_IDX:%d\n", dev->wlan_idx);
4563+ seq_printf(s, "LMAC WTBL Addr: group:0x%x=0x%x addr: 0x%lx\n",
4564+ MT_DBG_WTBLON_TOP_WDUCR_ADDR,
4565+ mt76_rr(dev, MT_DBG_WTBLON_TOP_WDUCR_ADDR),
4566+ LWTBL_IDX2BASE(dev->wlan_idx, 0));
4567+ for (x = 0; x < LWTBL_LEN_IN_DW; x++) {
4568+ seq_printf(s, "DW%02d: %02x %02x %02x %02x\n",
4569+ x,
4570+ lwtbl[x * 4 + 3],
4571+ lwtbl[x * 4 + 2],
4572+ lwtbl[x * 4 + 1],
4573+ lwtbl[x * 4]);
4574+ }
4575+
4576+ /* Parse LWTBL */
4577+ parse_fmac_lwtbl_dw0_1(s, lwtbl);
4578+ parse_fmac_lwtbl_dw2(s, lwtbl);
4579+ parse_fmac_lwtbl_dw3(s, lwtbl);
4580+ parse_fmac_lwtbl_dw4(s, lwtbl);
4581+ parse_fmac_lwtbl_dw5(s, lwtbl);
4582+ parse_fmac_lwtbl_dw6(s, lwtbl);
4583+ parse_fmac_lwtbl_dw7(s, lwtbl);
4584+ parse_fmac_lwtbl_dw8(s, lwtbl);
4585+ parse_fmac_lwtbl_dw9(s, lwtbl);
4586+ parse_fmac_lwtbl_dw10(s, lwtbl);
4587+ parse_fmac_lwtbl_dw11(s, lwtbl);
4588+ parse_fmac_lwtbl_dw12(s, lwtbl);
4589+ parse_fmac_lwtbl_dw13(s, lwtbl);
4590+ parse_fmac_lwtbl_dw14(s, lwtbl);
4591+ parse_fmac_lwtbl_mlo_info(s, lwtbl);
4592+ parse_fmac_lwtbl_dw31(s, lwtbl);
4593+ parse_fmac_lwtbl_dw32(s, lwtbl);
4594+ parse_fmac_lwtbl_rx_stats(s, lwtbl);
4595+
4596+ mt7996_wtbl_read_raw(dev, dev->wlan_idx, WTBL_TYPE_UMAC, 0,
4597+ UWTBL_LEN_IN_DW, uwtbl);
4598+ seq_printf(s, "Dump WTBL info of WLAN_IDX:%d\n", dev->wlan_idx);
4599+ seq_printf(s, "UMAC WTBL Addr: group:0x%x=0x%x addr: 0x%lx\n",
4600+ MT_DBG_UWTBL_TOP_WDUCR_ADDR,
4601+ mt76_rr(dev, MT_DBG_UWTBL_TOP_WDUCR_ADDR),
4602+ UWTBL_IDX2BASE(dev->wlan_idx, 0));
4603+ for (x = 0; x < UWTBL_LEN_IN_DW; x++) {
4604+ seq_printf(s, "DW%02d: %02x %02x %02x %02x\n",
4605+ x,
4606+ uwtbl[x * 4 + 3],
4607+ uwtbl[x * 4 + 2],
4608+ uwtbl[x * 4 + 1],
4609+ uwtbl[x * 4]);
4610+ }
4611+
4612+ /* Parse UWTBL */
4613+ parse_fmac_uwtbl_mlo_info(s, uwtbl);
4614+ parse_fmac_uwtbl_pn(s, uwtbl, lwtbl);
4615+ parse_fmac_uwtbl_sn(s, uwtbl);
4616+ parse_fmac_uwtbl_key_info(s, uwtbl, lwtbl);
4617+ parse_fmac_uwtbl_msdu_info(s, uwtbl);
4618+
4619+ return 0;
4620+}
4621+
4622+static int mt7996_sta_info(struct seq_file *s, void *data)
4623+{
4624+ struct mt7996_dev *dev = dev_get_drvdata(s->private);
4625+ u8 lwtbl[LWTBL_LEN_IN_DW*4] = {0};
4626+ u16 i = 0;
4627+
4628+ for (i=0; i < mt7996_wtbl_size(dev); i++) {
4629+ mt7996_wtbl_read_raw(dev, i, WTBL_TYPE_LMAC, 0,
4630+ LWTBL_LEN_IN_DW, lwtbl);
4631+
4632+ if (lwtbl[4] || lwtbl[5] || lwtbl[6] || lwtbl[7] || lwtbl[0] || lwtbl[1]) {
4633+ u32 *addr = (u32 *)&(lwtbl[WTBL_GROUP_TRX_CAP_DW_2*4]);
4634+ u32 dw_value = *addr;
4635+
4636+ seq_printf(s, "wcid:%d\tAddr: %02x:%02x:%02x:%02x:%02x:%02x",
4637+ i, lwtbl[4], lwtbl[5], lwtbl[6], lwtbl[7], lwtbl[0], lwtbl[1]);
4638+ seq_printf(s, "\t%s:%u\n", WTBL_LMAC_DW2[0].name,
4639+ (dw_value & WTBL_LMAC_DW2[0].mask) >> WTBL_LMAC_DW2[0].shift);
4640+ }
4641+ }
4642+
4643+ return 0;
4644+}
4645+
4646+int mt7996_mtk_init_debugfs(struct mt7996_phy *phy, struct dentry *dir)
4647+{
4648+ struct mt7996_dev *dev = phy->dev;
4649+
4650+ mt7996_mcu_fw_log_2_host(dev, MCU_FW_LOG_WM, 0);
4651+
4652+ /* agg */
4653+ debugfs_create_devm_seqfile(dev->mt76.dev, "agg_info0", dir,
4654+ mt7996_agginfo_read_band0);
4655+ debugfs_create_devm_seqfile(dev->mt76.dev, "agg_info1", dir,
4656+ mt7996_agginfo_read_band1);
4657+ debugfs_create_devm_seqfile(dev->mt76.dev, "agg_info2", dir,
4658+ mt7996_agginfo_read_band2);
4659+ /* amsdu */
4660+ debugfs_create_devm_seqfile(dev->mt76.dev, "amsdu_info", dir,
4661+ mt7996_amsdu_result_read);
4662+
4663+ debugfs_create_file("fw_debug_module", 0600, dir, dev,
4664+ &fops_fw_debug_module);
4665+ debugfs_create_file("fw_debug_level", 0600, dir, dev,
4666+ &fops_fw_debug_level);
4667+ debugfs_create_file("fw_wa_query", 0600, dir, dev, &fops_wa_query);
4668+ debugfs_create_file("fw_wa_set", 0600, dir, dev, &fops_wa_set);
4669+ debugfs_create_devm_seqfile(dev->mt76.dev, "fw_version", dir,
4670+ mt7996_dump_version);
4671+
4672+ debugfs_create_devm_seqfile(dev->mt76.dev, "mib_info0", dir,
4673+ mt7996_mibinfo_band0);
4674+ debugfs_create_devm_seqfile(dev->mt76.dev, "mib_info1", dir,
4675+ mt7996_mibinfo_band1);
4676+ debugfs_create_devm_seqfile(dev->mt76.dev, "mib_info2", dir,
4677+ mt7996_mibinfo_band2);
4678+
4679+ debugfs_create_devm_seqfile(dev->mt76.dev, "sta_info", dir,
4680+ mt7996_sta_info);
4681+
4682+ debugfs_create_devm_seqfile(dev->mt76.dev, "tr_info", dir,
4683+ mt7996_trinfo_read);
4684+
4685+ debugfs_create_devm_seqfile(dev->mt76.dev, "wtbl_info", dir,
4686+ mt7996_wtbl_read);
4687+
4688+ return 0;
4689+}
4690+
4691+#endif
4692diff --git a/mt7996/mtk_mcu.c b/mt7996/mtk_mcu.c
4693new file mode 100644
developerde9ecce2023-05-22 11:17:16 +08004694index 00000000..e8870166
developer1bc2ce22023-03-25 00:47:41 +08004695--- /dev/null
4696+++ b/mt7996/mtk_mcu.c
4697@@ -0,0 +1,18 @@
4698+// SPDX-License-Identifier: ISC
4699+/*
4700+ * Copyright (C) 2023 MediaTek Inc.
4701+ */
4702+
4703+#include <linux/firmware.h>
4704+#include <linux/fs.h>
4705+#include "mt7996.h"
4706+#include "mcu.h"
4707+#include "mac.h"
4708+#include "mtk_mcu.h"
4709+
4710+#ifdef CONFIG_MTK_DEBUG
4711+
4712+
4713+
4714+
4715+#endif
4716diff --git a/mt7996/mtk_mcu.h b/mt7996/mtk_mcu.h
4717new file mode 100644
developerde9ecce2023-05-22 11:17:16 +08004718index 00000000..e741aa27
developer1bc2ce22023-03-25 00:47:41 +08004719--- /dev/null
4720+++ b/mt7996/mtk_mcu.h
4721@@ -0,0 +1,16 @@
4722+/* SPDX-License-Identifier: ISC */
4723+/*
4724+ * Copyright (C) 2023 MediaTek Inc.
4725+ */
4726+
4727+#ifndef __MT7996_MTK_MCU_H
4728+#define __MT7996_MTK_MCU_H
4729+
4730+#include "../mt76_connac_mcu.h"
4731+
4732+#ifdef CONFIG_MTK_DEBUG
4733+
4734+
4735+#endif
4736+
4737+#endif
4738diff --git a/tools/fwlog.c b/tools/fwlog.c
developerde9ecce2023-05-22 11:17:16 +08004739index e5d4a105..3c6a61d7 100644
developer1bc2ce22023-03-25 00:47:41 +08004740--- a/tools/fwlog.c
4741+++ b/tools/fwlog.c
4742@@ -26,7 +26,7 @@ static const char *debugfs_path(const char *phyname, const char *file)
4743 return path;
4744 }
4745
4746-static int mt76_set_fwlog_en(const char *phyname, bool en)
4747+static int mt76_set_fwlog_en(const char *phyname, bool en, char *val)
4748 {
4749 FILE *f = fopen(debugfs_path(phyname, "fw_debug_bin"), "w");
4750
4751@@ -35,7 +35,13 @@ static int mt76_set_fwlog_en(const char *phyname, bool en)
4752 return 1;
4753 }
4754
4755- fprintf(f, "7");
4756+ if (en && val)
4757+ fprintf(f, "%s", val);
4758+ else if (en)
4759+ fprintf(f, "7");
4760+ else
4761+ fprintf(f, "0");
4762+
4763 fclose(f);
4764
4765 return 0;
4766@@ -76,6 +82,7 @@ static void handle_signal(int sig)
4767
4768 int mt76_fwlog(const char *phyname, int argc, char **argv)
4769 {
4770+#define BUF_SIZE 1504
4771 struct sockaddr_in local = {
4772 .sin_family = AF_INET,
4773 .sin_addr.s_addr = INADDR_ANY,
4774@@ -84,9 +91,9 @@ int mt76_fwlog(const char *phyname, int argc, char **argv)
4775 .sin_family = AF_INET,
4776 .sin_port = htons(55688),
4777 };
4778- char buf[1504];
4779+ char *buf = calloc(BUF_SIZE, sizeof(char));
4780 int ret = 0;
4781- int yes = 1;
4782+ /* int yes = 1; */
4783 int s, fd;
4784
4785 if (argc < 1) {
4786@@ -105,13 +112,13 @@ int mt76_fwlog(const char *phyname, int argc, char **argv)
4787 return 1;
4788 }
4789
4790- setsockopt(s, SOL_SOCKET, SO_BROADCAST, &yes, sizeof(yes));
4791+ /* setsockopt(s, SOL_SOCKET, SO_BROADCAST, &yes, sizeof(yes)); */
4792 if (bind(s, (struct sockaddr *)&local, sizeof(local)) < 0) {
4793 perror("bind");
4794 return 1;
4795 }
4796
4797- if (mt76_set_fwlog_en(phyname, true))
4798+ if (mt76_set_fwlog_en(phyname, true, argv[1]))
4799 return 1;
4800
4801 fd = open(debugfs_path(phyname, "fwlog_data"), O_RDONLY);
4802@@ -145,8 +152,8 @@ int mt76_fwlog(const char *phyname, int argc, char **argv)
4803 if (!r)
4804 continue;
4805
4806- if (len > sizeof(buf)) {
4807- fprintf(stderr, "Length error: %d > %d\n", len, (int)sizeof(buf));
4808+ if (len > BUF_SIZE) {
4809+ fprintf(stderr, "Length error: %d > %d\n", len, BUF_SIZE);
4810 ret = 1;
4811 break;
4812 }
4813@@ -171,7 +178,7 @@ int mt76_fwlog(const char *phyname, int argc, char **argv)
4814 close(fd);
4815
4816 out:
4817- mt76_set_fwlog_en(phyname, false);
4818+ mt76_set_fwlog_en(phyname, false, NULL);
4819
4820 return ret;
4821 }
4822--
developerde9ecce2023-05-22 11:17:16 +080048232.39.2
developer1bc2ce22023-03-25 00:47:41 +08004824