blob: 30f91fb3705e39e014c72e70da24d797e41cbf89 [file] [log] [blame]
developer20d67712022-03-02 14:09:32 +08001From 7a5adbf5743296ad6626378d701de08b0d039748 Mon Sep 17 00:00:00 2001
2From: Shayne Chen <shayne.chen@mediatek.com>
3Date: Thu, 17 Feb 2022 00:17:39 +0800
4Subject: [PATCH] mt76: mt7915: add mtk internal debug tools for mt76
5
6---
7 .../wireless/mediatek/mt76/mt76_connac_mcu.h | 6 +
8 .../wireless/mediatek/mt76/mt7915/Makefile | 2 +-
9 .../wireless/mediatek/mt76/mt7915/debugfs.c | 61 +-
10 .../net/wireless/mediatek/mt76/mt7915/mcu.c | 37 +
11 .../net/wireless/mediatek/mt76/mt7915/mcu.h | 4 +
12 .../wireless/mediatek/mt76/mt7915/mt7915.h | 25 +
13 .../mediatek/mt76/mt7915/mt7915_debug.h | 1342 ++++++++
14 .../mediatek/mt76/mt7915/mtk_debugfs.c | 2869 +++++++++++++++++
15 .../wireless/mediatek/mt76/mt7915/mtk_mcu.c | 51 +
16 .../net/wireless/mediatek/mt76/tools/fwlog.c | 26 +-
17 10 files changed, 4412 insertions(+), 11 deletions(-)
18 create mode 100644 drivers/net/wireless/mediatek/mt76/mt7915/mt7915_debug.h
19 create mode 100644 drivers/net/wireless/mediatek/mt76/mt7915/mtk_debugfs.c
20 create mode 100644 drivers/net/wireless/mediatek/mt76/mt7915/mtk_mcu.c
21
22diff --git a/mt76_connac_mcu.h b/mt76_connac_mcu.h
23index 0dea04e..9a573a8 100644
24--- a/mt76_connac_mcu.h
25+++ b/mt76_connac_mcu.h
26@@ -968,6 +968,12 @@ enum {
27 MCU_EXT_CMD_TX_POWER_FEATURE_CTRL = 0x58,
28 MCU_EXT_CMD_RXDCOC_CAL = 0x59,
29 MCU_EXT_CMD_GET_MIB_INFO = 0x5a,
30+#ifdef MTK_DEBUG
31+ MCU_EXT_CMD_RED_ENABLE = 0x68,
32+ MCU_EXT_CMD_RED_SHOW_STA = 0x69,
33+ MCU_EXT_CMD_RED_TARGET_DELAY = 0x6A,
34+ MCU_EXT_CMD_RED_TX_RPT = 0x6B,
35+#endif
36 MCU_EXT_CMD_TXDPD_CAL = 0x60,
37 MCU_EXT_CMD_CAL_CACHE = 0x67,
38 MCU_EXT_CMD_SET_RADAR_TH = 0x7c,
39diff --git a/mt7915/Makefile b/mt7915/Makefile
40index b794ceb..a3474e2 100644
41--- a/mt7915/Makefile
42+++ b/mt7915/Makefile
43@@ -3,7 +3,7 @@
44 obj-$(CONFIG_MT7915E) += mt7915e.o
45
46 mt7915e-y := pci.o init.o dma.o eeprom.o main.o mcu.o mac.o \
47- debugfs.o mmio.o
48+ debugfs.o mmio.o mtk_debugfs.o mtk_mcu.o
49
50 mt7915e-$(CONFIG_NL80211_TESTMODE) += testmode.o
51 mt7915e-$(CONFIG_MT7986_WMAC) += soc.o
52\ No newline at end of file
53diff --git a/mt7915/debugfs.c b/mt7915/debugfs.c
54index 4e1ecae..6dd1ceb 100644
55--- a/mt7915/debugfs.c
56+++ b/mt7915/debugfs.c
57@@ -8,6 +8,9 @@
58 #include "mac.h"
59
60 #define FW_BIN_LOG_MAGIC 0x44e98caf
61+#ifdef MTK_DEBUG
62+#define FW_BIN_LOG_MAGIC_V2 0x44d9c99a
63+#endif
64
65 /** global debugfs **/
66
67@@ -370,6 +373,9 @@ mt7915_fw_debug_wm_set(void *data, u64 val)
68 int ret;
69
70 dev->fw_debug_wm = val ? MCU_FW_LOG_TO_HOST : 0;
71+#ifdef MTK_DEBUG
72+ dev->fw_debug_wm = val;
73+#endif
74
75 if (dev->fw_debug_bin)
76 val = 16;
77@@ -394,6 +400,9 @@ mt7915_fw_debug_wm_set(void *data, u64 val)
78 if (ret)
79 return ret;
80 }
81+#ifdef MTK_DEBUG
82+ mt7915_mcu_fw_dbg_ctrl(dev, 68, !!val);
83+#endif
84
85 /* WM CPU info record control */
86 mt76_clear(dev, MT_CPU_UTIL_CTRL, BIT(0));
87@@ -401,6 +410,12 @@ mt7915_fw_debug_wm_set(void *data, u64 val)
88 mt76_wr(dev, MT_MCU_WM_CIRQ_IRQ_MASK_CLR_ADDR, BIT(5));
89 mt76_wr(dev, MT_MCU_WM_CIRQ_IRQ_SOFT_ADDR, BIT(5));
90
91+#ifdef MTK_DEBUG
92+ if (dev->fw_debug_bin & BIT(3))
93+ /* use bit 7 to indicate v2 magic number */
94+ dev->fw_debug_wm |= BIT(7);
95+#endif
96+
97 return 0;
98 }
99
100@@ -409,7 +424,11 @@ mt7915_fw_debug_wm_get(void *data, u64 *val)
101 {
102 struct mt7915_dev *dev = data;
103
104- *val = dev->fw_debug_wm;
105+#ifdef MTK_DEBUG
106+ *val = dev->fw_debug_wm & ~BIT(7);
107+#else
108+ val = dev->fw_debug_wm;
109+#endif
110
111 return 0;
112 }
113@@ -910,6 +929,11 @@ int mt7915_init_debugfs(struct mt7915_phy *phy)
114 if (!ext_phy)
115 dev->debugfs_dir = dir;
116
117+#ifdef MTK_DEBUG
118+ debugfs_create_u16("wlan_idx", 0600, dir, &dev->wlan_idx);
119+ mt7915_mtk_init_debugfs(phy, dir);
120+#endif
121+
122 return 0;
123 }
124
125@@ -950,17 +974,52 @@ void mt7915_debugfs_rx_fw_monitor(struct mt7915_dev *dev, const void *data, int
126 .msg_type = cpu_to_le16(PKT_TYPE_RX_FW_MONITOR),
127 };
128
129+#ifdef MTK_DEBUG
130+ struct {
131+ __le32 magic;
132+ u8 version;
133+ u8 _rsv;
134+ __le16 serial_id;
135+ __le32 timestamp;
136+ __le16 msg_type;
137+ __le16 len;
138+ } hdr2 = {
139+ .version = 0x1,
140+ .magic = cpu_to_le32(FW_BIN_LOG_MAGIC_V2),
141+ .msg_type = PKT_TYPE_RX_FW_MONITOR,
142+ };
143+#endif
144+
145 if (!dev->relay_fwlog)
146 return;
147
148+#ifdef MTK_DEBUG
149+ /* old magic num */
150+ if (!(dev->fw_debug_wm & BIT(7))) {
151+ hdr.timestamp = mt76_rr(dev, MT_LPON_FRCR(0));
152+ hdr.len = *(__le16 *)data;
153+ mt7915_debugfs_write_fwlog(dev, &hdr, sizeof(hdr), data, len);
154+ } else {
155+ hdr2.serial_id = dev->dbg.fwlog_seq++;
156+ hdr2.timestamp = mt76_rr(dev, MT_LPON_FRCR(0));
157+ hdr2.len = *(__le16 *)data;
158+ mt7915_debugfs_write_fwlog(dev, &hdr2, sizeof(hdr2), data, len);
159+ }
160+#else
161 hdr.timestamp = cpu_to_le32(mt76_rr(dev, MT_LPON_FRCR(0)));
162 hdr.len = *(__le16 *)data;
163 mt7915_debugfs_write_fwlog(dev, &hdr, sizeof(hdr), data, len);
164+#endif
165 }
166
167 bool mt7915_debugfs_rx_log(struct mt7915_dev *dev, const void *data, int len)
168 {
169+#ifdef MTK_DEBUG
170+ if (get_unaligned_le32(data) != FW_BIN_LOG_MAGIC &&
171+ get_unaligned_le32(data) != FW_BIN_LOG_MAGIC_V2)
172+#else
173 if (get_unaligned_le32(data) != FW_BIN_LOG_MAGIC)
174+#endif
175 return false;
176
177 if (dev->relay_fwlog)
178diff --git a/mt7915/mcu.c b/mt7915/mcu.c
179index 15580f0..03e15bc 100644
180--- a/mt7915/mcu.c
181+++ b/mt7915/mcu.c
182@@ -3621,3 +3621,40 @@ int mt7915_mcu_twt_agrt_update(struct mt7915_dev *dev,
183 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(TWT_AGRT_UPDATE),
184 &req, sizeof(req), true);
185 }
186+
187+#ifdef MTK_DEBUG
188+int mt7915_dbg_mcu_wa_cmd(struct mt7915_dev *dev, int cmd, u32 a1, u32 a2, u32 a3, bool wait_resp)
189+{
190+ struct {
191+ __le32 args[3];
192+ } req = {
193+ .args = {
194+ cpu_to_le32(a1),
195+ cpu_to_le32(a2),
196+ cpu_to_le32(a3),
197+ },
198+ };
199+
200+ return mt76_mcu_send_msg(&dev->mt76, cmd, &req, sizeof(req), wait_resp);
201+}
202+
203+int mt7915_mcu_set_red(struct mt7915_dev *dev, bool enabled)
204+{
205+#define RED_DISABLE 0
206+#define RED_BY_HOST_ENABLE 1
207+#define RED_BY_WA_ENABLE 2
208+ int ret;
209+ u32 red_type = enabled > 0 ? RED_BY_WA_ENABLE : RED_DISABLE;
210+ __le32 req = cpu_to_le32(red_type);
211+
212+ ret = mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(RED_ENABLE), &req,
213+ sizeof(req), false);
214+ if (ret < 0)
215+ return ret;
216+
217+ mt7915_dbg_mcu_wa_cmd(dev, MCU_WA_PARAM_CMD(SET),
218+ MCU_WA_PARAM_RED, enabled, 0, true);
219+
220+ return 0;
221+}
222+#endif
223diff --git a/mt7915/mcu.h b/mt7915/mcu.h
224index 52368dc..94e0a81 100644
225--- a/mt7915/mcu.h
226+++ b/mt7915/mcu.h
227@@ -296,6 +296,10 @@ enum {
228 MCU_WA_PARAM_PDMA_RX = 0x04,
229 MCU_WA_PARAM_CPU_UTIL = 0x0b,
230 MCU_WA_PARAM_RED = 0x0e,
231+#ifdef MTK_DEBUG
232+ MCU_WA_PARAM_RED_SHOW_STA = 0xf,
233+ MCU_WA_PARAM_RED_TARGET_DELAY = 0x10,
234+#endif
235 };
236
237 enum mcu_mmps_mode {
238diff --git a/mt7915/mt7915.h b/mt7915/mt7915.h
239index 3e6f5a3..d3f036d 100644
240--- a/mt7915/mt7915.h
241+++ b/mt7915/mt7915.h
242@@ -9,6 +9,7 @@
243 #include "../mt76_connac.h"
244 #include "regs.h"
245
246+#define MTK_DEBUG 1
247 #define MT7915_MAX_INTERFACES 19
248 #define MT7915_MAX_WMM_SETS 4
249 #define MT7915_WTBL_SIZE 288
250@@ -324,6 +325,22 @@ struct mt7915_dev {
251 struct reset_control *rstc;
252 void __iomem *dcm;
253 void __iomem *sku;
254+
255+#ifdef MTK_DEBUG
256+ u16 wlan_idx;
257+ struct {
258+ u32 fixed_rate;
259+ u32 l1debugfs_reg;
260+ u32 l2debugfs_reg;
261+ u32 mac_reg;
262+ u32 fw_dbg_module;
263+ u8 fw_dbg_lv;
264+ u32 bcn_total_cnt[2];
265+ u16 fwlog_seq;
266+ u32 token_idx;
267+ } dbg;
268+ const struct mt7915_dbg_reg_desc *dbg_reg;
269+#endif
270 };
271
272 enum {
273@@ -591,4 +608,12 @@ void mt7915_sta_add_debugfs(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
274 struct ieee80211_sta *sta, struct dentry *dir);
275 #endif
276
277+#ifdef MTK_DEBUG
278+int mt7915_mtk_init_debugfs(struct mt7915_phy *phy, struct dentry *dir);
279+int mt7915_dbg_mcu_wa_cmd(struct mt7915_dev *dev, int cmd, u32 a1, u32 a2, u32 a3, bool wait_resp);
280+int mt7915_mcu_set_red(struct mt7915_dev *dev, bool enabled);
281+void mt7915_dump_tmac_info(u8 *tmac_info);
282+int mt7915_mcu_set_txpower_level(struct mt7915_phy *phy, u8 drop_level);
283+#endif
284+
285 #endif
286diff --git a/mt7915/mt7915_debug.h b/mt7915/mt7915_debug.h
287new file mode 100644
288index 0000000..cc6fca3
289--- /dev/null
290+++ b/mt7915/mt7915_debug.h
291@@ -0,0 +1,1342 @@
292+#ifndef __MT7915_DEBUG_H
293+#define __MT7915_DEBUG_H
294+
295+#ifdef MTK_DEBUG
296+
297+#define DBG_INVALID_BASE 0xffffffff
298+#define DBG_INVALID_OFFSET 0x0
299+
300+struct __dbg_map {
301+ u32 phys;
302+ u32 maps;
303+ u32 size;
304+};
305+
306+struct __dbg_reg {
307+ u32 base;
308+ u32 offs;
309+};
310+
311+struct __dbg_mask {
312+ u32 end;
313+ u32 start;
314+};
315+
316+enum dbg_base_rev {
317+ MT_DBG_WFDMA0_BASE,
318+ MT_DBG_WFDMA1_BASE,
319+ MT_DBG_WFDMA0_PCIE1_BASE,
320+ MT_DBG_WFDMA1_PCIE1_BASE,
321+ MT_DBG_WFDMA_EXT_CSR_BASE,
322+ MT_DBG_SWDEF_BASE,
323+ __MT_DBG_BASE_REV_MAX,
324+};
325+
326+enum dbg_reg_rev {
327+ DBG_INT_SOURCE_CSR,
328+ DBG_INT_MASK_CSR,
329+ DBG_INT1_SOURCE_CSR,
330+ DBG_INT1_MASK_CSR,
331+ DBG_TX_RING_BASE,
332+ DBG_RX_EVENT_RING_BASE,
333+ DBG_RX_STS_RING_BASE,
334+ DBG_RX_DATA_RING_BASE,
335+ DBG_DMA_ICSC_FR0,
336+ DBG_DMA_ICSC_FR1,
337+ DBG_TMAC_ICSCR0,
338+ DBG_RMAC_RXICSRPT,
339+ DBG_MIB_M0SDR0,
340+ DBG_MIB_M0SDR3,
341+ DBG_MIB_M0SDR4,
342+ DBG_MIB_M0SDR5,
343+ DBG_MIB_M0SDR7,
344+ DBG_MIB_M0SDR8,
345+ DBG_MIB_M0SDR9,
346+ DBG_MIB_M0SDR10,
347+ DBG_MIB_M0SDR11,
348+ DBG_MIB_M0SDR12,
349+ DBG_MIB_M0SDR14,
350+ DBG_MIB_M0SDR15,
351+ DBG_MIB_M0SDR16,
352+ DBG_MIB_M0SDR17,
353+ DBG_MIB_M0SDR18,
354+ DBG_MIB_M0SDR19,
355+ DBG_MIB_M0SDR20,
356+ DBG_MIB_M0SDR21,
357+ DBG_MIB_M0SDR22,
358+ DBG_MIB_M0SDR23,
359+ DBG_MIB_M0DR0,
360+ DBG_MIB_M0DR1,
361+ DBG_MIB_MUBF,
362+ DBG_MIB_M0DR6,
363+ DBG_MIB_M0DR7,
364+ DBG_MIB_M0DR8,
365+ DBG_MIB_M0DR9,
366+ DBG_MIB_M0DR10,
367+ DBG_MIB_M0DR11,
368+ DBG_MIB_M0DR12,
369+ DBG_WTBLON_WDUCR,
370+ DBG_UWTBL_WDUCR,
371+ DBG_PLE_DRR_TABLE_CTRL,
372+ DBG_PLE_DRR_TABLE_RDATA,
373+ DBG_PLE_PBUF_CTRL,
374+ DBG_PLE_QUEUE_EMPTY,
375+ DBG_PLE_FREEPG_CNT,
376+ DBG_PLE_FREEPG_HEAD_TAIL,
377+ DBG_PLE_PG_HIF_GROUP,
378+ DBG_PLE_HIF_PG_INFO,
379+ DBG_PLE_PG_HIF_TXCMD_GROUP,
380+ DBG_PLE_HIF_TXCMD_PG_INFO,
381+ DBG_PLE_PG_CPU_GROUP,
382+ DBG_PLE_CPU_PG_INFO,
383+ DBG_PLE_FL_QUE_CTRL,
384+ DBG_PLE_NATIVE_TXCMD_Q_EMPTY,
385+ DBG_PLE_TXCMD_Q_EMPTY,
386+ DBG_PLE_AC_QEMPTY,
387+ DBG_PLE_AC_OFFSET,
388+ DBG_PLE_STATION_PAUSE,
389+ DBG_PLE_DIS_STA_MAP,
390+ DBG_PSE_PBUF_CTRL,
391+ DBG_PSE_FREEPG_CNT,
392+ DBG_PSE_FREEPG_HEAD_TAIL,
393+ DBG_PSE_HIF0_PG_INFO,
394+ DBG_PSE_PG_HIF1_GROUP,
395+ DBG_PSE_HIF1_PG_INFO,
396+ DBG_PSE_PG_CPU_GROUP,
397+ DBG_PSE_CPU_PG_INFO,
398+ DBG_PSE_PG_PLE_GROUP,
399+ DBG_PSE_PLE_PG_INFO,
400+ DBG_PSE_PG_LMAC0_GROUP,
401+ DBG_PSE_LMAC0_PG_INFO,
402+ DBG_PSE_PG_LMAC1_GROUP,
403+ DBG_PSE_LMAC1_PG_INFO,
404+ DBG_PSE_PG_LMAC2_GROUP,
405+ DBG_PSE_LMAC2_PG_INFO,
406+ DBG_PSE_PG_LMAC3_GROUP,
407+ DBG_PSE_LMAC3_PG_INFO,
408+ DBG_PSE_PG_MDP_GROUP,
409+ DBG_PSE_MDP_PG_INFO,
410+ DBG_PSE_PG_PLE1_GROUP,
411+ DBG_PSE_PLE1_PG_INFO,
412+ DBG_AGG_AALCR0,
413+ DBG_AGG_AALCR1,
414+ DBG_AGG_AALCR2,
415+ DBG_AGG_AALCR3,
416+ DBG_AGG_AALCR4,
417+ DBG_AGG_B0BRR0,
418+ DBG_AGG_B1BRR0,
419+ DBG_AGG_B2BRR0,
420+ DBG_AGG_B3BRR0,
421+ DBG_AGG_AWSCR0,
422+ DBG_AGG_PCR0,
423+ DBG_AGG_TTCR0,
424+ DBG_MIB_M0ARNG0,
425+ DBG_MIB_M0DR2,
426+ DBG_MIB_M0DR13,
427+ __MT_DBG_REG_REV_MAX,
428+};
429+
430+enum dbg_mask_rev {
431+ DBG_MIB_M0SDR10_RX_MDRDY_COUNT,
432+ DBG_MIB_M0SDR14_AMPDU,
433+ DBG_MIB_M0SDR15_AMPDU_ACKED,
434+ DBG_MIB_RX_FCS_ERROR_COUNT,
435+ __MT_DBG_MASK_REV_MAX,
436+};
437+
438+enum dbg_bit_rev {
439+ __MT_DBG_BIT_REV_MAX,
440+};
441+
442+static const u32 mt7915_dbg_base[] = {
443+ [MT_DBG_WFDMA0_BASE] = 0xd4000,
444+ [MT_DBG_WFDMA1_BASE] = 0xd5000,
445+ [MT_DBG_WFDMA0_PCIE1_BASE] = 0xd8000,
446+ [MT_DBG_WFDMA1_PCIE1_BASE] = 0xd9000,
447+ [MT_DBG_WFDMA_EXT_CSR_BASE] = 0xd7000,
448+ [MT_DBG_SWDEF_BASE] = 0x41f200,
449+};
450+
451+static const u32 mt7916_dbg_base[] = {
452+ [MT_DBG_WFDMA0_BASE] = 0xd4000,
453+ [MT_DBG_WFDMA1_BASE] = 0xd5000,
454+ [MT_DBG_WFDMA0_PCIE1_BASE] = 0xd8000,
455+ [MT_DBG_WFDMA1_PCIE1_BASE] = 0xd9000,
456+ [MT_DBG_WFDMA_EXT_CSR_BASE] = 0xd7000,
457+ [MT_DBG_SWDEF_BASE] = 0x411400,
458+};
459+
460+static const u32 mt7986_dbg_base[] = {
461+ [MT_DBG_WFDMA0_BASE] = 0x24000,
462+ [MT_DBG_WFDMA1_BASE] = 0x25000,
463+ [MT_DBG_WFDMA0_PCIE1_BASE] = 0x28000,
464+ [MT_DBG_WFDMA1_PCIE1_BASE] = 0x29000,
465+ [MT_DBG_WFDMA_EXT_CSR_BASE] = 0x27000,
466+ [MT_DBG_SWDEF_BASE] = 0x411400,
467+};
468+
469+/* mt7915 regs with different base and offset */
470+static const struct __dbg_reg mt7915_dbg_reg[] = {
471+ [DBG_INT_SOURCE_CSR] = { MT_DBG_WFDMA_EXT_CSR_BASE, 0x10 },
472+ [DBG_INT_MASK_CSR] = { MT_DBG_WFDMA_EXT_CSR_BASE, 0x14 },
473+ [DBG_INT1_SOURCE_CSR] = { MT_DBG_WFDMA_EXT_CSR_BASE, 0x88 },
474+ [DBG_INT1_MASK_CSR] = { MT_DBG_WFDMA_EXT_CSR_BASE, 0x8c },
475+ [DBG_TX_RING_BASE] = { MT_DBG_WFDMA1_BASE, 0x400 },
476+ [DBG_RX_EVENT_RING_BASE] = { MT_DBG_WFDMA1_BASE, 0x500 },
477+ [DBG_RX_STS_RING_BASE] = { MT_DBG_WFDMA1_BASE, 0x510 },
478+ [DBG_RX_DATA_RING_BASE] = { MT_DBG_WFDMA0_BASE, 0x500 },
479+ [DBG_DMA_ICSC_FR0] = { DBG_INVALID_BASE, 0x0f0 },
480+ [DBG_DMA_ICSC_FR1] = { DBG_INVALID_BASE, 0x0f4 },
481+ [DBG_TMAC_ICSCR0] = { DBG_INVALID_BASE, 0x200 },
482+ [DBG_RMAC_RXICSRPT] = { DBG_INVALID_BASE, 0x618},
483+ [DBG_MIB_M0SDR0] = { DBG_INVALID_BASE, 0x010},
484+ [DBG_MIB_M0SDR3] = { DBG_INVALID_BASE, 0x014},
485+ [DBG_MIB_M0SDR4] = { DBG_INVALID_BASE, 0x018},
486+ [DBG_MIB_M0SDR5] = { DBG_INVALID_BASE, 0x01c},
487+ [DBG_MIB_M0SDR7] = { DBG_INVALID_BASE, 0x024},
488+ [DBG_MIB_M0SDR8] = { DBG_INVALID_BASE, 0x028},
489+ [DBG_MIB_M0SDR9] = { DBG_INVALID_BASE, 0x02C},
490+ [DBG_MIB_M0SDR10] = { DBG_INVALID_BASE, 0x030},
491+ [DBG_MIB_M0SDR11] = { DBG_INVALID_BASE, 0x034},
492+ [DBG_MIB_M0SDR12] = { DBG_INVALID_BASE, 0x038},
493+ [DBG_MIB_M0SDR14] = { DBG_INVALID_BASE, 0x040},
494+ [DBG_MIB_M0SDR15] = { DBG_INVALID_BASE, 0x044},
495+ [DBG_MIB_M0SDR16] = { DBG_INVALID_BASE, 0x048},
496+ [DBG_MIB_M0SDR17] = { DBG_INVALID_BASE, 0x04c},
497+ [DBG_MIB_M0SDR18] = { DBG_INVALID_BASE, 0x050},
498+ [DBG_MIB_M0SDR19] = { DBG_INVALID_BASE, 0x054},
499+ [DBG_MIB_M0SDR20] = { DBG_INVALID_BASE, 0x058},
500+ [DBG_MIB_M0SDR21] = { DBG_INVALID_BASE, 0x05c},
501+ [DBG_MIB_M0SDR22] = { DBG_INVALID_BASE, 0x060},
502+ [DBG_MIB_M0SDR23] = { DBG_INVALID_BASE, 0x064},
503+ [DBG_MIB_M0DR0] = { DBG_INVALID_BASE, 0x0a0},
504+ [DBG_MIB_M0DR1] = { DBG_INVALID_BASE, 0x0a4},
505+ [DBG_MIB_MUBF] = { DBG_INVALID_BASE, 0x090},
506+ [DBG_MIB_M0DR6] = { DBG_INVALID_BASE, 0x0b8},
507+ [DBG_MIB_M0DR7] = { DBG_INVALID_BASE, 0x0bc},
508+ [DBG_MIB_M0DR8] = { DBG_INVALID_BASE, 0x0c0},
509+ [DBG_MIB_M0DR9] = { DBG_INVALID_BASE, 0x0c4},
510+ [DBG_MIB_M0DR10] = { DBG_INVALID_BASE, 0x0c8},
511+ [DBG_MIB_M0DR11] = { DBG_INVALID_BASE, 0x0cc},
512+ [DBG_MIB_M0DR12] = { DBG_INVALID_BASE, 0x160},
513+ [DBG_WTBLON_WDUCR] = { DBG_INVALID_BASE, 0x0},
514+ [DBG_UWTBL_WDUCR] = { DBG_INVALID_BASE, 0x0},
515+ [DBG_PLE_DRR_TABLE_CTRL] = { DBG_INVALID_BASE, 0x388},
516+ [DBG_PLE_DRR_TABLE_RDATA] = { DBG_INVALID_BASE, 0x350},
517+ [DBG_PLE_PBUF_CTRL] = { DBG_INVALID_BASE, 0x014},
518+ [DBG_PLE_QUEUE_EMPTY] = { DBG_INVALID_BASE, 0x0b0},
519+ [DBG_PLE_FREEPG_CNT] = { DBG_INVALID_BASE, 0x100},
520+ [DBG_PLE_FREEPG_HEAD_TAIL] = { DBG_INVALID_BASE, 0x104},
521+ [DBG_PLE_PG_HIF_GROUP] = { DBG_INVALID_BASE, 0x110},
522+ [DBG_PLE_HIF_PG_INFO] = { DBG_INVALID_BASE, 0x114},
523+ [DBG_PLE_PG_HIF_TXCMD_GROUP] = { DBG_INVALID_BASE, 0x120},
524+ [DBG_PLE_HIF_TXCMD_PG_INFO] = { DBG_INVALID_BASE, 0x124},
525+ [DBG_PLE_PG_CPU_GROUP] = { DBG_INVALID_BASE, 0x150},
526+ [DBG_PLE_CPU_PG_INFO] = { DBG_INVALID_BASE, 0x154},
527+ [DBG_PLE_FL_QUE_CTRL] = { DBG_INVALID_BASE, 0x1b0},
528+ [DBG_PLE_NATIVE_TXCMD_Q_EMPTY] = { DBG_INVALID_BASE, 0x22c},
529+ [DBG_PLE_TXCMD_Q_EMPTY] = { DBG_INVALID_BASE, 0x230},
530+ [DBG_PLE_AC_QEMPTY] = { DBG_INVALID_BASE, 0x500},
531+ [DBG_PLE_AC_OFFSET] = { DBG_INVALID_BASE, 0x040},
532+ [DBG_PLE_STATION_PAUSE] = { DBG_INVALID_BASE, 0x400},
533+ [DBG_PLE_DIS_STA_MAP] = { DBG_INVALID_BASE, 0x440},
534+ [DBG_PSE_PBUF_CTRL] = { DBG_INVALID_BASE, 0x004},
535+ [DBG_PSE_FREEPG_CNT] = { DBG_INVALID_BASE, 0x100},
536+ [DBG_PSE_FREEPG_HEAD_TAIL] = { DBG_INVALID_BASE, 0x104},
537+ [DBG_PSE_HIF0_PG_INFO] = { DBG_INVALID_BASE, 0x114},
538+ [DBG_PSE_PG_HIF1_GROUP] = { DBG_INVALID_BASE, 0x118},
539+ [DBG_PSE_HIF1_PG_INFO] = { DBG_INVALID_BASE, 0x11c},
540+ [DBG_PSE_PG_CPU_GROUP] = { DBG_INVALID_BASE, 0x150},
541+ [DBG_PSE_CPU_PG_INFO] = { DBG_INVALID_BASE, 0x154},
542+ [DBG_PSE_PG_PLE_GROUP] = { DBG_INVALID_BASE, 0x160},
543+ [DBG_PSE_PLE_PG_INFO] = { DBG_INVALID_BASE, 0x164},
544+ [DBG_PSE_PG_LMAC0_GROUP] = { DBG_INVALID_BASE, 0x170},
545+ [DBG_PSE_LMAC0_PG_INFO] = { DBG_INVALID_BASE, 0x174},
546+ [DBG_PSE_PG_LMAC1_GROUP] = { DBG_INVALID_BASE, 0x178},
547+ [DBG_PSE_LMAC1_PG_INFO] = { DBG_INVALID_BASE, 0x17c},
548+ [DBG_PSE_PG_LMAC2_GROUP] = { DBG_INVALID_BASE, 0x180},
549+ [DBG_PSE_LMAC2_PG_INFO] = { DBG_INVALID_BASE, 0x184},
550+ [DBG_PSE_PG_LMAC3_GROUP] = { DBG_INVALID_BASE, 0x188},
551+ [DBG_PSE_LMAC3_PG_INFO] = { DBG_INVALID_BASE, 0x18c},
552+ [DBG_PSE_PG_MDP_GROUP] = { DBG_INVALID_BASE, 0x198},
553+ [DBG_PSE_MDP_PG_INFO] = { DBG_INVALID_BASE, 0x19c},
554+ [DBG_PSE_PG_PLE1_GROUP] = { DBG_INVALID_BASE, 0x168},
555+ [DBG_PSE_PLE1_PG_INFO] = { DBG_INVALID_BASE, 0x16c},
556+ [DBG_AGG_AALCR0] = { DBG_INVALID_BASE, 0x048},
557+ [DBG_AGG_AALCR1] = { DBG_INVALID_BASE, 0x04c},
558+ [DBG_AGG_AALCR2] = { DBG_INVALID_BASE, 0x050},
559+ [DBG_AGG_AALCR3] = { DBG_INVALID_BASE, 0x054},
560+ [DBG_AGG_AALCR4] = { DBG_INVALID_BASE, 0x058},
561+ [DBG_AGG_B0BRR0] = { DBG_INVALID_BASE, 0x100},
562+ [DBG_AGG_B1BRR0] = { DBG_INVALID_BASE, 0x104},
563+ [DBG_AGG_B2BRR0] = { DBG_INVALID_BASE, 0x108},
564+ [DBG_AGG_B3BRR0] = { DBG_INVALID_BASE, 0x10c},
565+ [DBG_AGG_AWSCR0] = { DBG_INVALID_BASE, 0x030},
566+ [DBG_AGG_PCR0] = { DBG_INVALID_BASE, 0x040},
567+ [DBG_AGG_TTCR0] = { DBG_INVALID_BASE, 0x04c},
568+ [DBG_MIB_M0ARNG0] = { DBG_INVALID_BASE, 0x4b8},
569+ [DBG_MIB_M0DR2] = { DBG_INVALID_BASE, 0x0a8},
570+ [DBG_MIB_M0DR13] = { DBG_INVALID_BASE, 0x164},
571+};
572+
573+/* mt7986/mt7916 regs with different base and offset */
574+static const struct __dbg_reg mt7916_dbg_reg[] = {
575+ [DBG_INT_SOURCE_CSR] = { MT_DBG_WFDMA0_BASE, 0x200 },
576+ [DBG_INT_MASK_CSR] = { MT_DBG_WFDMA0_BASE, 0x204 },
577+ [DBG_INT1_SOURCE_CSR] = { MT_DBG_WFDMA0_PCIE1_BASE, 0x200 },
578+ [DBG_INT1_MASK_CSR] = { MT_DBG_WFDMA0_PCIE1_BASE, 0x204 },
579+ [DBG_TX_RING_BASE] = { MT_DBG_WFDMA0_BASE, 0x400 },
580+ [DBG_RX_EVENT_RING_BASE] = { MT_DBG_WFDMA0_BASE, 0x500 },
581+ [DBG_RX_STS_RING_BASE] = { MT_DBG_WFDMA0_BASE, 0x520 },
582+ [DBG_RX_DATA_RING_BASE] = { MT_DBG_WFDMA0_BASE, 0x540 },
583+ [DBG_DMA_ICSC_FR0] = { DBG_INVALID_BASE, 0x05c },
584+ [DBG_DMA_ICSC_FR1] = { DBG_INVALID_BASE, 0x060 },
585+ [DBG_TMAC_ICSCR0] = { DBG_INVALID_BASE, 0x120 },
586+ [DBG_RMAC_RXICSRPT] = { DBG_INVALID_BASE, 0xd0 },
587+ [DBG_MIB_M0SDR0] = { DBG_INVALID_BASE, 0x7d8},
588+ [DBG_MIB_M0SDR3] = { DBG_INVALID_BASE, 0x698},
589+ [DBG_MIB_M0SDR4] = { DBG_INVALID_BASE, 0x788},
590+ [DBG_MIB_M0SDR5] = { DBG_INVALID_BASE, 0x780},
591+ [DBG_MIB_M0SDR7] = { DBG_INVALID_BASE, 0x5a8},
592+ [DBG_MIB_M0SDR8] = { DBG_INVALID_BASE, 0x78c},
593+ [DBG_MIB_M0SDR9] = { DBG_INVALID_BASE, 0x024},
594+ [DBG_MIB_M0SDR10] = { DBG_INVALID_BASE, 0x76c},
595+ [DBG_MIB_M0SDR11] = { DBG_INVALID_BASE, 0x790},
596+ [DBG_MIB_M0SDR12] = { DBG_INVALID_BASE, 0x558},
597+ [DBG_MIB_M0SDR14] = { DBG_INVALID_BASE, 0x564},
598+ [DBG_MIB_M0SDR15] = { DBG_INVALID_BASE, 0x564},
599+ [DBG_MIB_M0SDR16] = { DBG_INVALID_BASE, 0x7fc},
600+ [DBG_MIB_M0SDR17] = { DBG_INVALID_BASE, 0x800},
601+ [DBG_MIB_M0SDR18] = { DBG_INVALID_BASE, 0x030},
602+ [DBG_MIB_M0SDR19] = { DBG_INVALID_BASE, 0x5ac},
603+ [DBG_MIB_M0SDR20] = { DBG_INVALID_BASE, 0x5b0},
604+ [DBG_MIB_M0SDR21] = { DBG_INVALID_BASE, 0x5b4},
605+ [DBG_MIB_M0SDR22] = { DBG_INVALID_BASE, 0x770},
606+ [DBG_MIB_M0SDR23] = { DBG_INVALID_BASE, 0x774},
607+ [DBG_MIB_M0DR0] = { DBG_INVALID_BASE, 0x594},
608+ [DBG_MIB_M0DR1] = { DBG_INVALID_BASE, 0x598},
609+ [DBG_MIB_MUBF] = { DBG_INVALID_BASE, 0x7ac},
610+ [DBG_MIB_M0DR6] = { DBG_INVALID_BASE, 0x658},
611+ [DBG_MIB_M0DR7] = { DBG_INVALID_BASE, 0x65c},
612+ [DBG_MIB_M0DR8] = { DBG_INVALID_BASE, 0x56c},
613+ [DBG_MIB_M0DR9] = { DBG_INVALID_BASE, 0x570},
614+ [DBG_MIB_M0DR10] = { DBG_INVALID_BASE, 0x578},
615+ [DBG_MIB_M0DR11] = { DBG_INVALID_BASE, 0x574},
616+ [DBG_MIB_M0DR12] = { DBG_INVALID_BASE, 0x654},
617+ [DBG_WTBLON_WDUCR] = { DBG_INVALID_BASE, 0x200},
618+ [DBG_UWTBL_WDUCR] = { DBG_INVALID_BASE, 0x094},
619+ [DBG_PLE_DRR_TABLE_CTRL] = { DBG_INVALID_BASE, 0x490},
620+ [DBG_PLE_DRR_TABLE_RDATA] = { DBG_INVALID_BASE, 0x470},
621+ [DBG_PLE_PBUF_CTRL] = { DBG_INVALID_BASE, 0x004},
622+ [DBG_PLE_QUEUE_EMPTY] = { DBG_INVALID_BASE, 0x360},
623+ [DBG_PLE_FREEPG_CNT] = { DBG_INVALID_BASE, 0x380},
624+ [DBG_PLE_FREEPG_HEAD_TAIL] = { DBG_INVALID_BASE, 0x384},
625+ [DBG_PLE_PG_HIF_GROUP] = { DBG_INVALID_BASE, 0x00c},
626+ [DBG_PLE_HIF_PG_INFO] = { DBG_INVALID_BASE, 0x388},
627+ [DBG_PLE_PG_HIF_TXCMD_GROUP] = { DBG_INVALID_BASE, 0x014},
628+ [DBG_PLE_HIF_TXCMD_PG_INFO] = { DBG_INVALID_BASE, 0x390},
629+ [DBG_PLE_PG_CPU_GROUP] = { DBG_INVALID_BASE, 0x018},
630+ [DBG_PLE_CPU_PG_INFO] = { DBG_INVALID_BASE, 0x394},
631+ [DBG_PLE_FL_QUE_CTRL] = { DBG_INVALID_BASE, 0x3e0},
632+ [DBG_PLE_NATIVE_TXCMD_Q_EMPTY] = { DBG_INVALID_BASE, 0x370},
633+ [DBG_PLE_TXCMD_Q_EMPTY] = { DBG_INVALID_BASE, 0x374},
634+ [DBG_PLE_AC_QEMPTY] = { DBG_INVALID_BASE, 0x600},
635+ [DBG_PLE_AC_OFFSET] = { DBG_INVALID_BASE, 0x080},
636+ [DBG_PLE_STATION_PAUSE] = { DBG_INVALID_BASE, 0x100},
637+ [DBG_PLE_DIS_STA_MAP] = { DBG_INVALID_BASE, 0x180},
638+ [DBG_PSE_PBUF_CTRL] = { DBG_INVALID_BASE, 0x004},
639+ [DBG_PSE_FREEPG_CNT] = { DBG_INVALID_BASE, 0x380},
640+ [DBG_PSE_FREEPG_HEAD_TAIL] = { DBG_INVALID_BASE, 0x384},
641+ [DBG_PSE_HIF0_PG_INFO] = { DBG_INVALID_BASE, 0x150},
642+ [DBG_PSE_PG_HIF1_GROUP] = { DBG_INVALID_BASE, 0x154},
643+ [DBG_PSE_HIF1_PG_INFO] = { DBG_INVALID_BASE, 0x160},
644+ [DBG_PSE_PG_CPU_GROUP] = { DBG_INVALID_BASE, 0x118},
645+ [DBG_PSE_CPU_PG_INFO] = { DBG_INVALID_BASE, 0x158},
646+ [DBG_PSE_PG_PLE_GROUP] = { DBG_INVALID_BASE, 0x11c},
647+ [DBG_PSE_PLE_PG_INFO] = { DBG_INVALID_BASE, 0x15c},
648+ [DBG_PSE_PG_LMAC0_GROUP] = { DBG_INVALID_BASE, 0x124},
649+ [DBG_PSE_LMAC0_PG_INFO] = { DBG_INVALID_BASE, 0x164},
650+ [DBG_PSE_PG_LMAC1_GROUP] = { DBG_INVALID_BASE, 0x128},
651+ [DBG_PSE_LMAC1_PG_INFO] = { DBG_INVALID_BASE, 0x168},
652+ [DBG_PSE_PG_LMAC2_GROUP] = { DBG_INVALID_BASE, 0x12c},
653+ [DBG_PSE_LMAC2_PG_INFO] = { DBG_INVALID_BASE, 0x16c},
654+ [DBG_PSE_PG_LMAC3_GROUP] = { DBG_INVALID_BASE, 0x130},
655+ [DBG_PSE_LMAC3_PG_INFO] = { DBG_INVALID_BASE, 0x17c},
656+ [DBG_PSE_PG_MDP_GROUP] = { DBG_INVALID_BASE, 0x134},
657+ [DBG_PSE_MDP_PG_INFO] = { DBG_INVALID_BASE, 0x174},
658+ [DBG_PSE_PG_PLE1_GROUP] = { DBG_INVALID_BASE, 0x120},
659+ [DBG_PSE_PLE1_PG_INFO] = { DBG_INVALID_BASE, 0x160},
660+ [DBG_AGG_AALCR0] = { DBG_INVALID_BASE, 0x028},
661+ [DBG_AGG_AALCR1] = { DBG_INVALID_BASE, 0x144},
662+ [DBG_AGG_AALCR2] = { DBG_INVALID_BASE, 0x14c},
663+ [DBG_AGG_AALCR3] = { DBG_INVALID_BASE, 0x154},
664+ [DBG_AGG_AALCR4] = { DBG_INVALID_BASE, 0x02c},
665+ [DBG_AGG_B0BRR0] = { DBG_INVALID_BASE, 0x08c},
666+ [DBG_AGG_B1BRR0] = { DBG_INVALID_BASE, 0x148},
667+ [DBG_AGG_B2BRR0] = { DBG_INVALID_BASE, 0x150},
668+ [DBG_AGG_B3BRR0] = { DBG_INVALID_BASE, 0x158},
669+ [DBG_AGG_AWSCR0] = { DBG_INVALID_BASE, 0x05c},
670+ [DBG_AGG_PCR0] = { DBG_INVALID_BASE, 0x06c},
671+ [DBG_AGG_TTCR0] = { DBG_INVALID_BASE, 0x07c},
672+ [DBG_MIB_M0ARNG0] = { DBG_INVALID_BASE, 0x0b0},
673+ [DBG_MIB_M0DR2] = { DBG_INVALID_BASE, 0x7dc},
674+ [DBG_MIB_M0DR13] = { DBG_INVALID_BASE, 0x7ec},
675+};
676+
677+static const struct __dbg_mask mt7915_dbg_mask[] = {
678+ [DBG_MIB_M0SDR10_RX_MDRDY_COUNT]= {25, 0},
679+ [DBG_MIB_M0SDR14_AMPDU] = {23, 0},
680+ [DBG_MIB_M0SDR15_AMPDU_ACKED] = {23, 0},
681+ [DBG_MIB_RX_FCS_ERROR_COUNT] = {15, 0},
682+};
683+
684+static const struct __dbg_mask mt7916_dbg_mask[] = {
685+ [DBG_MIB_M0SDR10_RX_MDRDY_COUNT]= {31, 0},
686+ [DBG_MIB_M0SDR14_AMPDU] = {31, 0},
687+ [DBG_MIB_M0SDR15_AMPDU_ACKED] = {31, 0},
688+ [DBG_MIB_RX_FCS_ERROR_COUNT] = {31, 16},
689+};
690+
691+/* used to differentiate between generations */
692+struct mt7915_dbg_reg_desc {
693+ const u32 id;
694+ const u32 *base_rev;
695+ const struct __dbg_reg *reg_rev;
696+ const struct __dbg_mask *mask_rev;
697+};
698+
699+static const struct mt7915_dbg_reg_desc dbg_reg_s[] = {
700+ { 0x7915,
701+ mt7915_dbg_base,
702+ mt7915_dbg_reg,
703+ mt7915_dbg_mask
704+ },
705+ { 0x7906,
706+ mt7916_dbg_base,
707+ mt7916_dbg_reg,
708+ mt7916_dbg_mask
709+ },
710+ { 0x7986,
711+ mt7986_dbg_base,
712+ mt7916_dbg_reg,
713+ mt7916_dbg_mask
714+ },
715+};
716+
717+#define __DBG_REG_MAP(_dev, id, ofs) ((_dev)->dbg_reg->base_rev[(id)] + (ofs))
718+#define __DBG_REG_BASE(_dev, id) ((_dev)->dbg_reg->reg_rev[(id)].base)
719+#define __DBG_REG_OFFS(_dev, id) ((_dev)->dbg_reg->reg_rev[(id)].offs)
720+
721+#define __DBG_MASK(_dev, id) GENMASK((_dev)->dbg_reg->mask_rev[(id)].end, \
722+ (_dev)->dbg_reg->mask_rev[(id)].start)
723+#define __DBG_REG(_dev, id) __DBG_REG_MAP((_dev), __DBG_REG_BASE((_dev), (id)), \
724+ __DBG_REG_OFFS((_dev), (id)))
725+
726+#define __DBG_FIELD_GET(id, _reg) (((_reg) & __DBG_MASK(dev, (id))) >> \
727+ dev->dbg_reg->mask_rev[(id)].start)
728+#define __DBG_FIELD_PREP(id, _reg) (((_reg) << dev->dbg_reg->mask_rev[(id)].start) & \
729+ __DBG_MASK(dev, (id)))
730+
731+
732+#define MT_DBG_TX_RING_BASE __DBG_REG(dev, DBG_TX_RING_BASE)
733+#define MT_DBG_RX_EVENT_RING_BASE __DBG_REG(dev, DBG_RX_EVENT_RING_BASE)
734+#define MT_DBG_RX_STS_RING_BASE __DBG_REG(dev, DBG_RX_STS_RING_BASE)
735+#define MT_DBG_RX_DATA_RING_BASE __DBG_REG(dev, DBG_RX_DATA_RING_BASE)
736+
737+#define MT_DBG_TX_RING_CTRL(n) (MT_DBG_TX_RING_BASE + (0x10 * (n)))
738+#define MT_DBG_RX_DATA_RING_CTRL(n) (MT_DBG_RX_DATA_RING_BASE + (0x10 * (n)))
739+#define MT_DBG_RX_EVENT_RING_CTRL(n) (MT_DBG_RX_EVENT_RING_BASE + (0x10 * (n)))
740+
741+/* WFDMA COMMON */
742+#define MT_DBG_INT_SOURCE_CSR __DBG_REG(dev, DBG_INT_SOURCE_CSR)
743+#define MT_DBG_INT_MASK_CSR __DBG_REG(dev, DBG_INT_MASK_CSR)
744+#define MT_DBG_INT1_SOURCE_CSR __DBG_REG(dev, DBG_INT1_SOURCE_CSR)
745+#define MT_DBG_INT1_MASK_CSR __DBG_REG(dev, DBG_INT1_MASK_CSR)
746+
747+/* WFDMA0 */
748+#define MT_DBG_WFDMA0(_ofs) __DBG_REG_MAP(dev, MT_DBG_WFDMA0_BASE, (_ofs))
749+
750+#define MT_DBG_WFDMA0_INT_SOURCE_CSR MT_DBG_WFDMA0(0x200)
751+#define MT_DBG_WFDMA0_INT_MASK_CSR MT_DBG_WFDMA0(0x204)
752+
753+#define MT_DBG_WFDMA0_GLO_CFG MT_DBG_WFDMA0(0x208)
754+#define MT_DBG_WFDMA0_GLO_CFG_TX_DMA_EN BIT(0)
755+#define MT_DBG_WFDMA0_GLO_CFG_RX_DMA_EN BIT(2)
756+#define MT_DBG_WFDMA0_GLO_CFG_TX_BUSY_MASK BIT(1)
757+#define MT_DBG_WFDMA0_GLO_CFG_RX_BUSY_MASK BIT(3)
758+
759+
760+/* WFDMA1 */
761+#define MT_DBG_WFDMA1(_ofs) __DBG_REG_MAP(dev, MT_DBG_WFDMA1_BASE, (_ofs))
762+#define MT_DBG_WFDMA1_INT_SOURCE_CSR MT_DBG_WFDMA1(0x200)
763+#define MT_DBG_WFDMA1_INT_MASK_CSR MT_DBG_WFDMA1(0x204)
764+
765+#define MT_DBG_WFDMA1_GLO_CFG MT_DBG_WFDMA1(0x208)
766+
767+#define MT_DBG_WFDMA1_GLO_CFG_TX_DMA_EN BIT(0)
768+#define MT_DBG_WFDMA1_GLO_CFG_RX_DMA_EN BIT(2)
769+#define MT_DBG_WFDMA1_GLO_CFG_TX_BUSY_MASK BIT(1)
770+#define MT_DBG_WFDMA1_GLO_CFG_RX_BUSY_MASK BIT(3)
771+
772+/* WFDMA0 PCIE1 */
773+#define MT_DBG_WFDMA0_PCIE1(_ofs) __DBG_REG_MAP(dev, MT_DBG_WFDMA0_PCIE1_BASE, (_ofs))
774+
775+#define MT_DBG_WFDMA0_PCIE1_INT_SOURCE_CSR MT_DBG_WFDMA0_PCIE1(0x200)
776+#define MT_DBG_WFDMA0_PCIE1_INT_MASK_CSR MT_DBG_WFDMA0_PCIE1(0x204)
777+#define MT_DBG_WFDMA0_PCIE1_GLO_CFG MT_DBG_WFDMA0_PCIE1(0x208)
778+#define MT_DBG_WFDMA0_PCIE1_RX1_CTRL0 MT_DBG_WFDMA1_PCIE1(0x510)
779+
780+#define MT_DBG_WFDMA0_PCIE1_GLO_CFG_TX_DMA_EN BIT(0)
781+#define MT_DBG_WFDMA0_PCIE1_GLO_CFG_TX_BUSY_MASK BIT(1)
782+#define MT_DBG_WFDMA0_PCIE1_GLO_CFG_RX_DMA_EN BIT(2)
783+#define MT_DBG_WFDMA0_PCIE1_GLO_CFG_RX_BUSY_MASK BIT(3)
784+
785+/* WFDMA1 PCIE1 */
786+#define MT_DBG_WFDMA1_PCIE1(_ofs) __DBG_REG_MAP(dev, MT_DBG_WFDMA1_PCIE1_BASE, (_ofs))
787+#define MT_DBG_WFDMA1_PCIE1_INT_SOURCE_CSR MT_DBG_WFDMA1_PCIE1(0x200)
788+#define MT_DBG_WFDMA1_PCIE1_INT_MASK_CSR MT_DBG_WFDMA1_PCIE1(0x204)
789+#define MT_DBG_WFDMA1_PCIE1_GLO_CFG MT_DBG_WFDMA1_PCIE1(0x208)
790+#define MT_DBG_WFDMA1_PCIE1_TX19_CTRL0 MT_DBG_WFDMA1_PCIE1(0x330)
791+#define MT_DBG_WFDMA1_PCIE1_RX2_CTRL0 MT_DBG_WFDMA1_PCIE1(0x520)
792+
793+#define MT_DBG_WFDMA1_PCIE1_GLO_CFG_TX_DMA_EN BIT(0)
794+#define MT_DBG_WFDMA1_PCIE1_GLO_CFG_TX_BUSY_MASK BIT(1)
795+#define MT_DBG_WFDMA1_PCIE1_GLO_CFG_RX_DMA_EN BIT(2)
796+#define MT_DBG_WFDMA1_PCIE1_GLO_CFG_RX_BUSY_MASK BIT(3)
797+
798+#define MT_DBG_WFDMA_HOST_DMA0_GLO_CFG_RX_DMA_EN_MASK BIT(2)
799+#define MT_DBG_WFDMA_HOST_DMA0_GLO_CFG_TX_DMA_EN_MASK BIT(0)
800+#define MT_DBG_WFDMA_HOST_DMA0_GLO_CFG_RX_DMA_BUSY_MASK BIT(3)
801+#define MT_DBG_WFDMA_HOST_DMA0_GLO_CFG_TX_DMA_BUSY_MASK BIT(1)
802+
803+
804+/* WF DMA TOP: band 0(0x820E7000),band 1(0x820F7000) */
805+#define MT_DBG_WF_DMA_BASE(_band) ((_band) ? 0x820F7000 : 0x820E7000)
806+#define MT_DBG_WF_DMA(_band, ofs) (MT_WF_DMA_BASE(_band) + (ofs))
807+
808+#define MT_DBG_DMA_DCR0(_band) MT_DBG_WF_DMA((_band), 0x000)
809+#define MT_DBG_DMA_DCR0_MAX_RX_LEN GENMASK(15, 3)
810+#define MT_DBG_DMA_DCR0_RXD_G5_EN BIT(23)
811+
812+#define MT_DBG_DMA_ICSC_FR0(_band) MT_DBG_WF_DMA((_band), __DBG_REG_OFFS(dev, DBG_DMA_ICSC_FR0))
813+#define MT_DBG_DMA_ICSC_FR0_RXBF_EN BIT(25)
814+#define MT_DBG_DMA_ICSC_FR0_EN BIT(24)
815+#define MT_DBG_DMA_ICSC_FR0_TOUT_MASK GENMASK(23, 16)
816+#define MT_DBG_DMA_ICSC_FR0_PID_MASK GENMASK(9, 8)
817+#define MT_DBG_DMA_ICSC_FR0_QID_MASK GENMASK(6, 0)
818+
819+#define MT_DBG_DMA_ICSC_FR1(_band) MT_DBG_WF_DMA((_band), __DBG_REG_OFFS(dev, DBG_DMA_ICSC_FR1))
820+#define MT_DBG_DMA_ICSC_FR1_AGG_SIZE_MASK GENMASK(26, 16)
821+#define MT_DBG_DMA_ICSC_FR1_MAX_FRAME_SIZE_MASK GENMASK(10, 0)
822+
823+/* TMAC: band 0(0x820e4000), band 1(0x820f4000) */
824+#define MT_DBG_WF_TMAC_BASE(_band) ((_band) ? 0x820f4000 : 0x820e4000)
825+#define MT_DBG_WF_TMAC(_band, ofs) (MT_DBG_WF_TMAC_BASE(_band) + (ofs))
826+
827+#define MT_DBG_TMAC_ICSCR0(_band) MT_DBG_WF_TMAC((_band), __DBG_REG_OFFS(dev, DBG_TMAC_ICSCR0))
828+#define MT_DBG_TMAC_ICSCR0_ICSRPT_EN BIT(0)
829+
830+/* RMAC: band 0(0x820E5000), band 1(0x820f5000) */
831+#define MT_DBG_WF_RMAC_BASE(_band) ((_band) ? 0x820f5000 : 0x820E5000)
832+#define MT_DBG_WF_RMAC(_band, ofs) (MT_DBG_WF_RMAC_BASE(_band) + (ofs))
833+
834+#define MT_DBG_RMAC_RXICSRPT(_band) MT_DBG_WF_RMAC((_band), __DBG_REG_OFFS(dev, DBG_RMAC_RXICSRPT))
835+#define MT_DBG_RMAC_RXICSRPT_ICSRPT_EN BIT(0)
836+
837+/* MIB: band 0(0x820ed000), band 1(0x820fd000) */
838+#define MT_DBG_MIB_BASE(_band) ((_band) ? 0x820fd000 : 0x820ed000)
839+#define MT_DBG_MIB(_band, ofs) (MT_DBG_MIB_BASE(_band) + (ofs))
840+
841+
842+#define MT_DBG_MIB_M0SCR0(_band) MT_DBG_MIB((_band), 0x00)
843+#define MT_DBG_MIB_M0PBSCR(_band) MT_DBG_MIB((_band), 0x04)
844+
845+#define MT_DBG_MIB_M0SDR0(_band) MT_DBG_MIB((_band), __DBG_REG_OFFS(dev, DBG_MIB_M0SDR0))
846+#define MT_DBG_MIB_M0SDR3(_band) MT_DBG_MIB((_band), __DBG_REG_OFFS(dev, DBG_MIB_M0SDR3))
847+#define MT_DBG_MIB_RX_FCS_ERROR_COUNT_MASK __DBG_MASK(dev, DBG_MIB_RX_FCS_ERROR_COUNT)
848+#define MT_DBG_MIB_M0SDR4(_band) MT_DBG_MIB((_band), __DBG_REG_OFFS(dev, DBG_MIB_M0SDR4))
849+#define MT_DBG_MIB_M0SDR5(_band) MT_DBG_MIB((_band), __DBG_REG_OFFS(dev, DBG_MIB_M0SDR5))
850+#define MT_DBG_MIB_M0SDR6(_band) MT_DBG_MIB((_band), 0x20)
851+#define MT_DBG_MIB_M0SDR7(_band) MT_DBG_MIB((_band), __DBG_REG_OFFS(dev, DBG_MIB_M0SDR7))
852+#define MT_DBG_MIB_M0SDR8(_band) MT_DBG_MIB((_band), __DBG_REG_OFFS(dev, DBG_MIB_M0SDR8))
853+#define MT_DBG_MIB_M0SDR9(_band) MT_DBG_MIB((_band), __DBG_REG_OFFS(dev, DBG_MIB_M0SDR9))
854+#define MT_DBG_MIB_M0SDR10(_band) MT_DBG_MIB((_band), __DBG_REG_OFFS(dev, DBG_MIB_M0SDR10))
855+#define MT_DBG_MIB_M0SDR10_RX_MDRDY_COUNT_MASK __DBG_MASK(dev, DBG_MIB_M0SDR10_RX_MDRDY_COUNT)
856+#define MT_DBG_MIB_M0SDR11(_band) MT_DBG_MIB((_band), __DBG_REG_OFFS(dev, DBG_MIB_M0SDR11))
857+
858+#define MT_DBG_MIB_M0SDR12(_band) MT_DBG_MIB((_band), __DBG_REG_OFFS(dev, DBG_MIB_M0SDR12))
859+
860+#define MT_DBG_MIB_M0SDR14(_band) MT_DBG_MIB((_band), __DBG_REG_OFFS(dev, DBG_MIB_M0SDR14))
861+#define MT_DBG_MIB_M0SDR14_AMPDU_MASK __DBG_MASK(dev, DBG_MIB_M0SDR14_AMPDU)
862+#define MT_DBG_MIB_M0SDR15(_band) MT_DBG_MIB((_band), __DBG_REG_OFFS(dev, DBG_MIB_M0SDR15))
863+#define MT_DBG_MIB_M0SDR15_AMPDU_ACKED_MASK __DBG_MASK(dev, DBG_MIB_M0SDR15_AMPDU_ACKED)
864+#define MT_DBG_MIB_M0SDR16(_band) MT_DBG_MIB((_band), __DBG_REG_OFFS(dev, DBG_MIB_M0SDR16))
865+#define MT_DBG_MIB_M0SDR17(_band) MT_DBG_MIB((_band), __DBG_REG_OFFS(dev, DBG_MIB_M0SDR17))
866+#define MT_DBG_MIB_M0SDR18(_band) MT_DBG_MIB((_band), __DBG_REG_OFFS(dev, DBG_MIB_M0SDR18))
867+#define MT_DBG_MIB_M0SDR19(_band) MT_DBG_MIB((_band), __DBG_REG_OFFS(dev, DBG_MIB_M0SDR19))
868+#define MT_DBG_MIB_M0SDR20(_band) MT_DBG_MIB((_band), __DBG_REG_OFFS(dev, DBG_MIB_M0SDR20))
869+#define MT_DBG_MIB_M0SDR21(_band) MT_DBG_MIB((_band), __DBG_REG_OFFS(dev, DBG_MIB_M0SDR21))
870+#define MT_DBG_MIB_M0SDR22(_band) MT_DBG_MIB((_band), __DBG_REG_OFFS(dev, DBG_MIB_M0SDR22))
871+#define MT_DBG_MIB_M0SDR23(_band) MT_DBG_MIB((_band), __DBG_REG_OFFS(dev, DBG_MIB_M0SDR23))
872+#define MT_DBG_MIB_M0DR0(_band) MT_DBG_MIB((_band), __DBG_REG_OFFS(dev, DBG_MIB_M0DR0))
873+#define MT_DBG_MIB_M0DR1(_band) MT_DBG_MIB((_band), __DBG_REG_OFFS(dev, DBG_MIB_M0DR1))
874+
875+#define MT_DBG_MIB_MUBF(_band) MT_DBG_MIB((_band), __DBG_REG_OFFS(dev, DBG_MIB_MUBF))
876+#define MT_DBG_MIB_M0DR6(_band) MT_DBG_MIB((_band), __DBG_REG_OFFS(dev, DBG_MIB_M0DR6))
877+#define MT_DBG_MIB_M0DR7(_band) MT_DBG_MIB((_band), __DBG_REG_OFFS(dev, DBG_MIB_M0DR7))
878+#define MT_DBG_MIB_M0DR8(_band) MT_DBG_MIB((_band), __DBG_REG_OFFS(dev, DBG_MIB_M0DR8))
879+#define MT_DBG_MIB_M0DR9(_band) MT_DBG_MIB((_band), __DBG_REG_OFFS(dev, DBG_MIB_M0DR9))
880+#define MT_DBG_MIB_M0DR10(_band) MT_DBG_MIB((_band), __DBG_REG_OFFS(dev, DBG_MIB_M0DR10))
881+#define MT_DBG_MIB_M0DR11(_band) MT_DBG_MIB((_band), __DBG_REG_OFFS(dev, DBG_MIB_M0DR11))
882+ #define MT_DBG_MIB_M0DR12(_band) MT_DBG_MIB((_band), __DBG_REG_OFFS(dev, DBG_MIB_M0DR12))
883+
884+/* WTBLON TOP: 0x820D4000/pcie(0x34000) rbus(0x434000) */
885+#define MT_DBG_WTBLON_TOP_BASE 0x820D4000
886+#define MT_DBG_WTBLON_TOP(ofs) (MT_WTBLON_TOP_BASE + (ofs))
887+#define MT_DBG_WTBLON_TOP_WDUCR MT_DBG_WTBLON_TOP(__DBG_REG_OFFS(dev, DBG_WTBLON_WDUCR))
888+#define MT_DBG_WTBLON_TOP_WDUCR_GROUP GENMASK(2, 0)
889+
890+#define WF_WTBLON_TOP_B0BTCRn_ADDR (MT_DBG_WTBLON_TOP_BASE + 0x1000) // 5000
891+#define WF_WTBLON_TOP_B0BTBCRn_ADDR (MT_DBG_WTBLON_TOP_BASE + 0x1010) // 5010
892+#define WF_WTBLON_TOP_B0BRCRn_ADDR (MT_DBG_WTBLON_TOP_BASE + 0x1020) // 5020
893+#define WF_WTBLON_TOP_B0BRBCRn_ADDR (MT_DBG_WTBLON_TOP_BASE + 0x1030) // 5030
894+#define WF_WTBLON_TOP_B0BTDCRn_ADDR (MT_DBG_WTBLON_TOP_BASE + 0x1040) // 5040
895+#define WF_WTBLON_TOP_B0BRDCRn_ADDR (MT_DBG_WTBLON_TOP_BASE + 0x1050) // 5050
896+#define WF_WTBLON_TOP_B0MBTCRn_ADDR (MT_DBG_WTBLON_TOP_BASE + 0x1100) // 5100
897+#define WF_WTBLON_TOP_B0MBTBCRn_ADDR (MT_DBG_WTBLON_TOP_BASE + 0x1140) // 5140
898+#define WF_WTBLON_TOP_B0MBRCRn_ADDR (MT_DBG_WTBLON_TOP_BASE + 0x1180) // 5180
899+#define WF_WTBLON_TOP_B0MBRBCRn_ADDR (MT_DBG_WTBLON_TOP_BASE + 0x11C0) // 51C0
900+
901+#define WF_WTBLON_TOP_B1BTCRn_ADDR (MT_DBG_WTBLON_TOP_BASE + 0x1800) // 5800
902+
903+/* WTBLON TOP: 0x820C4000/pcie(0xa8000) rbus(0x4a8000) */
904+#define MT_DBG_UWTBL_TOP_BASE 0x820C4000
905+#define MT_DBG_UWTBL_TOP(ofs) (MT_DBG_UWTBL_TOP_BASE + (ofs))
906+
907+#define MT_DBG_UWTBL_TOP_WDUCR MT_DBG_WTBLON_TOP(__DBG_REG_OFFS(dev, DBG_UWTBL_WDUCR))
908+
909+#define MT_UWTBL_TOP_WDUCR_TARGET BIT(31)
910+#define MT_UWTBL_TOP_WDUCR_GROUP GENMASK(3, 0)
911+
912+
913+/* WTBL : 0x820D8000/pcie(0x38000) rbus(0x438000) */
914+#define MT_DBG_WTBL_BASE 0x820D8000
915+
916+/* PLE related CRs. */
917+#define MT_DBG_PLE_BASE 0x820C0000
918+#define MT_DBG_PLE(ofs) (MT_DBG_PLE_BASE + (ofs))
919+
920+#define MT_DBG_PLE_DRR_TAB_CTRL MT_DBG_PLE(__DBG_REG_OFFS(dev, DBG_PLE_DRR_TABLE_CTRL))
921+#define MT_DBG_PLE_DRR_TAB_RD_OFS __DBG_REG_OFFS(dev, DBG_PLE_DRR_TABLE_RDATA)
922+
923+#define MT_DBG_PLE_DRR_TABLE_RDATA0 MT_DBG_PLE(MT_DBG_PLE_DRR_TAB_RD_OFS + 0x0)
924+#define MT_DBG_PLE_DRR_TABLE_RDATA1 MT_DBG_PLE(MT_DBG_PLE_DRR_TAB_RD_OFS + 0x4)
925+#define MT_DBG_PLE_DRR_TABLE_RDATA2 MT_DBG_PLE(MT_DBG_PLE_DRR_TAB_RD_OFS + 0x8)
926+#define MT_DBG_PLE_DRR_TABLE_RDATA3 MT_DBG_PLE(MT_DBG_PLE_DRR_TAB_RD_OFS + 0xc)
927+#define MT_DBG_PLE_DRR_TABLE_RDATA4 MT_DBG_PLE(MT_DBG_PLE_DRR_TAB_RD_OFS + 0x10)
928+#define MT_DBG_PLE_DRR_TABLE_RDATA5 MT_DBG_PLE(MT_DBG_PLE_DRR_TAB_RD_OFS + 0x14)
929+#define MT_DBG_PLE_DRR_TABLE_RDATA6 MT_DBG_PLE(MT_DBG_PLE_DRR_TAB_RD_OFS + 0x18)
930+#define MT_DBG_PLE_DRR_TABLE_RDATA7 MT_DBG_PLE(MT_DBG_PLE_DRR_TAB_RD_OFS+ 0x1c)
931+
932+#define MT_DBG_PLE_PBUF_CTRL_ADDR MT_DBG_PLE(__DBG_REG_OFFS(dev, DBG_PLE_PBUF_CTRL))
933+#define MT_DBG_PLE_QUEUE_EMPTY MT_DBG_PLE(__DBG_REG_OFFS(dev, DBG_PLE_QUEUE_EMPTY))
934+#define MT_DBG_PLE_FREEPG_CNT MT_DBG_PLE(__DBG_REG_OFFS(dev, DBG_PLE_FREEPG_CNT))
935+#define MT_DBG_PLE_FREEPG_HEAD_TAIL MT_DBG_PLE(__DBG_REG_OFFS(dev, DBG_PLE_FREEPG_HEAD_TAIL))
936+#define MT_DBG_PLE_PG_HIF_GROUP MT_DBG_PLE(__DBG_REG_OFFS(dev, DBG_PLE_PG_HIF_GROUP))
937+#define MT_DBG_PLE_HIF_PG_INFO MT_DBG_PLE(__DBG_REG_OFFS(dev, DBG_PLE_HIF_PG_INFO))
938+#define MT_DBG_PLE_PG_HIF_TXCMD_GROUP MT_DBG_PLE(__DBG_REG_OFFS(dev, DBG_PLE_PG_HIF_TXCMD_GROUP))
939+#define MT_DBG_PLE_HIF_TXCMD_PG_INFO MT_DBG_PLE(__DBG_REG_OFFS(dev, DBG_PLE_HIF_TXCMD_PG_INFO))
940+#define MT_DBG_PLE_PG_CPU_GROUP MT_DBG_PLE(__DBG_REG_OFFS(dev, DBG_PLE_PG_CPU_GROUP))
941+#define MT_DBG_PLE_CPU_PG_INFO MT_DBG_PLE(__DBG_REG_OFFS(dev, DBG_PLE_CPU_PG_INFO))
942+#define PLE_FL_QUE_CTRL_OFFSET __DBG_REG_OFFS(dev, DBG_PLE_FL_QUE_CTRL)
943+#define MT_DBG_PLE_FL_QUE_CTRL0 MT_DBG_PLE(PLE_FL_QUE_CTRL_OFFSET + 0x0)
944+#define MT_DBG_PLE_FL_QUE_CTRL1 MT_DBG_PLE(PLE_FL_QUE_CTRL_OFFSET + 0x4)
945+#define MT_DBG_PLE_FL_QUE_CTRL2 MT_DBG_PLE(PLE_FL_QUE_CTRL_OFFSET + 0x8)
946+#define MT_DBG_PLE_FL_QUE_CTRL3 MT_DBG_PLE(PLE_FL_QUE_CTRL_OFFSET + 0xc)
947+#define MT_DBG_PLE_NATIVE_TXCMD_Q_EMPTY MT_DBG_PLE(__DBG_REG_OFFS(dev, DBG_PLE_NATIVE_TXCMD_Q_EMPTY))
948+#define MT_DBG_PLE_TXCMD_Q_EMPTY MT_DBG_PLE(__DBG_REG_OFFS(dev, DBG_PLE_TXCMD_Q_EMPTY))
949+
950+#define MT_DBG_PLE_PBUF_CTRL_PAGE_SIZE_MASK BIT(31)
951+#define MT_DBG_PLE_PBUF_CTRL_OFFSET_MASK GENMASK(25, 17)
952+#define MT_DBG_PLE_PBUF_CTRL_TOTAL_PAGE_NUM_MASK GENMASK(11, 0)
953+
954+#define MT_DBG_PLE_FREEPG_CNT_FREEPG_CNT_MASK GENMASK(11, 0)
955+#define MT_DBG_PLE_FREEPG_CNT_FFA_CNT_MASK GENMASK(27, 16)
956+#define MT_DBG_PLE_FREEPG_HEAD_TAIL_FREEPG_TAIL_MASK GENMASK(27, 16)
957+#define MT_DBG_PLE_FREEPG_HEAD_TAIL_FREEPG_HEAD_MASK GENMASK(11, 0)
958+#define MT_DBG_PLE_PG_HIF_GROUP_HIF_MAX_QUOTA_MASK GENMASK(27, 16)
959+#define MT_DBG_PLE_PG_HIF_GROUP_HIF_MIN_QUOTA_MASK GENMASK(11, 0)
960+
961+#define MT_DBG_PLE_HIF_PG_INFO_HIF_SRC_CNT_MASK GENMASK(27, 16)
962+#define MT_DBG_PLE_HIF_PG_INFO_HIF_RSV_CNT_MASK GENMASK(11, 0)
963+
964+#define MT_DBG_PLE_PG_HIF_TXCMD_GROUP_HIF_TXCMD_MAX_QUOTA_MASK GENMASK(27, 16)
965+#define MT_DBG_PLE_PG_HIF_TXCMD_GROUP_HIF_TXCMD_MIN_QUOTA_MASK GENMASK(11, 0)
966+
967+#define MT_DBG_PLE_HIF_TXCMD_PG_INFO_HIF_TXCMD_SRC_CNT_MASK GENMASK(27, 16)
968+#define MT_DBG_PLE_HIF_TXCMD_PG_INFO_HIF_TXCMD_RSV_CNT_MASK GENMASK(11, 0)
969+
970+#define MT_DBG_PLE_TXCMD_PG_INFO_HIF_TXCMD_SRC_CNT_MASK GENMASK(27, 16)
971+#define MT_DBG_PLE_TXCMD_PG_INFO_HIF_TXCMD_RSV_CNT_MASK GENMASK(11, 0)
972+
973+#define MT_DBG_PLE_PG_CPU_GROUP_CPU_MAX_QUOTA_MASK GENMASK(27, 16)
974+#define MT_DBG_PLE_PG_CPU_GROUP_CPU_MIN_QUOTA_MASK GENMASK(11, 0)
975+
976+#define MT_DBG_PLE_CPU_PG_INFO_CPU_SRC_CNT_MASK GENMASK(27, 16)
977+#define MT_DBG_PLE_CPU_PG_INFO_CPU_RSV_CNT_MASK GENMASK(11, 0)
978+
979+#define MT_DBG_PLE_Q_EMPTY_ALL_AC_EMPTY_MASK BIT(24)
980+#define MT_DBG_PLE_FL_QUE_CTRL0_EXECUTE_MASK BIT(31)
981+#define MT_DBG_PLE_FL_QUE_CTRL0_Q_BUF_QID_MASK GENMASK(30, 24)
982+
983+#define MT_PLE_FL_QUE_CTRL0_Q_BUF_QID_SHFT 24
984+#define MT_PLE_FL_QUE_CTRL0_Q_BUF_PID_SHFT 10
985+
986+#define MT_DBG_PLE_FL_QUE_CTRL2_Q_TAIL_FID_MASK GENMASK(27, 16)
987+#define MT_DBG_PLE_FL_QUE_CTRL2_Q_HEAD_FID_MASK GENMASK(11, 0)
988+#define MT_DBG_PLE_FL_QUE_CTRL3_Q_PKT_NUM_MASK GENMASK(11, 0)
989+
990+#define MT_DBG_PLE_STATION_PAUSE(n) MT_DBG_PLE(__DBG_REG_OFFS(dev, DBG_PLE_STATION_PAUSE) + ((n) << 2))
991+#define MT_DBG_PLE_DIS_STA_MAP(n) MT_DBG_PLE(__DBG_REG_OFFS(dev, DBG_PLE_DIS_STA_MAP) + ((n) << 2))
992+#define MT_DBG_PLE_AC_QEMPTY(ac, n) MT_DBG_PLE(__DBG_REG_OFFS(dev, DBG_PLE_AC_QEMPTY) + \
993+ __DBG_REG_OFFS(dev, DBG_PLE_AC_OFFSET) * (ac) + ((n) << 2))
994+
995+#define MT_DBG_PLE_AMSDU_PACK_MSDU_CNT(n) MT_DBG_PLE(0x10e0 + ((n) << 2))
996+
997+/* pseinfo related CRs. */
998+#define MT_DBG_PSE_BASE 0x820C8000
999+#define MT_DBG_PSE(ofs) (MT_DBG_PSE_BASE + (ofs))
1000+
1001+#define MT_DBG_PSE_PBUF_CTRL MT_DBG_PLE(__DBG_REG_OFFS(dev, DBG_PSE_PBUF_CTRL))
1002+#define MT_DBG_PSE_QUEUE_EMPTY MT_DBG_PLE(0x0b0)
1003+#define MT_DBG_PSE_FREEPG_CNT MT_DBG_PLE(__DBG_REG_OFFS(dev, DBG_PSE_FREEPG_CNT))
1004+#define MT_DBG_PSE_FREEPG_HEAD_TAIL MT_DBG_PLE(__DBG_REG_OFFS(dev, DBG_PSE_FREEPG_HEAD_TAIL))
1005+#define MT_DBG_PSE_PG_HIF0_GROUP MT_DBG_PLE(0x110)
1006+#define MT_DBG_PSE_HIF0_PG_INFO MT_DBG_PLE(__DBG_REG_OFFS(dev, DBG_PSE_HIF0_PG_INFO))
1007+#define MT_DBG_PSE_PG_HIF1_GROUP MT_DBG_PLE(__DBG_REG_OFFS(dev, DBG_PSE_PG_HIF1_GROUP))
1008+#define MT_DBG_PSE_HIF1_PG_INFO MT_DBG_PLE(__DBG_REG_OFFS(dev, DBG_PSE_HIF1_PG_INFO))
1009+#define MT_DBG_PSE_PG_CPU_GROUP MT_DBG_PLE(__DBG_REG_OFFS(dev, DBG_PSE_PG_CPU_GROUP))
1010+#define MT_DBG_PSE_CPU_PG_INFO MT_DBG_PLE(__DBG_REG_OFFS(dev, DBG_PSE_CPU_PG_INFO))
1011+#define MT_DBG_PSE_PG_LMAC0_GROUP MT_DBG_PLE(__DBG_REG_OFFS(dev, DBG_PSE_PG_LMAC0_GROUP))
1012+#define MT_DBG_PSE_LMAC0_PG_INFO MT_DBG_PLE(__DBG_REG_OFFS(dev, DBG_PSE_LMAC0_PG_INFO))
1013+#define MT_DBG_PSE_PG_LMAC1_GROUP MT_DBG_PLE(__DBG_REG_OFFS(dev, DBG_PSE_PG_LMAC1_GROUP))
1014+#define MT_DBG_PSE_LMAC1_PG_INFO MT_DBG_PLE(__DBG_REG_OFFS(dev, DBG_PSE_LMAC1_PG_INFO))
1015+#define MT_DBG_PSE_PG_LMAC2_GROUP MT_DBG_PLE(__DBG_REG_OFFS(dev, DBG_PSE_PG_LMAC2_GROUP))
1016+#define MT_DBG_PSE_LMAC2_PG_INFO MT_DBG_PLE(__DBG_REG_OFFS(dev, DBG_PSE_LMAC2_PG_INFO))
1017+#define MT_DBG_PSE_PG_PLE_GROUP MT_DBG_PLE(__DBG_REG_OFFS(dev, DBG_PSE_PG_PLE_GROUP))
1018+#define MT_DBG_PSE_PLE_PG_INFO MT_DBG_PLE(__DBG_REG_OFFS(dev, DBG_PSE_PLE_PG_INFO))
1019+#define MT_DBG_PSE_PG_LMAC3_GROUP MT_DBG_PLE(__DBG_REG_OFFS(dev, DBG_PSE_PG_LMAC3_GROUP))
1020+#define MT_DBG_PSE_LMAC3_PG_INFO MT_DBG_PLE(__DBG_REG_OFFS(dev, DBG_PSE_LMAC3_PG_INFO))
1021+#define MT_DBG_PSE_PG_MDP_GROUP MT_DBG_PLE(__DBG_REG_OFFS(dev, DBG_PSE_PG_MDP_GROUP))
1022+#define MT_DBG_PSE_MDP_PG_INFO MT_DBG_PLE(__DBG_REG_OFFS(dev, DBG_PSE_MDP_PG_INFO))
1023+#define MT_DBG_PSE_PG_PLE1_GROUP MT_DBG_PLE(__DBG_REG_OFFS(dev, DBG_PSE_PG_PLE1_GROUP))
1024+#define MT_DBG_PSE_PLE1_PG_INFO MT_DBG_PLE(__DBG_REG_OFFS(dev, DBG_PSE_PLE1_PG_INFO))
1025+
1026+#define MT_DBG_PSE_PBUF_CTRL_PAGE_SIZE_CFG_MASK BIT(31)
1027+#define MT_DBG_PSE_PBUF_CTRL_PBUF_OFFSET_MASK GENMASK(25, 17)
1028+#define MT_DBG_PSE_PBUF_CTRL_TOTAL_PAGE_NUM_MASK GENMASK(11, 0)
1029+#define MT_DBG_PSE_QUEUE_EMPTY_RLS_Q_EMTPY_MASK BIT(31)
1030+#define MT_DBG_PSE_QUEUE_EMPTY_MDP_RXIOC_QUEUE_EMPTY_MASK BIT(23)
1031+#define MT_DBG_PSE_QUEUE_EMPTY_MDP_TXIOC_QUEUE_EMPTY_MASK BIT(22)
1032+#define MT_DBG_PSE_QUEUE_EMPTY_SFD_PARK_QUEUE_EMPTY_MASK BIT(21)
1033+#define MT_DBG_PSE_QUEUE_EMPTY_SEC_RX_QUEUE_EMPTY_SHFT BIT(20)
1034+#define MT_DBG_PSE_QUEUE_EMPTY_SEC_TX_QUEUE_EMPTY_MASK BIT(19)
1035+#define MT_DBG_PSE_QUEUE_EMPTY_MDP_RX_QUEUE_EMPTY_MASK BIT(18)
1036+#define MT_DBG_PSE_QUEUE_EMPTY_MDP_TX_QUEUE_EMPTY_MASK BIT(17)
1037+#define MT_DBG_PSE_QUEUE_EMPTY_LMAC_TX_QUEUE_EMPTY_MASK BIT(16)
1038+#define MT_DBG_PSE_QUEUE_EMPTY_HIF_5_EMPTY_MASK BIT(13)
1039+#define MT_DBG_PSE_QUEUE_EMPTY_HIF_4_EMPTY_MASK BIT(12)
1040+#define MT_DBG_PSE_QUEUE_EMPTY_HIF_3_EMPTY_MASK BIT(11)
1041+#define MT_DBG_PSE_QUEUE_EMPTY_HIF_2_EMPTY_MASK BIT(10)
1042+#define MT_DBG_PSE_QUEUE_EMPTY_HIF_1_EMPTY_MASK BIT(9)
1043+#define MT_DBG_PSE_QUEUE_EMPTY_HIF_0_EMPTY_MASK BIT(8)
1044+#define MT_DBG_PSE_QUEUE_EMPTY_CPU_Q3_EMPTY_MASK BIT(3)
1045+#define MT_DBG_PSE_QUEUE_EMPTY_CPU_Q2_EMPTY_MASK BIT(2)
1046+#define MT_DBG_PSE_QUEUE_EMPTY_CPU_Q1_EMPTY_MASK BIT(1)
1047+#define MT_DBG_PSE_QUEUE_EMPTY_CPU_Q0_EMPTY_MASK BIT(0)
1048+#define MT_DBG_PSE_FREEPG_CNT_FFA_CNT_MASK GENMASK(27, 16)
1049+#define MT_DBG_PSE_FREEPG_CNT_FREEPG_CNT_MASK GENMASK(11, 0)
1050+#define MT_DBG_PSE_FREEPG_HEAD_TAIL_FREEPG_TAIL_MASK GENMASK(27, 16)
1051+#define MT_DBG_PSE_FREEPG_HEAD_TAIL_FREEPG_HEAD_MASK GENMASK(11, 0)
1052+#define MT_DBG_PSE_PG_HIF0_GROUP_HIF0_MAX_QUOTA_MASK GENMASK(27, 16)
1053+#define MT_DBG_PSE_PG_HIF0_GROUP_HIF0_MIN_QUOTA_MASK GENMASK(11, 0)
1054+#define MT_DBG_PSE_PG_HIF0_GROUP_HIF0_MAX_QUOTA_MASK GENMASK(27, 16)
1055+#define MT_DBG_PSE_PG_HIF0_GROUP_HIF0_MIN_QUOTA_MASK GENMASK(11, 0)
1056+#define MT_DBG_PSE_HIF0_PG_INFO_HIF0_SRC_CNT_MASK GENMASK(27, 16)
1057+#define MT_DBG_PSE_HIF0_PG_INFO_HIF0_RSV_CNT_MASK GENMASK(11, 0)
1058+#define MT_DBG_PSE_PG_HIF1_GROUP_HIF1_MAX_QUOTA_MASK GENMASK(27, 16)
1059+#define MT_DBG_PSE_PG_HIF1_GROUP_HIF1_MIN_QUOTA_MASK GENMASK(11, 0)
1060+#define MT_DBG_PSE_HIF1_PG_INFO_HIF1_SRC_CNT_MASK GENMASK(27, 16)
1061+#define MT_DBG_PSE_HIF1_PG_INFO_HIF1_RSV_CNT_MASK GENMASK(11, 0)
1062+#define MT_DBG_PSE_CPU_PG_INFO_CPU_SRC_CNT_MASK GENMASK(27, 16)
1063+#define MT_DBG_PSE_CPU_PG_INFO_CPU_RSV_CNT_MASK GENMASK(11, 0)
1064+#define MT_DBG_PSE_PG_PLE_GROUP_PLE_MAX_QUOTA_MASK GENMASK(27, 16)
1065+#define MT_DBG_PSE_PG_PLE_GROUP_PLE_MIN_QUOTA_MASK GENMASK(11, 0)
1066+#define MT_DBG_PSE_PG_CPU_GROUP_CPU_MAX_QUOTA_MASK GENMASK(27, 16)
1067+#define MT_DBG_PSE_PG_CPU_GROUP_CPU_MIN_QUOTA_MASK GENMASK(11, 0)
1068+#define MT_DBG_PSE_PLE_PG_INFO_PLE_SRC_CNT_MASK GENMASK(27, 16)
1069+#define MT_DBG_PSE_PLE_PG_INFO_PLE_RSV_CNT_MASK GENMASK(11, 0)
1070+#define MT_DBG_PSE_PG_LMAC0_GROUP_LMAC0_MAX_QUOTA_MASK GENMASK(27, 16)
1071+#define MT_DBG_PSE_PG_LMAC0_GROUP_LMAC0_MIN_QUOTA_MASK GENMASK(11, 0)
1072+#define MT_DBG_PSE_LMAC0_PG_INFO_LMAC0_SRC_CNT_MASK GENMASK(27, 16)
1073+#define MT_DBG_PSE_LMAC0_PG_INFO_LMAC0_RSV_CNT_MASK GENMASK(11, 0)
1074+#define MT_DBG_PSE_PG_LMAC1_GROUP_LMAC1_MAX_QUOTA_MASK GENMASK(27, 16)
1075+#define MT_DBG_TOP_PG_LMAC1_GROUP_LMAC1_MIN_QUOTA_MASK GENMASK(11, 0)
1076+#define MT_DBG_PSE_LMAC1_PG_INFO_LMAC1_SRC_CNT_MASK GENMASK(27, 16)
1077+#define MT_DBG_PSE_LMAC1_PG_INFO_LMAC1_RSV_CNT_MASK GENMASK(11, 0)
1078+#define MT_DBG_PSE_PG_LMAC2_GROUP_LMAC2_MAX_QUOTA_MASK GENMASK(27, 16)
1079+#define MT_DBG_PSE_PG_LMAC2_GROUP_LMAC2_MIN_QUOTA_MASK GENMASK(11, 0)
1080+#define MT_DBG_PSE_LMAC2_PG_INFO_LMAC2_SRC_CNT_MASK GENMASK(27, 16)
1081+#define MT_DBG_PSE_LMAC2_PG_INFO_LMAC2_RSV_CNT_MASK GENMASK(11, 0)
1082+#define MT_DBG_PSE_PG_LMAC3_GROUP_LMAC3_MAX_QUOTA_MASK GENMASK(27, 16)
1083+#define MT_DBG_TOP_PG_LMAC3_GROUP_LMAC3_MIN_QUOTA_MASK GENMASK(11, 0)
1084+#define MT_DBG_PSE_LMAC3_PG_INFO_LMAC3_SRC_CNT_MASK GENMASK(27, 16)
1085+#define MT_DBG_PSE_LMAC3_PG_INFO_LMAC3_RSV_CNT_MASK GENMASK(11, 0)
1086+#define MT_DBG_PSE_PG_LMAC3_GROUP_LMAC3_MAX_QUOTA_MASK GENMASK(27, 16)
1087+#define MT_DBG_TOP_PG_LMAC3_GROUP_LMAC3_MIN_QUOTA_MASK GENMASK(11, 0)
1088+#define MT_DBG_PSE_PG_MDP_GROUP_MDP_MAX_QUOTA_MASK GENMASK(27, 16)
1089+#define MT_DBG_PSE_PG_MDP_GROUP_MDP_MIN_QUOTA_MASK GENMASK(11, 0)
1090+#define MT_DBG_PSE_MDP_PG_INFO_MDP_SRC_CNT_MASK GENMASK(27, 16)
1091+#define MT_DBG_PSE_MDP_PG_INFO_MDP_RSV_CNT_MASK GENMASK(11, 0)
1092+
1093+#define MT_DBG_PSE_FL_QUE_CTRL_0_ADDR MT_DBG_PLE(0x1b0)
1094+#define MT_DBG_PSE_FL_QUE_CTRL_0_EXECUTE_MASK BIT(31)
1095+#define MT_DBG_PSE_FL_QUE_CTRL_0_Q_BUF_QID_SHFT 24
1096+#define MT_DBG_PSE_FL_QUE_CTRL_0_Q_BUF_PID_SHFT 10
1097+#define MT_DBG_PSE_FL_QUE_CTRL_0_Q_BUF_WLANID_MASK GENMASK(9, 0)
1098+
1099+#define MT_DBG_PSE_FL_QUE_CTRL_2_ADDR MT_DBG_PLE(0x1b8)
1100+#define MT_DBG_PSE_FL_QUE_CTRL_2_QUEUE_TAIL_FID_MASK GENMASK(27, 16)
1101+#define MT_DBG_PSE_FL_QUE_CTRL_2_QUEUE_HEAD_FID_MASK GENMASK(11, 0)
1102+
1103+#define MT_DBG_PSE_FL_QUE_CTRL_3_ADDR MT_DBG_PLE(0x1bc)
1104+#define MT_DBG_PSE_FL_QUE_CTRL_3_QUEUE_PKT_NUM_MASK GENMASK(11, 0)
1105+
1106+
1107+/* AGG */
1108+#define MT_DBG_AGG_BASE(_band) ((_band) ? 0x820f2000 : 0x820e2000)
1109+#define MT_DBG_AGG(_band, ofs) (MT_DBG_AGG_BASE(_band) + (ofs))
1110+
1111+#define MT_DBG_AGG_AALCR0(_band) MT_DBG_AGG((_band), __DBG_REG_OFFS(dev, DBG_AGG_AALCR0))
1112+#define MT_DBG_AGG_AALCR1(_band) MT_DBG_AGG((_band), __DBG_REG_OFFS(dev, DBG_AGG_AALCR1))
1113+#define MT_DBG_AGG_AALCR2(_band) MT_DBG_AGG((_band), __DBG_REG_OFFS(dev, DBG_AGG_AALCR2))
1114+#define MT_DBG_AGG_AALCR3(_band) MT_DBG_AGG((_band), __DBG_REG_OFFS(dev, DBG_AGG_AALCR3))
1115+#define MT_DBG_AGG_AALCR4(_band) MT_DBG_AGG((_band), __DBG_REG_OFFS(dev, DBG_AGG_AALCR4))
1116+#define MT_DBG_AGG_B0BRR0(_band) MT_DBG_AGG((_band), __DBG_REG_OFFS(dev, DBG_AGG_B0BRR0))
1117+#define MT_DBG_AGG_B1BRR0(_band) MT_DBG_AGG((_band), __DBG_REG_OFFS(dev, DBG_AGG_B1BRR0))
1118+#define MT_DBG_AGG_B2BRR0(_band) MT_DBG_AGG((_band), __DBG_REG_OFFS(dev, DBG_AGG_B2BRR0))
1119+#define MT_DBG_AGG_B3BRR0(_band) MT_DBG_AGG((_band), __DBG_REG_OFFS(dev, DBG_AGG_B3BRR0))
1120+#define MT_DBG_AGG_AWSCR(_band, n) MT_DBG_AGG((_band), __DBG_REG_OFFS(dev, DBG_AGG_AWSCR0) + ((n) << 2))
1121+#define MT_DBG_AGG_PCR(_band, n) MT_DBG_AGG((_band), __DBG_REG_OFFS(dev, DBG_AGG_PCR0) + ((n) << 2))
1122+#define MT_DBG_AGG_TTCR(_band, n) MT_DBG_AGG((_band), __DBG_REG_OFFS(dev, DBG_AGG_TTCR0) + ((n) << 2))
1123+#define MT_DBG_MIB_M0ARNG(_band, n) MT_DBG_MIB((_band), __DBG_REG_OFFS(dev, DBG_MIB_M0ARNG0) + ((n) << 2))
1124+#define MT_DBG_MIB_M0DR2(_band, n) MT_DBG_MIB((_band), __DBG_REG_OFFS(dev, DBG_MIB_M0DR2) + ((n) << 2))
1125+#define MT_DBG_MIB_M0DR13(_band, n) MT_DBG_MIB((_band), __DBG_REG_OFFS(dev, DBG_MIB_M0DR13) + ((n) << 2))
1126+
1127+#define MT_DBG_AGG_AALCR_ACx3_AGG_LIMIT_MASK GENMASK(31, 24)
1128+#define MT_DBG_AGG_AALCR_ACx2_AGG_LIMIT_MASK GENMASK(23, 16)
1129+#define MT_DBG_AGG_AALCR_ACx1_AGG_LIMIT_MASK GENMASK(15, 8)
1130+#define MT_DBG_AGG_AALCR_ACx0_AGG_LIMIT_MASK GENMASK(7, 0)
1131+#define MT_DBG_AGG_AALCR4_ALTX0_AGG_LIMIT_MASK GENMASK(7, 0)
1132+
1133+#define MT_DBG_AGG_AWSCR0_WINSIZE3_MASK GENMASK(31, 24)
1134+#define MT_DBG_AGG_AWSCR0_WINSIZE2_MASK GENMASK(23, 16)
1135+#define MT_DBG_AGG_AWSCR0_WINSIZE1_MASK GENMASK(15, 8)
1136+#define MT_DBG_AGG_AWSCR0_WINSIZE0_MASK GENMASK(7, 0)
1137+
1138+#define MT_DBG_AGG_AWSCR1_WINSIZE7_MASK GENMASK(31, 24)
1139+#define MT_DBG_AGG_AWSCR1_WINSIZE6_MASK GENMASK(23, 16)
1140+#define MT_DBG_AGG_AWSCR1_WINSIZE5_MASK GENMASK(15, 8)
1141+#define MT_DBG_AGG_AWSCR1_WINSIZE4_MASK GENMASK(7, 0)
1142+
1143+#define MT_DBG_AGG_AWSCR2_WINSIZEB_MASK GENMASK(31, 24)
1144+#define MT_DBG_AGG_AWSCR2_WINSIZEA_MASK GENMASK(23, 16)
1145+#define MT_DBG_AGG_AWSCR2_WINSIZE9_MASK GENMASK(15, 8)
1146+#define MT_DBG_AGG_AWSCR2_WINSIZE8_MASK GENMASK(7, 0)
1147+
1148+#define MT_DBG_AGG_AWSCR3_WINSIZEE_MASK GENMASK(23, 16)
1149+#define MT_DBG_AGG_AWSCR3_WINSIZED_MASK GENMASK(15, 8)
1150+#define MT_DBG_AGG_AWSCR3_WINSIZEC_MASK GENMASK(7, 0)
1151+
1152+#define MT_DBG_MIB_M0ARNG0_AGG_RANG_SEL3_MASK GENMASK(31, 24)
1153+#define MT_DBG_MIB_M0ARNG0_AGG_RANG_SEL2_MASK GENMASK(23, 16)
1154+#define MT_DBG_MIB_M0ARNG0_AGG_RANG_SEL1_MASK GENMASK(15, 8)
1155+#define MT_DBG_MIB_M0ARNG0_AGG_RANG_SEL0_MASK GENMASK(7, 0)
1156+
1157+#define MT_DBG_MIB_M0ARNG1_AGG_RANG_SEL7_MASK GENMASK(31, 24)
1158+#define MT_DBG_MIB_M0ARNG1_AGG_RANG_SEL6_MASK GENMASK(23, 16)
1159+#define MT_DBG_MIB_M0ARNG1_AGG_RANG_SEL5_MASK GENMASK(15, 8)
1160+#define MT_DBG_MIB_M0ARNG1_AGG_RANG_SEL4_MASK GENMASK(7, 0)
1161+
1162+#define MT_DBG_MIB_M0ARNG2_AGG_RANG_SEL11_MASK GENMASK(31, 24)
1163+#define MT_DBG_MIB_M0ARNG2_AGG_RANG_SEL10_MASK GENMASK(23, 16)
1164+#define MT_DBG_MIB_M0ARNG2_AGG_RANG_SEL9_MASK GENMASK(15, 8)
1165+#define MT_DBG_MIB_M0ARNG2_AGG_RANG_SEL8_MASK GENMASK(7, 0)
1166+
1167+#define MT_DBG_MIB_M0ARNG3_AGG_RANG_SEL14_MASK GENMASK(23, 16)
1168+#define MT_DBG_MIB_M0ARNG3_AGG_RANG_SEL13_MASK GENMASK(15, 8)
1169+#define MT_DBG_MIB_M0ARNG3_AGG_RANG_SEL12_MASK GENMASK(7, 0)
1170+
1171+#define MT_DBG_MIB_M0DR2_TRX_AGG_RANGE1_CNT_MASK GENMASK(31, 16)
1172+#define MT_DBG_MIB_M0DR2_TRX_AGG_RANGE0_CNT_MASK GENMASK(15, 0)
1173+#define MT_DBG_MIB_M0DR3_TRX_AGG_RANGE3_CNT_MASK GENMASK(31, 16)
1174+#define MT_DBG_MIB_M0DR3_TRX_AGG_RANGE2_CNT_MASK GENMASK(15, 0)
1175+#define MT_DBG_MIB_M0DR4_TRX_AGG_RANGE5_CNT_MASK GENMASK(31, 16)
1176+#define MT_DBG_MIB_M0DR4_TRX_AGG_RANGE4_CNT_MASK GENMASK(15, 0)
1177+#define MT_DBG_MIB_M0DR5_TRX_AGG_RANGE7_CNT_MASK GENMASK(31, 16)
1178+#define MT_DBG_MIB_M0DR5_TRX_AGG_RANGE6_CNT_MASK GENMASK(15, 0)
1179+#define MT_DBG_MIB_M0DR13_TRX_AGG_RANGE9_CNT_MASK GENMASK(31, 16)
1180+#define MT_DBG_MIB_M0DR13_TRX_AGG_RANGE8_CNT_MASK GENMASK(15, 0)
1181+#define MT_DBG_MIB_M0DR14_TRX_AGG_RANGE11_CNT_MASK GENMASK(31, 16)
1182+#define MT_DBG_MIB_M0DR14_TRX_AGG_RANGE10_CNT_MASK GENMASK(15, 0)
1183+#define MT_DBG_MIB_M0DR15_TRX_AGG_RANGE13_CNT_MASK GENMASK(31, 16)
1184+#define MT_DBG_MIB_M0DR15_TRX_AGG_RANGE12_CNT_MASK GENMASK(15, 0)
1185+#define MT_DBG_MIB_M0DR16_TRX_AGG_RANGE15_CNT_MASK GENMASK(31, 16)
1186+#define MT_DBG_MIB_M0DR16_TRX_AGG_RANGE14_CNT_MASK GENMASK(15, 0)
1187+
1188+/* mt7915 host DMA*/
1189+#define MT_DBG_INT_DMA1_R0_DONE BIT(0)
1190+#define MT_DBG_INT_DMA1_R1_DONE BIT(1)
1191+#define MT_DBG_INT_DMA1_R2_DONE BIT(2)
1192+
1193+#define MT_DBG_INT_DMA1_T16_DONE BIT(26)
1194+#define MT_DBG_INT_DMA1_T17_DONE BIT(27)
1195+#define MT_DBG_INT_DMA1_T18_DONE BIT(30)
1196+#define MT_DBG_INT_DMA1_T19_DONE BIT(31)
1197+#define MT_DBG_INT_DMA1_T20_DONE BIT(15)
1198+
1199+#define MT_DBG_EXT_WRAP_INT_DMA0_R0_DONE BIT(16)
1200+#define MT_DBG_EXT_WRAP_INT_DMA0_R1_DONE BIT(17)
1201+
1202+/* mt7986 host DMA */
1203+#define MT_DBG_INT_DMA0_R0_DONE BIT(0)
1204+#define MT_DBG_INT_DMA0_R1_DONE BIT(1)
1205+#define MT_DBG_INT_DMA0_R2_DONE BIT(2)
1206+#define MT_DBG_INT_DMA0_R3_DONE BIT(3)
1207+#define MT_DBG_INT_DMA0_R4_DONE BIT(22)
1208+#define MT_DBG_INT_DMA0_R5_DONE BIT(23)
1209+
1210+#define MT_DBG_INT_DMA0_T16_DONE BIT(26)
1211+#define MT_DBG_INT_DMA0_T17_DONE BIT(27)
1212+#define MT_DBG_INT_DMA0_T18_DONE BIT(30)
1213+#define MT_DBG_INT_DMA0_T19_DONE BIT(31)
1214+#define MT_DBG_INT_DMA0_T20_DONE BIT(25)
1215+
1216+/* MCU DMA */
1217+#define WF_WFDMA_MCU_DMA0_BASE 0x54000000
1218+#define WF_WFDMA_MCU_DMA0_HOST_INT_STA_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x200) // 0200
1219+#define WF_WFDMA_MCU_DMA0_HOST_INT_ENA_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0X204) // 0204
1220+#define WF_WFDMA_MCU_DMA0_WPDMA_GLO_CFG_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x208) // 0208
1221+#define WF_WFDMA_MCU_DMA0_WPDMA_GLO_CFG_RX_DMA_BUSY_MASK 0x00000008 // RX_DMA_BUSY[3]
1222+#define WF_WFDMA_MCU_DMA0_WPDMA_GLO_CFG_RX_DMA_BUSY_SHFT 3
1223+#define WF_WFDMA_MCU_DMA0_WPDMA_GLO_CFG_RX_DMA_EN_MASK 0x00000004 // RX_DMA_EN[2]
1224+#define WF_WFDMA_MCU_DMA0_WPDMA_GLO_CFG_RX_DMA_EN_SHFT 2
1225+#define WF_WFDMA_MCU_DMA0_WPDMA_GLO_CFG_TX_DMA_BUSY_MASK 0x00000002 // TX_DMA_BUSY[1]
1226+#define WF_WFDMA_MCU_DMA0_WPDMA_GLO_CFG_TX_DMA_BUSY_SHFT 1
1227+#define WF_WFDMA_MCU_DMA0_WPDMA_GLO_CFG_TX_DMA_EN_MASK 0x00000001 // TX_DMA_EN[0]
1228+#define WF_WFDMA_MCU_DMA0_WPDMA_GLO_CFG_TX_DMA_EN_SHFT 0
1229+
1230+#define WF_WFDMA_MCU_DMA1_BASE 0x55000000
1231+#define WF_WFDMA_MCU_DMA1_HOST_INT_STA_ADDR (WF_WFDMA_MCU_DMA1_BASE + 0x200) // 0200
1232+#define WF_WFDMA_MCU_DMA1_HOST_INT_ENA_ADDR (WF_WFDMA_MCU_DMA1_BASE + 0X204) // 0204
1233+#define WF_WFDMA_MCU_DMA1_WPDMA_GLO_CFG_ADDR (WF_WFDMA_MCU_DMA1_BASE + 0x208) // 0208
1234+#define WF_WFDMA_MCU_DMA1_WPDMA_GLO_CFG_RX_DMA_BUSY_MASK 0x00000008 // RX_DMA_BUSY[3]
1235+#define WF_WFDMA_MCU_DMA1_WPDMA_GLO_CFG_RX_DMA_BUSY_SHFT 3
1236+#define WF_WFDMA_MCU_DMA1_WPDMA_GLO_CFG_RX_DMA_EN_MASK 0x00000004 // RX_DMA_EN[2]
1237+#define WF_WFDMA_MCU_DMA1_WPDMA_GLO_CFG_RX_DMA_EN_SHFT 2
1238+#define WF_WFDMA_MCU_DMA1_WPDMA_GLO_CFG_TX_DMA_BUSY_MASK 0x00000002 // TX_DMA_BUSY[1]
1239+#define WF_WFDMA_MCU_DMA1_WPDMA_GLO_CFG_TX_DMA_BUSY_SHFT 1
1240+#define WF_WFDMA_MCU_DMA1_WPDMA_GLO_CFG_TX_DMA_EN_MASK 0x00000001 // TX_DMA_EN[0]
1241+#define WF_WFDMA_MCU_DMA1_WPDMA_GLO_CFG_TX_DMA_EN_SHFT 0
1242+#define WF_WFDMA_MCU_DMA1_WPDMA_TX_RING0_CTRL0_ADDR (WF_WFDMA_MCU_DMA1_BASE + 0x300) // 0300
1243+#define WF_WFDMA_MCU_DMA1_WPDMA_TX_RING1_CTRL0_ADDR (WF_WFDMA_MCU_DMA1_BASE + 0x310) // 0310
1244+#define WF_WFDMA_MCU_DMA1_WPDMA_TX_RING2_CTRL0_ADDR (WF_WFDMA_MCU_DMA1_BASE + 0x320) // 0320
1245+#define WF_WFDMA_MCU_DMA1_WPDMA_RX_RING0_CTRL0_ADDR (WF_WFDMA_MCU_DMA1_BASE + 0x500) // 0500
1246+#define WF_WFDMA_MCU_DMA1_WPDMA_RX_RING1_CTRL0_ADDR (WF_WFDMA_MCU_DMA1_BASE + 0x510) // 0510
1247+#define WF_WFDMA_MCU_DMA1_WPDMA_RX_RING2_CTRL0_ADDR (WF_WFDMA_MCU_DMA1_BASE + 0x520) // 0520
1248+#define WF_WFDMA_MCU_DMA1_WPDMA_RX_RING3_CTRL0_ADDR (WF_WFDMA_MCU_DMA1_BASE + 0x530) // 0530
1249+#define WF_WFDMA_MCU_DMA1_WPDMA_RX_RING4_CTRL0_ADDR (WF_WFDMA_MCU_DMA1_BASE + 0x540) // 0540
1250+
1251+#define WF_WFDMA_MCU_DMA1_PCIE1_BASE 0x59000000
1252+#define WF_WFDMA_MCU_DMA1_PCIE1_HOST_INT_STA_ADDR (WF_WFDMA_MCU_DMA1_PCIE1_BASE + 0x200) // 0200
1253+#define WF_WFDMA_MCU_DMA1_PCIE1_HOST_INT_ENA_ADDR (WF_WFDMA_MCU_DMA1_PCIE1_BASE + 0X204) // 0204
1254+#define WF_WFDMA_MCU_DMA1_PCIE1_WPDMA_GLO_CFG_ADDR (WF_WFDMA_MCU_DMA1_PCIE1_BASE + 0x208) // 0208
1255+#define WF_WFDMA_MCU_DMA1_PCIE1_WPDMA_GLO_CFG_RX_DMA_BUSY_MASK 0x00000008 // RX_DMA_BUSY[3]
1256+#define WF_WFDMA_MCU_DMA1_PCIE1_WPDMA_GLO_CFG_RX_DMA_BUSY_SHFT 3
1257+#define WF_WFDMA_MCU_DMA1_PCIE1_WPDMA_GLO_CFG_RX_DMA_EN_MASK 0x00000004 // RX_DMA_EN[2]
1258+#define WF_WFDMA_MCU_DMA1_PCIE1_WPDMA_GLO_CFG_RX_DMA_EN_SHFT 2
1259+#define WF_WFDMA_MCU_DMA1_PCIE1_WPDMA_GLO_CFG_TX_DMA_BUSY_MASK 0x00000002 // TX_DMA_BUSY[1]
1260+#define WF_WFDMA_MCU_DMA1_PCIE1_WPDMA_GLO_CFG_TX_DMA_BUSY_SHFT 1
1261+#define WF_WFDMA_MCU_DMA1_PCIE1_WPDMA_GLO_CFG_TX_DMA_EN_MASK 0x00000001 // TX_DMA_EN[0]
1262+#define WF_WFDMA_MCU_DMA1_PCIE1_WPDMA_GLO_CFG_TX_DMA_EN_SHFT 0
1263+#define WF_WFDMA_MCU_DMA1_PCIE1_WPDMA_TX_RING2_CTRL0_ADDR (WF_WFDMA_MCU_DMA1_PCIE1_BASE + 0x320) // 0320
1264+#define WF_WFDMA_MCU_DMA1_PCIE1_WPDMA_RX_RING3_CTRL0_ADDR (WF_WFDMA_MCU_DMA1_PCIE1_BASE + 0x530) // 0530
1265+
1266+#define WF_WFDMA_MCU_DMA0_WPDMA_TX_RING0_CTRL0_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x300) // 0300
1267+#define WF_WFDMA_MCU_DMA0_WPDMA_TX_RING1_CTRL0_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x310) // 0310
1268+#define WF_WFDMA_MCU_DMA0_WPDMA_TX_RING2_CTRL0_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x320) // 0320
1269+/* mt7986 add */
1270+#define WF_WFDMA_MCU_DMA0_WPDMA_TX_RING3_CTRL0_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x330) // 0330
1271+#define WF_WFDMA_MCU_DMA0_WPDMA_TX_RING4_CTRL0_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x340) // 0340
1272+#define WF_WFDMA_MCU_DMA0_WPDMA_TX_RING5_CTRL0_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x350) // 0350
1273+#define WF_WFDMA_MCU_DMA0_WPDMA_TX_RING6_CTRL0_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x360) // 0360
1274+
1275+
1276+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING0_CTRL0_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x500) // 0500
1277+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING1_CTRL0_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x510) // 0510
1278+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING2_CTRL0_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x520) // 0520
1279+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING3_CTRL0_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x530) // 0530
1280+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING4_CTRL0_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x540) // 0540
1281+
1282+/* mt7986 add */
1283+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING5_CTRL0_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x550) // 0550
1284+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING6_CTRL0_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x560) // 0560
1285+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING7_CTRL0_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x570) // 0570
1286+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING8_CTRL0_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x580) // 0580
1287+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING9_CTRL0_ADDR (WF_WFDMA_MCU_DMA0_BASE + 0x590) // 0590
1288+
1289+/* MEM DMA */
1290+#define WF_WFDMA_MEM_DMA_BASE 0x58000000
1291+#define WF_WFDMA_MEM_DMA_HOST_INT_STA_ADDR (WF_WFDMA_MEM_DMA_BASE + 0x200) // 0200
1292+#define WF_WFDMA_MEM_DMA_HOST_INT_ENA_ADDR (WF_WFDMA_MEM_DMA_BASE + 0X204) // 0204
1293+#define WF_WFDMA_MEM_DMA_WPDMA_GLO_CFG_ADDR (WF_WFDMA_MEM_DMA_BASE + 0x208) // 0208
1294+#define WF_WFDMA_MEM_DMA_WPDMA_GLO_CFG_RX_DMA_BUSY_MASK 0x00000008 // RX_DMA_BUSY[3]
1295+#define WF_WFDMA_MEM_DMA_WPDMA_GLO_CFG_RX_DMA_BUSY_SHFT 3
1296+#define WF_WFDMA_MEM_DMA_WPDMA_GLO_CFG_RX_DMA_EN_MASK 0x00000004 // RX_DMA_EN[2]
1297+#define WF_WFDMA_MEM_DMA_WPDMA_GLO_CFG_RX_DMA_EN_SHFT 2
1298+#define WF_WFDMA_MEM_DMA_WPDMA_GLO_CFG_TX_DMA_BUSY_MASK 0x00000002 // TX_DMA_BUSY[1]
1299+#define WF_WFDMA_MEM_DMA_WPDMA_GLO_CFG_TX_DMA_BUSY_SHFT 1
1300+#define WF_WFDMA_MEM_DMA_WPDMA_GLO_CFG_TX_DMA_EN_MASK 0x00000001 // TX_DMA_EN[0]
1301+#define WF_WFDMA_MEM_DMA_WPDMA_GLO_CFG_TX_DMA_EN_SHFT 0
1302+#define WF_WFDMA_MEM_DMA_WPDMA_TX_RING0_CTRL0_ADDR (WF_WFDMA_MEM_DMA_BASE + 0x300) // 0300
1303+#define WF_WFDMA_MEM_DMA_WPDMA_TX_RING1_CTRL0_ADDR (WF_WFDMA_MEM_DMA_BASE + 0x310) // 0310
1304+#define WF_WFDMA_MEM_DMA_WPDMA_RX_RING0_CTRL0_ADDR (WF_WFDMA_MEM_DMA_BASE + 0x500) // 0500
1305+#define WF_WFDMA_MEM_DMA_WPDMA_RX_RING1_CTRL0_ADDR (WF_WFDMA_MEM_DMA_BASE + 0x510) // 0510
1306+
1307+enum resource_attr {
1308+ HIF_TX_DATA,
1309+ HIF_TX_CMD,
1310+ HIF_TX_CMD_WM, /* direct path to WMCPU, only exist for WFDMA arch with 2 CPU */
1311+ HIF_TX_FWDL,
1312+ HIF_RX_DATA,
1313+ HIF_RX_EVENT,
1314+ RING_ATTR_NUM
1315+};
1316+
1317+struct hif_pci_tx_ring_desc {
1318+ u32 hw_int_mask;
1319+ u16 ring_size;
1320+ enum resource_attr ring_attr;
1321+ u8 band_idx;
1322+ char *const ring_info;
1323+};
1324+
1325+struct hif_pci_rx_ring_desc {
1326+ u32 hw_desc_base;
1327+ u32 hw_int_mask;
1328+ u16 ring_size;
1329+ enum resource_attr ring_attr;
1330+ u16 max_rx_process_cnt;
1331+ u16 max_sw_read_idx_inc;
1332+ char *const ring_info;
1333+};
1334+
1335+const struct hif_pci_tx_ring_desc mt7915_tx_ring_layout[] = {
1336+ {
1337+ .hw_int_mask = MT_DBG_INT_DMA1_T16_DONE,
1338+ .ring_size = 128,
1339+ .ring_attr = HIF_TX_FWDL,
1340+ .ring_info = "FWDL"
1341+ },
1342+ {
1343+ .hw_int_mask = MT_DBG_INT_DMA1_T17_DONE,
1344+ .ring_size = 256,
1345+ .ring_attr = HIF_TX_CMD_WM,
1346+ .ring_info = "cmd to WM"
1347+ },
1348+ {
1349+ .hw_int_mask = MT_DBG_INT_DMA1_T18_DONE,
1350+ .ring_size = 2048,
1351+ .ring_attr = HIF_TX_DATA,
1352+ .ring_info = "band0 TXD"
1353+ },
1354+ {
1355+ .hw_int_mask = MT_DBG_INT_DMA1_T19_DONE,
1356+ .ring_size = 2048,
1357+ .ring_attr = HIF_TX_DATA,
1358+ .ring_info = "band1 TXD"
1359+ },
1360+ {
1361+ .hw_int_mask = MT_DBG_INT_DMA1_T20_DONE,
1362+ .ring_size = 256,
1363+ .ring_attr = HIF_TX_CMD,
1364+ .ring_info = "cmd to WA"
1365+ }
1366+};
1367+
1368+const struct hif_pci_rx_ring_desc mt7915_rx_ring_layout[] = {
1369+ {
1370+ .hw_int_mask = MT_DBG_EXT_WRAP_INT_DMA0_R0_DONE,
1371+ .ring_size = 1536,
1372+ .ring_attr = HIF_RX_DATA,
1373+ .ring_info = "band0 RX data"
1374+ },
1375+ {
1376+ .hw_int_mask = MT_DBG_EXT_WRAP_INT_DMA0_R1_DONE,
1377+ .ring_size = 1536,
1378+ .ring_attr = HIF_RX_DATA,
1379+ .ring_info = "band1 RX data"
1380+ },
1381+ {
1382+ .hw_int_mask = MT_DBG_INT_DMA1_R0_DONE,
1383+ .ring_size = 512,
1384+ .ring_attr = HIF_RX_EVENT,
1385+ .ring_info = "event from WM"
1386+ },
1387+ {
1388+ .hw_int_mask = MT_DBG_INT_DMA1_R1_DONE,
1389+ .ring_size = 1024,
1390+ .ring_attr = HIF_RX_EVENT,
1391+ .ring_info = "event from WA band0"
1392+ },
1393+ {
1394+ .hw_int_mask = MT_DBG_INT_DMA1_R2_DONE,
1395+ .ring_size = 512,
1396+ .ring_attr = HIF_RX_EVENT,
1397+ .ring_info = "event from WA band1"
1398+ }
1399+};
1400+
1401+const struct hif_pci_tx_ring_desc mt7986_tx_ring_layout[] = {
1402+ {
1403+ .hw_int_mask = MT_DBG_INT_DMA0_T16_DONE,
1404+ .ring_size = 128,
1405+ .ring_attr = HIF_TX_FWDL,
1406+ .ring_info = "FWDL"
1407+ },
1408+ {
1409+ .hw_int_mask = MT_DBG_INT_DMA0_T17_DONE,
1410+ .ring_size = 256,
1411+ .ring_attr = HIF_TX_CMD_WM,
1412+ .ring_info = "cmd to WM"
1413+ },
1414+ {
1415+ .hw_int_mask = MT_DBG_INT_DMA0_T18_DONE,
1416+ .ring_size = 2048,
1417+ .ring_attr = HIF_TX_DATA,
1418+ .ring_info = "band0 TXD"
1419+ },
1420+ {
1421+ .hw_int_mask = MT_DBG_INT_DMA0_T19_DONE,
1422+ .ring_size = 2048,
1423+ .ring_attr = HIF_TX_DATA,
1424+ .ring_info = "band1 TXD"
1425+ },
1426+ {
1427+ .hw_int_mask = MT_DBG_INT_DMA0_T20_DONE,
1428+ .ring_size = 256,
1429+ .ring_attr = HIF_TX_CMD,
1430+ .ring_info = "cmd to WA"
1431+ }
1432+};
1433+
1434+const struct hif_pci_rx_ring_desc mt7986_rx_ring_layout[] = {
1435+ {
1436+ .hw_int_mask = MT_DBG_INT_DMA0_R4_DONE,
1437+ .ring_size = 1536,
1438+ .ring_attr = HIF_RX_DATA,
1439+ .ring_info = "band0 RX data"
1440+ },
1441+ {
1442+ .hw_int_mask = MT_DBG_INT_DMA0_R5_DONE,
1443+ .ring_size = 1536,
1444+ .ring_attr = HIF_RX_DATA,
1445+ .ring_info = "band1 RX data"
1446+ },
1447+ {
1448+ .hw_int_mask = MT_DBG_INT_DMA0_R0_DONE,
1449+ .ring_size = 512,
1450+ .ring_attr = HIF_RX_EVENT,
1451+ .ring_info = "event from WM"
1452+ },
1453+ {
1454+ .hw_int_mask = MT_DBG_INT_DMA0_R1_DONE,
1455+ .ring_size = 512,
1456+ .ring_attr = HIF_RX_EVENT,
1457+ .ring_info = "event from WA"
1458+ },
1459+ {
1460+ .hw_int_mask = MT_DBG_INT_DMA0_R2_DONE,
1461+ .ring_size = 1024,
1462+ .ring_attr = HIF_RX_EVENT,
1463+ .ring_info = "STS WA band0"
1464+ },
1465+ {
1466+ .hw_int_mask = MT_DBG_INT_DMA0_R3_DONE,
1467+ .ring_size = 512,
1468+ .ring_attr = HIF_RX_EVENT,
1469+ .ring_info = "STS WA band1"
1470+ },
1471+};
1472+
1473+/* mibinfo related CRs. */
1474+#define BN0_WF_MIB_TOP_BASE 0x820ed000
1475+#define BN1_WF_MIB_TOP_BASE 0x820fd000
1476+
1477+#define BN0_WF_MIB_TOP_BTOCR_ADDR (BN0_WF_MIB_TOP_BASE + 0x400) // D400
1478+#define BN0_WF_MIB_TOP_BTBCR_ADDR (BN0_WF_MIB_TOP_BASE + 0x428) // D428
1479+#define BN0_WF_MIB_TOP_BTDCR_ADDR (BN0_WF_MIB_TOP_BASE + 0x4F0) // D4F0
1480+
1481+#define BN0_WF_MIB_TOP_BSDR0_ADDR (BN0_WF_MIB_TOP_BASE + 0x688) // D688
1482+#define BN0_WF_MIB_TOP_BSDR1_ADDR (BN0_WF_MIB_TOP_BASE + 0x690) // D690
1483+
1484+#define BN0_WF_MIB_TOP_BSDR2_ADDR (BN0_WF_MIB_TOP_BASE + 0x518) // D518
1485+#define BN0_WF_MIB_TOP_BSDR3_ADDR (BN0_WF_MIB_TOP_BASE + 0x520) // D520
1486+#define BN0_WF_MIB_TOP_BSDR4_ADDR (BN0_WF_MIB_TOP_BASE + 0x528) // D528
1487+#define BN0_WF_MIB_TOP_BSDR5_ADDR (BN0_WF_MIB_TOP_BASE + 0x530) // D530
1488+#define BN0_WF_MIB_TOP_BSDR6_ADDR (BN0_WF_MIB_TOP_BASE + 0x538) // D538
1489+
1490+#define BN0_WF_MIB_TOP_BROCR_ADDR (BN0_WF_MIB_TOP_BASE + 0x5B8) // D5B8
1491+#define BN0_WF_MIB_TOP_BRBCR_ADDR (BN0_WF_MIB_TOP_BASE + 0x5E0) // D5E0
1492+#define BN0_WF_MIB_TOP_BRDCR_ADDR (BN0_WF_MIB_TOP_BASE + 0x630) // D630
1493+
1494+#define BN0_WF_MIB_TOP_M0SDR0_BEACONTXCOUNT_MASK 0x0000FFFF // BEACONTXCOUNT[15..0]
1495+
1496+#define BN0_WF_MIB_TOP_M0SDR4_RX_FIFO_FULL_COUNT_MASK 0x0000FFFF // RX_FIFO_FULL_COUNT[15..0]
1497+
1498+#define BN0_WF_MIB_TOP_M0SDR5_RX_MPDU_COUNT_MASK 0xFFFFFFFF // RX_MPDU_COUNT[31..0]
1499+
1500+#define BN0_WF_MIB_TOP_M0SDR6_CHANNEL_IDLE_COUNT_MASK 0x0000FFFF // CHANNEL_IDLE_COUNT[15..0]
1501+
1502+#define BN1_WF_MIB_TOP_BTOCR_ADDR (BN1_WF_MIB_TOP_BASE + 0x400) // D400
1503+
1504+#define BN0_WF_MIB_TOP_M0SDR7_VEC_MISS_COUNT_MASK 0x0000FFFF // VEC_MISS_COUNT[15..0]
1505+#define BN0_WF_MIB_TOP_M0SDR8_DELIMITER_FAIL_COUNT_MASK 0x0000FFFF // DELIMITER_FAIL_COUNT[15..0]
1506+#define BN0_WF_MIB_TOP_M0SDR9_CCA_NAV_TX_TIME_MASK 0x00FFFFFF // CCA_NAV_TX_TIME[23..0]
1507+
1508+#define BN0_WF_MIB_TOP_M0SDR11_RX_LEN_MISMATCH_MASK 0x0000FFFF // RX_LEN_MISMATCH[15..0]
1509+
1510+#define BN0_WF_MIB_TOP_M0SDR16_P_CCA_TIME_MASK 0x00FFFFFF // P_CCA_TIME[23..0]
1511+#define BN0_WF_MIB_TOP_M0SDR17_S_CCA_TIME_MASK 0x00FFFFFF // S_CCA_TIME[23..0]
1512+#define BN0_WF_MIB_TOP_M0SDR18_P_ED_TIME_MASK 0x00FFFFFF // P_ED_TIME[23..0]
1513+#define BN0_WF_MIB_TOP_M0SDR19_CCK_MDRDY_TIME_MASK 0x00FFFFFF // CCK_MDRDY_TIME[23..0]
1514+#define BN0_WF_MIB_TOP_M0SDR20_OFDM_LG_MIXED_VHT_MDRDY_TIME_MASK 0x00FFFFFF // OFDM_LG_MIXED_VHT_MDRDY_TIME[23..0]
1515+#define BN0_WF_MIB_TOP_M0SDR21_OFDM_GREEN_MDRDY_TIME_MASK 0x00FFFFFF // OFDM_GREEN_MDRDY_TIME[23..0]
1516+
1517+#define BN0_WF_MIB_TOP_M0SDR22_ADDR (BN0_WF_MIB_TOP_BASE + 0x60) // D060
1518+#define BN0_WF_MIB_TOP_M0SDR23_ADDR (BN0_WF_MIB_TOP_BASE + 0x64) // D064
1519+
1520+#define BN0_WF_MIB_TOP_M0SDR34_MUBF_TX_COUNT_MASK 0x0000FFFF // MUBF_TX_COUNT[15..0]
1521+
1522+#define BN0_WF_MIB_TOP_M0DR0_TX_40MHZ_CNT_MASK 0xFFFF0000 // TX_40MHZ_CNT[31..16]
1523+#define BN0_WF_MIB_TOP_M0DR0_TX_40MHZ_CNT_SHFT 16
1524+#define BN0_WF_MIB_TOP_M0DR0_TX_20MHZ_CNT_MASK 0x0000FFFF // TX_20MHZ_CNT[15..0]
1525+#define BN0_WF_MIB_TOP_M0DR0_TX_20MHZ_CNT_SHFT 0
1526+
1527+#define BN0_WF_MIB_TOP_M0DR1_TX_160MHZ_CNT_MASK 0xFFFF0000 // TX_160MHZ_CNT[31..16]
1528+#define BN0_WF_MIB_TOP_M0DR1_TX_160MHZ_CNT_SHFT 16
1529+#define BN0_WF_MIB_TOP_M0DR1_TX_80MHZ_CNT_MASK 0x0000FFFF // TX_80MHZ_CNT[15..0]
1530+#define BN0_WF_MIB_TOP_M0DR1_TX_80MHZ_CNT_SHFT 0
1531+
1532+#define BN0_WF_MIB_TOP_M0DR6_TX_DDLMT_RNG2_CNT_MASK 0xFFFF0000 // TX_DDLMT_RNG2_CNT[31..16]
1533+#define BN0_WF_MIB_TOP_M0DR6_TX_DDLMT_RNG2_CNT_SHFT 16
1534+#define BN0_WF_MIB_TOP_M0DR6_TX_DDLMT_RNG1_CNT_MASK 0x0000FFFF // TX_DDLMT_RNG1_CNT[15..0]
1535+#define BN0_WF_MIB_TOP_M0DR6_TX_DDLMT_RNG1_CNT_SHFT 0
1536+
1537+#define BN0_WF_MIB_TOP_M0DR7_TX_DDLMT_RNG4_CNT_MASK 0xFFFF0000 // TX_DDLMT_RNG4_CNT[31..16]
1538+#define BN0_WF_MIB_TOP_M0DR7_TX_DDLMT_RNG4_CNT_SHFT 16
1539+#define BN0_WF_MIB_TOP_M0DR7_TX_DDLMT_RNG3_CNT_MASK 0x0000FFFF // TX_DDLMT_RNG3_CNT[15..0]
1540+#define BN0_WF_MIB_TOP_M0DR7_TX_DDLMT_RNG3_CNT_SHFT 0
1541+
1542+#define BN0_WF_MIB_TOP_M0DR10_MU_FAIL_PPDU_CNT_MASK 0x0000FFFF // MU_FAIL_PPDU_CNT[15..0]
1543+
1544+#define BN0_WF_MIB_TOP_M0B0SDR0_ADDR (BN0_WF_MIB_TOP_BASE + 0x100) // D100
1545+#define BN0_WF_MIB_TOP_M0B0SDR0_RTSRETRYCOUNT_MASK 0xFFFF0000 // RTSRETRYCOUNT[31..16]
1546+#define BN0_WF_MIB_TOP_M0B0SDR0_RTSRETRYCOUNT_SHFT 16
1547+#define BN0_WF_MIB_TOP_M0B0SDR0_RTSTXCOUNT_MASK 0x0000FFFF // RTSTXCOUNT[15..0]
1548+#define BN0_WF_MIB_TOP_M0B0SDR0_RTSTXCOUNT_SHFT 0
1549+#define BN0_WF_MIB_TOP_M0B0SDR1_ADDR (BN0_WF_MIB_TOP_BASE + 0x104) // D104
1550+#define BN0_WF_MIB_TOP_M0B0SDR1_ACKFAILCOUNT_MASK 0xFFFF0000 // ACKFAILCOUNT[31..16]
1551+#define BN0_WF_MIB_TOP_M0B0SDR1_ACKFAILCOUNT_SHFT 16
1552+#define BN0_WF_MIB_TOP_M0B0SDR1_BAMISSCOUNT_MASK 0x0000FFFF // BAMISSCOUNT[15..0]
1553+#define BN0_WF_MIB_TOP_M0B0SDR1_BAMISSCOUNT_SHFT 0
1554+#define BN0_WF_MIB_TOP_M0B0SDR2_ADDR (BN0_WF_MIB_TOP_BASE + 0x108) // D108
1555+#define BN0_WF_MIB_TOP_M0B0SDR2_FRAMERETRY2COUNT_MASK 0xFFFF0000 // FRAMERETRY2COUNT[31..16]
1556+#define BN0_WF_MIB_TOP_M0B0SDR2_FRAMERETRY2COUNT_SHFT 16
1557+#define BN0_WF_MIB_TOP_M0B0SDR2_FRAMERETRYCOUNT_MASK 0x0000FFFF // FRAMERETRYCOUNT[15..0]
1558+#define BN0_WF_MIB_TOP_M0B0SDR2_FRAMERETRYCOUNT_SHFT 0
1559+#define BN0_WF_MIB_TOP_M0B0SDR3_ADDR (BN0_WF_MIB_TOP_BASE + 0x10C) // D10C
1560+#define BN0_WF_MIB_TOP_M0B0SDR3_FRAMERETRY3COUNT_MASK 0x0000FFFF // FRAMERETRY3COUNT[15..0]
1561+#define BN0_WF_MIB_TOP_M0B0SDR3_FRAMERETRY3COUNT_SHFT 0
1562+#define BN0_WF_MIB_TOP_M0DR12_TX_DDLMT_RNG0_CNT_MASK 0x0000FFFF // TX_DDLMT_RNG0_CNT[15..0]
1563+
1564+
1565+#define BN0_WF_MIB_TOP_BTOCR_TX_OK_COUNT2np1_MASK 0xFFFF0000 // TX_OK_COUNT2np1[31..16]
1566+#define BN0_WF_MIB_TOP_BTOCR_TX_OK_COUNT2np1_SHFT 16
1567+#define BN0_WF_MIB_TOP_BTOCR_TX_OK_COUNT2n_MASK 0x0000FFFF // TX_OK_COUNT2n[15..0]
1568+#define BN0_WF_MIB_TOP_BTOCR_TX_OK_COUNT2n_SHFT 0
1569+
1570+#define BN0_WF_MIB_TOP_BTDCR_TX_DATA_COUNT2np1_MASK 0xFFFF0000 // TX_DATA_COUNT2np1[31..16]
1571+#define BN0_WF_MIB_TOP_BTDCR_TX_DATA_COUNT2np1_SHFT 16
1572+#define BN0_WF_MIB_TOP_BTDCR_TX_DATA_COUNT2n_MASK 0x0000FFFF // TX_DATA_COUNT2n[15..0]
1573+#define BN0_WF_MIB_TOP_BTDCR_TX_DATA_COUNT2n_SHFT 0
1574+
1575+#define BN0_WF_MIB_TOP_BROCR_RX_OK_COUNT2np1_MASK 0xFFFF0000 // RX_OK_COUNT2np1[31..16]
1576+#define BN0_WF_MIB_TOP_BROCR_RX_OK_COUNT2np1_SHFT 16
1577+#define BN0_WF_MIB_TOP_BROCR_RX_OK_COUNT2n_MASK 0x0000FFFF // RX_OK_COUNT2n[15..0]
1578+#define BN0_WF_MIB_TOP_BROCR_RX_OK_COUNT2n_SHFT 0
1579+
1580+#define BN0_WF_MIB_TOP_BRDCR_RX_DATA_COUNT2np1_MASK 0xFFFF0000 // RX_DATA_COUNT2np1[31..16]
1581+#define BN0_WF_MIB_TOP_BRDCR_RX_DATA_COUNT2np1_SHFT 16
1582+#define BN0_WF_MIB_TOP_BRDCR_RX_DATA_COUNT2n_MASK 0x0000FFFF // RX_DATA_COUNT2n[15..0]
1583+#define BN0_WF_MIB_TOP_BRDCR_RX_DATA_COUNT2n_SHFT 0
1584+
1585+#define BN0_WF_MIB_TOP_BSDR0_RTSTXCOUNT2np1_MASK 0xFFFF0000 // RTSTXCOUNT2np1[31..16]
1586+#define BN0_WF_MIB_TOP_BSDR0_RTSTXCOUNT2np1_SHFT 16
1587+#define BN0_WF_MIB_TOP_BSDR0_RTSTXCOUNT2n_MASK 0x0000FFFF // RTSTXCOUNT2n[15..0]
1588+#define BN0_WF_MIB_TOP_BSDR0_RTSTXCOUNT2n_SHFT 0
1589+
1590+#define BN0_WF_MIB_TOP_BSDR1_RTSRETRYCOUNT2np1_MASK 0xFFFF0000 // RTSRETRYCOUNT2np1[31..16]
1591+#define BN0_WF_MIB_TOP_BSDR1_RTSRETRYCOUNT2np1_SHFT 16
1592+#define BN0_WF_MIB_TOP_BSDR1_RTSRETRYCOUNT2n_MASK 0x0000FFFF // RTSRETRYCOUNT2n[15..0]
1593+#define BN0_WF_MIB_TOP_BSDR1_RTSRETRYCOUNT2n_SHFT 0
1594+
1595+#define BN0_WF_MIB_TOP_BSDR2_BAMISSCOUNT2np1_MASK 0xFFFF0000 // BAMISSCOUNT2np1[31..16]
1596+#define BN0_WF_MIB_TOP_BSDR2_BAMISSCOUNT2np1_SHFT 16
1597+#define BN0_WF_MIB_TOP_BSDR2_BAMISSCOUNT2n_MASK 0x0000FFFF // BAMISSCOUNT2n[15..0]
1598+#define BN0_WF_MIB_TOP_BSDR2_BAMISSCOUNT2n_SHFT 0
1599+
1600+#define BN0_WF_MIB_TOP_BSDR3_ACKFAILCOUNT2np1_MASK 0xFFFF0000 // ACKFAILCOUNT2np1[31..16]
1601+#define BN0_WF_MIB_TOP_BSDR3_ACKFAILCOUNT2np1_SHFT 16
1602+#define BN0_WF_MIB_TOP_BSDR3_ACKFAILCOUNT2n_MASK 0x0000FFFF // ACKFAILCOUNT2n[15..0]
1603+#define BN0_WF_MIB_TOP_BSDR3_ACKFAILCOUNT2n_SHFT 0
1604+
1605+#define BN0_WF_MIB_TOP_BSDR4_FRAMERETRYCOUNT2np1_MASK 0xFFFF0000 // FRAMERETRYCOUNT2np1[31..16]
1606+#define BN0_WF_MIB_TOP_BSDR4_FRAMERETRYCOUNT2np1_SHFT 16
1607+#define BN0_WF_MIB_TOP_BSDR4_FRAMERETRYCOUNT2n_MASK 0x0000FFFF // FRAMERETRYCOUNT2n[15..0]
1608+#define BN0_WF_MIB_TOP_BSDR4_FRAMERETRYCOUNT2n_SHFT 0
1609+
1610+#define BN0_WF_MIB_TOP_BSDR5_FRAMERETRY2COUNT2np1_MASK 0xFFFF0000 // FRAMERETRY2COUNT2np1[31..16]
1611+#define BN0_WF_MIB_TOP_BSDR5_FRAMERETRY2COUNT2np1_SHFT 16
1612+#define BN0_WF_MIB_TOP_BSDR5_FRAMERETRY2COUNT2n_MASK 0x0000FFFF // FRAMERETRY2COUNT2n[15..0]
1613+#define BN0_WF_MIB_TOP_BSDR5_FRAMERETRY2COUNT2n_SHFT 0
1614+
1615+#define BN0_WF_MIB_TOP_BSDR6_FRAMERETRY3COUNT2np1_MASK 0xFFFF0000 // FRAMERETRY3COUNT2np1[31..16]
1616+#define BN0_WF_MIB_TOP_BSDR6_FRAMERETRY3COUNT2np1_SHFT 16
1617+#define BN0_WF_MIB_TOP_BSDR6_FRAMERETRY3COUNT2n_MASK 0x0000FFFF // FRAMERETRY3COUNT2n[15..0]
1618+#define BN0_WF_MIB_TOP_BSDR6_FRAMERETRY3COUNT2n_SHFT 0
1619+/* TXD */
1620+
1621+#define MT_TXD1_ETYP BIT(15)
1622+#define MT_TXD1_VLAN BIT(14)
1623+#define MT_TXD1_RMVL BIT(13)
1624+#define MT_TXD1_AMS BIT(13)
1625+#define MT_TXD1_EOSP BIT(12)
1626+#define MT_TXD1_MRD BIT(11)
1627+
1628+#define MT_TXD7_CTXD BIT(26)
1629+#define MT_TXD7_CTXD_CNT GENMASK(25, 23)
1630+#define MT_TXD7_TAT GENMASK(9, 0)
1631+
1632+#endif
1633+#endif
1634diff --git a/mt7915/mtk_debugfs.c b/mt7915/mtk_debugfs.c
1635new file mode 100644
1636index 0000000..2616fbf
1637--- /dev/null
1638+++ b/mt7915/mtk_debugfs.c
1639@@ -0,0 +1,2869 @@
1640+#include<linux/inet.h>
1641+#include "mt7915.h"
1642+#include "mt7915_debug.h"
1643+#include "mac.h"
1644+#include "mcu.h"
1645+
1646+#ifdef MTK_DEBUG
1647+#define LWTBL_IDX2BASE_ID GENMASK(14, 8)
1648+#define LWTBL_IDX2BASE_DW GENMASK(7, 2)
1649+#define LWTBL_IDX2BASE(_id, _dw) (MT_DBG_WTBL_BASE | \
1650+ FIELD_PREP(LWTBL_IDX2BASE_ID, _id) | \
1651+ FIELD_PREP(LWTBL_IDX2BASE_DW, _dw))
1652+
1653+#define UWTBL_IDX2BASE_ID GENMASK(12, 6)
1654+#define UWTBL_IDX2BASE_DW GENMASK(5, 2)
1655+#define UWTBL_IDX2BASE(_id, _dw) (MT_DBG_UWTBL_TOP_BASE | 0x2000 | \
1656+ FIELD_PREP(UWTBL_IDX2BASE_ID, _id) | \
1657+ FIELD_PREP(UWTBL_IDX2BASE_DW, _dw))
1658+
1659+#define KEYTBL_IDX2BASE_KEY GENMASK(12, 6)
1660+#define KEYTBL_IDX2BASE_DW GENMASK(5, 2)
1661+#define KEYTBL_IDX2BASE(_key, _dw) (MT_DBG_UWTBL_TOP_BASE | 0x2000 | \
1662+ FIELD_PREP(KEYTBL_IDX2BASE_KEY, _key) | \
1663+ FIELD_PREP(KEYTBL_IDX2BASE_DW, _dw))
1664+
1665+enum mt7915_wtbl_type {
1666+ WTBL_TYPE_LMAC, /* WTBL in LMAC */
1667+ WTBL_TYPE_UMAC, /* WTBL in UMAC */
1668+ WTBL_TYPE_KEY, /* Key Table */
1669+ MAX_NUM_WTBL_TYPE
1670+};
1671+
1672+static int mt7915_wtbl_read_raw(struct mt7915_dev *dev, u16 idx,
1673+ enum mt7915_wtbl_type type, u16 start_dw,
1674+ u16 len, void *buf)
1675+{
1676+ u32 *dest_cpy = (u32 *)buf;
1677+ u32 size_dw = len;
1678+ u32 src = 0;
1679+
1680+ if (!buf)
1681+ return 0xFF;
1682+
1683+ if (type == WTBL_TYPE_LMAC) {
1684+ mt76_wr(dev, MT_DBG_WTBLON_TOP_WDUCR,
1685+ FIELD_PREP(MT_DBG_WTBLON_TOP_WDUCR_GROUP, (idx >> 7)));
1686+ src = LWTBL_IDX2BASE(idx, start_dw);
1687+ } else if (type == WTBL_TYPE_UMAC) {
1688+ mt76_wr(dev, MT_DBG_UWTBL_TOP_WDUCR,
1689+ FIELD_PREP(MT_UWTBL_TOP_WDUCR_GROUP, (idx >> 7)));
1690+ src = UWTBL_IDX2BASE(idx, start_dw);
1691+ } else if (type == WTBL_TYPE_KEY) {
1692+ mt76_wr(dev, MT_DBG_UWTBL_TOP_WDUCR,
1693+ MT_UWTBL_TOP_WDUCR_TARGET |
1694+ FIELD_PREP(MT_UWTBL_TOP_WDUCR_GROUP, (idx >> 7)));
1695+ src = KEYTBL_IDX2BASE(idx, start_dw);
1696+ }
1697+
1698+ while (size_dw--) {
1699+ *dest_cpy++ = mt76_rr(dev, src);
1700+ src += 4;
1701+ };
1702+
1703+ return 0;
1704+}
1705+
1706+static int mt7915_wtbl_write_raw(struct mt7915_dev *dev, u16 idx,
1707+ enum mt7915_wtbl_type type, u16 start_dw,
1708+ u32 val)
1709+{
1710+ u32 addr = 0;
1711+
1712+ if (type == WTBL_TYPE_LMAC) {
1713+ mt76_wr(dev, MT_DBG_WTBLON_TOP_WDUCR,
1714+ FIELD_PREP(MT_WTBLON_TOP_WDUCR_GROUP, (idx >> 7)));
1715+ addr = LWTBL_IDX2BASE(idx, start_dw);
1716+ } else if (type == WTBL_TYPE_UMAC) {
1717+ mt76_wr(dev, MT_DBG_UWTBL_TOP_WDUCR,
1718+ FIELD_PREP(MT_UWTBL_TOP_WDUCR_GROUP, (idx >> 7)));
1719+ addr = UWTBL_IDX2BASE(idx, start_dw);
1720+ } else if (type == WTBL_TYPE_KEY) {
1721+ mt76_wr(dev, MT_DBG_UWTBL_TOP_WDUCR,
1722+ MT_UWTBL_TOP_WDUCR_TARGET |
1723+ FIELD_PREP(MT_UWTBL_TOP_WDUCR_GROUP, (idx >> 7)));
1724+ addr = KEYTBL_IDX2BASE(idx, start_dw);
1725+ }
1726+
1727+ mt76_wr(dev, addr, val);
1728+
1729+ return 0;
1730+}
1731+
1732+static int
1733+mt7915_fw_debug_module_set(void *data, u64 module)
1734+{
1735+ struct mt7915_dev *dev = data;
1736+
1737+ dev->dbg.fw_dbg_module = module;
1738+ return 0;
1739+}
1740+
1741+static int
1742+mt7915_fw_debug_module_get(void *data, u64 *module)
1743+{
1744+ struct mt7915_dev *dev = data;
1745+
1746+ *module = dev->dbg.fw_dbg_module;
1747+ return 0;
1748+}
1749+
1750+DEFINE_DEBUGFS_ATTRIBUTE(fops_fw_debug_module, mt7915_fw_debug_module_get,
1751+ mt7915_fw_debug_module_set, "%lld\n");
1752+
1753+static int
1754+mt7915_fw_debug_level_set(void *data, u64 level)
1755+{
1756+ struct mt7915_dev *dev = data;
1757+
1758+ dev->dbg.fw_dbg_lv = level;
1759+ mt7915_mcu_fw_dbg_ctrl(dev, dev->dbg.fw_dbg_module, dev->dbg.fw_dbg_lv);
1760+ return 0;
1761+}
1762+
1763+static int
1764+mt7915_fw_debug_level_get(void *data, u64 *level)
1765+{
1766+ struct mt7915_dev *dev = data;
1767+
1768+ *level = dev->dbg.fw_dbg_lv;
1769+ return 0;
1770+}
1771+
1772+DEFINE_DEBUGFS_ATTRIBUTE(fops_fw_debug_level, mt7915_fw_debug_level_get,
1773+ mt7915_fw_debug_level_set, "%lld\n");
1774+
1775+#define MAX_TX_MODE 12
1776+static char *HW_TX_MODE_STR[] = {"CCK", "OFDM", "HT-Mix", "HT-GF", "VHT",
1777+ "N/A", "N/A", "N/A", "HE_SU", "HE_EXT_SU",
1778+ "HE_TRIG", "HE_MU", "N/A"};
1779+static char *HW_TX_RATE_CCK_STR[] = {"1M", "2Mlong", "5.5Mlong", "11Mlong",
1780+ "N/A", "2Mshort", "5.5Mshort", "11Mshort",
1781+ "N/A"};
1782+static char *HW_TX_RATE_OFDM_STR[] = {"6M", "9M", "12M", "18M", "24M", "36M",
1783+ "48M", "54M", "N/A"};
1784+static char *fcap_str[] = {"20MHz", "20/40MHz", "20/40/80MHz",
1785+ "20/40/80/160/80+80MHz"};
1786+
1787+static char *hw_rate_ofdm_str(u16 ofdm_idx)
1788+{
1789+ switch (ofdm_idx) {
1790+ case 11: /* 6M */
1791+ return HW_TX_RATE_OFDM_STR[0];
1792+
1793+ case 15: /* 9M */
1794+ return HW_TX_RATE_OFDM_STR[1];
1795+
1796+ case 10: /* 12M */
1797+ return HW_TX_RATE_OFDM_STR[2];
1798+
1799+ case 14: /* 18M */
1800+ return HW_TX_RATE_OFDM_STR[3];
1801+
1802+ case 9: /* 24M */
1803+ return HW_TX_RATE_OFDM_STR[4];
1804+
1805+ case 13: /* 36M */
1806+ return HW_TX_RATE_OFDM_STR[5];
1807+
1808+ case 8: /* 48M */
1809+ return HW_TX_RATE_OFDM_STR[6];
1810+
1811+ case 12: /* 54M */
1812+ return HW_TX_RATE_OFDM_STR[7];
1813+
1814+ default:
1815+ return HW_TX_RATE_OFDM_STR[8];
1816+ }
1817+}
1818+
1819+static char *hw_rate_str(u8 mode, u16 rate_idx)
1820+{
1821+ if (mode == 0)
1822+ return rate_idx < 8 ? HW_TX_RATE_CCK_STR[rate_idx] : HW_TX_RATE_CCK_STR[8];
1823+ else if (mode == 1)
1824+ return hw_rate_ofdm_str(rate_idx);
1825+ else
1826+ return "MCS";
1827+}
1828+
1829+static void parse_rate(struct seq_file *s, u16 rate_idx, u16 txrate)
1830+{
1831+ u16 txmode, mcs, nss, stbc;
1832+
1833+ txmode = FIELD_GET(GENMASK(9, 6), txrate);
1834+ mcs = FIELD_GET(GENMASK(5, 0), txrate);
1835+ nss = FIELD_GET(GENMASK(12, 10), txrate);
1836+ stbc = FIELD_GET(BIT(13), txrate);
1837+
1838+ seq_printf(s, "\tRate%d(0x%x):TxMode=%d(%s), TxRate=%d(%s), Nsts=%d, STBC=%d\n",
1839+ rate_idx + 1, txrate,
1840+ txmode, (txmode < MAX_TX_MODE ? HW_TX_MODE_STR[txmode] : HW_TX_MODE_STR[MAX_TX_MODE]),
1841+ mcs, hw_rate_str(txmode, mcs), nss, stbc);
1842+}
1843+
1844+#define LWTBL_LEN_IN_DW 32
1845+#define UWTBL_LEN_IN_DW 8
1846+#define ONE_KEY_ENTRY_LEN_IN_DW 8
1847+static int mt7915_wtbl_read(struct seq_file *s, void *data)
1848+{
1849+ struct mt7915_dev *dev = dev_get_drvdata(s->private);
1850+ u8 lwtbl[LWTBL_LEN_IN_DW*4] = {0};
1851+ int x;
1852+ u32 *addr = 0;
1853+ u32 dw_value = 0;
1854+
1855+ mt7915_wtbl_read_raw(dev, dev->wlan_idx, WTBL_TYPE_LMAC, 0,
1856+ LWTBL_LEN_IN_DW, lwtbl);
1857+ seq_printf(s, "Dump WTBL info of WLAN_IDX:%d\n", dev->wlan_idx);
1858+ seq_printf(s, "LMAC WTBL Addr: group:0x%x=0x%x addr: 0x%lx\n",
1859+ MT_DBG_WTBLON_TOP_WDUCR,
1860+ mt76_rr(dev, MT_DBG_WTBLON_TOP_WDUCR),
1861+ LWTBL_IDX2BASE(dev->wlan_idx, 0));
1862+ for (x = 0; x < LWTBL_LEN_IN_DW; x++) {
1863+ seq_printf(s, "DW%02d: %02x %02x %02x %02x\n",
1864+ x,
1865+ lwtbl[x * 4 + 3],
1866+ lwtbl[x * 4 + 2],
1867+ lwtbl[x * 4 + 1],
1868+ lwtbl[x * 4]);
1869+ }
1870+
1871+ seq_printf(s, "\n\tAddr: %02x:%02x:%02x:%02x:%02x:%02x(D0[B0~15], D1[B0~31])\n",
1872+ lwtbl[4], lwtbl[5], lwtbl[6], lwtbl[7], lwtbl[0], lwtbl[1]);
1873+
1874+ // DW0, DW1
1875+ seq_printf(s, "LWTBL DW 0/1\n\t");
1876+ addr = (u32 *)&(lwtbl[0]);
1877+ dw_value = *addr;
1878+ seq_printf(s, "MUAR_IDX:%lu/ ", FIELD_GET(GENMASK(21, 16), dw_value));
1879+ seq_printf(s, "RCA1:%ld/ ", FIELD_GET(BIT(22), dw_value));
1880+ seq_printf(s, "KID:%lu/ ", FIELD_GET(GENMASK(24, 23), dw_value));
1881+ seq_printf(s, "RCID:%ld/ ", FIELD_GET(BIT(25), dw_value));
1882+ seq_printf(s, "FROM_DS:%ld\n\t", FIELD_GET(BIT(26), dw_value));
1883+ seq_printf(s, "TO_DS:%ld/ ", FIELD_GET(BIT(27), dw_value));
1884+ seq_printf(s, "RV:%ld/ ", FIELD_GET(BIT(28), dw_value));
1885+ seq_printf(s, "RCA2:%ld/ ", FIELD_GET(BIT(29), dw_value));
1886+ seq_printf(s, "WPI_FLAG:%ld\n", FIELD_GET(BIT(30), dw_value));
1887+
1888+ // DW2
1889+ seq_printf(s, "LWTBL DW 2\n\t");
1890+ addr = (u32 *)&(lwtbl[2*4]);
1891+ dw_value = *addr;
1892+ seq_printf(s, "AID12:%lu/ ", FIELD_GET(GENMASK(11, 0), dw_value));
1893+ seq_printf(s, "SU:%ld/ ", FIELD_GET(BIT(12), dw_value));
1894+ seq_printf(s, "SPP_EN:%ld/ ", FIELD_GET(BIT(13), dw_value));
1895+ seq_printf(s, "WPI_EVEN:%ld\n\t",FIELD_GET(BIT(14), dw_value));
1896+ seq_printf(s, "CIPHER:%lu/ ", FIELD_GET(GENMASK(20, 16), dw_value));
1897+ seq_printf(s, "CIPHER_IGTK:%lu/ ",FIELD_GET(GENMASK(22, 21), dw_value));
1898+ seq_printf(s, "AAD_OM:%ld\n\t", FIELD_GET(BIT(15), dw_value));
1899+ seq_printf(s, "SW:%ld/ ", FIELD_GET(BIT(24), dw_value));
1900+ seq_printf(s, "UL:%ld/ ", FIELD_GET(BIT(25), dw_value));
1901+ seq_printf(s, "TX_POWER_SAVE:%ld\n\t", FIELD_GET(BIT(26), dw_value));
1902+ seq_printf(s, "QOS:%ld/ ", FIELD_GET(BIT(27), dw_value));
1903+ seq_printf(s, "HT:%ld/ ", FIELD_GET(BIT(28), dw_value));
1904+ seq_printf(s, "VHT:%ld/ ", FIELD_GET(BIT(29), dw_value));
1905+ seq_printf(s, "HE:%ld/ ", FIELD_GET(BIT(30), dw_value));
1906+ seq_printf(s, "MESH:%ld\n", FIELD_GET(BIT(31), dw_value));
1907+
1908+ // DW3
1909+ seq_printf(s, "LWTBL DW 3\n\t");
1910+ addr = (u32 *)&(lwtbl[3*4]);
1911+ dw_value = *addr;
1912+ seq_printf(s, "WMM_Q:%lu/ ", FIELD_GET(GENMASK(1, 0), dw_value));
1913+ seq_printf(s, "RXD_DUP_MODE:%lu\n\t", FIELD_GET(GENMASK(3, 2), dw_value));
1914+ seq_printf(s, "VLAN2ETH:%ld/ ", FIELD_GET(BIT(4), dw_value));
1915+ seq_printf(s, "BEAM_CHG:%ld/ ", FIELD_GET(BIT(5), dw_value));
1916+ seq_printf(s, "DIS_BA256:%ld\n\t", FIELD_GET(BIT(6), dw_value));
1917+ seq_printf(s, "PFMU_IDX:%lu/ ", FIELD_GET(GENMASK(15, 8), dw_value));
1918+ seq_printf(s, "ULPF_IDX:%lu\n\t", FIELD_GET(GENMASK(23, 16), dw_value));
1919+ seq_printf(s, "RIBF:%ld/ ", FIELD_GET(BIT(24), dw_value));
1920+ seq_printf(s, "ULPF:%ld\n\t", FIELD_GET(BIT(25), dw_value));
1921+ seq_printf(s, "IGN_FBK:%ld/ ", FIELD_GET(BIT(26), dw_value));
1922+ seq_printf(s, "TBF:%ld/ ", FIELD_GET(BIT(29), dw_value));
1923+ seq_printf(s, "TBF_VHT:%ld/ ", FIELD_GET(BIT(30), dw_value));
1924+ seq_printf(s, "TBF_HE:%ld\n", FIELD_GET(BIT(31), dw_value));
1925+
1926+ // DW4
1927+ seq_printf(s, "LWTBL DW 4\n\t");
1928+ addr = (u32 *)&(lwtbl[4*4]);
1929+ dw_value = *addr;
1930+ seq_printf(s, "ANT_ID_STS0:%lu/ ", FIELD_GET(GENMASK(2, 0), dw_value));
1931+ seq_printf(s, "STS1:%lu/ ", FIELD_GET(GENMASK(5, 3), dw_value));
1932+ seq_printf(s, "STS2:%lu/ ", FIELD_GET(GENMASK(8, 6), dw_value));
1933+ seq_printf(s, "STS3:%lu\n\t", FIELD_GET(GENMASK(11, 9), dw_value));
1934+ seq_printf(s, "ANT_ID_STS4:%lu/ ", FIELD_GET(GENMASK(14, 12), dw_value));
1935+ seq_printf(s, "STS5:%lu/ ", FIELD_GET(GENMASK(17, 15), dw_value));
1936+ seq_printf(s, "STS6:%ld/ ", FIELD_GET(GENMASK(20, 18), dw_value));
1937+ seq_printf(s, "STS7:%lu\n\t", FIELD_GET(GENMASK(23, 21), dw_value));
1938+ seq_printf(s, "CASCAD:%ld/ ", FIELD_GET(BIT(24), dw_value));
1939+ seq_printf(s, "LDPC_HT:%ld/ ", FIELD_GET(BIT(25), dw_value));
1940+ seq_printf(s, "LDPC_VHT:%ld/ ", FIELD_GET(BIT(26), dw_value));
1941+ seq_printf(s, "LDPC_HE:%ld\n\t", FIELD_GET(BIT(27), dw_value));
1942+ seq_printf(s, "DIS_RHTR:%ld/ ", FIELD_GET(BIT(28), dw_value));
1943+ seq_printf(s, "ALL_ACK:%ld/ ", FIELD_GET(BIT(29), dw_value));
1944+ seq_printf(s, "DROP:%ld/ ", FIELD_GET(BIT(30), dw_value));
1945+ seq_printf(s, "ACK_EN:%ld\n", FIELD_GET(BIT(31), dw_value));
1946+
1947+ // DW5
1948+ seq_printf(s, "LWTBL DW 5\n\t");
1949+ addr = (u32 *)&(lwtbl[5*4]);
1950+ dw_value = *addr;
1951+ seq_printf(s, "AF:%lu/ ", FIELD_GET(GENMASK(2, 0), dw_value));
1952+ seq_printf(s, "AF_HE:%lu/ ", FIELD_GET(GENMASK(4, 3), dw_value));
1953+ seq_printf(s, "RTS:%ld/ ", FIELD_GET(BIT(5), dw_value));
1954+ seq_printf(s, "SMPS:%ld/ ", FIELD_GET(BIT(6), dw_value));
1955+ seq_printf(s, "DYN_BW:%ld\n\t", FIELD_GET(BIT(7), dw_value));
1956+ seq_printf(s, "MMSS:%lu/ ", FIELD_GET(GENMASK(10, 8), dw_value));
1957+ seq_printf(s, "USR:%ld/ ", FIELD_GET(BIT(11), dw_value));
1958+ seq_printf(s, "SR_RATE:%lu/ ", FIELD_GET(GENMASK(14, 12), dw_value));
1959+ seq_printf(s, "SR_ABORT:%ld\n\t", FIELD_GET(BIT(15), dw_value));
1960+ seq_printf(s, "TX_POWER_OFFSET:%lu/ ", FIELD_GET(GENMASK(21, 16), dw_value));
1961+ seq_printf(s, "WTBL_MPDU_SIZE:%lu\n\t", FIELD_GET(GENMASK(23, 22), dw_value));
1962+ seq_printf(s, "PE:%lu/ ", FIELD_GET(GENMASK(25, 24), dw_value));
1963+ seq_printf(s, "DOPPL:%ld/ ", FIELD_GET(BIT(26), dw_value));
1964+ seq_printf(s, "TXOP_PS_CAP:%ld/ ", FIELD_GET(BIT(27), dw_value));
1965+ seq_printf(s, "DONOT_UPDATE_I_PSM:%ld\n\t", FIELD_GET(BIT(28), dw_value));
1966+ seq_printf(s, "I_PSM:%ld/ ", FIELD_GET(BIT(29), dw_value));
1967+ seq_printf(s, "PSM:%ld/ ", FIELD_GET(BIT(30), dw_value));
1968+ seq_printf(s, "SKIP_TX:%ld\n", FIELD_GET(BIT(31), dw_value));
1969+
1970+ // DW6
1971+ seq_printf(s, "LWTBL DW 6\n\t");
1972+ seq_printf(s, "TID 0/1/2/3/4/5/6/7 BA_WIN_SIZE:");
1973+ addr = (u32 *)&(lwtbl[6*4]);
1974+ dw_value = *addr;
1975+ seq_printf(s, "%lu/ ", FIELD_GET(GENMASK(3, 0), dw_value));
1976+ seq_printf(s, "%lu/ ", FIELD_GET(GENMASK(7, 4), dw_value));
1977+ seq_printf(s, "%lu/ ", FIELD_GET(GENMASK(11, 8), dw_value));
1978+ seq_printf(s, "%lu/ ", FIELD_GET(GENMASK(15, 12), dw_value));
1979+ seq_printf(s, "%lu/ ", FIELD_GET(GENMASK(19, 16), dw_value));
1980+ seq_printf(s, "%lu/ ", FIELD_GET(GENMASK(23, 20), dw_value));
1981+ seq_printf(s, "%lu/ ", FIELD_GET(GENMASK(27, 24), dw_value));
1982+ seq_printf(s, "%lu\n", FIELD_GET(GENMASK(31, 28), dw_value));
1983+
1984+ // DW7
1985+ seq_printf(s, "LWTBL DW 7\n\t");
1986+ addr = (u32 *)&(lwtbl[7*4]);
1987+ dw_value = *addr;
1988+ seq_printf(s, "CBRN:%lu/ ", FIELD_GET(GENMASK(2, 0), dw_value));
1989+ seq_printf(s, "DBNSS_EN:%ld/ ", FIELD_GET(BIT(3), dw_value));
1990+ seq_printf(s, "BAF_EN:%ld/ ", FIELD_GET(BIT(4), dw_value));
1991+ seq_printf(s, "RDGBA:%ld\n\t", FIELD_GET(BIT(5), dw_value));
1992+ seq_printf(s, "RDG:%ld/ ", FIELD_GET(BIT(6), dw_value));
1993+ seq_printf(s, "SPE_IDX:%lu/ ", FIELD_GET(GENMASK(11, 7), dw_value));
1994+ seq_printf(s, "G2:%ld/ ", FIELD_GET(BIT(12), dw_value));
1995+ seq_printf(s, "G4:%ld/ ", FIELD_GET(BIT(13), dw_value));
1996+ seq_printf(s, "G8:%ld/ ", FIELD_GET(BIT(14), dw_value));
1997+ seq_printf(s, "G16:%ld\n\t", FIELD_GET(BIT(15), dw_value));
1998+ seq_printf(s, "G2_LTF:%lu/ ", FIELD_GET(GENMASK(17, 16), dw_value));
1999+ seq_printf(s, "G4_LTF:%lu/ ", FIELD_GET(GENMASK(19, 18), dw_value));
2000+ seq_printf(s, "G8_LTF:%lu/ ", FIELD_GET(GENMASK(21, 20), dw_value));
2001+ seq_printf(s, "G16_LTF:%lu\n\t", FIELD_GET(GENMASK(23, 22), dw_value));
2002+ seq_printf(s, "G2_HE:%lu/ ", FIELD_GET(GENMASK(25, 24), dw_value));
2003+ seq_printf(s, "G4_HE:%lu/ ", FIELD_GET(GENMASK(27, 27), dw_value));
2004+ seq_printf(s, "G8_HE:%lu/ ", FIELD_GET(GENMASK(29, 28), dw_value));
2005+ seq_printf(s, "G16_HE:%lu\n", FIELD_GET(GENMASK(31, 30), dw_value));
2006+
2007+ // DW8
2008+ seq_printf(s, "LWTBL DW 8\n\t");
2009+ addr = (u32 *)&(lwtbl[8*4]);
2010+ dw_value = *addr;
2011+ seq_printf(s, "FAIL_CNT_AC0:%lu/ ", FIELD_GET(GENMASK(4, 0), dw_value));
2012+ seq_printf(s, "AC1:%lu/ ", FIELD_GET(GENMASK(9, 5), dw_value));
2013+ seq_printf(s, "AC2:%lu/ ", FIELD_GET(GENMASK(14, 10), dw_value));
2014+ seq_printf(s, "AC3:%lu\n\t", FIELD_GET(GENMASK(19, 15), dw_value));
2015+ seq_printf(s, "PARTIAL_AID:%lu/ ", FIELD_GET(GENMASK(28, 20), dw_value));
2016+ seq_printf(s, "CHK_PER:%lu\n", FIELD_GET(BIT(31), dw_value));
2017+
2018+ // DW9
2019+ seq_printf(s, "LWTBL DW 9\n\t");
2020+ addr = (u32 *)&(lwtbl[9*4]);
2021+ dw_value = *addr;
2022+ seq_printf(s, "RX_AVG_MPDU:%lu/ ", FIELD_GET(GENMASK(13, 0), dw_value));
2023+ seq_printf(s, "PRITX_SW_MODE:%ld/ ", FIELD_GET(BIT(16), dw_value));
2024+ seq_printf(s, "PRITX_PLR:%ld\n\t", FIELD_GET(BIT(17), dw_value));
2025+ seq_printf(s, "PRITX_DCM:%ld/ ", FIELD_GET(BIT(18), dw_value));
2026+ seq_printf(s, "PRITX_ER160:%ld/ ", FIELD_GET(BIT(19), dw_value));
2027+ seq_printf(s, "PRITX_ERSU:%lu\n\t", FIELD_GET(BIT(20), dw_value));
2028+ seq_printf(s, "MPDU_FAIL_CNT:%lu/ ", FIELD_GET(GENMASK(25, 23), dw_value));
2029+ seq_printf(s, "MPDU_OK_CNT:%lu/ ", FIELD_GET(GENMASK(28, 26), dw_value));
2030+ seq_printf(s, "RATE_IDX:%lu\n\t", FIELD_GET(GENMASK(31, 29), dw_value));
2031+ seq_printf(s, "FCAP:%s\n", fcap_str[FIELD_GET(GENMASK(22, 21), dw_value)]);
2032+
2033+ // DW10
2034+ seq_printf(s, "LWTBL DW 10\n");
2035+ addr = (u32 *)&(lwtbl[10*4]);
2036+ dw_value = *addr;
2037+ parse_rate(s, 0, FIELD_GET(GENMASK(13, 0), dw_value));
2038+ parse_rate(s, 1, FIELD_GET(GENMASK(29, 16), dw_value));
2039+ // DW11
2040+ seq_printf(s, "LWTBL DW 11\n");
2041+ addr = (u32 *)&(lwtbl[11*4]);
2042+ dw_value = *addr;
2043+ parse_rate(s, 2, FIELD_GET(GENMASK(13, 0), dw_value));
2044+ parse_rate(s, 3, FIELD_GET(GENMASK(29, 16), dw_value));
2045+ // DW12
2046+ seq_printf(s, "LWTBL DW 12\n");
2047+ addr = (u32 *)&(lwtbl[12*4]);
2048+ dw_value = *addr;
2049+ parse_rate(s, 4, FIELD_GET(GENMASK(13, 0), dw_value));
2050+ parse_rate(s, 5, FIELD_GET(GENMASK(29, 16), dw_value));
2051+ // DW13
2052+ seq_printf(s, "LWTBL DW 13\n");
2053+ addr = (u32 *)&(lwtbl[13*4]);
2054+ dw_value = *addr;
2055+ parse_rate(s, 6, FIELD_GET(GENMASK(13, 0), dw_value));
2056+ parse_rate(s, 7, FIELD_GET(GENMASK(29, 16), dw_value));
2057+
2058+ //DW28
2059+ seq_printf(s, "LWTBL DW 28\n\t");
2060+ addr = (u32 *)&(lwtbl[28*4]);
2061+ dw_value = *addr;
2062+ seq_printf(s, "OM_INFO:%lu/ ", FIELD_GET(GENMASK(11, 0), dw_value));
2063+ seq_printf(s, "OM_RXD_DUP_MODE:%u\n\t", !!(dw_value & BIT(12)) );
2064+
2065+ //DW29
2066+ seq_printf(s, "LWTBL DW 29\n");
2067+ addr = (u32 *)&(lwtbl[29*4]);
2068+ dw_value = *addr;
2069+ seq_printf(s, "USER_RSSI:%lu/ ", FIELD_GET(GENMASK(8, 0), dw_value));
2070+ seq_printf(s, "USER_SNR:%lu/ ", FIELD_GET(GENMASK(14, 9), dw_value));
2071+ seq_printf(s, "RAPID_REACTION_RATE:%lu/ ", FIELD_GET(GENMASK(26, 16), dw_value));
2072+ seq_printf(s, "HT_AMSDU(Read Only):%u/ ", !!(dw_value & BIT(30)) );
2073+ seq_printf(s, "AMSDU_CROSS_LG(Read Only):%u\n\t ", !!(dw_value & BIT(31)));
2074+
2075+ //DW30
2076+ seq_printf(s, "LWTBL DW 30\n\t");
2077+ addr = (u32 *)&(lwtbl[30*4]);
2078+ dw_value = *addr;
2079+ seq_printf(s, "RCPI 0:%lu/ ", FIELD_GET(GENMASK(7, 0), dw_value));
2080+ seq_printf(s, "RCPI 1:%lu/ ", FIELD_GET(GENMASK(15, 8), dw_value));
2081+ seq_printf(s, "RCPI 2:%lu/ ", FIELD_GET(GENMASK(23, 16), dw_value));
2082+ seq_printf(s, "RCPI 3:%lu\n\t", FIELD_GET(GENMASK(31, 24), dw_value));
2083+
2084+ //DW31
2085+ seq_printf(s, "LWTBL DW 31\n\t");
2086+ addr = (u32 *)&(lwtbl[31*4]);
2087+ dw_value = *addr;
2088+ seq_printf(s, "RCPI 4:%lu/ ", FIELD_GET(GENMASK(7, 0), dw_value));
2089+ seq_printf(s, "RCPI 5:%lu/ ", FIELD_GET(GENMASK(15, 8), dw_value));
2090+ seq_printf(s, "RCPI 6:%lu/ ", FIELD_GET(GENMASK(23, 16), dw_value));
2091+ seq_printf(s, "RCPI 7:%lu\n\t", FIELD_GET(GENMASK(31, 24), dw_value));
2092+
2093+ return 0;
2094+}
2095+
2096+static int mt7915_uwtbl_read(struct seq_file *s, void *data)
2097+{
2098+ struct mt7915_dev *dev = dev_get_drvdata(s->private);
2099+ u8 uwtbl[UWTBL_LEN_IN_DW * 4] = {0};
2100+ u8 keytbl[ONE_KEY_ENTRY_LEN_IN_DW*4] = {0};
2101+ int x;
2102+ u32 *addr = 0;
2103+ u32 dw_value = 0;
2104+ u32 amsdu_len = 0;
2105+ u32 u2SN = 0;
2106+ u16 keyloc0, keyloc1;
2107+
2108+ mt7915_wtbl_read_raw(dev, dev->wlan_idx, WTBL_TYPE_UMAC, 0,
2109+ UWTBL_LEN_IN_DW, uwtbl);
2110+ seq_printf(s, "Dump WTBL info of WLAN_IDX:%d\n", dev->wlan_idx);
2111+ seq_printf(s, "UMAC WTBL Addr: group:0x%x=0x%x addr: 0x%lx\n",
2112+ MT_DBG_WTBLON_TOP_WDUCR,
2113+ mt76_rr(dev, MT_DBG_WTBLON_TOP_WDUCR),
2114+ UWTBL_IDX2BASE(dev->wlan_idx, 0));
2115+ for (x = 0; x < UWTBL_LEN_IN_DW; x++) {
2116+ seq_printf(s, "DW%02d: %02x %02x %02x %02x\n",
2117+ x,
2118+ uwtbl[x * 4 + 3],
2119+ uwtbl[x * 4 + 2],
2120+ uwtbl[x * 4 + 1],
2121+ uwtbl[x * 4]);
2122+ }
2123+
2124+ /* UMAC WTBL DW 0 */
2125+ seq_printf(s, "\nUWTBL PN\n\t");
2126+ addr = (u32 *)&(uwtbl[0]);
2127+ dw_value = *addr;
2128+ seq_printf(s, "PN0:%lu/ ", FIELD_GET(GENMASK(7, 0), dw_value));
2129+ seq_printf(s, "PN1:%lu/ ", FIELD_GET(GENMASK(15, 8), dw_value));
2130+ seq_printf(s, "PN2:%lu\n\t", FIELD_GET(GENMASK(23, 16), dw_value));
2131+ seq_printf(s, "PN3:%lu/ ", FIELD_GET(GENMASK(31, 24), dw_value));
2132+
2133+ addr = (u32 *)&(uwtbl[1 * 4]);
2134+ dw_value = *addr;
2135+ seq_printf(s, "PN4:%lu/ ", FIELD_GET(GENMASK(7, 0), dw_value));
2136+ seq_printf(s, "PN5:%lu\n", FIELD_GET(GENMASK(15, 8), dw_value));
2137+
2138+ /* UMAC WTBL DW SN part */
2139+ seq_printf(s, "\nUWTBL SN\n");
2140+ addr = (u32 *)&(uwtbl[2 * 4]);
2141+ dw_value = *addr;
2142+ seq_printf(s, "TID0_AC0_SN:%lu\n", FIELD_GET(GENMASK(11, 0), dw_value));
2143+ seq_printf(s, "TID1_AC1_SN:%lu\n", FIELD_GET(GENMASK(23, 12), dw_value));
2144+
2145+ u2SN = FIELD_GET(GENMASK(31, 24), dw_value);
2146+ addr = (u32 *)&(uwtbl[3 * 4]);
2147+ dw_value = *addr;
2148+ u2SN |= FIELD_GET(GENMASK(3, 0), dw_value);
2149+ seq_printf(s, "TID2_AC2_SN:%u\n", u2SN);
2150+ seq_printf(s, "TID3_AC3_SN:%lu\n", FIELD_GET(GENMASK(15, 4), dw_value));
2151+ seq_printf(s, "TID4_SN:%lu\n", FIELD_GET(GENMASK(27, 16), dw_value));
2152+
2153+ u2SN = FIELD_GET(GENMASK(31, 28), dw_value);
2154+ addr = (u32 *)&(uwtbl[4 * 4]);
2155+ dw_value = *addr;
2156+ u2SN |= FIELD_GET(GENMASK(7, 0), dw_value);
2157+ seq_printf(s, "TID5_SN:%u\n", u2SN);
2158+ seq_printf(s, "TID6_SN:%lu\n", FIELD_GET(GENMASK(19, 8), dw_value));
2159+ seq_printf(s, "TID7_SN:%lu\n", FIELD_GET(GENMASK(31, 20), dw_value));
2160+
2161+ addr = (u32 *)&(uwtbl[1 * 4]);
2162+ dw_value = *addr;
2163+ seq_printf(s, "COM_SN:%lu\n", FIELD_GET(GENMASK(27, 16), dw_value));
2164+
2165+ /* UMAC WTBL DW 0 */
2166+ seq_printf(s, "\nUWTBL others\n");
2167+
2168+ addr = (u32 *)&(uwtbl[5 * 4]);
2169+ dw_value = *addr;
2170+ keyloc0 = FIELD_GET(GENMASK(10, 0), dw_value);
2171+ keyloc1 = FIELD_GET(GENMASK(26, 16), dw_value);
2172+ seq_printf(s, "\tKey Loc 1/2:%lu/%lu\n",
2173+ FIELD_GET(GENMASK(10, 0), dw_value),
2174+ FIELD_GET(GENMASK(26, 16), dw_value));
2175+ seq_printf(s, "\tUWTBL_QOS:%lu\n", FIELD_GET(BIT(27), dw_value));
2176+ seq_printf(s, "\tUWTBL_HT_VHT_HE:%lu\n", FIELD_GET(BIT(28), dw_value));
2177+
2178+ addr = (u32 *)&(uwtbl[6*4]);
2179+ dw_value = *addr;
2180+ seq_printf(s, "\tHW AMSDU Enable:%lu\n", FIELD_GET(BIT(9), dw_value));
2181+
2182+ amsdu_len = FIELD_GET(GENMASK(5, 0), dw_value);
2183+ if (amsdu_len == 0)
2184+ seq_printf(s, "\tHW AMSDU Len:invalid (WTBL value=0x%x)\n", amsdu_len);
2185+ else if (amsdu_len == 1)
2186+ seq_printf(s, "\tHW AMSDU Len:%d~%d (WTBL value=0x%x)\n",
2187+ 1,
2188+ 255,
2189+ amsdu_len);
2190+ else
2191+ seq_printf(s, "\tHW AMSDU Len:%d~%d (WTBL value=0x%x)\n",
2192+ 256 * (amsdu_len - 1),
2193+ 256 * (amsdu_len - 1) + 255,
2194+ amsdu_len
2195+ );
2196+ seq_printf(s, "\tHW AMSDU Num:%lu (WTBL value=0x%lx)\n",
2197+ FIELD_GET(GENMASK(8, 6), dw_value) + 1,
2198+ FIELD_GET(GENMASK(8, 6), dw_value));
2199+
2200+ /* Parse KEY link */
2201+ seq_printf(s, "\n\tkeyloc0:%d\n", keyloc0);
2202+ if(keyloc0 != GENMASK(10, 0)) {
2203+ mt7915_wtbl_read_raw(dev, keyloc0, WTBL_TYPE_KEY,
2204+ 0, ONE_KEY_ENTRY_LEN_IN_DW, keytbl);
2205+ seq_printf(s, "KEY WTBL Addr: group:0x%x=0x%x addr: 0x%lx\n",
2206+ MT_DBG_WTBLON_TOP_WDUCR,
2207+ mt76_rr(dev, MT_DBG_WTBLON_TOP_WDUCR),
2208+ KEYTBL_IDX2BASE(keyloc0, 0));
2209+
2210+ for (x = 0; x < ONE_KEY_ENTRY_LEN_IN_DW; x++) {
2211+ seq_printf(s, "DW%02d: %02x %02x %02x %02x\n",
2212+ x,
2213+ keytbl[x * 4 + 3],
2214+ keytbl[x * 4 + 2],
2215+ keytbl[x * 4 + 1],
2216+ keytbl[x * 4]);
2217+ }
2218+ }
2219+
2220+ seq_printf(s, "\n\tkeyloc1:%d\n", keyloc1);
2221+ if(keyloc1 != GENMASK(26, 16)) {
2222+ mt7915_wtbl_read_raw(dev, keyloc1, WTBL_TYPE_KEY,
2223+ 0, ONE_KEY_ENTRY_LEN_IN_DW, keytbl);
2224+ seq_printf(s, "KEY WTBL Addr: group:0x%x=0x%x addr: 0x%lx\n",
2225+ MT_DBG_WTBLON_TOP_WDUCR,
2226+ mt76_rr(dev, MT_DBG_WTBLON_TOP_WDUCR),
2227+ KEYTBL_IDX2BASE(keyloc1, 0));
2228+
2229+ for (x = 0; x < ONE_KEY_ENTRY_LEN_IN_DW; x++) {
2230+ seq_printf(s, "DW%02d: %02x %02x %02x %02x\n",
2231+ x,
2232+ keytbl[x * 4 + 3],
2233+ keytbl[x * 4 + 2],
2234+ keytbl[x * 4 + 1],
2235+ keytbl[x * 4]);
2236+ }
2237+ }
2238+ return 0;
2239+}
2240+
2241+static void
2242+dump_dma_tx_ring_info(struct seq_file *s, struct mt7915_dev *dev, char *str, u32 ring_base)
2243+{
2244+ u32 base, cnt, cidx, didx, queue_cnt;
2245+
2246+ base= mt76_rr(dev, ring_base);
2247+ cnt = mt76_rr(dev, ring_base + 4);
2248+ cidx = mt76_rr(dev, ring_base + 8);
2249+ didx = mt76_rr(dev, ring_base + 12);
2250+ queue_cnt = (cidx >= didx) ? (cidx - didx) : (cidx - didx + cnt);
2251+
2252+ seq_printf(s, "%20s %10x %10x %10x %10x %10x\n", str, base, cnt, cidx, didx, queue_cnt);
2253+}
2254+
2255+static void
2256+dump_dma_rx_ring_info(struct seq_file *s, struct mt7915_dev *dev, char *str, u32 ring_base)
2257+{
2258+ u32 base, cnt, cidx, didx, queue_cnt;
2259+
2260+ base= mt76_rr(dev, ring_base);
2261+ cnt = mt76_rr(dev, ring_base + 4);
2262+ cidx = mt76_rr(dev, ring_base + 8);
2263+ didx = mt76_rr(dev, ring_base + 12);
2264+ queue_cnt = (didx > cidx) ? (didx - cidx - 1) : (didx - cidx + cnt - 1);
2265+
2266+ seq_printf(s, "%20s %10x %10x %10x %10x %10x\n", str, base, cnt, cidx, didx, queue_cnt);
2267+}
2268+
2269+static void
2270+mt7915_show_host_dma_info(struct seq_file *s, struct mt7915_dev *dev)
2271+{
2272+ u32 sys_ctrl[10] = {};
2273+
2274+ /* HOST DMA */
2275+ sys_ctrl[0] = mt76_rr(dev, MT_DBG_INT_SOURCE_CSR);
2276+ sys_ctrl[1] = mt76_rr(dev, MT_DBG_INT_MASK_CSR);
2277+ sys_ctrl[2] = mt76_rr(dev, MT_DBG_WFDMA0_INT_SOURCE_CSR);
2278+ sys_ctrl[3] = mt76_rr(dev, MT_DBG_WFDMA0_INT_MASK_CSR);
2279+ sys_ctrl[4] = mt76_rr(dev, MT_DBG_WFDMA1_INT_SOURCE_CSR);
2280+ sys_ctrl[5] = mt76_rr(dev, MT_DBG_WFDMA1_INT_MASK_CSR);
2281+ sys_ctrl[6] = mt76_rr(dev, MT_DBG_WFDMA0_GLO_CFG);
2282+ sys_ctrl[7] = mt76_rr(dev, MT_DBG_WFDMA1_GLO_CFG);
2283+ seq_printf(s, "HOST_DMA Configuration\n");
2284+ seq_printf(s, "%10s %10s %10s %10s %10s %10s\n",
2285+ "DMA", "IntCSR", "IntMask", "Glocfg", "Tx/RxEn", "Tx/RxBusy");
2286+ seq_printf(s, "%10s %10x %10x\n",
2287+ "Merge", sys_ctrl[0], sys_ctrl[1]);
2288+ seq_printf(s, "%10s %10x %10x %10x %4lx/%5lx %4lx/%5lx\n",
2289+ "DMA0", sys_ctrl[2], sys_ctrl[3], sys_ctrl[6],
2290+ FIELD_GET(MT_DBG_WFDMA0_GLO_CFG_TX_DMA_EN, sys_ctrl[6]),
2291+ FIELD_GET(MT_DBG_WFDMA0_GLO_CFG_RX_DMA_EN, sys_ctrl[6]),
2292+ FIELD_GET(MT_DBG_WFDMA0_GLO_CFG_TX_BUSY_MASK, sys_ctrl[6]),
2293+ FIELD_GET(MT_DBG_WFDMA0_GLO_CFG_RX_BUSY_MASK, sys_ctrl[6]));
2294+
2295+ seq_printf(s, "%10s %10x %10x %10x %4lx/%5lx %4lx/%5lx\n",
2296+ "DMA1", sys_ctrl[4], sys_ctrl[5], sys_ctrl[7],
2297+ FIELD_GET(MT_DBG_WFDMA1_GLO_CFG_TX_DMA_EN, sys_ctrl[7]),
2298+ FIELD_GET(MT_DBG_WFDMA1_GLO_CFG_RX_DMA_EN, sys_ctrl[7]),
2299+ FIELD_GET(MT_DBG_WFDMA1_GLO_CFG_TX_BUSY_MASK, sys_ctrl[7]),
2300+ FIELD_GET(MT_DBG_WFDMA1_GLO_CFG_RX_BUSY_MASK, sys_ctrl[7]));
2301+
2302+ sys_ctrl[0] = mt76_rr(dev, MT_DBG_INT1_SOURCE_CSR);
2303+ sys_ctrl[1] = mt76_rr(dev, MT_DBG_INT1_MASK_CSR);
2304+ sys_ctrl[2] = mt76_rr(dev, MT_DBG_WFDMA0_PCIE1_INT_SOURCE_CSR);
2305+ sys_ctrl[3] = mt76_rr(dev, MT_DBG_WFDMA0_PCIE1_INT_MASK_CSR);
2306+ sys_ctrl[4] = mt76_rr(dev, MT_DBG_WFDMA1_PCIE1_INT_SOURCE_CSR);
2307+ sys_ctrl[5] = mt76_rr(dev, MT_DBG_WFDMA1_PCIE1_INT_MASK_CSR);
2308+ sys_ctrl[6] = mt76_rr(dev, MT_DBG_WFDMA0_PCIE1_GLO_CFG);
2309+ sys_ctrl[7] = mt76_rr(dev, MT_DBG_WFDMA1_PCIE1_GLO_CFG);
2310+ seq_printf(s, "%10s %10x %10x\n",
2311+ "MergeP1", sys_ctrl[0], sys_ctrl[1]);
2312+ seq_printf(s, "%10s %10x %10x %10x %4lx/%5lx %4lx/%5lx\n",
2313+ "DMA0P1", sys_ctrl[2], sys_ctrl[3], sys_ctrl[6],
2314+ FIELD_GET(MT_DBG_WFDMA0_PCIE1_GLO_CFG_TX_DMA_EN, sys_ctrl[6]),
2315+ FIELD_GET(MT_DBG_WFDMA0_PCIE1_GLO_CFG_RX_DMA_EN, sys_ctrl[6]),
2316+ FIELD_GET(MT_DBG_WFDMA0_PCIE1_GLO_CFG_TX_BUSY_MASK, sys_ctrl[6]),
2317+ FIELD_GET(MT_DBG_WFDMA0_PCIE1_GLO_CFG_RX_BUSY_MASK, sys_ctrl[6]));
2318+ seq_printf(s, "%10s %10x %10x %10x %4lx/%5lx %4lx/%5lx\n",
2319+ "DMA1P1", sys_ctrl[4], sys_ctrl[5], sys_ctrl[7],
2320+ FIELD_GET(MT_DBG_WFDMA0_PCIE1_GLO_CFG_TX_DMA_EN, sys_ctrl[7]),
2321+ FIELD_GET(MT_DBG_WFDMA0_PCIE1_GLO_CFG_RX_DMA_EN, sys_ctrl[7]),
2322+ FIELD_GET(MT_DBG_WFDMA0_PCIE1_GLO_CFG_TX_BUSY_MASK, sys_ctrl[7]),
2323+ FIELD_GET(MT_DBG_WFDMA0_PCIE1_GLO_CFG_RX_BUSY_MASK, sys_ctrl[7]));
2324+
2325+ seq_printf(s, "HOST_DMA0 Ring Configuration\n");
2326+ seq_printf(s, "%20s %10s %10s %10s %10s %10s\n",
2327+ "Name", "Base", "Cnt", "CIDX", "DIDX", "QCnt");
2328+ dump_dma_rx_ring_info(s, dev, "R0:Data0(MAC2H)", MT_DBG_RX_DATA_RING_CTRL(0));
2329+ dump_dma_rx_ring_info(s, dev, "R1:Data1(MAC2H)", MT_DBG_RX_DATA_RING_CTRL(1));
2330+
2331+ seq_printf(s, "HOST_DMA0 PCIe 1 Ring Configuration\n");
2332+ seq_printf(s, "%20s %10s %10s %10s %10s %10s\n",
2333+ "Name", "Base", "Cnt", "CIDX", "DIDX", "QCnt");
2334+ dump_dma_rx_ring_info(s, dev, "R1:Data1(MAC2H)", MT_DBG_WFDMA0_PCIE1_RX1_CTRL0);
2335+
2336+ seq_printf(s, "HOST_DMA1 Ring Configuration\n");
2337+ seq_printf(s, "%20s %10s %10s %10s %10s %10s\n",
2338+ "Name", "Base", "Cnt", "CIDX", "DIDX", "QCnt");
2339+ dump_dma_tx_ring_info(s, dev, "T16:FWDL", MT_DBG_TX_RING_CTRL(0));
2340+ dump_dma_tx_ring_info(s, dev, "T17:Cmd(H2WM)", MT_DBG_TX_RING_CTRL(1));
2341+ dump_dma_tx_ring_info(s, dev, "T18:TXD0(H2WA)", MT_DBG_TX_RING_CTRL(2));
2342+ dump_dma_tx_ring_info(s, dev, "T19:TXD1(H2WA)", MT_DBG_TX_RING_CTRL(3));
2343+ dump_dma_tx_ring_info(s, dev, "T20:Cmd(H2WA)", MT_DBG_TX_RING_CTRL(4));
2344+ dump_dma_rx_ring_info(s, dev, "R0:Event(WM2H)", MT_DBG_RX_EVENT_RING_CTRL(0));
2345+ dump_dma_rx_ring_info(s, dev, "R1:Event0(WA2H)", MT_DBG_RX_EVENT_RING_CTRL(1));
2346+ dump_dma_rx_ring_info(s, dev, "R2:Event1(WA2H)", MT_DBG_RX_EVENT_RING_CTRL(2));
2347+
2348+ seq_printf(s, "HOST_DMA1 PCIe 1 Ring Configuration\n");
2349+ seq_printf(s, "%20s %10s %10s %10s %10s %10s\n",
2350+ "Name", "Base", "Cnt", "CIDX", "DIDX", "QCnt");
2351+ dump_dma_tx_ring_info(s, dev, "T19:TXD1(H2WA)", MT_DBG_WFDMA1_PCIE1_TX19_CTRL0);
2352+ dump_dma_rx_ring_info(s, dev, "R2:Event1(WA2H)", MT_DBG_WFDMA1_PCIE1_RX2_CTRL0);
2353+}
2354+
2355+static void
2356+mt7915_show_mcu_dma_info(struct seq_file *s, struct mt7915_dev *dev)
2357+{
2358+ u32 sys_ctrl[9] = {};
2359+
2360+ /* MCU DMA information */
2361+ sys_ctrl[0] = mt76_rr(dev, WF_WFDMA_MCU_DMA0_WPDMA_GLO_CFG_ADDR);
2362+ sys_ctrl[1] = mt76_rr(dev, WF_WFDMA_MCU_DMA0_HOST_INT_STA_ADDR);
2363+ sys_ctrl[2] = mt76_rr(dev, WF_WFDMA_MCU_DMA0_HOST_INT_ENA_ADDR);
2364+
2365+ sys_ctrl[3] = mt76_rr(dev, WF_WFDMA_MCU_DMA1_WPDMA_GLO_CFG_ADDR);
2366+ sys_ctrl[4] = mt76_rr(dev, WF_WFDMA_MCU_DMA1_HOST_INT_STA_ADDR);
2367+ sys_ctrl[5] = mt76_rr(dev, WF_WFDMA_MCU_DMA1_HOST_INT_ENA_ADDR);
2368+ sys_ctrl[6] = mt76_rr(dev, WF_WFDMA_MCU_DMA1_PCIE1_WPDMA_GLO_CFG_ADDR);
2369+ sys_ctrl[7] = mt76_rr(dev, WF_WFDMA_MCU_DMA1_PCIE1_HOST_INT_STA_ADDR);
2370+ sys_ctrl[8] = mt76_rr(dev, WF_WFDMA_MCU_DMA1_PCIE1_HOST_INT_ENA_ADDR);
2371+
2372+ seq_printf(s, "MCU_DMA Configuration\n");
2373+ seq_printf(s, "%10s %10s %10s %10s %10s %10s\n",
2374+ "DMA", "IntCSR", "IntMask", "Glocfg", "Tx/RxEn", "Tx/RxBusy");
2375+ seq_printf(s, "%10s %10x %10x %10x %4x/%5x %4x/%5x\n",
2376+ "DMA0", sys_ctrl[1], sys_ctrl[2], sys_ctrl[0],
2377+ (sys_ctrl[0] & WF_WFDMA_MCU_DMA0_WPDMA_GLO_CFG_TX_DMA_EN_MASK) >> WF_WFDMA_MCU_DMA0_WPDMA_GLO_CFG_TX_DMA_EN_SHFT,
2378+ (sys_ctrl[0] & WF_WFDMA_MCU_DMA0_WPDMA_GLO_CFG_RX_DMA_EN_MASK) >> WF_WFDMA_MCU_DMA0_WPDMA_GLO_CFG_RX_DMA_EN_SHFT,
2379+ (sys_ctrl[0] & WF_WFDMA_MCU_DMA0_WPDMA_GLO_CFG_TX_DMA_BUSY_MASK) >> WF_WFDMA_MCU_DMA0_WPDMA_GLO_CFG_TX_DMA_BUSY_SHFT,
2380+ (sys_ctrl[0] & WF_WFDMA_MCU_DMA0_WPDMA_GLO_CFG_RX_DMA_BUSY_MASK) >> WF_WFDMA_MCU_DMA0_WPDMA_GLO_CFG_RX_DMA_BUSY_SHFT);
2381+
2382+ seq_printf(s, "%10s %10x %10x %10x %4x/%5x %4x/%5x\n",
2383+ "DMA1", sys_ctrl[4], sys_ctrl[5], sys_ctrl[3],
2384+ (sys_ctrl[3] & WF_WFDMA_MCU_DMA1_WPDMA_GLO_CFG_TX_DMA_EN_MASK) >> WF_WFDMA_MCU_DMA1_WPDMA_GLO_CFG_TX_DMA_EN_SHFT,
2385+ (sys_ctrl[3] & WF_WFDMA_MCU_DMA1_WPDMA_GLO_CFG_RX_DMA_EN_MASK) >> WF_WFDMA_MCU_DMA1_WPDMA_GLO_CFG_RX_DMA_EN_SHFT,
2386+ (sys_ctrl[3] & WF_WFDMA_MCU_DMA1_WPDMA_GLO_CFG_TX_DMA_BUSY_MASK) >> WF_WFDMA_MCU_DMA1_WPDMA_GLO_CFG_TX_DMA_BUSY_SHFT,
2387+ (sys_ctrl[3] & WF_WFDMA_MCU_DMA1_WPDMA_GLO_CFG_RX_DMA_BUSY_MASK) >> WF_WFDMA_MCU_DMA1_WPDMA_GLO_CFG_RX_DMA_BUSY_SHFT);
2388+ seq_printf(s, "%10s %10x %10x %10x %4x/%5x %4x/%5x\n",
2389+ "DMA1P1", sys_ctrl[7], sys_ctrl[8], sys_ctrl[6],
2390+ (sys_ctrl[6] & WF_WFDMA_MCU_DMA1_PCIE1_WPDMA_GLO_CFG_TX_DMA_EN_MASK) >> WF_WFDMA_MCU_DMA1_PCIE1_WPDMA_GLO_CFG_TX_DMA_EN_SHFT,
2391+ (sys_ctrl[6] & WF_WFDMA_MCU_DMA1_PCIE1_WPDMA_GLO_CFG_RX_DMA_EN_MASK) >> WF_WFDMA_MCU_DMA1_PCIE1_WPDMA_GLO_CFG_RX_DMA_EN_SHFT,
2392+ (sys_ctrl[6] & WF_WFDMA_MCU_DMA1_PCIE1_WPDMA_GLO_CFG_TX_DMA_BUSY_MASK) >> WF_WFDMA_MCU_DMA1_PCIE1_WPDMA_GLO_CFG_TX_DMA_BUSY_SHFT,
2393+ (sys_ctrl[6] & WF_WFDMA_MCU_DMA1_PCIE1_WPDMA_GLO_CFG_RX_DMA_BUSY_MASK) >> WF_WFDMA_MCU_DMA1_PCIE1_WPDMA_GLO_CFG_RX_DMA_BUSY_SHFT);
2394+
2395+ seq_printf(s, "MCU_DMA0 Ring Configuration\n");
2396+ seq_printf(s, "%20s %10s %10s %10s %10s %10s\n",
2397+ "Name", "Base", "Cnt", "CIDX", "DIDX", "QCnt");
2398+ dump_dma_tx_ring_info(s, dev, "T0:TXD(WM2MAC)", WF_WFDMA_MCU_DMA0_WPDMA_TX_RING0_CTRL0_ADDR);
2399+ dump_dma_tx_ring_info(s, dev, "T1:TXCMD(WM2MAC)", WF_WFDMA_MCU_DMA0_WPDMA_TX_RING1_CTRL0_ADDR);
2400+ dump_dma_tx_ring_info(s, dev, "T2:TXD(WA2MAC)", WF_WFDMA_MCU_DMA0_WPDMA_TX_RING2_CTRL0_ADDR);
2401+ dump_dma_rx_ring_info(s, dev, "R0:Data(MAC2WM)", WF_WFDMA_MCU_DMA0_WPDMA_RX_RING0_CTRL0_ADDR);
2402+ dump_dma_rx_ring_info(s, dev, "R1:TxDone(MAC2WM)", WF_WFDMA_MCU_DMA0_WPDMA_RX_RING1_CTRL0_ADDR);
2403+ dump_dma_rx_ring_info(s, dev, "R2:SPL(MAC2WM)", WF_WFDMA_MCU_DMA0_WPDMA_RX_RING2_CTRL0_ADDR);
2404+ dump_dma_rx_ring_info(s, dev, "R3:TxDone(MAC2WA)", WF_WFDMA_MCU_DMA0_WPDMA_RX_RING3_CTRL0_ADDR);
2405+ dump_dma_rx_ring_info(s, dev, "R4:TXS(MAC2WA)", WF_WFDMA_MCU_DMA0_WPDMA_RX_RING4_CTRL0_ADDR);
2406+
2407+ seq_printf(s, "MCU_DMA1 Ring Configuration\n");
2408+ seq_printf(s, "%20s %10s %10s %10s %10s %10s\n",
2409+ "Name", "Base", "Cnt", "CIDX", "DIDX", "QCnt");
2410+ dump_dma_tx_ring_info(s, dev, "T0:Event(WM2H)", WF_WFDMA_MCU_DMA1_WPDMA_TX_RING0_CTRL0_ADDR);
2411+ dump_dma_tx_ring_info(s, dev, "T1:Event0(WA2H)", WF_WFDMA_MCU_DMA1_WPDMA_TX_RING1_CTRL0_ADDR);
2412+ dump_dma_tx_ring_info(s, dev, "T2:Event1(WA2H)", WF_WFDMA_MCU_DMA1_WPDMA_TX_RING2_CTRL0_ADDR);
2413+ dump_dma_rx_ring_info(s, dev, "R0:FWDL", WF_WFDMA_MCU_DMA1_WPDMA_RX_RING0_CTRL0_ADDR);
2414+ dump_dma_rx_ring_info(s, dev, "R1:Cmd(H2WM)", WF_WFDMA_MCU_DMA1_WPDMA_RX_RING1_CTRL0_ADDR);
2415+ dump_dma_rx_ring_info(s, dev, "R2:TXD0(H2WA)", WF_WFDMA_MCU_DMA1_WPDMA_RX_RING2_CTRL0_ADDR);
2416+ dump_dma_rx_ring_info(s, dev, "R3:TXD1(H2WA)", WF_WFDMA_MCU_DMA1_WPDMA_RX_RING3_CTRL0_ADDR);
2417+ dump_dma_rx_ring_info(s, dev, "R4:Cmd(H2WA)", WF_WFDMA_MCU_DMA1_WPDMA_RX_RING4_CTRL0_ADDR);
2418+
2419+ seq_printf(s, "MCU_DMA1 PCIe 1 Ring Configuration\n");
2420+ seq_printf(s, "%20s %10s %10s %10s %10s %10s\n",
2421+ "Name", "Base", "Cnt", "CIDX", "DIDX", "QCnt");
2422+ dump_dma_tx_ring_info(s, dev, "T2:Event1(WA2H)", WF_WFDMA_MCU_DMA1_PCIE1_WPDMA_TX_RING2_CTRL0_ADDR);
2423+ dump_dma_rx_ring_info(s, dev, "R3:TXD1(H2WA)", WF_WFDMA_MCU_DMA1_PCIE1_WPDMA_RX_RING3_CTRL0_ADDR);
2424+}
2425+
2426+static void
2427+mt7986_show_host_dma_info(struct seq_file *s, struct mt7915_dev *dev)
2428+{
2429+ u32 sys_ctrl[5] = {};
2430+
2431+ /* HOST DMA */
2432+ sys_ctrl[0] = mt76_rr(dev, MT_DBG_INT_SOURCE_CSR);
2433+ sys_ctrl[1] = mt76_rr(dev, MT_DBG_INT_MASK_CSR);
2434+ sys_ctrl[2] = mt76_rr(dev, MT_DBG_WFDMA0_INT_SOURCE_CSR);
2435+ sys_ctrl[3] = mt76_rr(dev, MT_DBG_WFDMA0_INT_MASK_CSR);
2436+ sys_ctrl[4] = mt76_rr(dev, MT_DBG_WFDMA0_GLO_CFG);
2437+
2438+ seq_printf(s, "HOST_DMA Configuration\n");
2439+ seq_printf(s, "%10s %10s %10s %10s %10s %10s\n",
2440+ "DMA", "IntCSR", "IntMask", "Glocfg", "Tx/RxEn", "Tx/RxBusy");
2441+ seq_printf(s, "%10s %10x %10x\n",
2442+ "Merge", sys_ctrl[0], sys_ctrl[1]);
2443+ seq_printf(s, "%10s %10x %10x %10x %4lx/%5lx %4lx/%5lx\n",
2444+ "DMA0", sys_ctrl[2], sys_ctrl[3], sys_ctrl[4],
2445+ FIELD_GET(MT_DBG_WFDMA_HOST_DMA0_GLO_CFG_TX_DMA_EN_MASK, sys_ctrl[4]),
2446+ FIELD_GET(MT_DBG_WFDMA_HOST_DMA0_GLO_CFG_RX_DMA_EN_MASK, sys_ctrl[4]),
2447+ FIELD_GET(MT_DBG_WFDMA_HOST_DMA0_GLO_CFG_TX_DMA_BUSY_MASK, sys_ctrl[4]),
2448+ FIELD_GET(MT_DBG_WFDMA_HOST_DMA0_GLO_CFG_RX_DMA_BUSY_MASK, sys_ctrl[4]));
2449+
2450+
2451+ seq_printf(s, "HOST_DMA0 Ring Configuration\n");
2452+ seq_printf(s, "%20s %10s %10s %10s %10s %10s\n",
2453+ "Name", "Base", "Cnt", "CIDX", "DIDX", "QCnt");
2454+ dump_dma_tx_ring_info(s, dev, "T16:FWDL", MT_DBG_TX_RING_CTRL(0));
2455+ dump_dma_tx_ring_info(s, dev, "T17:Cmd(H2WM)", MT_DBG_TX_RING_CTRL(1));
2456+ dump_dma_tx_ring_info(s, dev, "T18:TXD0(H2WA)", MT_DBG_TX_RING_CTRL(2));
2457+ dump_dma_tx_ring_info(s, dev, "T19:TXD1(H2WA)", MT_DBG_TX_RING_CTRL(3));
2458+ dump_dma_tx_ring_info(s, dev, "T20:Cmd(H2WA)", MT_DBG_TX_RING_CTRL(4));
2459+ dump_dma_rx_ring_info(s, dev, "R0:Event(WM2H)", MT_DBG_RX_DATA_RING_CTRL(0));
2460+ dump_dma_rx_ring_info(s, dev, "R1:Event(WA2H)", MT_DBG_RX_EVENT_RING_CTRL(1));
2461+ dump_dma_rx_ring_info(s, dev, "R2:TxDone(WA2H)", MT_DBG_RX_EVENT_RING_CTRL(2));
2462+ dump_dma_rx_ring_info(s, dev, "R3:TxDone1(WA2H)", MT_DBG_RX_EVENT_RING_CTRL(3));
2463+ dump_dma_rx_ring_info(s, dev, "R4:Data0(MAC2H)", MT_DBG_RX_DATA_RING_CTRL(0));
2464+ dump_dma_rx_ring_info(s, dev, "R5:Data1(MAC2H)", MT_DBG_RX_DATA_RING_CTRL(1));
2465+}
2466+
2467+static void
2468+mt7986_show_mcu_dma_info(struct seq_file *s, struct mt7915_dev *dev)
2469+{
2470+ u32 sys_ctrl[3] = {};
2471+
2472+ /* MCU DMA information */
2473+ sys_ctrl[0] = mt76_rr(dev, WF_WFDMA_MCU_DMA0_WPDMA_GLO_CFG_ADDR);
2474+ sys_ctrl[1] = mt76_rr(dev, WF_WFDMA_MCU_DMA0_HOST_INT_STA_ADDR);
2475+ sys_ctrl[2] = mt76_rr(dev, WF_WFDMA_MCU_DMA0_HOST_INT_ENA_ADDR);
2476+
2477+ seq_printf(s, "MCU_DMA Configuration\n");
2478+ seq_printf(s, "%10s %10s %10s %10s %10s %10s\n",
2479+ "DMA", "IntCSR", "IntMask", "Glocfg", "Tx/RxEn", "Tx/RxBusy");
2480+ seq_printf(s, "%10s %10x %10x %10x %4x/%5x %4x/%5x\n",
2481+ "DMA0", sys_ctrl[1], sys_ctrl[2], sys_ctrl[0],
2482+ (sys_ctrl[0] & WF_WFDMA_MCU_DMA0_WPDMA_GLO_CFG_TX_DMA_EN_MASK) >> WF_WFDMA_MCU_DMA0_WPDMA_GLO_CFG_TX_DMA_EN_SHFT,
2483+ (sys_ctrl[0] & WF_WFDMA_MCU_DMA0_WPDMA_GLO_CFG_RX_DMA_EN_MASK) >> WF_WFDMA_MCU_DMA0_WPDMA_GLO_CFG_RX_DMA_EN_SHFT,
2484+ (sys_ctrl[0] & WF_WFDMA_MCU_DMA0_WPDMA_GLO_CFG_TX_DMA_BUSY_MASK) >> WF_WFDMA_MCU_DMA0_WPDMA_GLO_CFG_TX_DMA_BUSY_SHFT,
2485+ (sys_ctrl[0] & WF_WFDMA_MCU_DMA0_WPDMA_GLO_CFG_RX_DMA_BUSY_MASK) >> WF_WFDMA_MCU_DMA0_WPDMA_GLO_CFG_RX_DMA_BUSY_SHFT);
2486+
2487+ seq_printf(s, "MCU_DMA0 Ring Configuration\n");
2488+ seq_printf(s, "%22s %10s %10s %10s %10s %10s\n",
2489+ "Name", "Base", "Cnt", "CIDX", "DIDX", "QCnt");
2490+ dump_dma_tx_ring_info(s, dev, "T0:Event (WM2H)", WF_WFDMA_MCU_DMA0_WPDMA_TX_RING0_CTRL0_ADDR);
2491+ dump_dma_tx_ring_info(s, dev, "T1:Event (WA2H)", WF_WFDMA_MCU_DMA0_WPDMA_TX_RING1_CTRL0_ADDR);
2492+ dump_dma_tx_ring_info(s, dev, "T2:TxDone (WA2H)", WF_WFDMA_MCU_DMA0_WPDMA_TX_RING2_CTRL0_ADDR);
2493+ dump_dma_tx_ring_info(s, dev, "T3:TxDone1 (WA2H)", WF_WFDMA_MCU_DMA0_WPDMA_TX_RING3_CTRL0_ADDR);
2494+ dump_dma_tx_ring_info(s, dev, "T4:TXD (WM2MAC)", WF_WFDMA_MCU_DMA0_WPDMA_TX_RING4_CTRL0_ADDR);
2495+ dump_dma_tx_ring_info(s, dev, "T5:TXCMD (WM2MAC)", WF_WFDMA_MCU_DMA0_WPDMA_TX_RING5_CTRL0_ADDR);
2496+ dump_dma_tx_ring_info(s, dev, "T6:TXD (WA2MAC)", WF_WFDMA_MCU_DMA0_WPDMA_TX_RING6_CTRL0_ADDR);
2497+ dump_dma_rx_ring_info(s, dev, "R0:FWDL", WF_WFDMA_MCU_DMA0_WPDMA_RX_RING0_CTRL0_ADDR);
2498+ dump_dma_rx_ring_info(s, dev, "R1:Cmd (H2WM)", WF_WFDMA_MCU_DMA0_WPDMA_RX_RING1_CTRL0_ADDR);
2499+ dump_dma_rx_ring_info(s, dev, "R2:TXD (H2WA)", WF_WFDMA_MCU_DMA0_WPDMA_RX_RING2_CTRL0_ADDR);
2500+ dump_dma_rx_ring_info(s, dev, "R3:TXD1 (H2WA)", WF_WFDMA_MCU_DMA0_WPDMA_RX_RING3_CTRL0_ADDR);
2501+ dump_dma_rx_ring_info(s, dev, "R4:Cmd (H2WA)", WF_WFDMA_MCU_DMA0_WPDMA_RX_RING4_CTRL0_ADDR);
2502+ dump_dma_rx_ring_info(s, dev, "R5:Data (MAC2WM)", WF_WFDMA_MCU_DMA0_WPDMA_RX_RING5_CTRL0_ADDR);
2503+ dump_dma_rx_ring_info(s, dev, "R6:TxDone/STS (MAC2WM)", WF_WFDMA_MCU_DMA0_WPDMA_RX_RING6_CTRL0_ADDR);
2504+ dump_dma_rx_ring_info(s, dev, "R7:RPT (MAC2WM)", WF_WFDMA_MCU_DMA0_WPDMA_RX_RING7_CTRL0_ADDR);
2505+ dump_dma_rx_ring_info(s, dev, "R8:TxDone/STS (MAC2WA)", WF_WFDMA_MCU_DMA0_WPDMA_RX_RING8_CTRL0_ADDR);
2506+ dump_dma_rx_ring_info(s, dev, "R9:Data1 (MAC2WM)", WF_WFDMA_MCU_DMA0_WPDMA_RX_RING9_CTRL0_ADDR);
2507+
2508+}
2509+
2510+static void
2511+mt7915_show_dma_info(struct seq_file *s, struct mt7915_dev *dev)
2512+{
2513+ u32 sys_ctrl[10] = {};
2514+
2515+ if(is_mt7915(&dev->mt76)) {
2516+ mt7915_show_host_dma_info(s, dev);
2517+ mt7915_show_mcu_dma_info(s, dev);
2518+ } else {
2519+ mt7986_show_host_dma_info(s, dev);
2520+ mt7986_show_mcu_dma_info(s, dev);
2521+ }
2522+
2523+ /* MEM DMA information */
2524+ sys_ctrl[0] = mt76_rr(dev, WF_WFDMA_MEM_DMA_WPDMA_GLO_CFG_ADDR);
2525+ sys_ctrl[1] = mt76_rr(dev, WF_WFDMA_MEM_DMA_HOST_INT_STA_ADDR);
2526+ sys_ctrl[2] = mt76_rr(dev, WF_WFDMA_MEM_DMA_HOST_INT_ENA_ADDR);
2527+
2528+ seq_printf(s, "MEM_DMA Configuration\n");
2529+ seq_printf(s, "%10s %10s %10s %10s %10s %10s\n",
2530+ "DMA", "IntCSR", "IntMask", "Glocfg", "Tx/RxEn", "Tx/RxBusy");
2531+ seq_printf(s, "%10s %10x %10x %10x %4x/%5x %4x/%5x\n",
2532+ "MEM", sys_ctrl[1], sys_ctrl[2], sys_ctrl[0],
2533+ (sys_ctrl[0] & WF_WFDMA_MEM_DMA_WPDMA_GLO_CFG_TX_DMA_EN_MASK) >> WF_WFDMA_MEM_DMA_WPDMA_GLO_CFG_TX_DMA_EN_SHFT,
2534+ (sys_ctrl[0] & WF_WFDMA_MEM_DMA_WPDMA_GLO_CFG_RX_DMA_EN_MASK) >> WF_WFDMA_MEM_DMA_WPDMA_GLO_CFG_RX_DMA_EN_SHFT,
2535+ (sys_ctrl[0] & WF_WFDMA_MEM_DMA_WPDMA_GLO_CFG_TX_DMA_BUSY_MASK) >> WF_WFDMA_MEM_DMA_WPDMA_GLO_CFG_TX_DMA_BUSY_SHFT,
2536+ (sys_ctrl[0] & WF_WFDMA_MEM_DMA_WPDMA_GLO_CFG_RX_DMA_BUSY_MASK) >> WF_WFDMA_MEM_DMA_WPDMA_GLO_CFG_RX_DMA_BUSY_SHFT);
2537+
2538+ seq_printf(s, "MEM_DMA Ring Configuration\n");
2539+ seq_printf(s, "%20s %10s %10s %10s %10s %10s\n",
2540+ "Name", "Base", "Cnt", "CIDX", "DIDX", "QCnt");
2541+ dump_dma_tx_ring_info(s, dev, "T0:CmdEvent(WM2WA)", WF_WFDMA_MEM_DMA_WPDMA_TX_RING0_CTRL0_ADDR);
2542+ dump_dma_tx_ring_info(s, dev, "T1:CmdEvent(WA2WM)", WF_WFDMA_MEM_DMA_WPDMA_TX_RING1_CTRL0_ADDR);
2543+ dump_dma_rx_ring_info(s, dev, "R0:CmdEvent(WM2WA)", WF_WFDMA_MEM_DMA_WPDMA_RX_RING0_CTRL0_ADDR);
2544+ dump_dma_rx_ring_info(s, dev, "R1:CmdEvent(WA2WM)", WF_WFDMA_MEM_DMA_WPDMA_RX_RING1_CTRL0_ADDR);
2545+}
2546+
2547+static int mt7915_trinfo_read(struct seq_file *s, void *data)
2548+{
2549+ struct mt7915_dev *dev = dev_get_drvdata(s->private);
2550+ const struct hif_pci_tx_ring_desc *tx_ring_layout;
2551+ const struct hif_pci_rx_ring_desc *rx_ring_layout;
2552+ u32 tx_ring_num, rx_ring_num;
2553+ u32 tbase[5], tcnt[5];
2554+ u32 tcidx[5], tdidx[5];
2555+ u32 rbase[6], rcnt[6];
2556+ u32 rcidx[6], rdidx[6];
2557+ int idx;
2558+
2559+ if(is_mt7915(&dev->mt76)) {
2560+ tx_ring_layout = &mt7915_tx_ring_layout[0];
2561+ rx_ring_layout = &mt7915_rx_ring_layout[0];
2562+ tx_ring_num = ARRAY_SIZE(mt7915_tx_ring_layout);
2563+ rx_ring_num = ARRAY_SIZE(mt7915_rx_ring_layout);
2564+ } else {
2565+ tx_ring_layout = &mt7986_tx_ring_layout[0];
2566+ rx_ring_layout = &mt7986_rx_ring_layout[0];
2567+ tx_ring_num = ARRAY_SIZE(mt7986_tx_ring_layout);
2568+ rx_ring_num = ARRAY_SIZE(mt7986_rx_ring_layout);
2569+ }
2570+
2571+ for (idx = 0; idx < tx_ring_num; idx++) {
2572+ tbase[idx] = mt76_rr(dev, MT_DBG_TX_RING_CTRL(idx));
2573+ tcnt[idx] = mt76_rr(dev, MT_DBG_TX_RING_CTRL(idx) + 0x04);
2574+ tcidx[idx] = mt76_rr(dev, MT_DBG_TX_RING_CTRL(idx) + 0x08);
2575+ tdidx[idx] = mt76_rr(dev, MT_DBG_TX_RING_CTRL(idx) + 0x0c);
2576+ }
2577+
2578+ for (idx = 0; idx < rx_ring_num; idx++) {
2579+ if (idx < 2) {
2580+ rbase[idx] = mt76_rr(dev, MT_DBG_RX_DATA_RING_CTRL(idx));
2581+ rcnt[idx] = mt76_rr(dev, MT_DBG_RX_DATA_RING_CTRL(idx) + 0x04);
2582+ rcidx[idx] = mt76_rr(dev, MT_DBG_RX_DATA_RING_CTRL(idx) + 0x08);
2583+ rdidx[idx] = mt76_rr(dev, MT_DBG_RX_DATA_RING_CTRL(idx) + 0x0c);
2584+ } else {
2585+ rbase[idx] = mt76_rr(dev, MT_DBG_RX_EVENT_RING_CTRL(idx - 2));
2586+ rcnt[idx] = mt76_rr(dev, MT_DBG_RX_EVENT_RING_CTRL(idx - 2) + 0x04);
2587+ rcidx[idx] = mt76_rr(dev, MT_DBG_RX_EVENT_RING_CTRL(idx - 2) + 0x08);
2588+ rdidx[idx] = mt76_rr(dev, MT_DBG_RX_EVENT_RING_CTRL(idx - 2) + 0x0c);
2589+ }
2590+ }
2591+
2592+ seq_printf(s, "=================================================\n");
2593+ seq_printf(s, "TxRing Configuration\n");
2594+ seq_printf(s, "%4s %10s %8s %1s %6s %6s %6s %6s\n",
2595+ "Idx", "Attr", "Reg", "Base", "Cnt", "CIDX", "DIDX",
2596+ "QCnt");
2597+ for (idx = 0; idx < tx_ring_num; idx++) {
2598+ u32 queue_cnt;
2599+
2600+ queue_cnt = (tcidx[idx] >= tdidx[idx]) ?
2601+ (tcidx[idx] - tdidx[idx]) :
2602+ (tcidx[idx] - tdidx[idx] + tcnt[idx]);
2603+ seq_printf(s, "%4d %8s %8x %10x %6x %6x %6x %6x\n",
2604+ idx, tx_ring_layout[idx].ring_info,
2605+ MT_DBG_TX_RING_CTRL(idx), tbase[idx],
2606+ tcnt[idx], tcidx[idx], tdidx[idx], queue_cnt);
2607+ }
2608+
2609+ seq_printf(s, "RxRing Configuration\n");
2610+ seq_printf(s, "%4s %10s %8s %10s %6s %6s %6s %6s\n",
2611+ "Idx", "Attr", "Reg", "Base", "Cnt", "CIDX", "DIDX",
2612+ "QCnt");
2613+
2614+ for (idx = 0; idx < rx_ring_num; idx++) {
2615+ u32 queue_cnt;
2616+
2617+ queue_cnt = (rdidx[idx] > rcidx[idx]) ?
2618+ (rdidx[idx] - rcidx[idx] - 1) :
2619+ (rdidx[idx] - rcidx[idx] + rcnt[idx] - 1);
2620+ seq_printf(s, "%4d %8s %8x %10x %6x %6x %6x %6x\n",
2621+ idx, rx_ring_layout[idx].ring_info,
2622+ (idx < 2) ? MT_DBG_RX_DATA_RING_CTRL(idx): MT_DBG_RX_EVENT_RING_CTRL(idx - 2),
2623+ rbase[idx], rcnt[idx], rcidx[idx], rdidx[idx], queue_cnt);
2624+ }
2625+
2626+ mt7915_show_dma_info(s, dev);
2627+ return 0;
2628+}
2629+
2630+static int mt7915_drr_info(struct seq_file *s, void *data)
2631+{
2632+#define DL_AC_START 0x00
2633+#define DL_AC_END 0x0F
2634+#define UL_AC_START 0x10
2635+#define UL_AC_END 0x1F
2636+
2637+ struct mt7915_dev *dev = dev_get_drvdata(s->private);
2638+ u32 drr_sta_status[16];
2639+ u32 drr_ctrl_def_val = 0x80220000, drr_ctrl_val = 0;
2640+ bool is_show = false;
2641+ int idx, sta_line = 0, sta_no = 0, max_sta_line = (mt7915_wtbl_size(dev) + 31) / 32;
2642+ seq_printf(s, "DRR Table STA Info:\n");
2643+
2644+ for (idx = DL_AC_START; idx <= DL_AC_END; idx++) {
2645+ is_show = true;
2646+ drr_ctrl_val = (drr_ctrl_def_val | idx);
2647+ mt76_wr(dev, MT_DBG_PLE_DRR_TAB_CTRL, drr_ctrl_val);
2648+ drr_sta_status[0] = mt76_rr(dev, MT_DBG_PLE_DRR_TABLE_RDATA0);
2649+ drr_sta_status[1] = mt76_rr(dev, MT_DBG_PLE_DRR_TABLE_RDATA1);
2650+ drr_sta_status[2] = mt76_rr(dev, MT_DBG_PLE_DRR_TABLE_RDATA2);
2651+ drr_sta_status[3] = mt76_rr(dev, MT_DBG_PLE_DRR_TABLE_RDATA3);
2652+ drr_sta_status[4] = mt76_rr(dev, MT_DBG_PLE_DRR_TABLE_RDATA4);
2653+ drr_sta_status[5] = mt76_rr(dev, MT_DBG_PLE_DRR_TABLE_RDATA5);
2654+ drr_sta_status[6] = mt76_rr(dev, MT_DBG_PLE_DRR_TABLE_RDATA6);
2655+ drr_sta_status[7] = mt76_rr(dev, MT_DBG_PLE_DRR_TABLE_RDATA7);
2656+
2657+ if (is_mt7915(&dev->mt76) && max_sta_line > 8) {
2658+ drr_ctrl_val = (drr_ctrl_def_val | idx | 1 << 10);
2659+ mt76_wr(dev, MT_DBG_PLE_DRR_TAB_CTRL, drr_ctrl_val);
2660+ drr_sta_status[8] = mt76_rr(dev, MT_DBG_PLE_DRR_TABLE_RDATA0);
2661+ drr_sta_status[9] = mt76_rr(dev, MT_DBG_PLE_DRR_TABLE_RDATA1);
2662+ drr_sta_status[10] = mt76_rr(dev, MT_DBG_PLE_DRR_TABLE_RDATA2);
2663+ drr_sta_status[11] = mt76_rr(dev, MT_DBG_PLE_DRR_TABLE_RDATA3);
2664+ drr_sta_status[12] = mt76_rr(dev, MT_DBG_PLE_DRR_TABLE_RDATA4);
2665+ drr_sta_status[13] = mt76_rr(dev, MT_DBG_PLE_DRR_TABLE_RDATA5);
2666+ drr_sta_status[14] = mt76_rr(dev, MT_DBG_PLE_DRR_TABLE_RDATA6);
2667+ drr_sta_status[15] = mt76_rr(dev, MT_DBG_PLE_DRR_TABLE_RDATA7);
2668+ }
2669+ if (!is_mt7915(&dev->mt76))
2670+ max_sta_line = 8;
2671+
2672+ for (sta_line = 0; sta_line < max_sta_line; sta_line++) {
2673+ if (drr_sta_status[sta_line] > 0) {
2674+ for (sta_no = 0; sta_no < 32; sta_no++) {
2675+ if (((drr_sta_status[sta_line] & (0x1 << sta_no)) >> sta_no)) {
2676+ if (is_show) {
2677+ seq_printf(s, "\n DL AC%02d Queue Non-Empty STA:\n", idx);
2678+ is_show = false;
2679+ }
2680+ seq_printf(s, "%d ", sta_no + (sta_line * 32));
2681+ }
2682+ }
2683+ }
2684+ }
2685+ }
2686+
2687+ for (idx = UL_AC_START; idx <= UL_AC_END; idx++) {
2688+ is_show = true;
2689+ drr_ctrl_val = (drr_ctrl_def_val | idx);
2690+ mt76_wr(dev, MT_DBG_PLE_DRR_TAB_CTRL, drr_ctrl_val);
2691+ drr_sta_status[0] = mt76_rr(dev, MT_DBG_PLE_DRR_TABLE_RDATA0);
2692+ drr_sta_status[1] = mt76_rr(dev, MT_DBG_PLE_DRR_TABLE_RDATA1);
2693+ drr_sta_status[2] = mt76_rr(dev, MT_DBG_PLE_DRR_TABLE_RDATA2);
2694+ drr_sta_status[3] = mt76_rr(dev, MT_DBG_PLE_DRR_TABLE_RDATA3);
2695+ drr_sta_status[4] = mt76_rr(dev, MT_DBG_PLE_DRR_TABLE_RDATA4);
2696+ drr_sta_status[5] = mt76_rr(dev, MT_DBG_PLE_DRR_TABLE_RDATA5);
2697+ drr_sta_status[6] = mt76_rr(dev, MT_DBG_PLE_DRR_TABLE_RDATA6);
2698+ drr_sta_status[7] = mt76_rr(dev, MT_DBG_PLE_DRR_TABLE_RDATA7);
2699+
2700+ if (is_mt7915(&dev->mt76) && max_sta_line > 8) {
2701+ drr_ctrl_val = (drr_ctrl_def_val | idx | 1 << 10);
2702+ mt76_wr(dev, MT_DBG_PLE_DRR_TAB_CTRL, drr_ctrl_val);
2703+ drr_sta_status[8] = mt76_rr(dev, MT_DBG_PLE_DRR_TABLE_RDATA0);
2704+ drr_sta_status[9] = mt76_rr(dev, MT_DBG_PLE_DRR_TABLE_RDATA1);
2705+ drr_sta_status[10] = mt76_rr(dev, MT_DBG_PLE_DRR_TABLE_RDATA2);
2706+ drr_sta_status[11] = mt76_rr(dev, MT_DBG_PLE_DRR_TABLE_RDATA3);
2707+ drr_sta_status[12] = mt76_rr(dev, MT_DBG_PLE_DRR_TABLE_RDATA4);
2708+ drr_sta_status[13] = mt76_rr(dev, MT_DBG_PLE_DRR_TABLE_RDATA5);
2709+ drr_sta_status[14] = mt76_rr(dev, MT_DBG_PLE_DRR_TABLE_RDATA6);
2710+ drr_sta_status[15] = mt76_rr(dev, MT_DBG_PLE_DRR_TABLE_RDATA7);
2711+ }
2712+
2713+ if (!is_mt7915(&dev->mt76))
2714+ max_sta_line = 8;
2715+
2716+ for (sta_line = 0; sta_line < max_sta_line; sta_line++) {
2717+ if (drr_sta_status[sta_line] > 0) {
2718+ for (sta_no = 0; sta_no < 32; sta_no++) {
2719+ if (((drr_sta_status[sta_line] & (0x1 << sta_no)) >> sta_no)) {
2720+ if (is_show) {
2721+ seq_printf(s, "\n UL AC%02d Queue Non-Empty STA:\n", idx);
2722+ is_show = false;
2723+ }
2724+ seq_printf(s, "%d ", sta_no + (sta_line * 32));
2725+ }
2726+ }
2727+ }
2728+ }
2729+ }
2730+
2731+ for (idx = DL_AC_START; idx <= DL_AC_END; idx++) {
2732+ drr_ctrl_def_val = 0x80420000;
2733+ drr_ctrl_val = (drr_ctrl_def_val | idx);
2734+ mt76_wr(dev, MT_DBG_PLE_DRR_TAB_CTRL, drr_ctrl_val);
2735+ drr_sta_status[0] = mt76_rr(dev, MT_DBG_PLE_DRR_TABLE_RDATA0);
2736+ drr_sta_status[1] = mt76_rr(dev, MT_DBG_PLE_DRR_TABLE_RDATA1);
2737+ drr_sta_status[2] = mt76_rr(dev, MT_DBG_PLE_DRR_TABLE_RDATA2);
2738+ drr_sta_status[3] = mt76_rr(dev, MT_DBG_PLE_DRR_TABLE_RDATA3);
2739+ drr_sta_status[4] = mt76_rr(dev, MT_DBG_PLE_DRR_TABLE_RDATA4);
2740+ drr_sta_status[5] = mt76_rr(dev, MT_DBG_PLE_DRR_TABLE_RDATA5);
2741+ drr_sta_status[6] = mt76_rr(dev, MT_DBG_PLE_DRR_TABLE_RDATA6);
2742+ drr_sta_status[7] = mt76_rr(dev, MT_DBG_PLE_DRR_TABLE_RDATA7);
2743+
2744+ if (is_mt7915(&dev->mt76) && max_sta_line > 8) {
2745+ drr_ctrl_val = (drr_ctrl_def_val | idx | 1<<10);
2746+ mt76_wr(dev, MT_DBG_PLE_DRR_TAB_CTRL, drr_ctrl_val);
2747+ drr_sta_status[8] = mt76_rr(dev, MT_DBG_PLE_DRR_TABLE_RDATA0);
2748+ drr_sta_status[9] = mt76_rr(dev, MT_DBG_PLE_DRR_TABLE_RDATA1);
2749+ drr_sta_status[10] = mt76_rr(dev, MT_DBG_PLE_DRR_TABLE_RDATA2);
2750+ drr_sta_status[11] = mt76_rr(dev, MT_DBG_PLE_DRR_TABLE_RDATA3);
2751+ drr_sta_status[12] = mt76_rr(dev, MT_DBG_PLE_DRR_TABLE_RDATA4);
2752+ drr_sta_status[13] = mt76_rr(dev, MT_DBG_PLE_DRR_TABLE_RDATA5);
2753+ drr_sta_status[14] = mt76_rr(dev, MT_DBG_PLE_DRR_TABLE_RDATA6);
2754+ drr_sta_status[15] = mt76_rr(dev, MT_DBG_PLE_DRR_TABLE_RDATA7);
2755+ }
2756+
2757+ seq_printf(s, "\nBSSGrp[%d]:\n", idx);
2758+ if (!is_mt7915(&dev->mt76))
2759+ max_sta_line = 8;
2760+
2761+ for (sta_line = 0; sta_line < max_sta_line; sta_line++) {
2762+ seq_printf(s, "0x%08x ", drr_sta_status[sta_line]);
2763+
2764+ if ((sta_line % 4) == 3)
2765+ seq_printf(s, "\n");
2766+ }
2767+ }
2768+
2769+ return 0;
2770+}
2771+
2772+#define CR_NUM_OF_AC 9
2773+
2774+typedef enum _ENUM_UMAC_PORT_T {
2775+ ENUM_UMAC_HIF_PORT_0 = 0,
2776+ ENUM_UMAC_CPU_PORT_1 = 1,
2777+ ENUM_UMAC_LMAC_PORT_2 = 2,
2778+ ENUM_PLE_CTRL_PSE_PORT_3 = 3,
2779+ ENUM_UMAC_PSE_PLE_PORT_TOTAL_NUM = 4
2780+} ENUM_UMAC_PORT_T, *P_ENUM_UMAC_PORT_T;
2781+
2782+/* N9 MCU QUEUE LIST */
2783+typedef enum _ENUM_UMAC_CPU_P_QUEUE_T {
2784+ ENUM_UMAC_CTX_Q_0 = 0,
2785+ ENUM_UMAC_CTX_Q_1 = 1,
2786+ ENUM_UMAC_CTX_Q_2 = 2,
2787+ ENUM_UMAC_CTX_Q_3 = 3,
2788+ ENUM_UMAC_CRX = 0,
2789+ ENUM_UMAC_CIF_QUEUE_TOTAL_NUM = 4
2790+} ENUM_UMAC_CPU_P_QUEUE_T, *P_ENUM_UMAC_CPU_P_QUEUE_T;
2791+
2792+/* LMAC PLE TX QUEUE LIST */
2793+typedef enum _ENUM_UMAC_LMAC_PLE_TX_P_QUEUE_T {
2794+ ENUM_UMAC_LMAC_PLE_TX_Q_00 = 0x00,
2795+ ENUM_UMAC_LMAC_PLE_TX_Q_01 = 0x01,
2796+ ENUM_UMAC_LMAC_PLE_TX_Q_02 = 0x02,
2797+ ENUM_UMAC_LMAC_PLE_TX_Q_03 = 0x03,
2798+
2799+ ENUM_UMAC_LMAC_PLE_TX_Q_10 = 0x04,
2800+ ENUM_UMAC_LMAC_PLE_TX_Q_11 = 0x05,
2801+ ENUM_UMAC_LMAC_PLE_TX_Q_12 = 0x06,
2802+ ENUM_UMAC_LMAC_PLE_TX_Q_13 = 0x07,
2803+
2804+ ENUM_UMAC_LMAC_PLE_TX_Q_20 = 0x08,
2805+ ENUM_UMAC_LMAC_PLE_TX_Q_21 = 0x09,
2806+ ENUM_UMAC_LMAC_PLE_TX_Q_22 = 0x0a,
2807+ ENUM_UMAC_LMAC_PLE_TX_Q_23 = 0x0b,
2808+
2809+ ENUM_UMAC_LMAC_PLE_TX_Q_30 = 0x0c,
2810+ ENUM_UMAC_LMAC_PLE_TX_Q_31 = 0x0d,
2811+ ENUM_UMAC_LMAC_PLE_TX_Q_32 = 0x0e,
2812+ ENUM_UMAC_LMAC_PLE_TX_Q_33 = 0x0f,
2813+
2814+ ENUM_UMAC_LMAC_PLE_TX_Q_ALTX_0 = 0x10,
2815+ ENUM_UMAC_LMAC_PLE_TX_Q_BMC_0 = 0x11,
2816+ ENUM_UMAC_LMAC_PLE_TX_Q_BNC_0 = 0x12,
2817+ ENUM_UMAC_LMAC_PLE_TX_Q_PSMP_0 = 0x13,
2818+
2819+ ENUM_UMAC_LMAC_PLE_TX_Q_ALTX_1 = 0x14,
2820+ ENUM_UMAC_LMAC_PLE_TX_Q_BMC_1 = 0x15,
2821+ ENUM_UMAC_LMAC_PLE_TX_Q_BNC_1 = 0x16,
2822+ ENUM_UMAC_LMAC_PLE_TX_Q_PSMP_1 = 0x17,
2823+ ENUM_UMAC_LMAC_PLE_TX_Q_NAF = 0x18,
2824+ ENUM_UMAC_LMAC_PLE_TX_Q_NBCN = 0x19,
2825+ ENUM_UMAC_LMAC_PLE_TX_Q_RELEASE = 0x1f, /* DE suggests not to use 0x1f, it's only for hw free queue */
2826+ ENUM_UMAC_LMAC_QUEUE_TOTAL_NUM = 24,
2827+
2828+} ENUM_UMAC_LMAC_TX_P_QUEUE_T, *P_ENUM_UMAC_LMAC_TX_P_QUEUE_T;
2829+
2830+typedef struct _EMPTY_QUEUE_INFO_T {
2831+ char *QueueName;
2832+ u32 Portid;
2833+ u32 Queueid;
2834+} EMPTY_QUEUE_INFO_T, *P_EMPTY_QUEUE_INFO_T;
2835+
2836+static EMPTY_QUEUE_INFO_T ple_queue_empty_info[] = {
2837+ {"CPU Q0", ENUM_UMAC_CPU_PORT_1, ENUM_UMAC_CTX_Q_0},
2838+ {"CPU Q1", ENUM_UMAC_CPU_PORT_1, ENUM_UMAC_CTX_Q_1},
2839+ {"CPU Q2", ENUM_UMAC_CPU_PORT_1, ENUM_UMAC_CTX_Q_2},
2840+ {"CPU Q3", ENUM_UMAC_CPU_PORT_1, ENUM_UMAC_CTX_Q_3},
2841+ {NULL, 0, 0}, {NULL, 0, 0}, {NULL, 0, 0}, {NULL, 0, 0}, /* 4~7 not defined */
2842+ {"ALTX Q0", ENUM_UMAC_LMAC_PORT_2, ENUM_UMAC_LMAC_PLE_TX_Q_ALTX_0}, /* Q16 */
2843+ {"BMC Q0", ENUM_UMAC_LMAC_PORT_2, ENUM_UMAC_LMAC_PLE_TX_Q_BMC_0},
2844+ {"BCN Q0", ENUM_UMAC_LMAC_PORT_2, ENUM_UMAC_LMAC_PLE_TX_Q_BNC_0},
2845+ {"PSMP Q0", ENUM_UMAC_LMAC_PORT_2, ENUM_UMAC_LMAC_PLE_TX_Q_PSMP_0},
2846+ {"ALTX Q1", ENUM_UMAC_LMAC_PORT_2, ENUM_UMAC_LMAC_PLE_TX_Q_ALTX_1},
2847+ {"BMC Q1", ENUM_UMAC_LMAC_PORT_2, ENUM_UMAC_LMAC_PLE_TX_Q_BMC_1},
2848+ {"BCN Q1", ENUM_UMAC_LMAC_PORT_2, ENUM_UMAC_LMAC_PLE_TX_Q_BNC_1},
2849+ {"PSMP Q1", ENUM_UMAC_LMAC_PORT_2, ENUM_UMAC_LMAC_PLE_TX_Q_PSMP_1},
2850+ {"NAF Q", ENUM_UMAC_LMAC_PORT_2, ENUM_UMAC_LMAC_PLE_TX_Q_NAF},
2851+ {"NBCN Q", ENUM_UMAC_LMAC_PORT_2, ENUM_UMAC_LMAC_PLE_TX_Q_NBCN},
2852+ {NULL, 0, 0}, {NULL, 0, 0}, /* 18, 19 not defined */
2853+ {"FIXFID Q", ENUM_UMAC_LMAC_PORT_2, 0x1a},
2854+ {NULL, 0, 0}, {NULL, 0, 0}, {NULL, 0, 0}, {NULL, 0, 0}, {NULL, 0, 0},
2855+ {NULL, 0, 0}, {NULL, 0, 0}, {NULL, 0, 0}, {NULL, 0, 0}, /* 21~29 not defined */
2856+ {"RLS Q", ENUM_PLE_CTRL_PSE_PORT_3, 0x7e},
2857+ {"RLS2 Q", ENUM_PLE_CTRL_PSE_PORT_3, 0x7f}
2858+};
2859+
2860+static EMPTY_QUEUE_INFO_T ple_txcmd_queue_empty_info[] = {
2861+ {"AC00Q", ENUM_UMAC_LMAC_PORT_2, 0x40},
2862+ {"AC01Q", ENUM_UMAC_LMAC_PORT_2, 0x41},
2863+ {"AC02Q", ENUM_UMAC_LMAC_PORT_2, 0x42},
2864+ {"AC03Q", ENUM_UMAC_LMAC_PORT_2, 0x43},
2865+ {"AC10Q", ENUM_UMAC_LMAC_PORT_2, 0x44},
2866+ {"AC11Q", ENUM_UMAC_LMAC_PORT_2, 0x45},
2867+ {"AC12Q", ENUM_UMAC_LMAC_PORT_2, 0x46},
2868+ {"AC13Q", ENUM_UMAC_LMAC_PORT_2, 0x47},
2869+ {"AC20Q", ENUM_UMAC_LMAC_PORT_2, 0x48},
2870+ {"AC21Q", ENUM_UMAC_LMAC_PORT_2, 0x49},
2871+ {"AC22Q", ENUM_UMAC_LMAC_PORT_2, 0x4a},
2872+ {"AC23Q", ENUM_UMAC_LMAC_PORT_2, 0x4b},
2873+ {"AC30Q", ENUM_UMAC_LMAC_PORT_2, 0x4c},
2874+ {"AC31Q", ENUM_UMAC_LMAC_PORT_2, 0x4d},
2875+ {"AC32Q", ENUM_UMAC_LMAC_PORT_2, 0x4e},
2876+ {"AC33Q", ENUM_UMAC_LMAC_PORT_2, 0x4f},
2877+ {"ALTX Q0", ENUM_UMAC_LMAC_PORT_2, 0x50},
2878+ {"TF Q0", ENUM_UMAC_LMAC_PORT_2, 0x51},
2879+ {"TWT TSF-TF Q0", ENUM_UMAC_LMAC_PORT_2, 0x52},
2880+ {"TWT DL Q0", ENUM_UMAC_LMAC_PORT_2, 0x53},
2881+ {"TWT UL Q0", ENUM_UMAC_LMAC_PORT_2, 0x54},
2882+ {"ALTX Q1", ENUM_UMAC_LMAC_PORT_2, 0x55},
2883+ {"TF Q1", ENUM_UMAC_LMAC_PORT_2, 0x56},
2884+ {"TWT TSF-TF Q1", ENUM_UMAC_LMAC_PORT_2, 0x57},
2885+ {"TWT DL Q1", ENUM_UMAC_LMAC_PORT_2, 0x58},
2886+ {"TWT UL Q1", ENUM_UMAC_LMAC_PORT_2, 0x59},
2887+ {NULL, 0, 0}, {NULL, 0, 0}, {NULL, 0, 0}, {NULL, 0, 0}, {NULL, 0, 0}, {NULL, 0, 0},
2888+};
2889+
2890+
2891+
2892+static char* sta_ctrl_reg[] = {"ENABLE", "DISABLE", "PAUSE"};
2893+static u32 chip_show_sta_acq_info(struct seq_file *s, struct mt7915_dev *dev, u32 *ple_stat,
2894+ u32 *sta_pause, u32 *dis_sta_map,
2895+ u32 dumptxd)
2896+{
2897+ int i, j;
2898+ u32 total_nonempty_cnt = 0;
2899+ u32 ac_num = 9, all_ac_num;
2900+
2901+ /* TDO: ac_num = 16 for mt7986 */
2902+ /* if (!is_mt7915(&dev->mt76))
2903+ ac_num = 16;
2904+ */
2905+
2906+ all_ac_num = ac_num * 4;
2907+
2908+ for (j = 0; j < all_ac_num; j++) { /* show AC Q info */
2909+ for (i = 0; i < 32; i++) {
2910+ if (((ple_stat[j + 1] & (0x1 << i)) >> i) == 0) {
2911+ u32 hfid, tfid, pktcnt, ac_num = j / ac_num, ctrl = 0;
2912+ u32 sta_num = i + (j % ac_num) * 32, fl_que_ctrl[3] = {0};
2913+ //struct wifi_dev *wdev = wdev_search_by_wcid(pAd, sta_num);
2914+ u32 wmmidx = 0;
2915+ struct mt7915_sta *msta;
2916+ struct mt76_wcid *wcid;
2917+ struct ieee80211_sta *sta = NULL;
2918+
2919+ wcid = rcu_dereference(dev->mt76.wcid[sta_num]);
2920+ sta = wcid_to_sta(wcid);
2921+ if (!sta) {
2922+ printk("ERROR!! no found STA wcid=%d\n", sta_num);
2923+ return 0;
2924+ }
2925+ msta = container_of(wcid, struct mt7915_sta, wcid);
2926+ wmmidx = msta->vif->mt76.wmm_idx;
2927+
2928+ seq_printf(s, "\tSTA%d AC%d: ", sta_num, ac_num);
2929+
2930+ fl_que_ctrl[0] |= MT_DBG_PLE_FL_QUE_CTRL0_EXECUTE_MASK;
2931+ fl_que_ctrl[0] |= (ENUM_UMAC_LMAC_PORT_2 << MT_PLE_FL_QUE_CTRL0_Q_BUF_PID_SHFT);
2932+ fl_que_ctrl[0] |= (ac_num << MT_PLE_FL_QUE_CTRL0_Q_BUF_QID_SHFT);
2933+ fl_que_ctrl[0] |= sta_num;
2934+ mt76_wr(dev, MT_DBG_PLE_FL_QUE_CTRL0, fl_que_ctrl[0]);
2935+ fl_que_ctrl[1] = mt76_rr(dev, MT_DBG_PLE_FL_QUE_CTRL2);
2936+ fl_que_ctrl[2] = mt76_rr(dev, MT_DBG_PLE_FL_QUE_CTRL3);
2937+ hfid = FIELD_GET(MT_DBG_PLE_FL_QUE_CTRL2_Q_HEAD_FID_MASK, fl_que_ctrl[1]);
2938+ tfid = FIELD_GET(MT_DBG_PLE_FL_QUE_CTRL2_Q_TAIL_FID_MASK, fl_que_ctrl[1]);
2939+ pktcnt = FIELD_GET(MT_DBG_PLE_FL_QUE_CTRL3_Q_PKT_NUM_MASK, fl_que_ctrl[2]);
2940+ seq_printf(s, "tail/head fid = 0x%03x/0x%03x, pkt cnt = 0x%03x",
2941+ tfid, hfid, pktcnt);
2942+
2943+ if (((sta_pause[j % 6] & 0x1 << i) >> i) == 1)
2944+ ctrl = 2;
2945+
2946+ if (((dis_sta_map[j % 6] & 0x1 << i) >> i) == 1)
2947+ ctrl = 1;
2948+
2949+ seq_printf(s, " ctrl = %s", sta_ctrl_reg[ctrl]);
2950+ seq_printf(s, " (wmmidx=%d)\n", wmmidx);
2951+
2952+ total_nonempty_cnt++;
2953+
2954+ // TODO
2955+ //if (pktcnt > 0 && dumptxd > 0)
2956+ // ShowTXDInfo(pAd, hfid);
2957+ }
2958+ }
2959+ }
2960+
2961+ return total_nonempty_cnt;
2962+}
2963+
2964+static void chip_show_txcmdq_info(struct seq_file *s, struct mt7915_dev *dev, u32 ple_txcmd_stat)
2965+{
2966+ int i;
2967+
2968+ seq_printf(s, "Nonempty TXCMD Q info:\n");
2969+ for (i = 0; i < 31; i++) {
2970+ if (((ple_txcmd_stat & (0x1 << i)) >> i) == 0) {
2971+ u32 hfid, tfid, pktcnt, fl_que_ctrl[3] = {0};
2972+
2973+ if (ple_txcmd_queue_empty_info[i].QueueName != NULL) {
2974+ seq_printf(s, "\t%s: ", ple_txcmd_queue_empty_info[i].QueueName);
2975+ fl_que_ctrl[0] |= MT_DBG_PLE_FL_QUE_CTRL0_EXECUTE_MASK;
2976+ fl_que_ctrl[0] |= (ple_txcmd_queue_empty_info[i].Portid <<
2977+ MT_PLE_FL_QUE_CTRL0_Q_BUF_PID_SHFT);
2978+ fl_que_ctrl[0] |= (ple_txcmd_queue_empty_info[i].Queueid <<
2979+ MT_PLE_FL_QUE_CTRL0_Q_BUF_QID_SHFT);
2980+ } else
2981+ continue;
2982+
2983+ mt76_wr(dev, MT_DBG_PLE_FL_QUE_CTRL0, fl_que_ctrl[0]);
2984+ fl_que_ctrl[1] = mt76_rr(dev, MT_DBG_PLE_FL_QUE_CTRL2);
2985+ fl_que_ctrl[2] = mt76_rr(dev, MT_DBG_PLE_FL_QUE_CTRL3);
2986+ hfid = FIELD_GET(MT_DBG_PLE_FL_QUE_CTRL2_Q_HEAD_FID_MASK, fl_que_ctrl[1]);
2987+ tfid = FIELD_GET(MT_DBG_PLE_FL_QUE_CTRL2_Q_TAIL_FID_MASK, fl_que_ctrl[1]);
2988+ pktcnt = FIELD_GET(MT_DBG_PLE_FL_QUE_CTRL3_Q_PKT_NUM_MASK, fl_que_ctrl[2]);
2989+ seq_printf(s, "tail/head fid = 0x%03x/0x%03x, pkt cnt = 0x%03x\n",
2990+ tfid, hfid, pktcnt);
2991+ }
2992+ }
2993+}
2994+
2995+static void chip_get_ple_acq_stat(struct mt7915_dev *dev, u32 *ple_stat)
2996+{
2997+ int i;
2998+ int cr_num = 9, all_cr_num;
2999+ u32 ac , index;
3000+
3001+ /* TDO: cr_num = 16 for mt7986 */
3002+ /*
3003+ if(!is_mt7915(&dev->mt76))
3004+ cr_num = 16;
3005+ */
3006+ all_cr_num = cr_num * 4;
3007+
3008+ ple_stat[0] = mt76_rr(dev, MT_DBG_PLE_QUEUE_EMPTY);
3009+
3010+ for(i = 0; i < all_cr_num; i++) {
3011+ ac = i / cr_num;
3012+ index = i % cr_num;
3013+ ple_stat[i + 1] =
3014+ mt76_rr(dev, MT_DBG_PLE_AC_QEMPTY(ac, index));
3015+
3016+ }
3017+}
3018+
3019+static void chip_get_dis_sta_map(struct mt7915_dev *dev, u32 *dis_sta_map)
3020+{
3021+ int i;
3022+
3023+ for(i = 0; i < CR_NUM_OF_AC; i++) {
3024+ dis_sta_map[i] = mt76_rr(dev, MT_DBG_PLE_DIS_STA_MAP(i));
3025+ }
3026+}
3027+
3028+static void chip_get_sta_pause(struct mt7915_dev *dev, u32 *sta_pause)
3029+{
3030+ int i;
3031+
3032+ for(i = 0; i < CR_NUM_OF_AC; i++) {
3033+ sta_pause[i] = mt76_rr(dev, MT_DBG_PLE_STATION_PAUSE(i));
3034+ }
3035+}
3036+
3037+static int mt7915_pleinfo_read(struct seq_file *s, void *data)
3038+{
3039+ struct mt7915_dev *dev = dev_get_drvdata(s->private);
3040+ u32 ple_buf_ctrl, pg_sz, pg_num;
3041+ u32 ple_stat[65] = {0}, pg_flow_ctrl[8] = {0};
3042+ u32 ple_native_txcmd_stat;
3043+ u32 ple_txcmd_stat;
3044+ u32 sta_pause[CR_NUM_OF_AC] = {0}, dis_sta_map[CR_NUM_OF_AC] = {0};
3045+ u32 fpg_cnt, ffa_cnt, fpg_head, fpg_tail, hif_max_q, hif_min_q;
3046+ u32 rpg_hif, upg_hif, cpu_max_q, cpu_min_q, rpg_cpu, upg_cpu;
3047+ int i, j;
3048+ u32 ac_num = 9, all_ac_num;
3049+
3050+ /* TDO: ac_num = 16 for mt7986 */
3051+ /* if (!is_mt7915(&dev->mt76))
3052+ ac_num = 16;
3053+ */
3054+
3055+ all_ac_num = ac_num * 4;
3056+
3057+ ple_buf_ctrl = mt76_rr(dev, MT_DBG_PLE_PBUF_CTRL_ADDR);
3058+ chip_get_ple_acq_stat(dev, ple_stat);
3059+ ple_txcmd_stat = mt76_rr(dev, MT_DBG_PLE_TXCMD_Q_EMPTY);
3060+ ple_native_txcmd_stat = mt76_rr(dev, MT_DBG_PLE_NATIVE_TXCMD_Q_EMPTY);
3061+ pg_flow_ctrl[0] = mt76_rr(dev, MT_DBG_PLE_FREEPG_CNT);
3062+ pg_flow_ctrl[1] = mt76_rr(dev, MT_DBG_PLE_FREEPG_HEAD_TAIL);
3063+ pg_flow_ctrl[2] = mt76_rr(dev, MT_DBG_PLE_PG_HIF_GROUP);
3064+ pg_flow_ctrl[3] = mt76_rr(dev, MT_DBG_PLE_HIF_PG_INFO);
3065+ pg_flow_ctrl[4] = mt76_rr(dev, MT_DBG_PLE_PG_CPU_GROUP);
3066+ pg_flow_ctrl[5] = mt76_rr(dev, MT_DBG_PLE_CPU_PG_INFO);
3067+ pg_flow_ctrl[6] = mt76_rr(dev, MT_DBG_PLE_PG_HIF_TXCMD_GROUP);
3068+ pg_flow_ctrl[7] = mt76_rr(dev, MT_DBG_PLE_HIF_TXCMD_PG_INFO);
3069+ chip_get_dis_sta_map(dev, dis_sta_map);
3070+ chip_get_sta_pause(dev, sta_pause);
3071+
3072+ seq_printf(s, "PLE Configuration Info:\n");
3073+ seq_printf(s, "\tPacket Buffer Control(0x%x): 0x%08x\n",
3074+ MT_DBG_PLE_PBUF_CTRL_ADDR, ple_buf_ctrl);
3075+
3076+ pg_sz = FIELD_GET(MT_DBG_PLE_PBUF_CTRL_PAGE_SIZE_MASK, ple_buf_ctrl);
3077+ seq_printf(s, "\t\tPage Size=%d(%d bytes per page)\n",
3078+ pg_sz, (pg_sz == 1 ? 128 : 64));
3079+ seq_printf(s, "\t\tPage Offset=%ld(in unit of 2KB)\n",
3080+ FIELD_GET(MT_DBG_PLE_PBUF_CTRL_OFFSET_MASK, ple_buf_ctrl));
3081+
3082+ pg_num = FIELD_GET(MT_DBG_PLE_PBUF_CTRL_TOTAL_PAGE_NUM_MASK, ple_buf_ctrl);
3083+ seq_printf(s, "\t\tTotal Page=%d pages\n", pg_num);
3084+
3085+ /* Page Flow Control */
3086+ seq_printf(s, "PLE Page Flow Control:\n");
3087+ seq_printf(s, "\tFree page counter(0x%x): 0x%08x\n",
3088+ MT_DBG_PLE_FREEPG_CNT, pg_flow_ctrl[0]);
3089+ fpg_cnt = FIELD_GET(MT_DBG_PLE_FREEPG_CNT_FREEPG_CNT_MASK, pg_flow_ctrl[0]);
3090+
3091+ seq_printf(s, "\t\tThe toal page number of free=0x%03x\n", fpg_cnt);
3092+ ffa_cnt = FIELD_GET(MT_DBG_PLE_FREEPG_CNT_FFA_CNT_MASK, pg_flow_ctrl[0]);
3093+
3094+ seq_printf(s, "\t\tThe free page numbers of free for all=0x%03x\n", ffa_cnt);
3095+ seq_printf(s, "\tFree page head and tail(0x%x): 0x%08x\n",
3096+ MT_DBG_PLE_FREEPG_HEAD_TAIL, pg_flow_ctrl[1]);
3097+
3098+ fpg_head = FIELD_GET(MT_DBG_PLE_FREEPG_HEAD_TAIL_FREEPG_HEAD_MASK, pg_flow_ctrl[1]);
3099+ fpg_tail = FIELD_GET(MT_DBG_PLE_FREEPG_HEAD_TAIL_FREEPG_TAIL_MASK, pg_flow_ctrl[1]);
3100+ seq_printf(s, "\t\tThe tail/head page of free page list=0x%03x/0x%03x\n", fpg_tail, fpg_head);
3101+ seq_printf(s, "\tReserved page counter of HIF group(0x%x): 0x%08x\n",
3102+ MT_DBG_PLE_PG_HIF_GROUP, pg_flow_ctrl[2]);
3103+ seq_printf(s, "\tHIF group page status(0x%x): 0x%08x\n",
3104+ MT_DBG_PLE_HIF_PG_INFO, pg_flow_ctrl[3]);
3105+
3106+ hif_min_q = FIELD_GET(MT_DBG_PLE_PG_HIF_GROUP_HIF_MIN_QUOTA_MASK, pg_flow_ctrl[2]);
3107+ hif_max_q = FIELD_GET(MT_DBG_PLE_PG_HIF_GROUP_HIF_MAX_QUOTA_MASK, pg_flow_ctrl[2]);
3108+ seq_printf(s, "\t\tThe max/min quota pages of HIF group=0x%03x/0x%03x\n", hif_max_q, hif_min_q);
3109+
3110+ rpg_hif = FIELD_GET(MT_DBG_PLE_HIF_PG_INFO_HIF_RSV_CNT_MASK, pg_flow_ctrl[3]);
3111+ upg_hif = FIELD_GET(MT_DBG_PLE_HIF_PG_INFO_HIF_SRC_CNT_MASK, pg_flow_ctrl[3]);
3112+ seq_printf(s, "\t\tThe used/reserved pages of HIF group=0x%03x/0x%03x\n", upg_hif, rpg_hif);
3113+
3114+ seq_printf(s, "\tReserved page counter of HIF_TXCMD group(0x%x): 0x%08x\n",
3115+ MT_DBG_PLE_PG_HIF_TXCMD_GROUP, pg_flow_ctrl[6]);
3116+ seq_printf(s, "\tHIF_TXCMD group page status(0x%x): 0x%08x\n",
3117+ MT_DBG_PLE_HIF_TXCMD_PG_INFO, pg_flow_ctrl[7]);
3118+ cpu_min_q = FIELD_GET(MT_DBG_PLE_PG_HIF_TXCMD_GROUP_HIF_TXCMD_MIN_QUOTA_MASK, pg_flow_ctrl[6]);
3119+ cpu_max_q = FIELD_GET(MT_DBG_PLE_PG_HIF_TXCMD_GROUP_HIF_TXCMD_MIN_QUOTA_MASK, pg_flow_ctrl[6]);
3120+ seq_printf(s, "\t\tThe max/min quota pages of HIF_TXCMD group=0x%03x/0x%03x\n", cpu_max_q, cpu_min_q);
3121+
3122+ rpg_cpu = FIELD_GET(MT_DBG_PLE_TXCMD_PG_INFO_HIF_TXCMD_RSV_CNT_MASK, pg_flow_ctrl[7]);
3123+ upg_cpu = FIELD_GET(MT_DBG_PLE_TXCMD_PG_INFO_HIF_TXCMD_SRC_CNT_MASK, pg_flow_ctrl[7]);
3124+ seq_printf(s, "\t\tThe used/reserved pages of HIF_TXCMD group=0x%03x/0x%03x\n", upg_cpu, rpg_cpu);
3125+
3126+ seq_printf(s, "\tReserved page counter of CPU group(0x820c0150): 0x%08x\n", pg_flow_ctrl[4]);
3127+ seq_printf(s, "\tCPU group page status(0x820c0154): 0x%08x\n", pg_flow_ctrl[5]);
3128+ cpu_min_q = FIELD_GET(MT_DBG_PLE_PG_CPU_GROUP_CPU_MIN_QUOTA_MASK, pg_flow_ctrl[4]);
3129+ cpu_max_q = FIELD_GET(MT_DBG_PLE_PG_CPU_GROUP_CPU_MAX_QUOTA_MASK, pg_flow_ctrl[4]);
3130+ seq_printf(s, "\t\tThe max/min quota pages of CPU group=0x%03x/0x%03x\n", cpu_max_q, cpu_min_q);
3131+
3132+ rpg_cpu = FIELD_GET(MT_DBG_PLE_CPU_PG_INFO_CPU_RSV_CNT_MASK, pg_flow_ctrl[5]);
3133+ upg_cpu = FIELD_GET(MT_DBG_PLE_CPU_PG_INFO_CPU_SRC_CNT_MASK, pg_flow_ctrl[5]);
3134+ seq_printf(s, "\t\tThe used/reserved pages of CPU group=0x%03x/0x%03x\n", upg_cpu, rpg_cpu);
3135+
3136+ if ((ple_stat[0] & MT_DBG_PLE_Q_EMPTY_ALL_AC_EMPTY_MASK) == 0) {
3137+ for (j = 0; j < all_ac_num; j++) {
3138+ if (j % ac_num == 0) {
3139+ seq_printf(s, "\n\tNonempty AC%d Q of STA#: ", j / ac_num);
3140+ }
3141+
3142+ for (i = 0; i < all_ac_num; i++) {
3143+ if (((ple_stat[j + 1] & (0x1 << i)) >> i) == 0) {
3144+ seq_printf(s, "%d ", i + (j % ac_num) * 32);
3145+ }
3146+ }
3147+ }
3148+
3149+ seq_printf(s, "\n");
3150+ }
3151+
3152+ seq_printf(s, "non-native/native txcmd queue empty = %d/%d\n", ple_txcmd_stat, ple_native_txcmd_stat);
3153+
3154+ seq_printf(s, "Nonempty Q info:\n");
3155+
3156+ for (i = 0; i < all_ac_num; i++) {
3157+ if (((ple_stat[0] & (0x1 << i)) >> i) == 0) {
3158+ u32 hfid, tfid, pktcnt, fl_que_ctrl[3] = {0};
3159+
3160+ if (ple_queue_empty_info[i].QueueName != NULL) {
3161+ seq_printf(s, "\t%s: ", ple_queue_empty_info[i].QueueName);
3162+ fl_que_ctrl[0] |= MT_DBG_PLE_FL_QUE_CTRL0_EXECUTE_MASK;
3163+ fl_que_ctrl[0] |= (ple_queue_empty_info[i].Portid << MT_PLE_FL_QUE_CTRL0_Q_BUF_PID_SHFT);
3164+ fl_que_ctrl[0] |= (ple_queue_empty_info[i].Queueid << MT_PLE_FL_QUE_CTRL0_Q_BUF_QID_SHFT);
3165+ } else
3166+ continue;
3167+
3168+ if (ple_queue_empty_info[i].Queueid >= ENUM_UMAC_LMAC_PLE_TX_Q_ALTX_0 &&
3169+ ple_queue_empty_info[i].Queueid <= ENUM_UMAC_LMAC_PLE_TX_Q_PSMP_0)
3170+ /* band0 set TGID 0, bit31 = 0 */
3171+ mt76_wr(dev, MT_DBG_PLE_FL_QUE_CTRL1, 0x0);
3172+ else if (ple_queue_empty_info[i].Queueid >= ENUM_UMAC_LMAC_PLE_TX_Q_ALTX_1 &&
3173+ ple_queue_empty_info[i].Queueid <= ENUM_UMAC_LMAC_PLE_TX_Q_PSMP_1)
3174+ /* band1 set TGID 1, bit31 = 1 */
3175+ mt76_wr(dev, MT_DBG_PLE_FL_QUE_CTRL1, 0x80000000);
3176+
3177+ mt76_wr(dev, MT_DBG_PLE_FL_QUE_CTRL0, fl_que_ctrl[0]);
3178+ fl_que_ctrl[1] = mt76_rr(dev, MT_DBG_PLE_FL_QUE_CTRL2);
3179+ fl_que_ctrl[2] = mt76_rr(dev, MT_DBG_PLE_FL_QUE_CTRL3);
3180+ hfid = FIELD_GET(MT_DBG_PLE_FL_QUE_CTRL2_Q_HEAD_FID_MASK, fl_que_ctrl[1]);
3181+ tfid = FIELD_GET(MT_DBG_PLE_FL_QUE_CTRL2_Q_TAIL_FID_MASK, fl_que_ctrl[1]);
3182+ pktcnt = FIELD_GET(MT_DBG_PLE_FL_QUE_CTRL3_Q_PKT_NUM_MASK, fl_que_ctrl[2]);
3183+ seq_printf(s, "tail/head fid = 0x%03x/0x%03x, pkt cnt = 0x%03x\n",
3184+ tfid, hfid, pktcnt);
3185+
3186+ /* TODO */
3187+ //if (pktcnt > 0 && dumptxd > 0)
3188+ // ShowTXDInfo(pAd, hfid);
3189+ }
3190+ }
3191+
3192+ chip_show_sta_acq_info(s, dev, ple_stat, sta_pause, dis_sta_map, 0/*dumptxd*/);
3193+ chip_show_txcmdq_info(s, dev, ple_native_txcmd_stat);
3194+
3195+ return 0;
3196+}
3197+
3198+typedef enum _ENUM_UMAC_PLE_CTRL_P3_QUEUE_T {
3199+ ENUM_UMAC_PLE_CTRL_P3_Q_0X1E = 0x1e,
3200+ ENUM_UMAC_PLE_CTRL_P3_Q_0X1F = 0x1f,
3201+ ENUM_UMAC_PLE_CTRL_P3_TOTAL_NUM = 2
3202+} ENUM_UMAC_PLE_CTRL_P3_QUEUE_T, *P_ENUM_UMAC_PLE_CTRL_P3_QUEUE_T;
3203+
3204+static EMPTY_QUEUE_INFO_T pse_queue_empty_info[] = {
3205+ {"CPU Q0", ENUM_UMAC_CPU_PORT_1, ENUM_UMAC_CTX_Q_0},
3206+ {"CPU Q1", ENUM_UMAC_CPU_PORT_1, ENUM_UMAC_CTX_Q_1},
3207+ {"CPU Q2", ENUM_UMAC_CPU_PORT_1, ENUM_UMAC_CTX_Q_2},
3208+ {"CPU Q3", ENUM_UMAC_CPU_PORT_1, ENUM_UMAC_CTX_Q_3},
3209+ {NULL, 0, 0}, {NULL, 0, 0}, {NULL, 0, 0}, {NULL, 0, 0}, /* 4~7 not defined */
3210+ {"HIF Q0", ENUM_UMAC_HIF_PORT_0, 0}, /* Q8 */
3211+ {"HIF Q1", ENUM_UMAC_HIF_PORT_0, 1},
3212+ {"HIF Q2", ENUM_UMAC_HIF_PORT_0, 2},
3213+ {"HIF Q3", ENUM_UMAC_HIF_PORT_0, 3},
3214+ {"HIF Q4", ENUM_UMAC_HIF_PORT_0, 4},
3215+ {"HIF Q5", ENUM_UMAC_HIF_PORT_0, 5},
3216+ {NULL, 0, 0}, {NULL, 0, 0}, /* 14~15 not defined */
3217+ {"LMAC Q", ENUM_UMAC_LMAC_PORT_2, 0},
3218+ {"MDP TX Q", ENUM_UMAC_LMAC_PORT_2, 1},
3219+ {"MDP RX Q", ENUM_UMAC_LMAC_PORT_2, 2},
3220+ {"SEC TX Q", ENUM_UMAC_LMAC_PORT_2, 3},
3221+ {"SEC RX Q", ENUM_UMAC_LMAC_PORT_2, 4},
3222+ {"SFD_PARK Q", ENUM_UMAC_LMAC_PORT_2, 5},
3223+ {"MDP_TXIOC Q", ENUM_UMAC_LMAC_PORT_2, 6},
3224+ {"MDP_RXIOC Q", ENUM_UMAC_LMAC_PORT_2, 7},
3225+ {NULL, 0, 0}, {NULL, 0, 0}, {NULL, 0, 0}, {NULL, 0, 0}, {NULL, 0, 0}, {NULL, 0, 0}, {NULL, 0, 0}, /* 24~30 not defined */
3226+ {"RLS Q", ENUM_PLE_CTRL_PSE_PORT_3, ENUM_UMAC_PLE_CTRL_P3_Q_0X1F}
3227+};
3228+
3229+static int mt7915_pseinfo_read(struct seq_file *s, void *data)
3230+{
3231+ struct mt7915_dev *dev = dev_get_drvdata(s->private);
3232+ u32 pse_buf_ctrl, pg_sz, pg_num;
3233+ u32 pse_stat, pg_flow_ctrl[22] = {0};
3234+ u32 fpg_cnt, ffa_cnt, fpg_head, fpg_tail;
3235+ u32 max_q, min_q, rsv_pg, used_pg;
3236+ int i;
3237+
3238+ pse_buf_ctrl = mt76_rr(dev, MT_DBG_PSE_PBUF_CTRL);
3239+ pse_stat = mt76_rr(dev, MT_DBG_PSE_QUEUE_EMPTY);
3240+ pg_flow_ctrl[0] = mt76_rr(dev, MT_DBG_PSE_FREEPG_CNT);
3241+ pg_flow_ctrl[1] = mt76_rr(dev, MT_DBG_PSE_FREEPG_HEAD_TAIL);
3242+ pg_flow_ctrl[2] = mt76_rr(dev, MT_DBG_PSE_PG_HIF0_GROUP);
3243+ pg_flow_ctrl[3] = mt76_rr(dev, MT_DBG_PSE_HIF0_PG_INFO);
3244+ pg_flow_ctrl[4] = mt76_rr(dev, MT_DBG_PSE_PG_HIF1_GROUP);
3245+ pg_flow_ctrl[5] = mt76_rr(dev, MT_DBG_PSE_HIF1_PG_INFO);
3246+ pg_flow_ctrl[6] = mt76_rr(dev, MT_DBG_PSE_PG_CPU_GROUP);
3247+ pg_flow_ctrl[7] = mt76_rr(dev, MT_DBG_PSE_CPU_PG_INFO);
3248+ pg_flow_ctrl[8] = mt76_rr(dev, MT_DBG_PSE_PG_LMAC0_GROUP);
3249+ pg_flow_ctrl[9] = mt76_rr(dev, MT_DBG_PSE_LMAC0_PG_INFO);
3250+ pg_flow_ctrl[10] = mt76_rr(dev, MT_DBG_PSE_PG_LMAC1_GROUP);
3251+ pg_flow_ctrl[11] = mt76_rr(dev, MT_DBG_PSE_LMAC1_PG_INFO);
3252+ pg_flow_ctrl[12] = mt76_rr(dev, MT_DBG_PSE_PG_LMAC2_GROUP);
3253+ pg_flow_ctrl[13] = mt76_rr(dev, MT_DBG_PSE_LMAC2_PG_INFO);
3254+ pg_flow_ctrl[14] = mt76_rr(dev, MT_DBG_PSE_PG_PLE_GROUP);
3255+ pg_flow_ctrl[15] = mt76_rr(dev, MT_DBG_PSE_PLE_PG_INFO);
3256+ pg_flow_ctrl[16] = mt76_rr(dev, MT_DBG_PSE_PG_LMAC3_GROUP);
3257+ pg_flow_ctrl[17] = mt76_rr(dev, MT_DBG_PSE_LMAC3_PG_INFO);
3258+ pg_flow_ctrl[18] = mt76_rr(dev, MT_DBG_PSE_PG_MDP_GROUP);
3259+ pg_flow_ctrl[19] = mt76_rr(dev, MT_DBG_PSE_MDP_PG_INFO);
3260+ pg_flow_ctrl[20] = mt76_rr(dev, MT_DBG_PSE_PG_PLE1_GROUP);
3261+ pg_flow_ctrl[21] = mt76_rr(dev,MT_DBG_PSE_PLE1_PG_INFO);
3262+
3263+ /* Configuration Info */
3264+ seq_printf(s, "PSE Configuration Info:\n");
3265+ seq_printf(s, "\tPacket Buffer Control(0x82068014): 0x%08x\n", pse_buf_ctrl);
3266+ pg_sz = FIELD_GET(MT_DBG_PSE_PBUF_CTRL_PAGE_SIZE_CFG_MASK, pse_buf_ctrl);
3267+
3268+ seq_printf(s, "\t\tPage Size=%d(%d bytes per page)\n", pg_sz, (pg_sz == 1 ? 256 : 128));
3269+ seq_printf(s, "\t\tPage Offset=%ld(in unit of 64KB)\n",
3270+ FIELD_GET(MT_DBG_PSE_PBUF_CTRL_PBUF_OFFSET_MASK, pse_buf_ctrl));
3271+ pg_num = FIELD_GET(MT_DBG_PSE_PBUF_CTRL_TOTAL_PAGE_NUM_MASK, pse_buf_ctrl);
3272+
3273+ seq_printf(s, "\t\tTotal page numbers=%d pages\n", pg_num);
3274+
3275+ /* Page Flow Control */
3276+ seq_printf(s, "PSE Page Flow Control:\n");
3277+ seq_printf(s, "\tFree page counter(0x82068100): 0x%08x\n", pg_flow_ctrl[0]);
3278+ fpg_cnt = FIELD_GET(MT_DBG_PSE_FREEPG_CNT_FREEPG_CNT_MASK, pg_flow_ctrl[0]);
3279+ seq_printf(s, "\t\tThe toal page number of free=0x%03x\n", fpg_cnt);
3280+
3281+ ffa_cnt = FIELD_GET(MT_DBG_PSE_FREEPG_CNT_FFA_CNT_MASK, pg_flow_ctrl[0]);
3282+ seq_printf(s, "\t\tThe free page numbers of free for all=0x%03x\n", ffa_cnt);
3283+
3284+ seq_printf(s, "\tFree page head and tail(0x82068104): 0x%08x\n", pg_flow_ctrl[1]);
3285+ fpg_head = FIELD_GET(MT_DBG_PSE_FREEPG_HEAD_TAIL_FREEPG_HEAD_MASK, pg_flow_ctrl[1]);
3286+
3287+ fpg_tail = FIELD_GET(MT_DBG_PSE_FREEPG_HEAD_TAIL_FREEPG_TAIL_MASK, pg_flow_ctrl[1]);
3288+ seq_printf(s, "\t\tThe tail/head page of free page list=0x%03x/0x%03x\n", fpg_tail, fpg_head);
3289+ seq_printf(s, "\tReserved page counter of HIF0 group(0x82068110): 0x%08x\n", pg_flow_ctrl[2]);
3290+ seq_printf(s, "\tHIF0 group page status(0x82068114): 0x%08x\n", pg_flow_ctrl[3]);
3291+ min_q = FIELD_GET(MT_DBG_PSE_PG_HIF0_GROUP_HIF0_MIN_QUOTA_MASK, pg_flow_ctrl[2]);
3292+ max_q = FIELD_GET(MT_DBG_PSE_PG_HIF0_GROUP_HIF0_MAX_QUOTA_MASK, pg_flow_ctrl[2]);
3293+ seq_printf(s, "\t\tThe max/min quota pages of HIF0 group=0x%03x/0x%03x\n", max_q, min_q);
3294+ rsv_pg = FIELD_GET(MT_DBG_PSE_HIF0_PG_INFO_HIF0_RSV_CNT_MASK, pg_flow_ctrl[3]);;
3295+ used_pg = FIELD_GET(MT_DBG_PSE_HIF0_PG_INFO_HIF0_SRC_CNT_MASK, pg_flow_ctrl[3]);
3296+ seq_printf(s, "\t\tThe used/reserved pages of HIF0 group=0x%03x/0x%03x\n", used_pg, rsv_pg);
3297+ seq_printf(s, "\tReserved page counter of HIF1 group(0x82068118): 0x%08x\n", pg_flow_ctrl[4]);
3298+ seq_printf(s, "\tHIF1 group page status(0x8206811c): 0x%08x\n", pg_flow_ctrl[5]);
3299+ min_q = FIELD_GET(MT_DBG_PSE_PG_HIF1_GROUP_HIF1_MIN_QUOTA_MASK, pg_flow_ctrl[4]);
3300+ max_q = FIELD_GET(MT_DBG_PSE_PG_HIF1_GROUP_HIF1_MAX_QUOTA_MASK, pg_flow_ctrl[4]);
3301+ seq_printf(s, "\t\tThe max/min quota pages of HIF1 group=0x%03x/0x%03x\n", max_q, min_q);
3302+ rsv_pg = FIELD_GET(MT_DBG_PSE_HIF1_PG_INFO_HIF1_RSV_CNT_MASK, pg_flow_ctrl[5]);
3303+ used_pg = FIELD_GET(MT_DBG_PSE_HIF1_PG_INFO_HIF1_SRC_CNT_MASK, pg_flow_ctrl[5]);
3304+
3305+ seq_printf(s, "\t\tThe used/reserved pages of HIF1 group=0x%03x/0x%03x\n", used_pg, rsv_pg);
3306+ seq_printf(s, "\tReserved page counter of CPU group(0x82068150): 0x%08x\n", pg_flow_ctrl[6]);
3307+ seq_printf(s, "\tCPU group page status(0x82068154): 0x%08x\n", pg_flow_ctrl[7]);
3308+ min_q = FIELD_GET(MT_DBG_PSE_PG_CPU_GROUP_CPU_MIN_QUOTA_MASK, pg_flow_ctrl[6]);
3309+ max_q = FIELD_GET(MT_DBG_PSE_PG_CPU_GROUP_CPU_MAX_QUOTA_MASK, pg_flow_ctrl[6]);
3310+ seq_printf(s, "\t\tThe max/min quota pages of CPU group=0x%03x/0x%03x\n", max_q, min_q);
3311+ rsv_pg = FIELD_GET(MT_DBG_PSE_CPU_PG_INFO_CPU_RSV_CNT_MASK, pg_flow_ctrl[7]);
3312+ used_pg = FIELD_GET(MT_DBG_PSE_CPU_PG_INFO_CPU_SRC_CNT_MASK, pg_flow_ctrl[7]);
3313+ seq_printf(s, "\t\tThe used/reserved pages of CPU group=0x%03x/0x%03x\n", used_pg, rsv_pg);
3314+ seq_printf(s, "\tReserved page counter of LMAC0 group(0x82068170): 0x%08x\n", pg_flow_ctrl[8]);
3315+ seq_printf(s, "\tLMAC0 group page status(0x82068174): 0x%08x\n", pg_flow_ctrl[9]);
3316+ min_q = FIELD_GET(MT_DBG_PSE_PG_LMAC0_GROUP_LMAC0_MIN_QUOTA_MASK, pg_flow_ctrl[8]);
3317+ max_q = FIELD_GET(MT_DBG_PSE_PG_LMAC0_GROUP_LMAC0_MAX_QUOTA_MASK, pg_flow_ctrl[8]);
3318+ seq_printf(s, "\t\tThe max/min quota pages of LMAC0 group=0x%03x/0x%03x\n", max_q, min_q);
3319+ rsv_pg = FIELD_GET(MT_DBG_PSE_LMAC0_PG_INFO_LMAC0_RSV_CNT_MASK, pg_flow_ctrl[9]);
3320+ used_pg = FIELD_GET(MT_DBG_PSE_LMAC0_PG_INFO_LMAC0_SRC_CNT_MASK, pg_flow_ctrl[9]);
3321+ seq_printf(s, "\t\tThe used/reserved pages of LMAC0 group=0x%03x/0x%03x\n", used_pg, rsv_pg);
3322+ seq_printf(s, "\tReserved page counter of LMAC1 group(0x82068178): 0x%08x\n", pg_flow_ctrl[10]);
3323+ seq_printf(s, "\tLMAC1 group page status(0x8206817c): 0x%08x\n", pg_flow_ctrl[11]);
3324+ min_q = FIELD_GET(MT_DBG_TOP_PG_LMAC1_GROUP_LMAC1_MIN_QUOTA_MASK, pg_flow_ctrl[10]);
3325+ max_q = FIELD_GET(MT_DBG_PSE_PG_LMAC1_GROUP_LMAC1_MAX_QUOTA_MASK, pg_flow_ctrl[10]);
3326+ seq_printf(s, "\t\tThe max/min quota pages of LMAC1 group=0x%03x/0x%03x\n", max_q, min_q);
3327+ rsv_pg = FIELD_GET(MT_DBG_PSE_LMAC1_PG_INFO_LMAC1_RSV_CNT_MASK, pg_flow_ctrl[11]);
3328+ used_pg = FIELD_GET(MT_DBG_PSE_LMAC1_PG_INFO_LMAC1_SRC_CNT_MASK, pg_flow_ctrl[11]);
3329+ seq_printf(s, "\t\tThe used/reserved pages of LMAC1 group=0x%03x/0x%03x\n", used_pg, rsv_pg);
3330+ seq_printf(s, "\tReserved page counter of LMAC2 group(0x82068180): 0x%08x\n", pg_flow_ctrl[11]);
3331+ seq_printf(s, "\tLMAC2 group page status(0x82068184): 0x%08x\n", pg_flow_ctrl[12]);
3332+ min_q = FIELD_GET(MT_DBG_PSE_PG_LMAC2_GROUP_LMAC2_MIN_QUOTA_MASK, pg_flow_ctrl[12]);
3333+ max_q = FIELD_GET(MT_DBG_PSE_PG_LMAC2_GROUP_LMAC2_MAX_QUOTA_MASK, pg_flow_ctrl[12]);
3334+ seq_printf(s, "\t\tThe max/min quota pages of LMAC2 group=0x%03x/0x%03x\n", max_q, min_q);
3335+ rsv_pg = FIELD_GET(MT_DBG_PSE_LMAC2_PG_INFO_LMAC2_RSV_CNT_MASK, pg_flow_ctrl[13]);
3336+ used_pg = FIELD_GET(MT_DBG_PSE_LMAC2_PG_INFO_LMAC2_SRC_CNT_MASK, pg_flow_ctrl[13]);
3337+ seq_printf(s, "\t\tThe used/reserved pages of LMAC2 group=0x%03x/0x%03x\n", used_pg, rsv_pg);
3338+
3339+ seq_printf(s, "\tReserved page counter of LMAC3 group(0x82068188): 0x%08x\n", pg_flow_ctrl[16]);
3340+ seq_printf(s, "\tLMAC3 group page status(0x8206818c): 0x%08x\n", pg_flow_ctrl[17]);
3341+ min_q = FIELD_GET(MT_DBG_TOP_PG_LMAC3_GROUP_LMAC3_MIN_QUOTA_MASK, pg_flow_ctrl[16]);
3342+ max_q = FIELD_GET(MT_DBG_PSE_PG_LMAC3_GROUP_LMAC3_MAX_QUOTA_MASK, pg_flow_ctrl[16]);
3343+ seq_printf(s, "\t\tThe max/min quota pages of LMAC3 group=0x%03x/0x%03x\n", max_q, min_q);
3344+ rsv_pg = FIELD_GET(MT_DBG_PSE_LMAC3_PG_INFO_LMAC3_RSV_CNT_MASK, pg_flow_ctrl[17]);
3345+ used_pg = FIELD_GET(MT_DBG_PSE_LMAC3_PG_INFO_LMAC3_SRC_CNT_MASK, pg_flow_ctrl[17]);
3346+ seq_printf(s, "\t\tThe used/reserved pages of LMAC3 group=0x%03x/0x%03x\n", used_pg, rsv_pg);
3347+
3348+ seq_printf(s, "\tReserved page counter of PLE group(0x82068160): 0x%08x\n", pg_flow_ctrl[14]);
3349+ seq_printf(s, "\tPLE group page status(0x82068164): 0x%08x\n", pg_flow_ctrl[15]);
3350+ min_q = FIELD_GET(MT_DBG_PSE_PG_PLE_GROUP_PLE_MIN_QUOTA_MASK, pg_flow_ctrl[14]);
3351+ max_q = FIELD_GET(MT_DBG_PSE_PG_PLE_GROUP_PLE_MAX_QUOTA_MASK, pg_flow_ctrl[14]);
3352+ seq_printf(s, "\t\tThe max/min quota pages of PLE group=0x%03x/0x%03x\n", max_q, min_q);
3353+ rsv_pg = FIELD_GET(MT_DBG_PSE_PLE_PG_INFO_PLE_RSV_CNT_MASK, pg_flow_ctrl[15]);
3354+ used_pg = FIELD_GET(MT_DBG_PSE_PLE_PG_INFO_PLE_SRC_CNT_MASK, pg_flow_ctrl[15]);
3355+ seq_printf(s, "\t\tThe used/reserved pages of PLE group=0x%03x/0x%03x\n", used_pg, rsv_pg);
3356+
3357+ seq_printf(s, "\tReserved page counter of PLE1 group(0x82068168): 0x%08x\n", pg_flow_ctrl[14]);
3358+ seq_printf(s, "\tPLE1 group page status(0x8206816c): 0x%08x\n", pg_flow_ctrl[15]);
3359+ min_q = FIELD_GET(MT_DBG_PSE_PG_PLE_GROUP_PLE_MIN_QUOTA_MASK, pg_flow_ctrl[20]);
3360+ max_q = FIELD_GET(MT_DBG_PSE_PG_PLE_GROUP_PLE_MAX_QUOTA_MASK, pg_flow_ctrl[20]);
3361+ seq_printf(s, "\t\tThe max/min quota pages of PLE1 group=0x%03x/0x%03x\n", max_q, min_q);
3362+ rsv_pg = FIELD_GET(MT_DBG_PSE_PLE_PG_INFO_PLE_RSV_CNT_MASK, pg_flow_ctrl[21]);
3363+ used_pg = FIELD_GET(MT_DBG_PSE_PLE_PG_INFO_PLE_SRC_CNT_MASK, pg_flow_ctrl[21]);
3364+ seq_printf(s, "\t\tThe used/reserved pages of PLE1 group=0x%03x/0x%03x\n", used_pg, rsv_pg);
3365+
3366+ seq_printf(s, "\tReserved page counter of MDP group(0x82068198): 0x%08x\n", pg_flow_ctrl[18]);
3367+ seq_printf(s, "\tMDP group page status(0x8206819c): 0x%08x\n", pg_flow_ctrl[19]);
3368+ min_q = FIELD_GET(MT_DBG_PSE_PG_MDP_GROUP_MDP_MIN_QUOTA_MASK, pg_flow_ctrl[18]);
3369+ max_q = FIELD_GET(MT_DBG_PSE_PG_MDP_GROUP_MDP_MAX_QUOTA_MASK, pg_flow_ctrl[18]);
3370+ seq_printf(s, "\t\tThe max/min quota pages of MDP group=0x%03x/0x%03x\n", max_q, min_q);
3371+ rsv_pg = FIELD_GET(MT_DBG_PSE_MDP_PG_INFO_MDP_RSV_CNT_MASK, pg_flow_ctrl[19]);
3372+ used_pg = FIELD_GET(MT_DBG_PSE_MDP_PG_INFO_MDP_SRC_CNT_MASK, pg_flow_ctrl[19]);
3373+ seq_printf(s, "\t\tThe used/reserved pages of MDP group=0x%03x/0x%03x\n", used_pg, rsv_pg);
3374+
3375+ /* Queue Empty Status */
3376+ seq_printf(s, "PSE Queue Empty Status:\n");
3377+ seq_printf(s, "\tQUEUE_EMPTY(0x820680b0): 0x%08x\n", pse_stat);
3378+ seq_printf(s, "\t\tCPU Q0/1/2/3 empty=%ld/%ld/%ld/%ld\n",
3379+ FIELD_GET(MT_DBG_PSE_QUEUE_EMPTY_CPU_Q0_EMPTY_MASK, pse_stat),
3380+ FIELD_GET(MT_DBG_PSE_QUEUE_EMPTY_CPU_Q1_EMPTY_MASK, pse_stat),
3381+ FIELD_GET(MT_DBG_PSE_QUEUE_EMPTY_CPU_Q2_EMPTY_MASK, pse_stat),
3382+ FIELD_GET(MT_DBG_PSE_QUEUE_EMPTY_CPU_Q3_EMPTY_MASK, pse_stat));
3383+
3384+ seq_printf(s, "\t\tHIF Q0/1/2/3/4/5 empty=%ld/%ld/%ld/%ld/%ld/%ld\n",
3385+ FIELD_GET(MT_DBG_PSE_QUEUE_EMPTY_HIF_0_EMPTY_MASK, pse_stat),
3386+ FIELD_GET(MT_DBG_PSE_QUEUE_EMPTY_HIF_1_EMPTY_MASK, pse_stat),
3387+ FIELD_GET(MT_DBG_PSE_QUEUE_EMPTY_HIF_2_EMPTY_MASK, pse_stat),
3388+ FIELD_GET(MT_DBG_PSE_QUEUE_EMPTY_HIF_3_EMPTY_MASK, pse_stat),
3389+ FIELD_GET(MT_DBG_PSE_QUEUE_EMPTY_HIF_4_EMPTY_MASK, pse_stat),
3390+ FIELD_GET(MT_DBG_PSE_QUEUE_EMPTY_HIF_5_EMPTY_MASK, pse_stat));
3391+
3392+ seq_printf(s, "\t\tLMAC TX Q empty=%ld\n",
3393+ FIELD_GET(MT_DBG_PSE_QUEUE_EMPTY_LMAC_TX_QUEUE_EMPTY_MASK, pse_stat));
3394+ seq_printf(s, "\t\tMDP TX Q/RX Q empty=%ld/%ld\n",
3395+ FIELD_GET(MT_DBG_PSE_QUEUE_EMPTY_MDP_TX_QUEUE_EMPTY_MASK, pse_stat),
3396+ FIELD_GET(MT_DBG_PSE_QUEUE_EMPTY_MDP_RX_QUEUE_EMPTY_MASK, pse_stat));
3397+ seq_printf(s, "\t\tSEC TX Q/RX Q empty=%ld/%ld\n",
3398+ FIELD_GET(MT_DBG_PSE_QUEUE_EMPTY_SEC_TX_QUEUE_EMPTY_MASK, pse_stat),
3399+ FIELD_GET(MT_DBG_PSE_QUEUE_EMPTY_SEC_RX_QUEUE_EMPTY_SHFT, pse_stat));
3400+ seq_printf(s, "\t\tSFD PARK Q empty=%ld\n",
3401+ FIELD_GET(MT_DBG_PSE_QUEUE_EMPTY_SFD_PARK_QUEUE_EMPTY_MASK, pse_stat));
3402+ seq_printf(s, "\t\tMDP TXIOC Q/RXIOC Q empty=%ld/%ld\n",
3403+ FIELD_GET(MT_DBG_PSE_QUEUE_EMPTY_MDP_TXIOC_QUEUE_EMPTY_MASK, pse_stat),
3404+ FIELD_GET(MT_DBG_PSE_QUEUE_EMPTY_MDP_RXIOC_QUEUE_EMPTY_MASK, pse_stat));
3405+ seq_printf(s, "\t\tRLS Q empty=%ld\n",
3406+ FIELD_GET(MT_DBG_PSE_QUEUE_EMPTY_RLS_Q_EMTPY_MASK, pse_stat));
3407+ seq_printf(s, "Nonempty Q info:\n");
3408+
3409+ for (i = 0; i < 31; i++) {
3410+ if (((pse_stat & (0x1 << i)) >> i) == 0) {
3411+ u32 hfid, tfid, pktcnt, fl_que_ctrl[3] = {0};
3412+
3413+ if (pse_queue_empty_info[i].QueueName != NULL) {
3414+ seq_printf(s, "\t%s: ", pse_queue_empty_info[i].QueueName);
3415+ fl_que_ctrl[0] |= MT_DBG_PSE_FL_QUE_CTRL_0_EXECUTE_MASK;
3416+ fl_que_ctrl[0] |= (pse_queue_empty_info[i].Portid << MT_DBG_PSE_FL_QUE_CTRL_0_Q_BUF_PID_SHFT);
3417+ fl_que_ctrl[0] |= (pse_queue_empty_info[i].Queueid << MT_DBG_PSE_FL_QUE_CTRL_0_Q_BUF_QID_SHFT);
3418+ } else
3419+ continue;
3420+
3421+ fl_que_ctrl[0] |= (0x1 << 31);
3422+
3423+ mt76_wr(dev, MT_DBG_PSE_FL_QUE_CTRL_0_ADDR, fl_que_ctrl[0]);
3424+ fl_que_ctrl[1] = mt76_rr(dev, MT_DBG_PSE_FL_QUE_CTRL_2_ADDR);
3425+ fl_que_ctrl[2] = mt76_rr(dev, MT_DBG_PSE_FL_QUE_CTRL_3_ADDR);
3426+
3427+ hfid = FIELD_GET(MT_DBG_PSE_FL_QUE_CTRL_2_QUEUE_HEAD_FID_MASK, fl_que_ctrl[1]);
3428+ tfid = FIELD_GET(MT_DBG_PSE_FL_QUE_CTRL_2_QUEUE_TAIL_FID_MASK, fl_que_ctrl[1]);
3429+ pktcnt = FIELD_GET(MT_DBG_PSE_FL_QUE_CTRL_3_QUEUE_PKT_NUM_MASK, fl_que_ctrl[2]);
3430+ seq_printf(s, "tail/head fid = 0x%03x/0x%03x, pkt cnt = 0x%03x\n",
3431+ tfid, hfid, pktcnt);
3432+ }
3433+ }
3434+
3435+ return 0;
3436+}
3437+
3438+static int mt7915_mibinfo_read_per_band(struct seq_file *s, int band_idx)
3439+{
3440+#define BSS_NUM 4
3441+ struct mt7915_dev *dev = dev_get_drvdata(s->private);
3442+ u32 mac_val0, mac_val, mac_val1, idx, band_offset = 0;
3443+ u32 msdr6, msdr7, msdr8, msdr9, msdr10, msdr16, msdr17, msdr18, msdr19, msdr20, msdr21;
3444+ u32 mbxsdr[BSS_NUM][7];
3445+ u32 mbtcr[16], mbtbcr[16], mbrcr[16], mbrbcr[16];
3446+ u32 btcr[BSS_NUM], btbcr[BSS_NUM], brcr[BSS_NUM], brbcr[BSS_NUM], btdcr[BSS_NUM], brdcr[BSS_NUM];
3447+ u32 mu_cnt[5];
3448+ u32 ampdu_cnt[3];
3449+ unsigned long per;
3450+
3451+ seq_printf(s, "Band %d MIB Status\n", band_idx);
3452+ seq_printf(s, "===============================\n");
3453+ mac_val = mt76_rr(dev, MT_DBG_MIB_M0SCR0(band_idx));
3454+ seq_printf(s, "MIB Status Control=0x%x\n", mac_val);
3455+ if (is_mt7915(&dev->mt76)) {
3456+ mac_val = mt76_rr(dev, MT_DBG_MIB_M0PBSCR(band_idx));
3457+ seq_printf(s, "MIB Per-BSS Status Control=0x%x\n", mac_val);
3458+ }
3459+
3460+ msdr6 = mt76_rr(dev, MT_DBG_MIB_M0SDR6(band_idx));
3461+ msdr7 = mt76_rr(dev, MT_DBG_MIB_M0SDR7(band_idx));
3462+ msdr8 = mt76_rr(dev, MT_DBG_MIB_M0SDR8(band_idx));
3463+ msdr9 = mt76_rr(dev, MT_DBG_MIB_M0SDR9(band_idx));
3464+ msdr10 = mt76_rr(dev, MT_DBG_MIB_M0SDR10(band_idx));
3465+ msdr16 = mt76_rr(dev, MT_DBG_MIB_M0SDR16(band_idx));
3466+ msdr17 = mt76_rr(dev, MT_DBG_MIB_M0SDR17(band_idx));
3467+ msdr18 = mt76_rr(dev, MT_DBG_MIB_M0SDR18(band_idx));
3468+ msdr19 = mt76_rr(dev, MT_DBG_MIB_M0SDR19(band_idx));
3469+ msdr20 = mt76_rr(dev, MT_DBG_MIB_M0SDR20(band_idx));
3470+ msdr21 = mt76_rr(dev, MT_DBG_MIB_M0SDR21(band_idx));
3471+ ampdu_cnt[0] = mt76_rr(dev, MT_DBG_MIB_M0SDR12(band_idx));
3472+ ampdu_cnt[1] = mt76_rr(dev, MT_DBG_MIB_M0SDR14(band_idx));
3473+ ampdu_cnt[2] = mt76_rr(dev, MT_DBG_MIB_M0SDR15(band_idx));
3474+ ampdu_cnt[1] &= MT_DBG_MIB_M0SDR14_AMPDU_MASK;
3475+ ampdu_cnt[2] &= MT_DBG_MIB_M0SDR15_AMPDU_ACKED_MASK;
3476+
3477+ seq_printf(s, "===Phy/Timing Related Counters===\n");
3478+ seq_printf(s, "\tChannelIdleCnt=0x%x\n", msdr6 & BN0_WF_MIB_TOP_M0SDR6_CHANNEL_IDLE_COUNT_MASK);
3479+ seq_printf(s, "\tCCA_NAV_Tx_Time=0x%x\n", msdr9 & BN0_WF_MIB_TOP_M0SDR9_CCA_NAV_TX_TIME_MASK);
3480+ seq_printf(s, "\tRx_MDRDY_CNT=0x%lx\n", msdr10 & MT_DBG_MIB_M0SDR10_RX_MDRDY_COUNT_MASK);
3481+ seq_printf(s, "\tCCK_MDRDY_TIME=0x%x, OFDM_MDRDY_TIME=0x%x, OFDM_GREEN_MDRDY_TIME=0x%x\n",
3482+ msdr19 & BN0_WF_MIB_TOP_M0SDR19_CCK_MDRDY_TIME_MASK,
3483+ msdr20 & BN0_WF_MIB_TOP_M0SDR20_OFDM_LG_MIXED_VHT_MDRDY_TIME_MASK,
3484+ msdr21 & BN0_WF_MIB_TOP_M0SDR21_OFDM_GREEN_MDRDY_TIME_MASK);
3485+ seq_printf(s, "\tPrim CCA Time=0x%x\n", msdr16 & BN0_WF_MIB_TOP_M0SDR16_P_CCA_TIME_MASK);
3486+ seq_printf(s, "\tSec CCA Time=0x%x\n", msdr17 & BN0_WF_MIB_TOP_M0SDR17_S_CCA_TIME_MASK);
3487+ seq_printf(s, "\tPrim ED Time=0x%x\n", msdr18 & BN0_WF_MIB_TOP_M0SDR18_P_ED_TIME_MASK);
3488+
3489+ seq_printf(s, "===Tx Related Counters(Generic)===\n");
3490+ mac_val = mt76_rr(dev, MT_DBG_MIB_M0SDR0(band_idx));
3491+ dev->dbg.bcn_total_cnt[band_idx] += (mac_val & BN0_WF_MIB_TOP_M0SDR0_BEACONTXCOUNT_MASK);
3492+ seq_printf(s, "\tBeaconTxCnt=0x%x\n",dev->dbg.bcn_total_cnt[band_idx]);
3493+ dev->dbg.bcn_total_cnt[band_idx] = 0;
3494+ mac_val = mt76_rr(dev, MT_DBG_MIB_M0DR0(band_idx));
3495+ seq_printf(s, "\tTx 20MHz Cnt=0x%x\n", mac_val & BN0_WF_MIB_TOP_M0DR0_TX_20MHZ_CNT_MASK);
3496+ seq_printf(s, "\tTx 40MHz Cnt=0x%x\n", (mac_val & BN0_WF_MIB_TOP_M0DR0_TX_40MHZ_CNT_MASK) >> BN0_WF_MIB_TOP_M0DR0_TX_40MHZ_CNT_SHFT);
3497+ mac_val = mt76_rr(dev, MT_DBG_MIB_M0DR1(band_idx));
3498+ seq_printf(s, "\tTx 80MHz Cnt=0x%x\n", mac_val & BN0_WF_MIB_TOP_M0DR1_TX_80MHZ_CNT_MASK);
3499+ seq_printf(s, "\tTx 160MHz Cnt=0x%x\n", (mac_val & BN0_WF_MIB_TOP_M0DR1_TX_160MHZ_CNT_MASK) >> BN0_WF_MIB_TOP_M0DR1_TX_160MHZ_CNT_SHFT);
3500+ seq_printf(s, "\tAMPDU Cnt=0x%x\n", ampdu_cnt[0]);
3501+ seq_printf(s, "\tAMPDU MPDU Cnt=0x%x\n", ampdu_cnt[1]);
3502+ seq_printf(s, "\tAMPDU MPDU Ack Cnt=0x%x\n", ampdu_cnt[2]);
3503+ per = (ampdu_cnt[2] == 0 ? 0 : 1000 * (ampdu_cnt[1] - ampdu_cnt[2]) / ampdu_cnt[1]);
3504+ seq_printf(s, "\tAMPDU MPDU PER=%ld.%1ld%%\n", per / 10, per % 10);
3505+
3506+ seq_printf(s, "===MU Related Counters===\n");
3507+ mu_cnt[0] = mt76_rr(dev, MT_DBG_MIB_MUBF(band_idx));
3508+ mu_cnt[1] = mt76_rr(dev, MT_DBG_MIB_M0DR8(band_idx));
3509+ mu_cnt[2] = mt76_rr(dev, MT_DBG_MIB_M0DR9(band_idx));
3510+ mu_cnt[3] = mt76_rr(dev, MT_DBG_MIB_M0DR10(band_idx));
3511+ mu_cnt[4] = mt76_rr(dev, MT_DBG_MIB_M0DR11(band_idx));
3512+ seq_printf(s, "\tMUBF_TX_COUNT=0x%x\n", mu_cnt[0] & BN0_WF_MIB_TOP_M0SDR34_MUBF_TX_COUNT_MASK);
3513+ seq_printf(s, "\tMU_TX_MPDU_COUNT(Ok+Fail)=0x%x\n", mu_cnt[1]);
3514+ seq_printf(s, "\tMU_TX_OK_MPDU_COUNT=0x%x\n", mu_cnt[2]);
3515+ seq_printf(s, "\tMU_TO_SU_PPDU_COUNT=0x%x\n", mu_cnt[3] & BN0_WF_MIB_TOP_M0DR10_MU_FAIL_PPDU_CNT_MASK);
3516+ seq_printf(s, "\tSU_TX_OK_MPDU_COUNT=0x%x\n", mu_cnt[4]);
3517+
3518+ seq_printf(s, "===Rx Related Counters(Generic)===\n");
3519+ seq_printf(s, "\tVector Mismacth Cnt=0x%x\n", msdr7 & BN0_WF_MIB_TOP_M0SDR7_VEC_MISS_COUNT_MASK);
3520+ seq_printf(s, "\tDelimiter Fail Cnt=0x%x\n", msdr8 & BN0_WF_MIB_TOP_M0SDR8_DELIMITER_FAIL_COUNT_MASK);
3521+
3522+ mac_val = mt76_rr(dev, MT_DBG_MIB_M0SDR3(band_idx));
3523+ seq_printf(s, "\tRxFCSErrCnt=0x%lx\n", __DBG_FIELD_GET(DBG_MIB_RX_FCS_ERROR_COUNT, mac_val));
3524+ mac_val = mt76_rr(dev, MT_DBG_MIB_M0SDR4(band_idx));
3525+ seq_printf(s, "\tRxFifoFullCnt=0x%x\n", (mac_val & BN0_WF_MIB_TOP_M0SDR4_RX_FIFO_FULL_COUNT_MASK));
3526+ mac_val = mt76_rr(dev, MT_DBG_MIB_M0SDR11(band_idx));
3527+ seq_printf(s, "\tRxLenMismatch=0x%x\n", (mac_val & BN0_WF_MIB_TOP_M0SDR11_RX_LEN_MISMATCH_MASK));
3528+ mac_val = mt76_rr(dev, MT_DBG_MIB_M0SDR5(band_idx));
3529+ seq_printf(s, "\tRxMPDUCnt=0x%x\n", (mac_val & BN0_WF_MIB_TOP_M0SDR5_RX_MPDU_COUNT_MASK));
3530+ mac_val = mt76_rr(dev, MT_DBG_MIB_M0SDR22(band_idx));
3531+ seq_printf(s, "\tRx AMPDU Cnt=0x%x\n", mac_val);
3532+ /* TODO: shiang-MT7615, is MIB_M0SDR23 used for Rx total byte count for all or just AMPDU only??? */
3533+ mac_val = mt76_rr(dev, MT_DBG_MIB_M0SDR23(band_idx));
3534+ seq_printf(s, "\tRx Total ByteCnt=0x%x\n", mac_val);
3535+
3536+ if (is_mt7915(&dev->mt76)) {
3537+ band_offset = WF_WTBLON_TOP_B1BTCRn_ADDR - WF_WTBLON_TOP_B0BTCRn_ADDR;//check
3538+ seq_printf(s, "===Per-BSS Related Tx/Rx Counters===\n");
3539+ seq_printf(s, "BSS Idx TxCnt/DataCnt TxByteCnt RxCnt/DataCnt RxByteCnt\n");
3540+
3541+ for (idx = 0; idx < BSS_NUM; idx++) {
3542+ btcr[idx] = mt76_rr(dev, WF_WTBLON_TOP_B0BTCRn_ADDR + band_offset + idx * 4);
3543+ btbcr[idx] = mt76_rr(dev, WF_WTBLON_TOP_B0BTBCRn_ADDR + band_offset + idx * 4);
3544+ brcr[idx] = mt76_rr(dev, WF_WTBLON_TOP_B0BRCRn_ADDR + band_offset + idx * 4);
3545+ brbcr[idx] = mt76_rr(dev, WF_WTBLON_TOP_B0BRBCRn_ADDR + band_offset + idx * 4);
3546+ btdcr[idx] = mt76_rr(dev, WF_WTBLON_TOP_B0BTDCRn_ADDR + band_offset + idx * 4);
3547+ brdcr[idx] = mt76_rr(dev, WF_WTBLON_TOP_B0BRDCRn_ADDR + band_offset + idx * 4);
3548+ }
3549+
3550+ for (idx = 0; idx < BSS_NUM; idx++) {
3551+ seq_printf(s, "%d\t 0x%x/0x%x\t 0x%x \t 0x%x/0x%x \t 0x%x\n",
3552+ idx, btcr[idx], btdcr[idx], btbcr[idx],
3553+ brcr[idx], brdcr[idx], brbcr[idx]);
3554+ }
3555+
3556+ band_offset = (BN1_WF_MIB_TOP_BASE - BN0_WF_MIB_TOP_BASE) * band_idx;
3557+ seq_printf(s, "===Per-MBSS Related MIB Counters===\n");
3558+ seq_printf(s, "BSS Idx RTSTx/RetryCnt BAMissCnt AckFailCnt FrmRetry1/2/3Cnt\n");
3559+
3560+ for (idx = 0; idx < BSS_NUM; idx++) {
3561+ mbxsdr[idx][0] = mt76_rr(dev, BN0_WF_MIB_TOP_M0B0SDR0_ADDR + band_offset + idx * 0x10);
3562+ mbxsdr[idx][1] = mt76_rr(dev, BN0_WF_MIB_TOP_M0B0SDR1_ADDR + band_offset + idx * 0x10);
3563+ mbxsdr[idx][2] = mt76_rr(dev, BN0_WF_MIB_TOP_M0B0SDR2_ADDR + band_offset + idx * 0x10);
3564+ mbxsdr[idx][3] = mt76_rr(dev, BN0_WF_MIB_TOP_M0B0SDR3_ADDR + band_offset + idx * 0x10);
3565+ }
3566+
3567+ for (idx = 0; idx < BSS_NUM; idx++) {
3568+ seq_printf(s, "%d:\t0x%08x/0x%08x 0x%08x \t 0x%08x \t 0x%08x/0x%08x/0x%08x\n",
3569+ idx, (mbxsdr[idx][0] & BN0_WF_MIB_TOP_M0B0SDR0_RTSTXCOUNT_MASK),
3570+ (mbxsdr[idx][0] & BN0_WF_MIB_TOP_M0B0SDR0_RTSRETRYCOUNT_MASK) >> BN0_WF_MIB_TOP_M0B0SDR0_RTSRETRYCOUNT_SHFT,
3571+ (mbxsdr[idx][1] & BN0_WF_MIB_TOP_M0B0SDR1_BAMISSCOUNT_MASK),
3572+ (mbxsdr[idx][1] & BN0_WF_MIB_TOP_M0B0SDR1_ACKFAILCOUNT_MASK) >> BN0_WF_MIB_TOP_M0B0SDR1_ACKFAILCOUNT_SHFT,
3573+ (mbxsdr[idx][2] & BN0_WF_MIB_TOP_M0B0SDR2_FRAMERETRYCOUNT_MASK),
3574+ (mbxsdr[idx][2] & BN0_WF_MIB_TOP_M0B0SDR2_FRAMERETRY2COUNT_MASK) >> BN0_WF_MIB_TOP_M0B0SDR2_FRAMERETRY2COUNT_SHFT,
3575+ (mbxsdr[idx][3] & BN0_WF_MIB_TOP_M0B0SDR3_FRAMERETRY3COUNT_MASK));
3576+ }
3577+
3578+ band_offset = WF_WTBLON_TOP_B1BTCRn_ADDR - WF_WTBLON_TOP_B0BTCRn_ADDR;
3579+ seq_printf(s, "===Per-MBSS Related Tx/Rx Counters===\n");
3580+ seq_printf(s, "MBSSIdx TxCnt TxByteCnt RxCnt RxByteCnt\n");
3581+
3582+ for (idx = 0; idx < 16; idx++) {
3583+ mbtcr[idx] = mt76_rr(dev, WF_WTBLON_TOP_B0MBTCRn_ADDR + band_offset + idx * 4);
3584+ mbtbcr[idx] = mt76_rr(dev, WF_WTBLON_TOP_B0MBTBCRn_ADDR + band_offset + idx * 4);
3585+ mbrcr[idx] = mt76_rr(dev, WF_WTBLON_TOP_B0MBRCRn_ADDR + band_offset + idx * 4);
3586+ mbrbcr[idx] = mt76_rr(dev, WF_WTBLON_TOP_B0MBRBCRn_ADDR + band_offset + idx * 4);
3587+ }
3588+
3589+ for (idx = 0; idx < 16; idx++) {
3590+ seq_printf(s, "%d\t 0x%08x\t 0x%08x \t 0x%08x \t 0x%08x\n",
3591+ idx, mbtcr[idx], mbtbcr[idx], mbrcr[idx], mbrbcr[idx]);
3592+ }
3593+ return 0;
3594+ } else {
3595+ u32 btocr[BSS_NUM], mbtocr[16],mbrocr[16], brocr[BSS_NUM];
3596+ u8 bss_nums = BSS_NUM;
3597+
3598+ band_offset = (BN1_WF_MIB_TOP_BTOCR_ADDR - BN0_WF_MIB_TOP_BTOCR_ADDR) * band_idx;
3599+ seq_printf(s, "===Per-BSS Related Tx/Rx Counters===\n");
3600+ seq_printf(s, "BSS Idx TxCnt/DataCnt TxByteCnt RxCnt/DataCnt RxByteCnt\n");
3601+
3602+ for (idx = 0; idx < BSS_NUM; idx++) {
3603+ btocr[idx] = mt76_rr(dev, (BN0_WF_MIB_TOP_BTOCR_ADDR + band_offset + (idx >> 1) * 4));
3604+ btdcr[idx] = mt76_rr(dev, (BN0_WF_MIB_TOP_BTDCR_ADDR + band_offset + (idx >> 1) * 4));
3605+ btbcr[idx] = mt76_rr(dev, (BN0_WF_MIB_TOP_BTBCR_ADDR + band_offset + (idx * 4)));
3606+ brocr[idx] = mt76_rr(dev, (BN0_WF_MIB_TOP_BROCR_ADDR + band_offset + (idx >> 1) * 4));
3607+ brdcr[idx] = mt76_rr(dev, (BN0_WF_MIB_TOP_BRDCR_ADDR + band_offset + (idx >> 1) * 4));
3608+ brbcr[idx] = mt76_rr(dev, (BN0_WF_MIB_TOP_BRBCR_ADDR + band_offset + (idx * 4)));
3609+
3610+ if ((idx % 2) == 0) {
3611+ btocr[idx] = ((btocr[idx] & BN0_WF_MIB_TOP_BTOCR_TX_OK_COUNT2n_MASK) >> BN0_WF_MIB_TOP_BTOCR_TX_OK_COUNT2n_SHFT);
3612+ btdcr[idx] = ((btdcr[idx] & BN0_WF_MIB_TOP_BTDCR_TX_DATA_COUNT2n_MASK) >> BN0_WF_MIB_TOP_BTDCR_TX_DATA_COUNT2n_SHFT);
3613+ brocr[idx] = ((brocr[idx] & BN0_WF_MIB_TOP_BROCR_RX_OK_COUNT2n_MASK) >> BN0_WF_MIB_TOP_BROCR_RX_OK_COUNT2n_SHFT);
3614+ brdcr[idx] = ((brdcr[idx] & BN0_WF_MIB_TOP_BRDCR_RX_DATA_COUNT2n_MASK) >> BN0_WF_MIB_TOP_BRDCR_RX_DATA_COUNT2n_SHFT);
3615+ } else {
3616+ btocr[idx] = ((btocr[idx] & BN0_WF_MIB_TOP_BTOCR_TX_OK_COUNT2np1_MASK) >> BN0_WF_MIB_TOP_BTOCR_TX_OK_COUNT2np1_SHFT);
3617+ btdcr[idx] = ((btdcr[idx] & BN0_WF_MIB_TOP_BTDCR_TX_DATA_COUNT2np1_MASK) >> BN0_WF_MIB_TOP_BTDCR_TX_DATA_COUNT2np1_SHFT);
3618+ brocr[idx] = ((brocr[idx] & BN0_WF_MIB_TOP_BROCR_RX_OK_COUNT2np1_MASK) >> BN0_WF_MIB_TOP_BROCR_RX_OK_COUNT2np1_SHFT);
3619+ brdcr[idx] = ((brdcr[idx] & BN0_WF_MIB_TOP_BRDCR_RX_DATA_COUNT2np1_MASK) >> BN0_WF_MIB_TOP_BRDCR_RX_DATA_COUNT2np1_SHFT);
3620+ }
3621+ }
3622+
3623+ for (idx = 0; idx < BSS_NUM; idx++) {
3624+ seq_printf(s, "%d\t 0x%x/0x%x\t 0x%x \t 0x%x/0x%x \t 0x%x\n",
3625+ idx, btocr[idx], btdcr[idx], btbcr[idx], brocr[idx], brdcr[idx], brbcr[idx]);
3626+ }
3627+
3628+ band_offset = (BN1_WF_MIB_TOP_BASE - BN0_WF_MIB_TOP_BASE) * band_idx;
3629+ seq_printf(s, "===Per-MBSS Related MIB Counters===\n");
3630+ seq_printf(s, "BSS Idx RTSTx/RetryCnt BAMissCnt AckFailCnt FrmRetry1/2/3Cnt\n");
3631+
3632+ for (idx = 0; idx < BSS_NUM; idx++) {
3633+ mbxsdr[idx][0] = mt76_rr(dev, BN0_WF_MIB_TOP_BSDR0_ADDR + band_offset + ((idx >> 1) * 4));
3634+ mbxsdr[idx][1] = mt76_rr(dev, BN0_WF_MIB_TOP_BSDR1_ADDR + band_offset + ((idx >> 1) * 4));
3635+ mbxsdr[idx][2] = mt76_rr(dev, BN0_WF_MIB_TOP_BSDR2_ADDR + band_offset + ((idx >> 1) * 4));
3636+ mbxsdr[idx][3] = mt76_rr(dev, BN0_WF_MIB_TOP_BSDR3_ADDR + band_offset + ((idx >> 1) * 4));
3637+ mbxsdr[idx][4] = mt76_rr(dev, BN0_WF_MIB_TOP_BSDR4_ADDR + band_offset + ((idx >> 1) * 4));
3638+ mbxsdr[idx][5] = mt76_rr(dev, BN0_WF_MIB_TOP_BSDR5_ADDR + band_offset + ((idx >> 1) * 4));
3639+ mbxsdr[idx][6] = mt76_rr(dev, BN0_WF_MIB_TOP_BSDR6_ADDR + band_offset + ((idx >> 1) * 4));
3640+
3641+ if ((idx % 2) == 0) {
3642+ mbxsdr[idx][0] = ((mbxsdr[idx][0] & BN0_WF_MIB_TOP_BSDR0_RTSTXCOUNT2n_MASK) >> BN0_WF_MIB_TOP_BSDR0_RTSTXCOUNT2n_SHFT);
3643+ mbxsdr[idx][1] = ((mbxsdr[idx][1] & BN0_WF_MIB_TOP_BSDR1_RTSRETRYCOUNT2n_MASK) >> BN0_WF_MIB_TOP_BSDR1_RTSRETRYCOUNT2n_SHFT);
3644+ mbxsdr[idx][2] = ((mbxsdr[idx][2] & BN0_WF_MIB_TOP_BSDR2_BAMISSCOUNT2n_MASK) >> BN0_WF_MIB_TOP_BSDR2_BAMISSCOUNT2n_SHFT);
3645+ mbxsdr[idx][3] = ((mbxsdr[idx][3] & BN0_WF_MIB_TOP_BSDR3_ACKFAILCOUNT2n_MASK) >> BN0_WF_MIB_TOP_BSDR3_ACKFAILCOUNT2n_SHFT);
3646+ mbxsdr[idx][4] = ((mbxsdr[idx][4] & BN0_WF_MIB_TOP_BSDR4_FRAMERETRYCOUNT2n_MASK) >> BN0_WF_MIB_TOP_BSDR4_FRAMERETRYCOUNT2n_SHFT);
3647+ mbxsdr[idx][5] = ((mbxsdr[idx][5] & BN0_WF_MIB_TOP_BSDR5_FRAMERETRY2COUNT2n_MASK) >> BN0_WF_MIB_TOP_BSDR5_FRAMERETRY2COUNT2n_SHFT);
3648+ mbxsdr[idx][6] = ((mbxsdr[idx][6] & BN0_WF_MIB_TOP_BSDR6_FRAMERETRY3COUNT2n_MASK) >> BN0_WF_MIB_TOP_BSDR6_FRAMERETRY3COUNT2n_SHFT);
3649+ } else {
3650+ mbxsdr[idx][0] = ((mbxsdr[idx][0] & BN0_WF_MIB_TOP_BSDR0_RTSTXCOUNT2np1_MASK) >> BN0_WF_MIB_TOP_BSDR0_RTSTXCOUNT2np1_SHFT);
3651+ mbxsdr[idx][1] = ((mbxsdr[idx][1] & BN0_WF_MIB_TOP_BSDR1_RTSRETRYCOUNT2np1_MASK) >> BN0_WF_MIB_TOP_BSDR1_RTSRETRYCOUNT2np1_SHFT);
3652+ mbxsdr[idx][2] = ((mbxsdr[idx][2] & BN0_WF_MIB_TOP_BSDR2_BAMISSCOUNT2np1_MASK) >> BN0_WF_MIB_TOP_BSDR2_BAMISSCOUNT2np1_SHFT);
3653+ mbxsdr[idx][3] = ((mbxsdr[idx][3] & BN0_WF_MIB_TOP_BSDR3_ACKFAILCOUNT2np1_MASK) >> BN0_WF_MIB_TOP_BSDR3_ACKFAILCOUNT2np1_SHFT);
3654+ mbxsdr[idx][4] = ((mbxsdr[idx][4] & BN0_WF_MIB_TOP_BSDR4_FRAMERETRYCOUNT2np1_MASK) >> BN0_WF_MIB_TOP_BSDR4_FRAMERETRYCOUNT2np1_SHFT);
3655+ mbxsdr[idx][5] = ((mbxsdr[idx][5] & BN0_WF_MIB_TOP_BSDR5_FRAMERETRY2COUNT2np1_MASK) >> BN0_WF_MIB_TOP_BSDR5_FRAMERETRY2COUNT2np1_SHFT);
3656+ mbxsdr[idx][6] = ((mbxsdr[idx][6] & BN0_WF_MIB_TOP_BSDR6_FRAMERETRY3COUNT2np1_MASK) >> BN0_WF_MIB_TOP_BSDR6_FRAMERETRY3COUNT2np1_SHFT);
3657+ }
3658+ }
3659+
3660+ for (idx = 0; idx < BSS_NUM; idx++) {
3661+ seq_printf(s, "%d:\t0x%x/0x%x 0x%x \t 0x%x \t 0x%x/0x%x/0x%x\n",
3662+ idx,
3663+ mbxsdr[idx][0], mbxsdr[idx][1], mbxsdr[idx][2], mbxsdr[idx][3],
3664+ mbxsdr[idx][4], mbxsdr[idx][5], mbxsdr[idx][6]);
3665+ }
3666+
3667+ band_offset = (BN1_WF_MIB_TOP_BTOCR_ADDR - BN0_WF_MIB_TOP_BTOCR_ADDR) * band_idx;
3668+ seq_printf(s, "===Per-MBSS Related Tx/Rx Counters===\n");
3669+ seq_printf(s, "MBSSIdx TxCnt TxByteCnt RxCnt RxByteCnt\n");
3670+
3671+ for (idx = 0; idx < 16; idx++) {
3672+ mbtocr[idx] = mt76_rr(dev, BN0_WF_MIB_TOP_BTOCR_ADDR + band_offset + (((bss_nums >> 1) * 4) + ((idx >> 1) * 4)));
3673+ mbtbcr[idx] = mt76_rr(dev, BN0_WF_MIB_TOP_BTBCR_ADDR + band_offset + (((bss_nums >> 1) * 4) + (idx * 4)));
3674+ mbrocr[idx] = mt76_rr(dev, BN0_WF_MIB_TOP_BROCR_ADDR + band_offset + (((bss_nums >> 1) * 4) + ((idx >> 1) * 4)));
3675+ mbrbcr[idx] = mt76_rr(dev, BN0_WF_MIB_TOP_BRBCR_ADDR + band_offset + (((bss_nums >> 1) * 4) + (idx * 4)));
3676+
3677+ if ((idx % 2) == 0) {
3678+ mbtocr[idx] = ((mbtocr[idx] & BN0_WF_MIB_TOP_BTOCR_TX_OK_COUNT2n_MASK) >> BN0_WF_MIB_TOP_BTOCR_TX_OK_COUNT2n_SHFT);
3679+ mbrocr[idx] = ((mbrocr[idx] & BN0_WF_MIB_TOP_BROCR_RX_OK_COUNT2n_MASK) >> BN0_WF_MIB_TOP_BROCR_RX_OK_COUNT2n_SHFT);
3680+ } else {
3681+ mbtocr[idx] = ((mbtocr[idx] & BN0_WF_MIB_TOP_BTOCR_TX_OK_COUNT2np1_MASK) >> BN0_WF_MIB_TOP_BTOCR_TX_OK_COUNT2np1_SHFT);
3682+ mbrocr[idx] = ((mbrocr[idx] & BN0_WF_MIB_TOP_BROCR_RX_OK_COUNT2np1_MASK) >> BN0_WF_MIB_TOP_BROCR_RX_OK_COUNT2np1_SHFT);
3683+ }
3684+ }
3685+
3686+ for (idx = 0; idx < 16; idx++) {
3687+ seq_printf(s, "%d\t 0x%08x\t 0x%08x \t 0x%08x \t 0x%08x\n",
3688+ idx, mbtocr[idx], mbtbcr[idx], mbrocr[idx], mbrbcr[idx]);
3689+ }
3690+ }
3691+
3692+ seq_printf(s, "===Dummy delimiter insertion result===\n");
3693+ mac_val0 = mt76_rr(dev, MT_DBG_MIB_M0DR11(band_idx));
3694+ mac_val = mt76_rr(dev, MT_DBG_MIB_M0DR6(band_idx));
3695+ mac_val1 = mt76_rr(dev, MT_DBG_MIB_M0DR7(band_idx));
3696+ seq_printf(s, "Range0 = %d\t Range1 = %d\t Range2 = %d\t Range3 = %d\t Range4 = %d\n",
3697+ (mac_val0 & BN0_WF_MIB_TOP_M0DR12_TX_DDLMT_RNG0_CNT_MASK),
3698+ (mac_val & BN0_WF_MIB_TOP_M0DR6_TX_DDLMT_RNG1_CNT_MASK),
3699+ (mac_val & BN0_WF_MIB_TOP_M0DR6_TX_DDLMT_RNG2_CNT_MASK) >> BN0_WF_MIB_TOP_M0DR6_TX_DDLMT_RNG2_CNT_SHFT,
3700+ (mac_val1 & BN0_WF_MIB_TOP_M0DR7_TX_DDLMT_RNG3_CNT_MASK),
3701+ (mac_val1 & BN0_WF_MIB_TOP_M0DR7_TX_DDLMT_RNG4_CNT_MASK) >> BN0_WF_MIB_TOP_M0DR7_TX_DDLMT_RNG4_CNT_SHFT);
3702+
3703+ return 0;
3704+}
3705+
3706+static int mt7915_mibinfo_band0(struct seq_file *s, void *data)
3707+{
3708+ mt7915_mibinfo_read_per_band(s, 0);
3709+ return 0;
3710+}
3711+
3712+static int mt7915_mibinfo_band1(struct seq_file *s, void *data)
3713+{
3714+ mt7915_mibinfo_read_per_band(s, 1);
3715+ return 0;
3716+}
3717+
3718+static int mt7915_token_read(struct seq_file *s, void *data)
3719+{
3720+ struct mt7915_dev *dev = dev_get_drvdata(s->private);
3721+ int id, count = 0;
3722+ struct mt76_txwi_cache *txwi;
3723+
3724+ seq_printf(s, "Cut through token:\n");
3725+ spin_lock_bh(&dev->mt76.token_lock);
3726+ idr_for_each_entry(&dev->mt76.token, txwi, id) {
3727+ seq_printf(s, "%4d ", id);
3728+ count++;
3729+ if (count % 8 == 0)
3730+ seq_printf(s, "\n");
3731+ }
3732+ spin_unlock_bh(&dev->mt76.token_lock);
3733+ seq_printf(s, "\n");
3734+
3735+ return 0;
3736+}
3737+
3738+struct txd_l {
3739+ u32 txd_0;
3740+ u32 txd_1;
3741+ u32 txd_2;
3742+ u32 txd_3;
3743+ u32 txd_4;
3744+ u32 txd_5;
3745+ u32 txd_6;
3746+ u32 txd_7;
3747+} __packed;
3748+
3749+char *pkt_ft_str[] = {"cut_through", "store_forward", "cmd", "PDA_FW_Download"};
3750+char *hdr_fmt_str[] = {
3751+ "Non-80211-Frame",
3752+ "Command-Frame",
3753+ "Normal-80211-Frame",
3754+ "enhanced-80211-Frame",
3755+};
3756+/* TMAC_TXD_1.hdr_format */
3757+#define TMI_HDR_FT_NON_80211 0x0
3758+#define TMI_HDR_FT_CMD 0x1
3759+#define TMI_HDR_FT_NOR_80211 0x2
3760+#define TMI_HDR_FT_ENH_80211 0x3
3761+
3762+void mt7915_dump_tmac_info(u8 *tmac_info)
3763+{
3764+ struct txd_l *txd = (struct txd_l *)tmac_info;
3765+
3766+ printk("txd raw data: size=%d\n", MT_TXD_SIZE);
3767+ print_hex_dump(KERN_ERR , "", DUMP_PREFIX_OFFSET, 16, 1, tmac_info, MT_TXD_SIZE, false);
3768+
3769+ printk("TMAC_TXD Fields:\n");
3770+ printk("\tTMAC_TXD_0:\n");
3771+
3772+ /* DW0 */
3773+ /* TX Byte Count [15:0] */
3774+ printk("\t\tTxByteCnt = %ld\n", FIELD_GET(MT_TXD0_TX_BYTES, txd->txd_0));
3775+
3776+ /* PKT_FT: Packet Format [24:23] */
3777+ printk("\t\tpkt_ft = %ld(%s)\n",
3778+ FIELD_GET(MT_TXD0_PKT_FMT, txd->txd_0),
3779+ pkt_ft_str[FIELD_GET(MT_TXD0_PKT_FMT, txd->txd_0)]);
3780+
3781+ /* Q_IDX [31:25] */
3782+ printk("\t\tQueID =0x%lx\n", FIELD_GET(MT_TXD0_Q_IDX, txd->txd_0));
3783+
3784+ printk("\tTMAC_TXD_1:\n");
3785+
3786+ /* DW1 */
3787+ /* WLAN Indec [9:0] */
3788+ printk("\t\tWlan Index = %ld\n", FIELD_GET(MT_TXD1_WLAN_IDX, txd->txd_1));
3789+
3790+ /* VTA [10] */
3791+ printk("\t\tVTA = %d\n", ((txd->txd_1 & MT_TXD1_VTA) ? 1 : 0));
3792+
3793+ /* HF: Header Format [17:16] */
3794+ printk("\t\tHdrFmt = %ld(%s)\n",
3795+ FIELD_GET(MT_TXD1_HDR_FORMAT, txd->txd_1),
3796+ FIELD_GET(MT_TXD1_HDR_FORMAT, txd->txd_1) < 4 ?
3797+ hdr_fmt_str[FIELD_GET(MT_TXD1_HDR_FORMAT, txd->txd_1)] : "N/A");
3798+
3799+ switch (FIELD_GET(MT_TXD1_HDR_FORMAT, txd->txd_1)) {
3800+ case TMI_HDR_FT_NON_80211:
3801+ /* MRD [11], EOSP [12], RMVL [13], VLAN [14], ETYPE [15] */
3802+ printk("\t\t\tMRD = %d, EOSP = %d,\
3803+ RMVL = %d, VLAN = %d, ETYP = %d\n",
3804+ (txd->txd_1 & MT_TXD1_MRD) ? 1 : 0,
3805+ (txd->txd_1 & MT_TXD1_EOSP) ? 1 : 0,
3806+ (txd->txd_1 & MT_TXD1_RMVL) ? 1 : 0,
3807+ (txd->txd_1 & MT_TXD1_VLAN) ? 1 : 0,
3808+ (txd->txd_1 & MT_TXD1_ETYP) ? 1 : 0);
3809+ break;
3810+ case TMI_HDR_FT_NOR_80211:
3811+ /* HEADER_LENGTH [15:11] */
3812+ printk("\t\t\tHeader Len = %ld(WORD)\n", FIELD_GET(MT_TXD1_HDR_INFO, txd->txd_1));
3813+ break;
3814+
3815+ case TMI_HDR_FT_ENH_80211:
3816+ /* EOSP [12], AMS [13] */
3817+ printk("\t\t\tEOSP = %d, AMS = %d\n",
3818+ (txd->txd_1 & MT_TXD1_EOSP) ? 1 : 0,
3819+ (txd->txd_1 & MT_TXD1_AMS) ? 1 : 0);
3820+ break;
3821+ }
3822+
3823+ /* Header Padding [19:18] */
3824+ printk("\t\tHdrPad = %ld\n", FIELD_GET(MT_TXD1_HDR_PAD, txd->txd_1));
3825+
3826+ /* TID [22:20] */
3827+ printk("\t\tTID = %ld\n", FIELD_GET(MT_TXD1_TID, txd->txd_1));
3828+
3829+
3830+ /* UtxB/AMSDU_C/AMSDU [23] */
3831+ printk("\t\tamsdu = %d\n", ((txd->txd_1 & MT_TXD1_AMSDU) ? 1 : 0));
3832+
3833+ /* OM [29:24] */
3834+ printk("\t\town_mac = %ld\n", FIELD_GET(MT_TXD1_OWN_MAC, txd->txd_1));
3835+
3836+
3837+ /* TGID [30] */
3838+ printk("\t\tTGID = %d\n", ((txd->txd_1 & MT_TXD1_TGID) ? 1 : 0));
3839+
3840+
3841+ /* FT [31] */
3842+ printk("\t\tTxDFormatType = %d\n", (txd->txd_1 & MT_TXD1_LONG_FORMAT) ? 1 : 0);
3843+
3844+ printk("\tTMAC_TXD_2:\n");
3845+ /* DW2 */
3846+ /* Subtype [3:0] */
3847+ printk("\t\tsub_type = %ld\n", FIELD_GET(MT_TXD2_SUB_TYPE, txd->txd_2));
3848+
3849+ /* Type[5:4] */
3850+ printk("\t\tfrm_type = %ld\n", FIELD_GET(MT_TXD2_FRAME_TYPE, txd->txd_2));
3851+
3852+ /* NDP [6] */
3853+ printk("\t\tNDP = %d\n", ((txd->txd_2 & MT_TXD2_NDP) ? 1 : 0));
3854+
3855+ /* NDPA [7] */
3856+ printk("\t\tNDPA = %d\n", ((txd->txd_2 & MT_TXD2_NDPA) ? 1 : 0));
3857+
3858+ /* SD [8] */
3859+ printk("\t\tSounding = %d\n", ((txd->txd_2 & MT_TXD2_SOUNDING) ? 1 : 0));
3860+
3861+ /* RTS [9] */
3862+ printk("\t\tRTS = %d\n", ((txd->txd_2 & MT_TXD2_RTS) ? 1 : 0));
3863+
3864+ /* BM [10] */
3865+ printk("\t\tbc_mc_pkt = %d\n", ((txd->txd_2 & MT_TXD2_MULTICAST) ? 1 : 0));
3866+
3867+ /* B [11] */
3868+ printk("\t\tBIP = %d\n", ((txd->txd_2 & MT_TXD2_BIP) ? 1 : 0));
3869+
3870+ /* DU [12] */
3871+ printk("\t\tDuration = %d\n", ((txd->txd_2 & MT_TXD2_DURATION) ? 1 : 0));
3872+
3873+ /* HE [13] */
3874+ printk("\t\tHE(HTC Exist) = %d\n", ((txd->txd_2 & MT_TXD2_HTC_VLD) ? 1 : 0));
3875+
3876+ /* FRAG [15:14] */
3877+ printk("\t\tFRAG = %ld\n", FIELD_GET(MT_TXD2_FRAG, txd->txd_2));
3878+
3879+
3880+ /* Remaining Life Time [23:16]*/
3881+ printk("\t\tReamingLife/MaxTx time = %ld (unit: 64TU)\n",
3882+ FIELD_GET(MT_TXD2_MAX_TX_TIME, txd->txd_2));
3883+
3884+ /* Power Offset [29:24] */
3885+ printk("\t\tpwr_offset = %ld\n", FIELD_GET(MT_TXD2_POWER_OFFSET, txd->txd_2));
3886+
3887+ /* FRM [30] */
3888+ printk("\t\tfix rate mode = %d\n", (txd->txd_2 & MT_TXD2_FIXED_RATE) ? 1 : 0);
3889+
3890+ /* FR[31] */
3891+ printk("\t\tfix rate = %d\n", (txd->txd_2 & MT_TXD2_FIX_RATE) ? 1 : 0);
3892+
3893+
3894+ printk("\tTMAC_TXD_3:\n");
3895+
3896+ /* DW3 */
3897+ /* NA [0] */
3898+ printk("\t\tNoAck = %d\n", (txd->txd_3 & MT_TXD3_NO_ACK) ? 1 : 0);
3899+
3900+ /* PF [1] */
3901+ printk("\t\tPF = %d\n", (txd->txd_3 & MT_TXD3_PROTECT_FRAME) ? 1 : 0);
3902+
3903+ /* EMRD [2] */
3904+ printk("\t\tEMRD = %d\n", (txd->txd_3 & MT_TXD3_EMRD) ? 1 : 0);
3905+
3906+ /* EEOSP [3] */
3907+ printk("\t\tEEOSP = %d\n", (txd->txd_3 & MT_TXD3_EEOSP) ? 1 : 0);
3908+
3909+ /* DAS [4] */
3910+ printk("\t\tda_select = %d\n", (txd->txd_3 & MT_TXD3_DAS) ? 1 : 0);
3911+
3912+ /* TM [5] */
3913+ printk("\t\ttm = %d\n", (txd->txd_3 & MT_TXD3_TIMING_MEASURE) ? 1 : 0);
3914+
3915+ /* TX Count [10:6] */
3916+ printk("\t\ttx_cnt = %ld\n", FIELD_GET(MT_TXD3_TX_COUNT, txd->txd_3));
3917+
3918+ /* Remaining TX Count [15:11] */
3919+ printk("\t\tremain_tx_cnt = %ld\n", FIELD_GET(MT_TXD3_REM_TX_COUNT, txd->txd_3));
3920+
3921+ /* SN [27:16] */
3922+ printk("\t\tsn = %ld\n", FIELD_GET(MT_TXD3_SEQ, txd->txd_3));
3923+
3924+ /* BA_DIS [28] */
3925+ printk("\t\tba dis = %d\n", (txd->txd_3 & MT_TXD3_BA_DISABLE) ? 1 : 0);
3926+
3927+ /* Power Management [29] */
3928+ printk("\t\tpwr_mgmt = 0x%x\n", (txd->txd_3 & MT_TXD3_SW_POWER_MGMT) ? 1 : 0);
3929+
3930+ /* PN_VLD [30] */
3931+ printk("\t\tpn_vld = %d\n", (txd->txd_3 & MT_TXD3_PN_VALID) ? 1 : 0);
3932+
3933+ /* SN_VLD [31] */
3934+ printk("\t\tsn_vld = %d\n", (txd->txd_3 & MT_TXD3_SN_VALID) ? 1 : 0);
3935+
3936+
3937+ /* DW4 */
3938+ printk("\tTMAC_TXD_4:\n");
3939+
3940+ /* PN_LOW [31:0] */
3941+ printk("\t\tpn_low = 0x%lx\n", FIELD_GET(MT_TXD4_PN_LOW, txd->txd_4));
3942+
3943+
3944+ /* DW5 */
3945+ printk("\tTMAC_TXD_5:\n");
3946+
3947+ /* PID [7:0] */
3948+ printk("\t\tpid = %ld\n", FIELD_GET(MT_TXD5_PID, txd->txd_5));
3949+
3950+ /* TXSFM [8] */
3951+ printk("\t\ttx_status_fmt = %d\n", (txd->txd_5 & MT_TXD5_TX_STATUS_FMT) ? 1 : 0);
3952+
3953+ /* TXS2M [9] */
3954+ printk("\t\ttx_status_2_mcu = %d\n", (txd->txd_5 & MT_TXD5_TX_STATUS_MCU) ? 1 : 0);
3955+
3956+ /* TXS2H [10] */
3957+ printk("\t\ttx_status_2_host = %d\n", (txd->txd_5 & MT_TXD5_TX_STATUS_HOST) ? 1 : 0);
3958+
3959+ /* ADD_BA [14] */
3960+ printk("\t\tADD_BA = %d\n", (txd->txd_5 & MT_TXD5_ADD_BA) ? 1 : 0);
3961+
3962+ /* MD [15] */
3963+ printk("\t\tMD = %d\n", (txd->txd_5 & MT_TXD5_MD) ? 1 : 0);
3964+
3965+ /* PN_HIGH [31:16] */
3966+ printk("\t\tpn_high = 0x%lx\n", FIELD_GET(MT_TXD5_PN_HIGH, txd->txd_5));
3967+
3968+ /* DW6 */
3969+ printk("\tTMAC_TXD_6:\n");
3970+
3971+ if (txd->txd_2 & MT_TXD2_FIX_RATE) {
3972+ /* Fixed BandWidth mode [2:0] */
3973+ printk("\t\tbw = %ld\n", FIELD_GET(MT_TXD6_BW, txd->txd_6));
3974+
3975+ /* DYN_BW [3] */
3976+ printk("\t\tdyn_bw = %d\n", (txd->txd_6 & MT_TXD6_DYN_BW) ? 1 : 0);
3977+
3978+ /* ANT_ID [7:4] */
3979+ printk("\t\tant_id = %ld\n", FIELD_GET(MT_TXD6_ANT_ID, txd->txd_6));
3980+
3981+ /* SPE_IDX_SEL [10] */
3982+ printk("\t\tspe_idx_sel = %d\n", (txd->txd_6 & MT_TXD6_SPE_ID_IDX) ? 1 : 0);
3983+
3984+ /* LDPC [11] */
3985+ printk("\t\tldpc = %d\n", (txd->txd_6 & MT_TXD6_LDPC) ? 1 : 0);
3986+
3987+ /* HELTF Type[13:12] */
3988+ printk("\t\tHELTF Type = %ld\n", FIELD_GET(MT_TXD6_HELTF, txd->txd_6));
3989+
3990+ /* GI Type [15:14] */
3991+ printk("\t\tGI = %ld\n", FIELD_GET(MT_TXD6_SGI, txd->txd_6));
3992+
3993+ /* Rate to be Fixed [29:16] */
3994+ printk("\t\ttx_rate = 0x%lx\n", FIELD_GET(MT_TXD6_TX_RATE, txd->txd_6));
3995+ }
3996+
3997+ /* TXEBF [30] */
3998+ printk("\t\ttxebf = %d\n", (txd->txd_6 & MT_TXD6_TX_EBF) ? 1 : 0);
3999+
4000+ /* TXIBF [31] */
4001+ printk("\t\ttxibf = %d\n", (txd->txd_6 & MT_TXD6_TX_IBF) ? 1 : 0);
4002+
4003+ /* DW7 */
4004+ printk("\tTMAC_TXD_7:\n");
4005+
4006+ if ((txd->txd_1 & MT_TXD1_VTA) == 0) {
4007+ /* SW Tx Time [9:0] */
4008+ printk("\t\tsw_tx_time = %ld\n", FIELD_GET(MT_TXD7_TX_TIME, txd->txd_7));
4009+ } else {
4010+ /* TXD Arrival Time [9:0] */
4011+ printk("\t\tat = %ld\n", FIELD_GET(MT_TXD7_TAT, txd->txd_7));
4012+ }
4013+
4014+ /* HW_AMSDU_CAP [10] */
4015+ printk("\t\thw amsdu cap = %d\n",(txd->txd_7 & MT_TXD7_HW_AMSDU) ? 1 : 0);
4016+
4017+ /* SPE_IDX [15:11] */
4018+ if (txd->txd_2 & MT_TXD2_FIX_RATE) {
4019+ printk("\t\tspe_idx = 0x%lx\n", FIELD_GET(MT_TXD7_SPE_IDX, txd->txd_7));
4020+ }
4021+
4022+ /* PSE_FID [27:16] */
4023+ printk("\t\tpse_fid = 0x%lx\n", FIELD_GET(MT_TXD7_PSE_FID, txd->txd_7));
4024+
4025+ /* Subtype [19:16] */
4026+ printk("\t\tpp_sub_type=%ld\n", FIELD_GET(MT_TXD7_SUB_TYPE, txd->txd_7));
4027+
4028+ /* Type [21:20] */
4029+ printk("\t\tpp_type=%ld\n", FIELD_GET(MT_TXD7_TYPE, txd->txd_7));
4030+
4031+ /* CTXD_CNT [25:23] */
4032+ printk("\t\tctxd cnt=0x%lx\n", FIELD_GET(MT_TXD7_CTXD_CNT, txd->txd_7));
4033+
4034+ /* CTXD [26] */
4035+ printk("\t\tctxd = %d\n", (txd->txd_7 & MT_TXD7_CTXD) ? 1 : 0);
4036+
4037+ /* I [28] */
4038+ printk("\t\ti = %d\n", (txd->txd_7 & MT_TXD7_IP_SUM) ? 1 : 0);
4039+
4040+ /* UT [29] */
4041+ printk("\t\tUT = %d\n", (txd->txd_7 & MT_TXD7_UDP_TCP_SUM) ? 1 : 0);
4042+
4043+ /* TXDLEN [31:30] */
4044+ printk("\t\t txd len= %ld\n", FIELD_GET(MT_TXD7_TXD_LEN, txd->txd_7));
4045+}
4046+
4047+
4048+static int mt7915_token_txd_read(struct seq_file *s, void *data)
4049+{
4050+ struct mt7915_dev *dev = dev_get_drvdata(s->private);
4051+ struct mt76_txwi_cache *t;
4052+ u8* txwi;
4053+
4054+ seq_printf(s, "\n");
4055+ spin_lock_bh(&dev->mt76.token_lock);
4056+
4057+ t = idr_find(&dev->mt76.token, dev->dbg.token_idx);
4058+
4059+ spin_unlock_bh(&dev->mt76.token_lock);
4060+ if (t != NULL) {
4061+ struct mt76_dev *mdev = &dev->mt76;
4062+ txwi = ((u8*)(t)) - (mdev->drv->txwi_size);
4063+ mt7915_dump_tmac_info((u8*) txwi);
4064+ seq_printf(s, "\n");
4065+ printk("[SKB]\n");
4066+ print_hex_dump(KERN_ERR , "", DUMP_PREFIX_OFFSET, 16, 1, (u8 *)t->skb->data, t->skb->len, false);
4067+ seq_printf(s, "\n");
4068+ }
4069+ return 0;
4070+}
4071+
4072+static int mt7915_amsduinfo_read(struct seq_file *s, void *data)
4073+{
4074+ struct mt7915_dev *dev = dev_get_drvdata(s->private);
4075+ u32 ple_stat[8] = {0}, total_amsdu = 0;
4076+ u8 i;
4077+
4078+ for (i = 0; i < 8; i++)
4079+ ple_stat[i] = mt76_rr(dev, MT_DBG_PLE_AMSDU_PACK_MSDU_CNT(i));
4080+
4081+ seq_printf(s, "TXD counter status of MSDU:\n");
4082+
4083+ for (i = 0; i < 8; i++)
4084+ total_amsdu += ple_stat[i];
4085+
4086+ for (i = 0; i < 8; i++) {
4087+ seq_printf(s, "AMSDU pack count of %d MSDU in TXD: 0x%x ", i + 1, ple_stat[i]);
4088+ if (total_amsdu != 0)
4089+ seq_printf(s, "(%d%%)\n", ple_stat[i] * 100 / total_amsdu);
4090+ else
4091+ seq_printf(s, "\n");
4092+ }
4093+
4094+ return 0;
4095+
4096+}
4097+
4098+static int mt7915_agginfo_read_per_band(struct seq_file *s, int band_idx)
4099+{
4100+ struct mt7915_dev *dev = dev_get_drvdata(s->private);
4101+ u32 value, idx, agg_rang_sel[15], ampdu_cnt[11], total_ampdu = 0;
4102+
4103+ seq_printf(s, "Band %d AGG Status\n", band_idx);
4104+ seq_printf(s, "===============================\n");
4105+ value = mt76_rr(dev, MT_DBG_AGG_AALCR0(band_idx));
4106+ seq_printf(s, "AC00 Agg limit = %ld\t", FIELD_GET(MT_DBG_AGG_AALCR_ACx0_AGG_LIMIT_MASK, value));
4107+ seq_printf(s, "AC01 Agg limit = %ld\t", FIELD_GET(MT_DBG_AGG_AALCR_ACx1_AGG_LIMIT_MASK, value));
4108+ seq_printf(s, "AC02 Agg limit = %ld\t", FIELD_GET(MT_DBG_AGG_AALCR_ACx2_AGG_LIMIT_MASK, value));
4109+ seq_printf(s, "AC03 Agg limit = %ld\n", FIELD_GET(MT_DBG_AGG_AALCR_ACx3_AGG_LIMIT_MASK, value));
4110+
4111+ value = mt76_rr(dev, MT_DBG_AGG_AALCR1(band_idx));
4112+ seq_printf(s, "AC10 Agg limit = %ld\t", FIELD_GET(MT_DBG_AGG_AALCR_ACx0_AGG_LIMIT_MASK, value));
4113+ seq_printf(s, "AC11 Agg limit = %ld\t", FIELD_GET(MT_DBG_AGG_AALCR_ACx1_AGG_LIMIT_MASK, value));
4114+ seq_printf(s, "AC12 Agg limit = %ld\t", FIELD_GET(MT_DBG_AGG_AALCR_ACx2_AGG_LIMIT_MASK, value));
4115+ seq_printf(s, "AC13 Agg limit = %ld\n", FIELD_GET(MT_DBG_AGG_AALCR_ACx3_AGG_LIMIT_MASK, value));
4116+
4117+ value = mt76_rr(dev, MT_DBG_AGG_AALCR2(band_idx));
4118+ seq_printf(s, "AC20 Agg limit = %ld\t", FIELD_GET(MT_DBG_AGG_AALCR_ACx0_AGG_LIMIT_MASK, value));
4119+ seq_printf(s, "AC21 Agg limit = %ld\t", FIELD_GET(MT_DBG_AGG_AALCR_ACx1_AGG_LIMIT_MASK, value));
4120+ seq_printf(s, "AC22 Agg limit = %ld\t", FIELD_GET(MT_DBG_AGG_AALCR_ACx2_AGG_LIMIT_MASK, value));
4121+ seq_printf(s, "AC23 Agg limit = %ld\n", FIELD_GET(MT_DBG_AGG_AALCR_ACx3_AGG_LIMIT_MASK, value));
4122+
4123+ value = mt76_rr(dev, MT_DBG_AGG_AALCR3(band_idx));
4124+ seq_printf(s, "AC30 Agg limit = %ld\t", FIELD_GET(MT_DBG_AGG_AALCR_ACx0_AGG_LIMIT_MASK, value));
4125+ seq_printf(s, "AC31 Agg limit = %ld\t", FIELD_GET(MT_DBG_AGG_AALCR_ACx1_AGG_LIMIT_MASK, value));
4126+ seq_printf(s, "AC32 Agg limit = %ld\t", FIELD_GET(MT_DBG_AGG_AALCR_ACx2_AGG_LIMIT_MASK, value));
4127+ seq_printf(s, "AC33 Agg limit = %ld\n", FIELD_GET(MT_DBG_AGG_AALCR_ACx3_AGG_LIMIT_MASK, value));
4128+
4129+ value = mt76_rr(dev, MT_DBG_AGG_AALCR4(band_idx));
4130+ seq_printf(s, "ALTX Agg limit = %ld\n", FIELD_GET(MT_DBG_AGG_AALCR4_ALTX0_AGG_LIMIT_MASK, value));
4131+
4132+ value = mt76_rr(dev, MT_DBG_AGG_AWSCR(band_idx, 0));
4133+ seq_printf(s, "Winsize0 limit = %ld\t", FIELD_GET(MT_DBG_AGG_AWSCR0_WINSIZE0_MASK, value));
4134+ seq_printf(s, "Winsize1 limit = %ld\t", FIELD_GET(MT_DBG_AGG_AWSCR0_WINSIZE1_MASK, value));
4135+ seq_printf(s, "Winsize2 limit = %ld\t", FIELD_GET(MT_DBG_AGG_AWSCR0_WINSIZE2_MASK, value));
4136+ seq_printf(s, "Winsize3 limit = %ld\n", FIELD_GET(MT_DBG_AGG_AWSCR0_WINSIZE3_MASK, value));
4137+
4138+ value = mt76_rr(dev, MT_DBG_AGG_AWSCR(band_idx, 1));
4139+ seq_printf(s, "Winsize4 limit = %ld\t", FIELD_GET(MT_DBG_AGG_AWSCR1_WINSIZE4_MASK, value));
4140+ seq_printf(s, "Winsize5 limit = %ld\t", FIELD_GET(MT_DBG_AGG_AWSCR1_WINSIZE5_MASK, value));
4141+ seq_printf(s, "Winsize6 limit = %ld\t", FIELD_GET(MT_DBG_AGG_AWSCR1_WINSIZE6_MASK, value));
4142+ seq_printf(s, "Winsize7 limit = %ld\n", FIELD_GET(MT_DBG_AGG_AWSCR1_WINSIZE7_MASK, value));
4143+
4144+ value = mt76_rr(dev, MT_DBG_AGG_AWSCR(band_idx, 2));
4145+ seq_printf(s, "Winsize8 limit = %ld\t", FIELD_GET(MT_DBG_AGG_AWSCR2_WINSIZE8_MASK, value));
4146+ seq_printf(s, "Winsize9 limit = %ld\t", FIELD_GET(MT_DBG_AGG_AWSCR2_WINSIZE9_MASK, value));
4147+ seq_printf(s, "WinsizeA limit = %ld\t", FIELD_GET(MT_DBG_AGG_AWSCR2_WINSIZEA_MASK, value));
4148+ seq_printf(s, "WinsizeB limit = %ld\n", FIELD_GET(MT_DBG_AGG_AWSCR2_WINSIZEB_MASK, value));
4149+
4150+
4151+ value = mt76_rr(dev, MT_DBG_AGG_AWSCR(band_idx, 3));
4152+ seq_printf(s, "WinsizeC limit = %ld\t", FIELD_GET(MT_DBG_AGG_AWSCR3_WINSIZEC_MASK, value));
4153+ seq_printf(s, "WinsizeD limit = %ld\t", FIELD_GET(MT_DBG_AGG_AWSCR3_WINSIZED_MASK, value));
4154+ seq_printf(s, "WinsizeE limit = %ld\n", FIELD_GET(MT_DBG_AGG_AWSCR3_WINSIZEE_MASK, value));
4155+
4156+ seq_printf(s, "===AMPDU Related Counters===\n");
4157+
4158+ value = mt76_rr(dev, MT_DBG_MIB_M0ARNG(band_idx, 0));
4159+ agg_rang_sel[0] = FIELD_GET(MT_DBG_MIB_M0ARNG0_AGG_RANG_SEL0_MASK, value);
4160+ agg_rang_sel[1] = FIELD_GET(MT_DBG_MIB_M0ARNG0_AGG_RANG_SEL1_MASK, value);
4161+ agg_rang_sel[2] = FIELD_GET(MT_DBG_MIB_M0ARNG0_AGG_RANG_SEL2_MASK, value);
4162+ agg_rang_sel[3] = FIELD_GET(MT_DBG_MIB_M0ARNG0_AGG_RANG_SEL3_MASK, value);
4163+
4164+ value = mt76_rr(dev, MT_DBG_MIB_M0ARNG(band_idx, 1));
4165+ agg_rang_sel[4] = FIELD_GET(MT_DBG_MIB_M0ARNG1_AGG_RANG_SEL4_MASK, value);
4166+ agg_rang_sel[5] = FIELD_GET(MT_DBG_MIB_M0ARNG1_AGG_RANG_SEL5_MASK, value);
4167+ agg_rang_sel[6] = FIELD_GET(MT_DBG_MIB_M0ARNG1_AGG_RANG_SEL6_MASK, value);
4168+ agg_rang_sel[7] = FIELD_GET(MT_DBG_MIB_M0ARNG1_AGG_RANG_SEL7_MASK, value);
4169+
4170+ value = mt76_rr(dev, MT_DBG_MIB_M0ARNG(band_idx, 2));
4171+ agg_rang_sel[8] = FIELD_GET(MT_DBG_MIB_M0ARNG2_AGG_RANG_SEL8_MASK, value);
4172+ agg_rang_sel[9] = FIELD_GET(MT_DBG_MIB_M0ARNG2_AGG_RANG_SEL9_MASK, value);
4173+ agg_rang_sel[10] = FIELD_GET(MT_DBG_MIB_M0ARNG2_AGG_RANG_SEL10_MASK, value);
4174+ agg_rang_sel[11] = FIELD_GET(MT_DBG_MIB_M0ARNG2_AGG_RANG_SEL11_MASK, value);
4175+
4176+ value = mt76_rr(dev, MT_DBG_MIB_M0ARNG(band_idx, 3));
4177+ agg_rang_sel[12] = FIELD_GET(MT_DBG_MIB_M0ARNG3_AGG_RANG_SEL12_MASK, value);
4178+ agg_rang_sel[13] = FIELD_GET(MT_DBG_MIB_M0ARNG3_AGG_RANG_SEL13_MASK, value);
4179+ agg_rang_sel[14] = FIELD_GET(MT_DBG_MIB_M0ARNG3_AGG_RANG_SEL14_MASK, value);
4180+
4181+ /* Need to add 1 after read from AGG_RANG_SEL CR */
4182+ for (idx = 0; idx < 15; idx++)
4183+ agg_rang_sel[idx]++;
4184+
4185+ ampdu_cnt[3] = mt76_rr(dev, MT_DBG_MIB_M0DR2(band_idx, 0));
4186+ ampdu_cnt[4] = mt76_rr(dev, MT_DBG_MIB_M0DR2(band_idx, 1));
4187+ ampdu_cnt[5] = mt76_rr(dev, MT_DBG_MIB_M0DR2(band_idx, 2));
4188+ ampdu_cnt[6] = mt76_rr(dev, MT_DBG_MIB_M0DR2(band_idx, 3));
4189+ ampdu_cnt[7] = mt76_rr(dev, MT_DBG_MIB_M0DR13(band_idx, 0));
4190+ ampdu_cnt[8] = mt76_rr(dev, MT_DBG_MIB_M0DR13(band_idx, 1));
4191+ ampdu_cnt[9] = mt76_rr(dev, MT_DBG_MIB_M0DR13(band_idx, 2));
4192+ ampdu_cnt[10] = mt76_rr(dev, MT_DBG_MIB_M0DR13(band_idx, 3));
4193+
4194+ seq_printf(s, "\tTx Agg Range: \t%d \t%d~%d \t%d~%d \t%d~%d \t%d~%d \t%d~%d \t%d~%d \t%d~%d\n",
4195+ agg_rang_sel[0],
4196+ agg_rang_sel[0] + 1, agg_rang_sel[1],
4197+ agg_rang_sel[1] + 1, agg_rang_sel[2],
4198+ agg_rang_sel[2] + 1, agg_rang_sel[3],
4199+ agg_rang_sel[3] + 1, agg_rang_sel[4],
4200+ agg_rang_sel[4] + 1, agg_rang_sel[5],
4201+ agg_rang_sel[5] + 1, agg_rang_sel[6],
4202+ agg_rang_sel[6] + 1, agg_rang_sel[7]);
4203+
4204+#define BIT_0_to_15_MASK 0x0000FFFF
4205+#define BIT_15_to_31_MASK 0xFFFF0000
4206+#define SHFIT_16_BIT 16
4207+
4208+ for (idx = 3; idx < 11; idx++)
4209+ total_ampdu = total_ampdu + (ampdu_cnt[idx] & BIT_0_to_15_MASK) + ((ampdu_cnt[idx] & BIT_15_to_31_MASK) >> SHFIT_16_BIT);
4210+
4211+ seq_printf(s, "\t\t\t0x%lx \t0x%lx \t0x%lx \t0x%lx \t0x%lx \t0x%lx \t0x%lx \t0x%lx\n",
4212+ (ampdu_cnt[3]) & MT_DBG_MIB_M0DR2_TRX_AGG_RANGE0_CNT_MASK,
4213+ FIELD_GET(MT_DBG_MIB_M0DR2_TRX_AGG_RANGE1_CNT_MASK, ampdu_cnt[3]),
4214+ (ampdu_cnt[4]) & MT_DBG_MIB_M0DR3_TRX_AGG_RANGE2_CNT_MASK,
4215+ FIELD_GET(MT_DBG_MIB_M0DR3_TRX_AGG_RANGE3_CNT_MASK, ampdu_cnt[4]),
4216+ (ampdu_cnt[5]) & MT_DBG_MIB_M0DR4_TRX_AGG_RANGE4_CNT_MASK,
4217+ FIELD_GET(MT_DBG_MIB_M0DR4_TRX_AGG_RANGE5_CNT_MASK, ampdu_cnt[5]),
4218+ (ampdu_cnt[6]) & MT_DBG_MIB_M0DR5_TRX_AGG_RANGE6_CNT_MASK,
4219+ FIELD_GET(MT_DBG_MIB_M0DR5_TRX_AGG_RANGE7_CNT_MASK, ampdu_cnt[6]));
4220+
4221+ if (total_ampdu != 0) {
4222+ seq_printf(s, "\t\t\t(%ld%%) \t(%ld%%) \t(%ld%%) \t(%ld%%) \t(%ld%%) \t(%ld%%) \t(%ld%%) \t(%ld%%)\n",
4223+ ((ampdu_cnt[3]) & MT_DBG_MIB_M0DR2_TRX_AGG_RANGE0_CNT_MASK) * 100 / total_ampdu,
4224+ FIELD_GET(MT_DBG_MIB_M0DR2_TRX_AGG_RANGE1_CNT_MASK, ampdu_cnt[3]) * 100 / total_ampdu,
4225+ ((ampdu_cnt[4]) & MT_DBG_MIB_M0DR3_TRX_AGG_RANGE2_CNT_MASK) * 100 / total_ampdu,
4226+ FIELD_GET(MT_DBG_MIB_M0DR3_TRX_AGG_RANGE3_CNT_MASK, ampdu_cnt[4]) * 100 / total_ampdu,
4227+ ((ampdu_cnt[5]) & MT_DBG_MIB_M0DR4_TRX_AGG_RANGE4_CNT_MASK) * 100 / total_ampdu,
4228+ FIELD_GET(MT_DBG_MIB_M0DR4_TRX_AGG_RANGE5_CNT_MASK, ampdu_cnt[5]) * 100 / total_ampdu,
4229+ ((ampdu_cnt[6]) & MT_DBG_MIB_M0DR5_TRX_AGG_RANGE6_CNT_MASK) * 100 / total_ampdu,
4230+ FIELD_GET(MT_DBG_MIB_M0DR5_TRX_AGG_RANGE7_CNT_MASK, ampdu_cnt[6]) * 100 / total_ampdu);
4231+ }
4232+
4233+ seq_printf(s, "\t\t\t%d~%d\t%d~%d\t%d~%d\t%d~%d\t%d~%d\t%d~%d\t%d~%d\t%d~256\n",
4234+ agg_rang_sel[7] + 1, agg_rang_sel[8],
4235+ agg_rang_sel[8] + 1, agg_rang_sel[9],
4236+ agg_rang_sel[9] + 1, agg_rang_sel[10],
4237+ agg_rang_sel[10] + 1, agg_rang_sel[11],
4238+ agg_rang_sel[11] + 1, agg_rang_sel[12],
4239+ agg_rang_sel[12] + 1, agg_rang_sel[13],
4240+ agg_rang_sel[13] + 1, agg_rang_sel[14],
4241+ agg_rang_sel[14] + 1);
4242+
4243+ seq_printf(s, "\t\t\t0x%lx \t0x%lx \t0x%lx \t0x%lx \t0x%lx \t0x%lx \t0x%lx \t0x%lx\n",
4244+ (ampdu_cnt[7]) & MT_DBG_MIB_M0DR13_TRX_AGG_RANGE8_CNT_MASK,
4245+ FIELD_GET(MT_DBG_MIB_M0DR13_TRX_AGG_RANGE9_CNT_MASK, ampdu_cnt[7]),
4246+ (ampdu_cnt[8]) & MT_DBG_MIB_M0DR14_TRX_AGG_RANGE10_CNT_MASK,
4247+ FIELD_GET(MT_DBG_MIB_M0DR14_TRX_AGG_RANGE11_CNT_MASK, ampdu_cnt[8]),
4248+ (ampdu_cnt[9]) & MT_DBG_MIB_M0DR15_TRX_AGG_RANGE12_CNT_MASK,
4249+ FIELD_GET(MT_DBG_MIB_M0DR15_TRX_AGG_RANGE13_CNT_MASK, ampdu_cnt[9]),
4250+ (ampdu_cnt[10]) & MT_DBG_MIB_M0DR16_TRX_AGG_RANGE14_CNT_MASK,
4251+ FIELD_GET(MT_DBG_MIB_M0DR16_TRX_AGG_RANGE15_CNT_MASK, ampdu_cnt[10]));
4252+
4253+ if (total_ampdu != 0) {
4254+ seq_printf(s, "\t\t\t(%ld%%) \t(%ld%%) \t(%ld%%) \t(%ld%%) \t(%ld%%) \t(%ld%%) \t(%ld%%) \t(%ld%%)\n",
4255+ ((ampdu_cnt[7]) & MT_DBG_MIB_M0DR2_TRX_AGG_RANGE0_CNT_MASK) * 100 / total_ampdu,
4256+ FIELD_GET(MT_DBG_MIB_M0DR2_TRX_AGG_RANGE1_CNT_MASK, ampdu_cnt[7]) * 100 / total_ampdu,
4257+ ((ampdu_cnt[8]) & MT_DBG_MIB_M0DR3_TRX_AGG_RANGE2_CNT_MASK) * 100 / total_ampdu,
4258+ FIELD_GET(MT_DBG_MIB_M0DR3_TRX_AGG_RANGE3_CNT_MASK, ampdu_cnt[8]) * 100 / total_ampdu,
4259+ ((ampdu_cnt[9]) & MT_DBG_MIB_M0DR4_TRX_AGG_RANGE4_CNT_MASK) * 100 / total_ampdu,
4260+ FIELD_GET(MT_DBG_MIB_M0DR4_TRX_AGG_RANGE5_CNT_MASK, ampdu_cnt[9]) * 100 / total_ampdu,
4261+ ((ampdu_cnt[10]) & MT_DBG_MIB_M0DR5_TRX_AGG_RANGE6_CNT_MASK) * 100 / total_ampdu,
4262+ FIELD_GET(MT_DBG_MIB_M0DR5_TRX_AGG_RANGE7_CNT_MASK, ampdu_cnt[10]) * 100 / total_ampdu);
4263+ }
4264+
4265+ return 0;
4266+}
4267+
4268+static int mt7915_agginfo_read_band0(struct seq_file *s, void *data)
4269+{
4270+ mt7915_agginfo_read_per_band(s, 0);
4271+ return 0;
4272+}
4273+
4274+static int mt7915_agginfo_read_band1(struct seq_file *s, void *data)
4275+{
4276+ mt7915_agginfo_read_per_band(s, 1);
4277+ return 0;
4278+}
4279+
4280+/*usage: <en> <num> <len>
4281+ en: BIT(16) 0: sw amsdu 1: hw amsdu
4282+ num: GENMASK(15, 8) range 1-8
4283+ len: GENMASK(7, 0) unit: 256 bytes */
4284+static int mt7915_sta_tx_amsdu_set(void *data, u64 tx_amsdu)
4285+{
4286+/* UWTBL DW 6 */
4287+#define WTBL_AMSDU_LEN_MASK GENMASK(5, 0)
4288+#define WTBL_AMSDU_NUM_MASK GENMASK(8, 6)
4289+#define WTBL_AMSDU_EN_MASK BIT(9)
4290+#define UWTBL_HW_AMSDU_DW 6
4291+
4292+ struct mt7915_dev *dev = data;
4293+ u32 len = FIELD_GET(GENMASK(7, 0), tx_amsdu);
4294+ u32 num = FIELD_GET(GENMASK(15, 8), tx_amsdu);
4295+ u32 uwtbl;
4296+
4297+ mt7915_wtbl_read_raw(dev, dev->wlan_idx, WTBL_TYPE_UMAC,
4298+ UWTBL_HW_AMSDU_DW, 1, &uwtbl);
4299+
4300+ if (len) {
4301+ uwtbl &= ~WTBL_AMSDU_LEN_MASK;
4302+ uwtbl |= FIELD_PREP(WTBL_AMSDU_LEN_MASK, len);
4303+ }
4304+
4305+ uwtbl &= ~WTBL_AMSDU_NUM_MASK;
4306+ uwtbl |= FIELD_PREP(WTBL_AMSDU_NUM_MASK, num);
4307+
4308+ if (tx_amsdu & BIT(16))
4309+ uwtbl |= WTBL_AMSDU_EN_MASK;
4310+
4311+ mt7915_wtbl_write_raw(dev, dev->wlan_idx, WTBL_TYPE_UMAC,
4312+ UWTBL_HW_AMSDU_DW, uwtbl);
4313+
4314+ return 0;
4315+}
4316+
4317+DEFINE_DEBUGFS_ATTRIBUTE(fops_tx_amsdu, NULL,
4318+ mt7915_sta_tx_amsdu_set, "%llx\n");
4319+
4320+static int mt7915_red_enable_set(void *data, u64 en)
4321+{
4322+ struct mt7915_dev *dev = data;
4323+
4324+ return mt7915_mcu_set_red(dev, en);
4325+}
4326+DEFINE_DEBUGFS_ATTRIBUTE(fops_red_en, NULL,
4327+ mt7915_red_enable_set, "%llx\n");
4328+
4329+static int mt7915_red_show_sta_set(void *data, u64 wlan_idx)
4330+{
4331+ struct mt7915_dev *dev = data;
4332+
4333+ mt7915_dbg_mcu_wa_cmd(dev, MCU_WA_PARAM_CMD(SET),
4334+ MCU_WA_PARAM_RED_SHOW_STA,
4335+ wlan_idx, 0, true);
4336+
4337+ return 0;
4338+}
4339+DEFINE_DEBUGFS_ATTRIBUTE(fops_red_show_sta, NULL,
4340+ mt7915_red_show_sta_set, "%llx\n");
4341+
4342+static int mt7915_red_target_dly_set(void *data, u64 delay)
4343+{
4344+ struct mt7915_dev *dev = data;
4345+
4346+ if (delay > 0 && delay <= 32767)
4347+ mt7915_dbg_mcu_wa_cmd(dev, MCU_WA_PARAM_CMD(SET),
4348+ MCU_WA_PARAM_RED_TARGET_DELAY,
4349+ delay, 0, true);
4350+
4351+ return 0;
4352+}
4353+DEFINE_DEBUGFS_ATTRIBUTE(fops_red_target_dly, NULL,
4354+ mt7915_red_target_dly_set, "%llx\n");
4355+
4356+static int
4357+mt7915_txpower_level_set(void *data, u64 val)
4358+{
4359+ struct mt7915_dev *dev = data;
4360+ struct mt7915_phy *ext_phy = mt7915_ext_phy(dev);
4361+ mt7915_mcu_set_txpower_level(&dev->phy, val);
4362+ if (ext_phy)
4363+ mt7915_mcu_set_txpower_level(ext_phy, val);
4364+
4365+ return 0;
4366+}
4367+
4368+DEFINE_DEBUGFS_ATTRIBUTE(fops_txpower_level, NULL,
4369+ mt7915_txpower_level_set, "%lld\n");
4370+
4371+/* usage: echo 0x[arg3][arg2][arg1] > fw_wa_set */
4372+static int
4373+mt7915_wa_set(void *data, u64 val)
4374+{
4375+ struct mt7915_dev *dev = data;
4376+ u32 arg1, arg2, arg3;
4377+
4378+ arg1 = FIELD_GET(GENMASK_ULL(7, 0), val);
4379+ arg2 = FIELD_GET(GENMASK_ULL(15, 8), val);
4380+ arg3 = FIELD_GET(GENMASK_ULL(23, 16), val);
4381+
4382+ mt7915_dbg_mcu_wa_cmd(dev, MCU_WA_PARAM_CMD(SET), arg1, arg2, arg3, false);
4383+
4384+ return 0;
4385+}
4386+
4387+DEFINE_DEBUGFS_ATTRIBUTE(fops_wa_set, NULL, mt7915_wa_set,
4388+ "0x%llx\n");
4389+/* usage: echo 0x[arg3][arg2][arg1] > fw_wa_query */
4390+static int
4391+mt7915_wa_query(void *data, u64 val)
4392+{
4393+ struct mt7915_dev *dev = data;
4394+ u32 arg1, arg2, arg3;
4395+
4396+ arg1 = FIELD_GET(GENMASK_ULL(7, 0), val);
4397+ arg2 = FIELD_GET(GENMASK_ULL(15, 8), val);
4398+ arg3 = FIELD_GET(GENMASK_ULL(23, 16), val);
4399+
4400+ mt7915_dbg_mcu_wa_cmd(dev, MCU_WA_PARAM_CMD(QUERY), arg1, arg2, arg3, false);
4401+
4402+ return 0;
4403+}
4404+
4405+DEFINE_DEBUGFS_ATTRIBUTE(fops_wa_query, NULL, mt7915_wa_query,
4406+ "0x%llx\n");
4407+/* set wa debug level
4408+ usage:
4409+ echo 0x[arg] > fw_wa_debug
4410+ bit0 : DEBUG_WIFI_TX
4411+ bit1 : DEBUG_CMD_EVENT
4412+ bit2 : DEBUG_RED
4413+ bit3 : DEBUG_WARN
4414+ bit4 : DEBUG_WIFI_RX
4415+ bit5 : DEBUG_TIME_STAMP
4416+ bit6 : DEBUG_TX_FREE_DONE_EVENT
4417+ bit12 : DEBUG_WIFI_TXD */
4418+static int
4419+mt7915_wa_debug(void *data, u64 val)
4420+{
4421+ struct mt7915_dev *dev = data;
4422+ u32 arg;
4423+
4424+ arg = FIELD_GET(GENMASK_ULL(15, 0), val);
4425+
4426+ mt7915_dbg_mcu_wa_cmd(dev, MCU_WA_PARAM_CMD(DEBUG), arg, 0, 0, false);
4427+
4428+ return 0;
4429+}
4430+
4431+DEFINE_DEBUGFS_ATTRIBUTE(fops_wa_debug, NULL, mt7915_wa_debug,
4432+ "0x%llx\n");
4433+
4434+int mt7915_mtk_init_debugfs(struct mt7915_phy *phy, struct dentry *dir)
4435+{
4436+ struct mt7915_dev *dev = phy->dev;
4437+ u32 device_id = (dev->mt76.rev) >> 16;
4438+ int i = 0;
4439+
4440+ for (i = 0; i < ARRAY_SIZE(dbg_reg_s); i++) {
4441+ if (device_id == dbg_reg_s[i].id) {
4442+ dev->dbg_reg = &dbg_reg_s[i];
4443+ break;
4444+ }
4445+ }
4446+
4447+ mt7915_mcu_fw_log_2_host(dev, MCU_FW_LOG_WM, 0);
4448+
4449+ debugfs_create_file("fw_debug_module", 0600, dir, dev,
4450+ &fops_fw_debug_module);
4451+ debugfs_create_file("fw_debug_level", 0600, dir, dev,
4452+ &fops_fw_debug_level);
4453+
4454+ debugfs_create_devm_seqfile(dev->mt76.dev, "wtbl_info", dir,
4455+ mt7915_wtbl_read);
4456+ debugfs_create_devm_seqfile(dev->mt76.dev, "uwtbl_info", dir,
4457+ mt7915_uwtbl_read);
4458+
4459+ debugfs_create_devm_seqfile(dev->mt76.dev, "tr_info", dir,
4460+ mt7915_trinfo_read);
4461+
4462+ debugfs_create_devm_seqfile(dev->mt76.dev, "drr_info", dir,
4463+ mt7915_drr_info);
4464+
4465+ debugfs_create_devm_seqfile(dev->mt76.dev, "ple_info", dir,
4466+ mt7915_pleinfo_read);
4467+
4468+ debugfs_create_devm_seqfile(dev->mt76.dev, "pse_info", dir,
4469+ mt7915_pseinfo_read);
4470+
4471+ debugfs_create_devm_seqfile(dev->mt76.dev, "mib_info0", dir,
4472+ mt7915_mibinfo_band0);
4473+ debugfs_create_devm_seqfile(dev->mt76.dev, "mib_info1", dir,
4474+ mt7915_mibinfo_band1);
4475+
4476+ debugfs_create_u32("token_idx", 0600, dir, &dev->dbg.token_idx);
4477+ debugfs_create_devm_seqfile(dev->mt76.dev, "token", dir,
4478+ mt7915_token_read);
4479+ debugfs_create_devm_seqfile(dev->mt76.dev, "token_txd", dir,
4480+ mt7915_token_txd_read);
4481+
4482+ debugfs_create_devm_seqfile(dev->mt76.dev, "amsdu_info", dir,
4483+ mt7915_amsduinfo_read);
4484+
4485+ debugfs_create_devm_seqfile(dev->mt76.dev, "agg_info0", dir,
4486+ mt7915_agginfo_read_band0);
4487+ debugfs_create_devm_seqfile(dev->mt76.dev, "agg_info1", dir,
4488+ mt7915_agginfo_read_band1);
4489+
4490+ debugfs_create_file("tx_amsdu", 0600, dir, dev, &fops_tx_amsdu);
4491+
4492+ debugfs_create_file("fw_wa_query", 0600, dir, dev, &fops_wa_query);
4493+ debugfs_create_file("fw_wa_set", 0600, dir, dev, &fops_wa_set);
4494+ debugfs_create_file("fw_wa_debug", 0600, dir, dev, &fops_wa_debug);
4495+
4496+ debugfs_create_file("red_en", 0600, dir, dev,
4497+ &fops_red_en);
4498+ debugfs_create_file("red_show_sta", 0600, dir, dev,
4499+ &fops_red_show_sta);
4500+ debugfs_create_file("red_target_dly", 0600, dir, dev,
4501+ &fops_red_target_dly);
4502+
4503+ debugfs_create_file("txpower_level", 0400, dir, dev,
4504+ &fops_txpower_level);
4505+
4506+ return 0;
4507+}
4508+#endif
4509diff --git a/mt7915/mtk_mcu.c b/mt7915/mtk_mcu.c
4510new file mode 100644
4511index 0000000..145fe78
4512--- /dev/null
4513+++ b/mt7915/mtk_mcu.c
4514@@ -0,0 +1,51 @@
4515+#include <linux/firmware.h>
4516+#include <linux/fs.h>
4517+#include<linux/inet.h>
4518+#include "mt7915.h"
4519+#include "mcu.h"
4520+#include "mac.h"
4521+
4522+int mt7915_mcu_set_txpower_level(struct mt7915_phy *phy, u8 drop_level)
4523+{
4524+ struct mt7915_dev *dev = phy->dev;
4525+ struct mt7915_sku_val {
4526+ u8 format_id;
4527+ u8 val;
4528+ u8 band;
4529+ u8 _rsv;
4530+ } __packed req = {
4531+ .format_id = 1,
4532+ .band = phy->band_idx,
4533+ .val = !!drop_level,
4534+ };
4535+ int ret;
4536+
4537+ ret = mt76_mcu_send_msg(&dev->mt76,
4538+ MCU_EXT_CMD(TX_POWER_FEATURE_CTRL), &req,
4539+ sizeof(req), true);
4540+ if (ret)
4541+ return ret;
4542+
4543+ req.format_id = 2;
4544+ if ((drop_level > 90 && drop_level < 100) || !drop_level)
4545+ req.val = 0;
4546+ else if (drop_level > 60 && drop_level <= 90)
4547+ /* reduce Pwr for 1 dB. */
4548+ req.val = 2;
4549+ else if (drop_level > 30 && drop_level <= 60)
4550+ /* reduce Pwr for 3 dB. */
4551+ req.val = 6;
4552+ else if (drop_level > 15 && drop_level <= 30)
4553+ /* reduce Pwr for 6 dB. */
4554+ req.val = 12;
4555+ else if (drop_level > 9 && drop_level <= 15)
4556+ /* reduce Pwr for 9 dB. */
4557+ req.val = 18;
4558+ else if (drop_level > 0 && drop_level <= 9)
4559+ /* reduce Pwr for 12 dB. */
4560+ req.val = 24;
4561+
4562+ return mt76_mcu_send_msg(&dev->mt76,
4563+ MCU_EXT_CMD(TX_POWER_FEATURE_CTRL), &req,
4564+ sizeof(req), true);
4565+}
4566diff --git a/tools/fwlog.c b/tools/fwlog.c
4567index e5d4a10..58a976a 100644
4568--- a/tools/fwlog.c
4569+++ b/tools/fwlog.c
4570@@ -26,7 +26,7 @@ static const char *debugfs_path(const char *phyname, const char *file)
4571 return path;
4572 }
4573
4574-static int mt76_set_fwlog_en(const char *phyname, bool en)
4575+static int mt76_set_fwlog_en(const char *phyname, bool en, char *val)
4576 {
4577 FILE *f = fopen(debugfs_path(phyname, "fw_debug_bin"), "w");
4578
4579@@ -35,7 +35,13 @@ static int mt76_set_fwlog_en(const char *phyname, bool en)
4580 return 1;
4581 }
4582
4583- fprintf(f, "7");
4584+ if (en && val)
4585+ fprintf(f, "%s", val);
4586+ else if (en)
4587+ fprintf(f, "7");
4588+ else
4589+ fprintf(f, "0");
4590+
4591 fclose(f);
4592
4593 return 0;
4594@@ -76,6 +82,7 @@ static void handle_signal(int sig)
4595
4596 int mt76_fwlog(const char *phyname, int argc, char **argv)
4597 {
4598+#define BUF_SIZE 1504
4599 struct sockaddr_in local = {
4600 .sin_family = AF_INET,
4601 .sin_addr.s_addr = INADDR_ANY,
4602@@ -84,9 +91,9 @@ int mt76_fwlog(const char *phyname, int argc, char **argv)
4603 .sin_family = AF_INET,
4604 .sin_port = htons(55688),
4605 };
4606- char buf[1504];
4607+ char *buf = calloc(BUF_SIZE, sizeof(char));
4608 int ret = 0;
4609- int yes = 1;
4610+ /* int yes = 1; */
4611 int s, fd;
4612
4613 if (argc < 1) {
4614@@ -105,13 +112,13 @@ int mt76_fwlog(const char *phyname, int argc, char **argv)
4615 return 1;
4616 }
4617
4618- setsockopt(s, SOL_SOCKET, SO_BROADCAST, &yes, sizeof(yes));
4619+ /* setsockopt(s, SOL_SOCKET, SO_BROADCAST, &yes, sizeof(yes)); */
4620 if (bind(s, (struct sockaddr *)&local, sizeof(local)) < 0) {
4621 perror("bind");
4622 return 1;
4623 }
4624
4625- if (mt76_set_fwlog_en(phyname, true))
4626+ if (mt76_set_fwlog_en(phyname, true, argv[1]))
4627 return 1;
4628
4629 fd = open(debugfs_path(phyname, "fwlog_data"), O_RDONLY);
4630@@ -145,8 +152,8 @@ int mt76_fwlog(const char *phyname, int argc, char **argv)
4631 if (!r)
4632 continue;
4633
4634- if (len > sizeof(buf)) {
4635- fprintf(stderr, "Length error: %d > %d\n", len, (int)sizeof(buf));
4636+ if (len > BUF_SIZE) {
4637+ fprintf(stderr, "Length error: %d > %d\n", len, BUF_SIZE);
4638 ret = 1;
4639 break;
4640 }
4641@@ -171,7 +178,8 @@ int mt76_fwlog(const char *phyname, int argc, char **argv)
4642 close(fd);
4643
4644 out:
4645- mt76_set_fwlog_en(phyname, false);
4646+ mt76_set_fwlog_en(phyname, false, NULL);
4647+ free(buf);
4648
4649 return ret;
4650 }
4651--
46522.25.1
4653