xref: /linux/drivers/net/wireless/realtek/rtw89/debug.c (revision 073350da0aa2aead9df7927a1c1046ebf5cdd816)
1e3ec7017SPing-Ke Shih // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
2e3ec7017SPing-Ke Shih /* Copyright(c) 2019-2020  Realtek Corporation
3e3ec7017SPing-Ke Shih  */
4e3ec7017SPing-Ke Shih 
515fcb103SJakub Kicinski #include <linux/vmalloc.h>
615fcb103SJakub Kicinski 
7e3ec7017SPing-Ke Shih #include "coex.h"
8e3ec7017SPing-Ke Shih #include "debug.h"
9e3ec7017SPing-Ke Shih #include "fw.h"
10e3ec7017SPing-Ke Shih #include "mac.h"
11e3ec7017SPing-Ke Shih #include "ps.h"
12e3ec7017SPing-Ke Shih #include "reg.h"
13e3ec7017SPing-Ke Shih #include "sar.h"
14e3ec7017SPing-Ke Shih 
15e3ec7017SPing-Ke Shih #ifdef CONFIG_RTW89_DEBUGMSG
16e3ec7017SPing-Ke Shih unsigned int rtw89_debug_mask;
17e3ec7017SPing-Ke Shih EXPORT_SYMBOL(rtw89_debug_mask);
18e3ec7017SPing-Ke Shih module_param_named(debug_mask, rtw89_debug_mask, uint, 0644);
19e3ec7017SPing-Ke Shih MODULE_PARM_DESC(debug_mask, "Debugging mask");
20e3ec7017SPing-Ke Shih #endif
21e3ec7017SPing-Ke Shih 
22e3ec7017SPing-Ke Shih #ifdef CONFIG_RTW89_DEBUGFS
23e3ec7017SPing-Ke Shih struct rtw89_debugfs_priv {
24e3ec7017SPing-Ke Shih 	struct rtw89_dev *rtwdev;
25e3ec7017SPing-Ke Shih 	int (*cb_read)(struct seq_file *m, void *v);
26e3ec7017SPing-Ke Shih 	ssize_t (*cb_write)(struct file *filp, const char __user *buffer,
27e3ec7017SPing-Ke Shih 			    size_t count, loff_t *loff);
28e3ec7017SPing-Ke Shih 	union {
29e3ec7017SPing-Ke Shih 		u32 cb_data;
30e3ec7017SPing-Ke Shih 		struct {
31e3ec7017SPing-Ke Shih 			u32 addr;
32e3ec7017SPing-Ke Shih 			u8 len;
33e3ec7017SPing-Ke Shih 		} read_reg;
34e3ec7017SPing-Ke Shih 		struct {
35e3ec7017SPing-Ke Shih 			u32 addr;
36e3ec7017SPing-Ke Shih 			u32 mask;
37e3ec7017SPing-Ke Shih 			u8 path;
38e3ec7017SPing-Ke Shih 		} read_rf;
39e3ec7017SPing-Ke Shih 		struct {
40e3ec7017SPing-Ke Shih 			u8 ss_dbg:1;
41e3ec7017SPing-Ke Shih 			u8 dle_dbg:1;
42e3ec7017SPing-Ke Shih 			u8 dmac_dbg:1;
43e3ec7017SPing-Ke Shih 			u8 cmac_dbg:1;
44e3ec7017SPing-Ke Shih 			u8 dbg_port:1;
45e3ec7017SPing-Ke Shih 		} dbgpkg_en;
46e3ec7017SPing-Ke Shih 		struct {
47e3ec7017SPing-Ke Shih 			u32 start;
48e3ec7017SPing-Ke Shih 			u32 len;
49e3ec7017SPing-Ke Shih 			u8 sel;
50e3ec7017SPing-Ke Shih 		} mac_mem;
51e3ec7017SPing-Ke Shih 	};
52e3ec7017SPing-Ke Shih };
53e3ec7017SPing-Ke Shih 
54e3ec7017SPing-Ke Shih static int rtw89_debugfs_single_show(struct seq_file *m, void *v)
55e3ec7017SPing-Ke Shih {
56e3ec7017SPing-Ke Shih 	struct rtw89_debugfs_priv *debugfs_priv = m->private;
57e3ec7017SPing-Ke Shih 
58e3ec7017SPing-Ke Shih 	return debugfs_priv->cb_read(m, v);
59e3ec7017SPing-Ke Shih }
60e3ec7017SPing-Ke Shih 
61e3ec7017SPing-Ke Shih static ssize_t rtw89_debugfs_single_write(struct file *filp,
62e3ec7017SPing-Ke Shih 					  const char __user *buffer,
63e3ec7017SPing-Ke Shih 					  size_t count, loff_t *loff)
64e3ec7017SPing-Ke Shih {
65e3ec7017SPing-Ke Shih 	struct rtw89_debugfs_priv *debugfs_priv = filp->private_data;
66e3ec7017SPing-Ke Shih 
67e3ec7017SPing-Ke Shih 	return debugfs_priv->cb_write(filp, buffer, count, loff);
68e3ec7017SPing-Ke Shih }
69e3ec7017SPing-Ke Shih 
70e3ec7017SPing-Ke Shih static ssize_t rtw89_debugfs_seq_file_write(struct file *filp,
71e3ec7017SPing-Ke Shih 					    const char __user *buffer,
72e3ec7017SPing-Ke Shih 					    size_t count, loff_t *loff)
73e3ec7017SPing-Ke Shih {
74e3ec7017SPing-Ke Shih 	struct seq_file *seqpriv = (struct seq_file *)filp->private_data;
75e3ec7017SPing-Ke Shih 	struct rtw89_debugfs_priv *debugfs_priv = seqpriv->private;
76e3ec7017SPing-Ke Shih 
77e3ec7017SPing-Ke Shih 	return debugfs_priv->cb_write(filp, buffer, count, loff);
78e3ec7017SPing-Ke Shih }
79e3ec7017SPing-Ke Shih 
80e3ec7017SPing-Ke Shih static int rtw89_debugfs_single_open(struct inode *inode, struct file *filp)
81e3ec7017SPing-Ke Shih {
82e3ec7017SPing-Ke Shih 	return single_open(filp, rtw89_debugfs_single_show, inode->i_private);
83e3ec7017SPing-Ke Shih }
84e3ec7017SPing-Ke Shih 
85e3ec7017SPing-Ke Shih static int rtw89_debugfs_close(struct inode *inode, struct file *filp)
86e3ec7017SPing-Ke Shih {
87e3ec7017SPing-Ke Shih 	return 0;
88e3ec7017SPing-Ke Shih }
89e3ec7017SPing-Ke Shih 
90e3ec7017SPing-Ke Shih static const struct file_operations file_ops_single_r = {
91e3ec7017SPing-Ke Shih 	.owner = THIS_MODULE,
92e3ec7017SPing-Ke Shih 	.open = rtw89_debugfs_single_open,
93e3ec7017SPing-Ke Shih 	.read = seq_read,
94e3ec7017SPing-Ke Shih 	.llseek = seq_lseek,
95e3ec7017SPing-Ke Shih 	.release = single_release,
96e3ec7017SPing-Ke Shih };
97e3ec7017SPing-Ke Shih 
98e3ec7017SPing-Ke Shih static const struct file_operations file_ops_common_rw = {
99e3ec7017SPing-Ke Shih 	.owner = THIS_MODULE,
100e3ec7017SPing-Ke Shih 	.open = rtw89_debugfs_single_open,
101e3ec7017SPing-Ke Shih 	.release = single_release,
102e3ec7017SPing-Ke Shih 	.read = seq_read,
103e3ec7017SPing-Ke Shih 	.llseek = seq_lseek,
104e3ec7017SPing-Ke Shih 	.write = rtw89_debugfs_seq_file_write,
105e3ec7017SPing-Ke Shih };
106e3ec7017SPing-Ke Shih 
107e3ec7017SPing-Ke Shih static const struct file_operations file_ops_single_w = {
108e3ec7017SPing-Ke Shih 	.owner = THIS_MODULE,
109e3ec7017SPing-Ke Shih 	.write = rtw89_debugfs_single_write,
110e3ec7017SPing-Ke Shih 	.open = simple_open,
111e3ec7017SPing-Ke Shih 	.release = rtw89_debugfs_close,
112e3ec7017SPing-Ke Shih };
113e3ec7017SPing-Ke Shih 
114e3ec7017SPing-Ke Shih static ssize_t
115e3ec7017SPing-Ke Shih rtw89_debug_priv_read_reg_select(struct file *filp,
116e3ec7017SPing-Ke Shih 				 const char __user *user_buf,
117e3ec7017SPing-Ke Shih 				 size_t count, loff_t *loff)
118e3ec7017SPing-Ke Shih {
119e3ec7017SPing-Ke Shih 	struct seq_file *m = (struct seq_file *)filp->private_data;
120e3ec7017SPing-Ke Shih 	struct rtw89_debugfs_priv *debugfs_priv = m->private;
121e3ec7017SPing-Ke Shih 	struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;
122e3ec7017SPing-Ke Shih 	char buf[32];
123e3ec7017SPing-Ke Shih 	size_t buf_size;
124e3ec7017SPing-Ke Shih 	u32 addr, len;
125e3ec7017SPing-Ke Shih 	int num;
126e3ec7017SPing-Ke Shih 
127e3ec7017SPing-Ke Shih 	buf_size = min(count, sizeof(buf) - 1);
128e3ec7017SPing-Ke Shih 	if (copy_from_user(buf, user_buf, buf_size))
129e3ec7017SPing-Ke Shih 		return -EFAULT;
130e3ec7017SPing-Ke Shih 
131e3ec7017SPing-Ke Shih 	buf[buf_size] = '\0';
132e3ec7017SPing-Ke Shih 	num = sscanf(buf, "%x %x", &addr, &len);
133e3ec7017SPing-Ke Shih 	if (num != 2) {
134e3ec7017SPing-Ke Shih 		rtw89_info(rtwdev, "invalid format: <addr> <len>\n");
135e3ec7017SPing-Ke Shih 		return -EINVAL;
136e3ec7017SPing-Ke Shih 	}
137e3ec7017SPing-Ke Shih 
138e3ec7017SPing-Ke Shih 	debugfs_priv->read_reg.addr = addr;
139e3ec7017SPing-Ke Shih 	debugfs_priv->read_reg.len = len;
140e3ec7017SPing-Ke Shih 
141e3ec7017SPing-Ke Shih 	rtw89_info(rtwdev, "select read %d bytes from 0x%08x\n", len, addr);
142e3ec7017SPing-Ke Shih 
143e3ec7017SPing-Ke Shih 	return count;
144e3ec7017SPing-Ke Shih }
145e3ec7017SPing-Ke Shih 
146e3ec7017SPing-Ke Shih static int rtw89_debug_priv_read_reg_get(struct seq_file *m, void *v)
147e3ec7017SPing-Ke Shih {
148e3ec7017SPing-Ke Shih 	struct rtw89_debugfs_priv *debugfs_priv = m->private;
149e3ec7017SPing-Ke Shih 	struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;
150e3ec7017SPing-Ke Shih 	u32 addr, data;
151e3ec7017SPing-Ke Shih 	u8 len;
152e3ec7017SPing-Ke Shih 
153e3ec7017SPing-Ke Shih 	len = debugfs_priv->read_reg.len;
154e3ec7017SPing-Ke Shih 	addr = debugfs_priv->read_reg.addr;
155e3ec7017SPing-Ke Shih 
156e3ec7017SPing-Ke Shih 	switch (len) {
157e3ec7017SPing-Ke Shih 	case 1:
158e3ec7017SPing-Ke Shih 		data = rtw89_read8(rtwdev, addr);
159e3ec7017SPing-Ke Shih 		break;
160e3ec7017SPing-Ke Shih 	case 2:
161e3ec7017SPing-Ke Shih 		data = rtw89_read16(rtwdev, addr);
162e3ec7017SPing-Ke Shih 		break;
163e3ec7017SPing-Ke Shih 	case 4:
164e3ec7017SPing-Ke Shih 		data = rtw89_read32(rtwdev, addr);
165e3ec7017SPing-Ke Shih 		break;
166e3ec7017SPing-Ke Shih 	default:
167e3ec7017SPing-Ke Shih 		rtw89_info(rtwdev, "invalid read reg len %d\n", len);
168e3ec7017SPing-Ke Shih 		return -EINVAL;
169e3ec7017SPing-Ke Shih 	}
170e3ec7017SPing-Ke Shih 
171e3ec7017SPing-Ke Shih 	seq_printf(m, "get %d bytes at 0x%08x=0x%08x\n", len, addr, data);
172e3ec7017SPing-Ke Shih 
173e3ec7017SPing-Ke Shih 	return 0;
174e3ec7017SPing-Ke Shih }
175e3ec7017SPing-Ke Shih 
176e3ec7017SPing-Ke Shih static ssize_t rtw89_debug_priv_write_reg_set(struct file *filp,
177e3ec7017SPing-Ke Shih 					      const char __user *user_buf,
178e3ec7017SPing-Ke Shih 					      size_t count, loff_t *loff)
179e3ec7017SPing-Ke Shih {
180e3ec7017SPing-Ke Shih 	struct rtw89_debugfs_priv *debugfs_priv = filp->private_data;
181e3ec7017SPing-Ke Shih 	struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;
182e3ec7017SPing-Ke Shih 	char buf[32];
183e3ec7017SPing-Ke Shih 	size_t buf_size;
184e3ec7017SPing-Ke Shih 	u32 addr, val, len;
185e3ec7017SPing-Ke Shih 	int num;
186e3ec7017SPing-Ke Shih 
187e3ec7017SPing-Ke Shih 	buf_size = min(count, sizeof(buf) - 1);
188e3ec7017SPing-Ke Shih 	if (copy_from_user(buf, user_buf, buf_size))
189e3ec7017SPing-Ke Shih 		return -EFAULT;
190e3ec7017SPing-Ke Shih 
191e3ec7017SPing-Ke Shih 	buf[buf_size] = '\0';
192e3ec7017SPing-Ke Shih 	num = sscanf(buf, "%x %x %x", &addr, &val, &len);
193e3ec7017SPing-Ke Shih 	if (num !=  3) {
194e3ec7017SPing-Ke Shih 		rtw89_info(rtwdev, "invalid format: <addr> <val> <len>\n");
195e3ec7017SPing-Ke Shih 		return -EINVAL;
196e3ec7017SPing-Ke Shih 	}
197e3ec7017SPing-Ke Shih 
198e3ec7017SPing-Ke Shih 	switch (len) {
199e3ec7017SPing-Ke Shih 	case 1:
200e3ec7017SPing-Ke Shih 		rtw89_info(rtwdev, "reg write8 0x%08x: 0x%02x\n", addr, val);
201e3ec7017SPing-Ke Shih 		rtw89_write8(rtwdev, addr, (u8)val);
202e3ec7017SPing-Ke Shih 		break;
203e3ec7017SPing-Ke Shih 	case 2:
204e3ec7017SPing-Ke Shih 		rtw89_info(rtwdev, "reg write16 0x%08x: 0x%04x\n", addr, val);
205e3ec7017SPing-Ke Shih 		rtw89_write16(rtwdev, addr, (u16)val);
206e3ec7017SPing-Ke Shih 		break;
207e3ec7017SPing-Ke Shih 	case 4:
208e3ec7017SPing-Ke Shih 		rtw89_info(rtwdev, "reg write32 0x%08x: 0x%08x\n", addr, val);
209e3ec7017SPing-Ke Shih 		rtw89_write32(rtwdev, addr, (u32)val);
210e3ec7017SPing-Ke Shih 		break;
211e3ec7017SPing-Ke Shih 	default:
212e3ec7017SPing-Ke Shih 		rtw89_info(rtwdev, "invalid read write len %d\n", len);
213e3ec7017SPing-Ke Shih 		break;
214e3ec7017SPing-Ke Shih 	}
215e3ec7017SPing-Ke Shih 
216e3ec7017SPing-Ke Shih 	return count;
217e3ec7017SPing-Ke Shih }
218e3ec7017SPing-Ke Shih 
219e3ec7017SPing-Ke Shih static ssize_t
220e3ec7017SPing-Ke Shih rtw89_debug_priv_read_rf_select(struct file *filp,
221e3ec7017SPing-Ke Shih 				const char __user *user_buf,
222e3ec7017SPing-Ke Shih 				size_t count, loff_t *loff)
223e3ec7017SPing-Ke Shih {
224e3ec7017SPing-Ke Shih 	struct seq_file *m = (struct seq_file *)filp->private_data;
225e3ec7017SPing-Ke Shih 	struct rtw89_debugfs_priv *debugfs_priv = m->private;
226e3ec7017SPing-Ke Shih 	struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;
227e3ec7017SPing-Ke Shih 	char buf[32];
228e3ec7017SPing-Ke Shih 	size_t buf_size;
229e3ec7017SPing-Ke Shih 	u32 addr, mask;
230e3ec7017SPing-Ke Shih 	u8 path;
231e3ec7017SPing-Ke Shih 	int num;
232e3ec7017SPing-Ke Shih 
233e3ec7017SPing-Ke Shih 	buf_size = min(count, sizeof(buf) - 1);
234e3ec7017SPing-Ke Shih 	if (copy_from_user(buf, user_buf, buf_size))
235e3ec7017SPing-Ke Shih 		return -EFAULT;
236e3ec7017SPing-Ke Shih 
237e3ec7017SPing-Ke Shih 	buf[buf_size] = '\0';
238e3ec7017SPing-Ke Shih 	num = sscanf(buf, "%hhd %x %x", &path, &addr, &mask);
239e3ec7017SPing-Ke Shih 	if (num != 3) {
240e3ec7017SPing-Ke Shih 		rtw89_info(rtwdev, "invalid format: <path> <addr> <mask>\n");
241e3ec7017SPing-Ke Shih 		return -EINVAL;
242e3ec7017SPing-Ke Shih 	}
243e3ec7017SPing-Ke Shih 
244e3ec7017SPing-Ke Shih 	if (path >= rtwdev->chip->rf_path_num) {
245e3ec7017SPing-Ke Shih 		rtw89_info(rtwdev, "wrong rf path\n");
246e3ec7017SPing-Ke Shih 		return -EINVAL;
247e3ec7017SPing-Ke Shih 	}
248e3ec7017SPing-Ke Shih 	debugfs_priv->read_rf.addr = addr;
249e3ec7017SPing-Ke Shih 	debugfs_priv->read_rf.mask = mask;
250e3ec7017SPing-Ke Shih 	debugfs_priv->read_rf.path = path;
251e3ec7017SPing-Ke Shih 
252e3ec7017SPing-Ke Shih 	rtw89_info(rtwdev, "select read rf path %d from 0x%08x\n", path, addr);
253e3ec7017SPing-Ke Shih 
254e3ec7017SPing-Ke Shih 	return count;
255e3ec7017SPing-Ke Shih }
256e3ec7017SPing-Ke Shih 
257e3ec7017SPing-Ke Shih static int rtw89_debug_priv_read_rf_get(struct seq_file *m, void *v)
258e3ec7017SPing-Ke Shih {
259e3ec7017SPing-Ke Shih 	struct rtw89_debugfs_priv *debugfs_priv = m->private;
260e3ec7017SPing-Ke Shih 	struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;
261e3ec7017SPing-Ke Shih 	u32 addr, data, mask;
262e3ec7017SPing-Ke Shih 	u8 path;
263e3ec7017SPing-Ke Shih 
264e3ec7017SPing-Ke Shih 	addr = debugfs_priv->read_rf.addr;
265e3ec7017SPing-Ke Shih 	mask = debugfs_priv->read_rf.mask;
266e3ec7017SPing-Ke Shih 	path = debugfs_priv->read_rf.path;
267e3ec7017SPing-Ke Shih 
268e3ec7017SPing-Ke Shih 	data = rtw89_read_rf(rtwdev, path, addr, mask);
269e3ec7017SPing-Ke Shih 
270e3ec7017SPing-Ke Shih 	seq_printf(m, "path %d, rf register 0x%08x=0x%08x\n", path, addr, data);
271e3ec7017SPing-Ke Shih 
272e3ec7017SPing-Ke Shih 	return 0;
273e3ec7017SPing-Ke Shih }
274e3ec7017SPing-Ke Shih 
275e3ec7017SPing-Ke Shih static ssize_t rtw89_debug_priv_write_rf_set(struct file *filp,
276e3ec7017SPing-Ke Shih 					     const char __user *user_buf,
277e3ec7017SPing-Ke Shih 					     size_t count, loff_t *loff)
278e3ec7017SPing-Ke Shih {
279e3ec7017SPing-Ke Shih 	struct rtw89_debugfs_priv *debugfs_priv = filp->private_data;
280e3ec7017SPing-Ke Shih 	struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;
281e3ec7017SPing-Ke Shih 	char buf[32];
282e3ec7017SPing-Ke Shih 	size_t buf_size;
283e3ec7017SPing-Ke Shih 	u32 addr, val, mask;
284e3ec7017SPing-Ke Shih 	u8 path;
285e3ec7017SPing-Ke Shih 	int num;
286e3ec7017SPing-Ke Shih 
287e3ec7017SPing-Ke Shih 	buf_size = min(count, sizeof(buf) - 1);
288e3ec7017SPing-Ke Shih 	if (copy_from_user(buf, user_buf, buf_size))
289e3ec7017SPing-Ke Shih 		return -EFAULT;
290e3ec7017SPing-Ke Shih 
291e3ec7017SPing-Ke Shih 	buf[buf_size] = '\0';
292e3ec7017SPing-Ke Shih 	num = sscanf(buf, "%hhd %x %x %x", &path, &addr, &mask, &val);
293e3ec7017SPing-Ke Shih 	if (num != 4) {
294e3ec7017SPing-Ke Shih 		rtw89_info(rtwdev, "invalid format: <path> <addr> <mask> <val>\n");
295e3ec7017SPing-Ke Shih 		return -EINVAL;
296e3ec7017SPing-Ke Shih 	}
297e3ec7017SPing-Ke Shih 
298e3ec7017SPing-Ke Shih 	if (path >= rtwdev->chip->rf_path_num) {
299e3ec7017SPing-Ke Shih 		rtw89_info(rtwdev, "wrong rf path\n");
300e3ec7017SPing-Ke Shih 		return -EINVAL;
301e3ec7017SPing-Ke Shih 	}
302e3ec7017SPing-Ke Shih 
303e3ec7017SPing-Ke Shih 	rtw89_info(rtwdev, "path %d, rf register write 0x%08x=0x%08x (mask = 0x%08x)\n",
304e3ec7017SPing-Ke Shih 		   path, addr, val, mask);
305e3ec7017SPing-Ke Shih 	rtw89_write_rf(rtwdev, path, addr, mask, val);
306e3ec7017SPing-Ke Shih 
307e3ec7017SPing-Ke Shih 	return count;
308e3ec7017SPing-Ke Shih }
309e3ec7017SPing-Ke Shih 
310e3ec7017SPing-Ke Shih static int rtw89_debug_priv_rf_reg_dump_get(struct seq_file *m, void *v)
311e3ec7017SPing-Ke Shih {
312e3ec7017SPing-Ke Shih 	struct rtw89_debugfs_priv *debugfs_priv = m->private;
313e3ec7017SPing-Ke Shih 	struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;
314e3ec7017SPing-Ke Shih 	const struct rtw89_chip_info *chip = rtwdev->chip;
315e3ec7017SPing-Ke Shih 	u32 addr, offset, data;
316e3ec7017SPing-Ke Shih 	u8 path;
317e3ec7017SPing-Ke Shih 
318e3ec7017SPing-Ke Shih 	for (path = 0; path < chip->rf_path_num; path++) {
319e3ec7017SPing-Ke Shih 		seq_printf(m, "RF path %d:\n\n", path);
320e3ec7017SPing-Ke Shih 		for (addr = 0; addr < 0x100; addr += 4) {
321e3ec7017SPing-Ke Shih 			seq_printf(m, "0x%08x: ", addr);
322e3ec7017SPing-Ke Shih 			for (offset = 0; offset < 4; offset++) {
323e3ec7017SPing-Ke Shih 				data = rtw89_read_rf(rtwdev, path,
324e3ec7017SPing-Ke Shih 						     addr + offset, RFREG_MASK);
325e3ec7017SPing-Ke Shih 				seq_printf(m, "0x%05x  ", data);
326e3ec7017SPing-Ke Shih 			}
327e3ec7017SPing-Ke Shih 			seq_puts(m, "\n");
328e3ec7017SPing-Ke Shih 		}
329e3ec7017SPing-Ke Shih 		seq_puts(m, "\n");
330e3ec7017SPing-Ke Shih 	}
331e3ec7017SPing-Ke Shih 
332e3ec7017SPing-Ke Shih 	return 0;
333e3ec7017SPing-Ke Shih }
334e3ec7017SPing-Ke Shih 
335e3ec7017SPing-Ke Shih struct txpwr_ent {
336e3ec7017SPing-Ke Shih 	const char *txt;
337e3ec7017SPing-Ke Shih 	u8 len;
338e3ec7017SPing-Ke Shih };
339e3ec7017SPing-Ke Shih 
340e3ec7017SPing-Ke Shih struct txpwr_map {
341e3ec7017SPing-Ke Shih 	const struct txpwr_ent *ent;
342e3ec7017SPing-Ke Shih 	u8 size;
343e3ec7017SPing-Ke Shih 	u32 addr_from;
344e3ec7017SPing-Ke Shih 	u32 addr_to;
345e3ec7017SPing-Ke Shih };
346e3ec7017SPing-Ke Shih 
347e3ec7017SPing-Ke Shih #define __GEN_TXPWR_ENT2(_t, _e0, _e1) \
348e3ec7017SPing-Ke Shih 	{ .len = 2, .txt = _t "\t-  " _e0 "  " _e1 }
349e3ec7017SPing-Ke Shih 
350e3ec7017SPing-Ke Shih #define __GEN_TXPWR_ENT4(_t, _e0, _e1, _e2, _e3) \
351e3ec7017SPing-Ke Shih 	{ .len = 4, .txt = _t "\t-  " _e0 "  " _e1 "  " _e2 "  " _e3 }
352e3ec7017SPing-Ke Shih 
353e3ec7017SPing-Ke Shih #define __GEN_TXPWR_ENT8(_t, _e0, _e1, _e2, _e3, _e4, _e5, _e6, _e7) \
354e3ec7017SPing-Ke Shih 	{ .len = 8, .txt = _t "\t-  " \
355e3ec7017SPing-Ke Shih 	  _e0 "  " _e1 "  " _e2 "  " _e3 "  " \
356e3ec7017SPing-Ke Shih 	  _e4 "  " _e5 "  " _e6 "  " _e7 }
357e3ec7017SPing-Ke Shih 
358e3ec7017SPing-Ke Shih static const struct txpwr_ent __txpwr_ent_byr[] = {
359e3ec7017SPing-Ke Shih 	__GEN_TXPWR_ENT4("CCK       ", "1M   ", "2M   ", "5.5M ", "11M  "),
360e3ec7017SPing-Ke Shih 	__GEN_TXPWR_ENT4("LEGACY    ", "6M   ", "9M   ", "12M  ", "18M  "),
361e3ec7017SPing-Ke Shih 	__GEN_TXPWR_ENT4("LEGACY    ", "24M  ", "36M  ", "48M  ", "54M  "),
362e3ec7017SPing-Ke Shih 	/* 1NSS */
363e3ec7017SPing-Ke Shih 	__GEN_TXPWR_ENT4("MCS_1NSS  ", "MCS0 ", "MCS1 ", "MCS2 ", "MCS3 "),
364e3ec7017SPing-Ke Shih 	__GEN_TXPWR_ENT4("MCS_1NSS  ", "MCS4 ", "MCS5 ", "MCS6 ", "MCS7 "),
365e3ec7017SPing-Ke Shih 	__GEN_TXPWR_ENT4("MCS_1NSS  ", "MCS8 ", "MCS9 ", "MCS10", "MCS11"),
366e3ec7017SPing-Ke Shih 	__GEN_TXPWR_ENT4("HEDCM_1NSS", "MCS0 ", "MCS1 ", "MCS3 ", "MCS4 "),
367e3ec7017SPing-Ke Shih 	/* 2NSS */
368e3ec7017SPing-Ke Shih 	__GEN_TXPWR_ENT4("MCS_2NSS  ", "MCS0 ", "MCS1 ", "MCS2 ", "MCS3 "),
369e3ec7017SPing-Ke Shih 	__GEN_TXPWR_ENT4("MCS_2NSS  ", "MCS4 ", "MCS5 ", "MCS6 ", "MCS7 "),
370e3ec7017SPing-Ke Shih 	__GEN_TXPWR_ENT4("MCS_2NSS  ", "MCS8 ", "MCS9 ", "MCS10", "MCS11"),
371e3ec7017SPing-Ke Shih 	__GEN_TXPWR_ENT4("HEDCM_2NSS", "MCS0 ", "MCS1 ", "MCS3 ", "MCS4 "),
372e3ec7017SPing-Ke Shih };
373e3ec7017SPing-Ke Shih 
374e3ec7017SPing-Ke Shih static_assert((ARRAY_SIZE(__txpwr_ent_byr) * 4) ==
375e3ec7017SPing-Ke Shih 	(R_AX_PWR_BY_RATE_MAX - R_AX_PWR_BY_RATE + 4));
376e3ec7017SPing-Ke Shih 
377e3ec7017SPing-Ke Shih static const struct txpwr_map __txpwr_map_byr = {
378e3ec7017SPing-Ke Shih 	.ent = __txpwr_ent_byr,
379e3ec7017SPing-Ke Shih 	.size = ARRAY_SIZE(__txpwr_ent_byr),
380e3ec7017SPing-Ke Shih 	.addr_from = R_AX_PWR_BY_RATE,
381e3ec7017SPing-Ke Shih 	.addr_to = R_AX_PWR_BY_RATE_MAX,
382e3ec7017SPing-Ke Shih };
383e3ec7017SPing-Ke Shih 
384e3ec7017SPing-Ke Shih static const struct txpwr_ent __txpwr_ent_lmt[] = {
385e3ec7017SPing-Ke Shih 	/* 1TX */
386e3ec7017SPing-Ke Shih 	__GEN_TXPWR_ENT2("CCK_1TX_20M    ", "NON_BF", "BF"),
387e3ec7017SPing-Ke Shih 	__GEN_TXPWR_ENT2("CCK_1TX_40M    ", "NON_BF", "BF"),
388e3ec7017SPing-Ke Shih 	__GEN_TXPWR_ENT2("OFDM_1TX       ", "NON_BF", "BF"),
389e3ec7017SPing-Ke Shih 	__GEN_TXPWR_ENT2("MCS_1TX_20M_0  ", "NON_BF", "BF"),
390e3ec7017SPing-Ke Shih 	__GEN_TXPWR_ENT2("MCS_1TX_20M_1  ", "NON_BF", "BF"),
391e3ec7017SPing-Ke Shih 	__GEN_TXPWR_ENT2("MCS_1TX_20M_2  ", "NON_BF", "BF"),
392e3ec7017SPing-Ke Shih 	__GEN_TXPWR_ENT2("MCS_1TX_20M_3  ", "NON_BF", "BF"),
393e3ec7017SPing-Ke Shih 	__GEN_TXPWR_ENT2("MCS_1TX_20M_4  ", "NON_BF", "BF"),
394e3ec7017SPing-Ke Shih 	__GEN_TXPWR_ENT2("MCS_1TX_20M_5  ", "NON_BF", "BF"),
395e3ec7017SPing-Ke Shih 	__GEN_TXPWR_ENT2("MCS_1TX_20M_6  ", "NON_BF", "BF"),
396e3ec7017SPing-Ke Shih 	__GEN_TXPWR_ENT2("MCS_1TX_20M_7  ", "NON_BF", "BF"),
397e3ec7017SPing-Ke Shih 	__GEN_TXPWR_ENT2("MCS_1TX_40M_0  ", "NON_BF", "BF"),
398e3ec7017SPing-Ke Shih 	__GEN_TXPWR_ENT2("MCS_1TX_40M_1  ", "NON_BF", "BF"),
399e3ec7017SPing-Ke Shih 	__GEN_TXPWR_ENT2("MCS_1TX_40M_2  ", "NON_BF", "BF"),
400e3ec7017SPing-Ke Shih 	__GEN_TXPWR_ENT2("MCS_1TX_40M_3  ", "NON_BF", "BF"),
401e3ec7017SPing-Ke Shih 	__GEN_TXPWR_ENT2("MCS_1TX_80M_0  ", "NON_BF", "BF"),
402e3ec7017SPing-Ke Shih 	__GEN_TXPWR_ENT2("MCS_1TX_80M_1  ", "NON_BF", "BF"),
403e3ec7017SPing-Ke Shih 	__GEN_TXPWR_ENT2("MCS_1TX_160M   ", "NON_BF", "BF"),
404e3ec7017SPing-Ke Shih 	__GEN_TXPWR_ENT2("MCS_1TX_40M_0p5", "NON_BF", "BF"),
405e3ec7017SPing-Ke Shih 	__GEN_TXPWR_ENT2("MCS_1TX_40M_2p5", "NON_BF", "BF"),
406e3ec7017SPing-Ke Shih 	/* 2TX */
407e3ec7017SPing-Ke Shih 	__GEN_TXPWR_ENT2("CCK_2TX_20M    ", "NON_BF", "BF"),
408e3ec7017SPing-Ke Shih 	__GEN_TXPWR_ENT2("CCK_2TX_40M    ", "NON_BF", "BF"),
409e3ec7017SPing-Ke Shih 	__GEN_TXPWR_ENT2("OFDM_2TX       ", "NON_BF", "BF"),
410e3ec7017SPing-Ke Shih 	__GEN_TXPWR_ENT2("MCS_2TX_20M_0  ", "NON_BF", "BF"),
411e3ec7017SPing-Ke Shih 	__GEN_TXPWR_ENT2("MCS_2TX_20M_1  ", "NON_BF", "BF"),
412e3ec7017SPing-Ke Shih 	__GEN_TXPWR_ENT2("MCS_2TX_20M_2  ", "NON_BF", "BF"),
413e3ec7017SPing-Ke Shih 	__GEN_TXPWR_ENT2("MCS_2TX_20M_3  ", "NON_BF", "BF"),
414e3ec7017SPing-Ke Shih 	__GEN_TXPWR_ENT2("MCS_2TX_20M_4  ", "NON_BF", "BF"),
415e3ec7017SPing-Ke Shih 	__GEN_TXPWR_ENT2("MCS_2TX_20M_5  ", "NON_BF", "BF"),
416e3ec7017SPing-Ke Shih 	__GEN_TXPWR_ENT2("MCS_2TX_20M_6  ", "NON_BF", "BF"),
417e3ec7017SPing-Ke Shih 	__GEN_TXPWR_ENT2("MCS_2TX_20M_7  ", "NON_BF", "BF"),
418e3ec7017SPing-Ke Shih 	__GEN_TXPWR_ENT2("MCS_2TX_40M_0  ", "NON_BF", "BF"),
419e3ec7017SPing-Ke Shih 	__GEN_TXPWR_ENT2("MCS_2TX_40M_1  ", "NON_BF", "BF"),
420e3ec7017SPing-Ke Shih 	__GEN_TXPWR_ENT2("MCS_2TX_40M_2  ", "NON_BF", "BF"),
421e3ec7017SPing-Ke Shih 	__GEN_TXPWR_ENT2("MCS_2TX_40M_3  ", "NON_BF", "BF"),
422e3ec7017SPing-Ke Shih 	__GEN_TXPWR_ENT2("MCS_2TX_80M_0  ", "NON_BF", "BF"),
423e3ec7017SPing-Ke Shih 	__GEN_TXPWR_ENT2("MCS_2TX_80M_1  ", "NON_BF", "BF"),
424e3ec7017SPing-Ke Shih 	__GEN_TXPWR_ENT2("MCS_2TX_160M   ", "NON_BF", "BF"),
425e3ec7017SPing-Ke Shih 	__GEN_TXPWR_ENT2("MCS_2TX_40M_0p5", "NON_BF", "BF"),
426e3ec7017SPing-Ke Shih 	__GEN_TXPWR_ENT2("MCS_2TX_40M_2p5", "NON_BF", "BF"),
427e3ec7017SPing-Ke Shih };
428e3ec7017SPing-Ke Shih 
429e3ec7017SPing-Ke Shih static_assert((ARRAY_SIZE(__txpwr_ent_lmt) * 2) ==
430e3ec7017SPing-Ke Shih 	(R_AX_PWR_LMT_MAX - R_AX_PWR_LMT + 4));
431e3ec7017SPing-Ke Shih 
432e3ec7017SPing-Ke Shih static const struct txpwr_map __txpwr_map_lmt = {
433e3ec7017SPing-Ke Shih 	.ent = __txpwr_ent_lmt,
434e3ec7017SPing-Ke Shih 	.size = ARRAY_SIZE(__txpwr_ent_lmt),
435e3ec7017SPing-Ke Shih 	.addr_from = R_AX_PWR_LMT,
436e3ec7017SPing-Ke Shih 	.addr_to = R_AX_PWR_LMT_MAX,
437e3ec7017SPing-Ke Shih };
438e3ec7017SPing-Ke Shih 
439e3ec7017SPing-Ke Shih static const struct txpwr_ent __txpwr_ent_lmt_ru[] = {
440e3ec7017SPing-Ke Shih 	/* 1TX */
441e3ec7017SPing-Ke Shih 	__GEN_TXPWR_ENT8("1TX", "RU26__0", "RU26__1", "RU26__2", "RU26__3",
442e3ec7017SPing-Ke Shih 			 "RU26__4", "RU26__5", "RU26__6", "RU26__7"),
443e3ec7017SPing-Ke Shih 	__GEN_TXPWR_ENT8("1TX", "RU52__0", "RU52__1", "RU52__2", "RU52__3",
444e3ec7017SPing-Ke Shih 			 "RU52__4", "RU52__5", "RU52__6", "RU52__7"),
445e3ec7017SPing-Ke Shih 	__GEN_TXPWR_ENT8("1TX", "RU106_0", "RU106_1", "RU106_2", "RU106_3",
446e3ec7017SPing-Ke Shih 			 "RU106_4", "RU106_5", "RU106_6", "RU106_7"),
447e3ec7017SPing-Ke Shih 	/* 2TX */
448e3ec7017SPing-Ke Shih 	__GEN_TXPWR_ENT8("2TX", "RU26__0", "RU26__1", "RU26__2", "RU26__3",
449e3ec7017SPing-Ke Shih 			 "RU26__4", "RU26__5", "RU26__6", "RU26__7"),
450e3ec7017SPing-Ke Shih 	__GEN_TXPWR_ENT8("2TX", "RU52__0", "RU52__1", "RU52__2", "RU52__3",
451e3ec7017SPing-Ke Shih 			 "RU52__4", "RU52__5", "RU52__6", "RU52__7"),
452e3ec7017SPing-Ke Shih 	__GEN_TXPWR_ENT8("2TX", "RU106_0", "RU106_1", "RU106_2", "RU106_3",
453e3ec7017SPing-Ke Shih 			 "RU106_4", "RU106_5", "RU106_6", "RU106_7"),
454e3ec7017SPing-Ke Shih };
455e3ec7017SPing-Ke Shih 
456e3ec7017SPing-Ke Shih static_assert((ARRAY_SIZE(__txpwr_ent_lmt_ru) * 8) ==
457e3ec7017SPing-Ke Shih 	(R_AX_PWR_RU_LMT_MAX - R_AX_PWR_RU_LMT + 4));
458e3ec7017SPing-Ke Shih 
459e3ec7017SPing-Ke Shih static const struct txpwr_map __txpwr_map_lmt_ru = {
460e3ec7017SPing-Ke Shih 	.ent = __txpwr_ent_lmt_ru,
461e3ec7017SPing-Ke Shih 	.size = ARRAY_SIZE(__txpwr_ent_lmt_ru),
462e3ec7017SPing-Ke Shih 	.addr_from = R_AX_PWR_RU_LMT,
463e3ec7017SPing-Ke Shih 	.addr_to = R_AX_PWR_RU_LMT_MAX,
464e3ec7017SPing-Ke Shih };
465e3ec7017SPing-Ke Shih 
466e3ec7017SPing-Ke Shih static u8 __print_txpwr_ent(struct seq_file *m, const struct txpwr_ent *ent,
467e3ec7017SPing-Ke Shih 			    const u8 *buf, const u8 cur)
468e3ec7017SPing-Ke Shih {
469e3ec7017SPing-Ke Shih 	char *fmt;
470e3ec7017SPing-Ke Shih 
471e3ec7017SPing-Ke Shih 	switch (ent->len) {
472e3ec7017SPing-Ke Shih 	case 2:
473e3ec7017SPing-Ke Shih 		fmt = "%s\t| %3d, %3d,\tdBm\n";
474e3ec7017SPing-Ke Shih 		seq_printf(m, fmt, ent->txt, buf[cur], buf[cur + 1]);
475e3ec7017SPing-Ke Shih 		return 2;
476e3ec7017SPing-Ke Shih 	case 4:
477e3ec7017SPing-Ke Shih 		fmt = "%s\t| %3d, %3d, %3d, %3d,\tdBm\n";
478e3ec7017SPing-Ke Shih 		seq_printf(m, fmt, ent->txt, buf[cur], buf[cur + 1],
479e3ec7017SPing-Ke Shih 			   buf[cur + 2], buf[cur + 3]);
480e3ec7017SPing-Ke Shih 		return 4;
481e3ec7017SPing-Ke Shih 	case 8:
482e3ec7017SPing-Ke Shih 		fmt = "%s\t| %3d, %3d, %3d, %3d, %3d, %3d, %3d, %3d,\tdBm\n";
483e3ec7017SPing-Ke Shih 		seq_printf(m, fmt, ent->txt, buf[cur], buf[cur + 1],
484e3ec7017SPing-Ke Shih 			   buf[cur + 2], buf[cur + 3], buf[cur + 4],
485e3ec7017SPing-Ke Shih 			   buf[cur + 5], buf[cur + 6], buf[cur + 7]);
486e3ec7017SPing-Ke Shih 		return 8;
487e3ec7017SPing-Ke Shih 	default:
488e3ec7017SPing-Ke Shih 		return 0;
489e3ec7017SPing-Ke Shih 	}
490e3ec7017SPing-Ke Shih }
491e3ec7017SPing-Ke Shih 
492e3ec7017SPing-Ke Shih static int __print_txpwr_map(struct seq_file *m, struct rtw89_dev *rtwdev,
493e3ec7017SPing-Ke Shih 			     const struct txpwr_map *map)
494e3ec7017SPing-Ke Shih {
495e3ec7017SPing-Ke Shih 	u8 fct = rtwdev->chip->txpwr_factor_mac;
496e3ec7017SPing-Ke Shih 	u8 *buf, cur, i;
497e3ec7017SPing-Ke Shih 	u32 val, addr;
498e3ec7017SPing-Ke Shih 	int ret;
499e3ec7017SPing-Ke Shih 
500e3ec7017SPing-Ke Shih 	buf = vzalloc(map->addr_to - map->addr_from + 4);
501e3ec7017SPing-Ke Shih 	if (!buf)
502e3ec7017SPing-Ke Shih 		return -ENOMEM;
503e3ec7017SPing-Ke Shih 
504e3ec7017SPing-Ke Shih 	for (addr = map->addr_from; addr <= map->addr_to; addr += 4) {
505e3ec7017SPing-Ke Shih 		ret = rtw89_mac_txpwr_read32(rtwdev, RTW89_PHY_0, addr, &val);
506e3ec7017SPing-Ke Shih 		if (ret)
507e3ec7017SPing-Ke Shih 			val = MASKDWORD;
508e3ec7017SPing-Ke Shih 
509e3ec7017SPing-Ke Shih 		cur = addr - map->addr_from;
510e3ec7017SPing-Ke Shih 		for (i = 0; i < 4; i++, val >>= 8)
511e3ec7017SPing-Ke Shih 			buf[cur + i] = FIELD_GET(MASKBYTE0, val) >> fct;
512e3ec7017SPing-Ke Shih 	}
513e3ec7017SPing-Ke Shih 
514e3ec7017SPing-Ke Shih 	for (cur = 0, i = 0; i < map->size; i++)
515e3ec7017SPing-Ke Shih 		cur += __print_txpwr_ent(m, &map->ent[i], buf, cur);
516e3ec7017SPing-Ke Shih 
517e3ec7017SPing-Ke Shih 	vfree(buf);
518e3ec7017SPing-Ke Shih 	return 0;
519e3ec7017SPing-Ke Shih }
520e3ec7017SPing-Ke Shih 
521e3ec7017SPing-Ke Shih #define case_REGD(_regd) \
522e3ec7017SPing-Ke Shih 	case RTW89_ ## _regd: \
523e3ec7017SPing-Ke Shih 		seq_puts(m, #_regd "\n"); \
524e3ec7017SPing-Ke Shih 		break
525e3ec7017SPing-Ke Shih 
526e3ec7017SPing-Ke Shih static void __print_regd(struct seq_file *m, struct rtw89_dev *rtwdev)
527e3ec7017SPing-Ke Shih {
528e3ec7017SPing-Ke Shih 	u8 band = rtwdev->hal.current_band_type;
529e3ec7017SPing-Ke Shih 	u8 regd = rtw89_regd_get(rtwdev, band);
530e3ec7017SPing-Ke Shih 
531e3ec7017SPing-Ke Shih 	switch (regd) {
532e3ec7017SPing-Ke Shih 	default:
533e3ec7017SPing-Ke Shih 		seq_printf(m, "UNKNOWN: %d\n", regd);
534e3ec7017SPing-Ke Shih 		break;
535e3ec7017SPing-Ke Shih 	case_REGD(WW);
536e3ec7017SPing-Ke Shih 	case_REGD(ETSI);
537e3ec7017SPing-Ke Shih 	case_REGD(FCC);
538e3ec7017SPing-Ke Shih 	case_REGD(MKK);
539e3ec7017SPing-Ke Shih 	case_REGD(NA);
540e3ec7017SPing-Ke Shih 	case_REGD(IC);
541e3ec7017SPing-Ke Shih 	case_REGD(KCC);
542e3ec7017SPing-Ke Shih 	case_REGD(NCC);
543e3ec7017SPing-Ke Shih 	case_REGD(CHILE);
544e3ec7017SPing-Ke Shih 	case_REGD(ACMA);
545e3ec7017SPing-Ke Shih 	case_REGD(MEXICO);
546e3ec7017SPing-Ke Shih 	case_REGD(UKRAINE);
547e3ec7017SPing-Ke Shih 	case_REGD(CN);
548e3ec7017SPing-Ke Shih 	}
549e3ec7017SPing-Ke Shih }
550e3ec7017SPing-Ke Shih 
551e3ec7017SPing-Ke Shih #undef case_REGD
552e3ec7017SPing-Ke Shih 
553e3ec7017SPing-Ke Shih static int rtw89_debug_priv_txpwr_table_get(struct seq_file *m, void *v)
554e3ec7017SPing-Ke Shih {
555e3ec7017SPing-Ke Shih 	struct rtw89_debugfs_priv *debugfs_priv = m->private;
556e3ec7017SPing-Ke Shih 	struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;
557e3ec7017SPing-Ke Shih 	int ret = 0;
558e3ec7017SPing-Ke Shih 
559e3ec7017SPing-Ke Shih 	mutex_lock(&rtwdev->mutex);
560e3ec7017SPing-Ke Shih 	rtw89_leave_ps_mode(rtwdev);
561e3ec7017SPing-Ke Shih 
562e3ec7017SPing-Ke Shih 	seq_puts(m, "[Regulatory] ");
563e3ec7017SPing-Ke Shih 	__print_regd(m, rtwdev);
564e3ec7017SPing-Ke Shih 
565e3ec7017SPing-Ke Shih 	seq_puts(m, "[SAR]\n");
566e3ec7017SPing-Ke Shih 	rtw89_print_sar(m, rtwdev);
567e3ec7017SPing-Ke Shih 
568e3ec7017SPing-Ke Shih 	seq_puts(m, "\n[TX power byrate]\n");
569e3ec7017SPing-Ke Shih 	ret = __print_txpwr_map(m, rtwdev, &__txpwr_map_byr);
570e3ec7017SPing-Ke Shih 	if (ret)
571e3ec7017SPing-Ke Shih 		goto err;
572e3ec7017SPing-Ke Shih 
573e3ec7017SPing-Ke Shih 	seq_puts(m, "\n[TX power limit]\n");
574e3ec7017SPing-Ke Shih 	ret = __print_txpwr_map(m, rtwdev, &__txpwr_map_lmt);
575e3ec7017SPing-Ke Shih 	if (ret)
576e3ec7017SPing-Ke Shih 		goto err;
577e3ec7017SPing-Ke Shih 
578e3ec7017SPing-Ke Shih 	seq_puts(m, "\n[TX power limit_ru]\n");
579e3ec7017SPing-Ke Shih 	ret = __print_txpwr_map(m, rtwdev, &__txpwr_map_lmt_ru);
580e3ec7017SPing-Ke Shih 	if (ret)
581e3ec7017SPing-Ke Shih 		goto err;
582e3ec7017SPing-Ke Shih 
583e3ec7017SPing-Ke Shih err:
584e3ec7017SPing-Ke Shih 	mutex_unlock(&rtwdev->mutex);
585e3ec7017SPing-Ke Shih 	return ret;
586e3ec7017SPing-Ke Shih }
587e3ec7017SPing-Ke Shih 
588e3ec7017SPing-Ke Shih static ssize_t
589e3ec7017SPing-Ke Shih rtw89_debug_priv_mac_reg_dump_select(struct file *filp,
590e3ec7017SPing-Ke Shih 				     const char __user *user_buf,
591e3ec7017SPing-Ke Shih 				     size_t count, loff_t *loff)
592e3ec7017SPing-Ke Shih {
593e3ec7017SPing-Ke Shih 	struct seq_file *m = (struct seq_file *)filp->private_data;
594e3ec7017SPing-Ke Shih 	struct rtw89_debugfs_priv *debugfs_priv = m->private;
595e3ec7017SPing-Ke Shih 	struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;
596e3ec7017SPing-Ke Shih 	char buf[32];
597e3ec7017SPing-Ke Shih 	size_t buf_size;
598e3ec7017SPing-Ke Shih 	int sel;
599e3ec7017SPing-Ke Shih 	int ret;
600e3ec7017SPing-Ke Shih 
601e3ec7017SPing-Ke Shih 	buf_size = min(count, sizeof(buf) - 1);
602e3ec7017SPing-Ke Shih 	if (copy_from_user(buf, user_buf, buf_size))
603e3ec7017SPing-Ke Shih 		return -EFAULT;
604e3ec7017SPing-Ke Shih 
605e3ec7017SPing-Ke Shih 	buf[buf_size] = '\0';
606e3ec7017SPing-Ke Shih 	ret = kstrtoint(buf, 0, &sel);
607e3ec7017SPing-Ke Shih 	if (ret)
608e3ec7017SPing-Ke Shih 		return ret;
609e3ec7017SPing-Ke Shih 
610e3ec7017SPing-Ke Shih 	if (sel < RTW89_DBG_SEL_MAC_00 || sel > RTW89_DBG_SEL_RFC) {
611e3ec7017SPing-Ke Shih 		rtw89_info(rtwdev, "invalid args: %d\n", sel);
612e3ec7017SPing-Ke Shih 		return -EINVAL;
613e3ec7017SPing-Ke Shih 	}
614e3ec7017SPing-Ke Shih 
615e3ec7017SPing-Ke Shih 	debugfs_priv->cb_data = sel;
616e3ec7017SPing-Ke Shih 	rtw89_info(rtwdev, "select mac page dump %d\n", debugfs_priv->cb_data);
617e3ec7017SPing-Ke Shih 
618e3ec7017SPing-Ke Shih 	return count;
619e3ec7017SPing-Ke Shih }
620e3ec7017SPing-Ke Shih 
621e3ec7017SPing-Ke Shih #define RTW89_MAC_PAGE_SIZE		0x100
622e3ec7017SPing-Ke Shih 
623e3ec7017SPing-Ke Shih static int rtw89_debug_priv_mac_reg_dump_get(struct seq_file *m, void *v)
624e3ec7017SPing-Ke Shih {
625e3ec7017SPing-Ke Shih 	struct rtw89_debugfs_priv *debugfs_priv = m->private;
626e3ec7017SPing-Ke Shih 	struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;
627e3ec7017SPing-Ke Shih 	enum rtw89_debug_mac_reg_sel reg_sel = debugfs_priv->cb_data;
628e3ec7017SPing-Ke Shih 	u32 start, end;
629e3ec7017SPing-Ke Shih 	u32 i, j, k, page;
630e3ec7017SPing-Ke Shih 	u32 val;
631e3ec7017SPing-Ke Shih 
632e3ec7017SPing-Ke Shih 	switch (reg_sel) {
633e3ec7017SPing-Ke Shih 	case RTW89_DBG_SEL_MAC_00:
634e3ec7017SPing-Ke Shih 		seq_puts(m, "Debug selected MAC page 0x00\n");
635e3ec7017SPing-Ke Shih 		start = 0x000;
636e3ec7017SPing-Ke Shih 		end = 0x014;
637e3ec7017SPing-Ke Shih 		break;
638*0b75b35cSPing-Ke Shih 	case RTW89_DBG_SEL_MAC_30:
639*0b75b35cSPing-Ke Shih 		seq_puts(m, "Debug selected MAC page 0x30\n");
640*0b75b35cSPing-Ke Shih 		start = 0x030;
641*0b75b35cSPing-Ke Shih 		end = 0x033;
642*0b75b35cSPing-Ke Shih 		break;
643e3ec7017SPing-Ke Shih 	case RTW89_DBG_SEL_MAC_40:
644e3ec7017SPing-Ke Shih 		seq_puts(m, "Debug selected MAC page 0x40\n");
645e3ec7017SPing-Ke Shih 		start = 0x040;
646e3ec7017SPing-Ke Shih 		end = 0x07f;
647e3ec7017SPing-Ke Shih 		break;
648e3ec7017SPing-Ke Shih 	case RTW89_DBG_SEL_MAC_80:
649e3ec7017SPing-Ke Shih 		seq_puts(m, "Debug selected MAC page 0x80\n");
650e3ec7017SPing-Ke Shih 		start = 0x080;
651e3ec7017SPing-Ke Shih 		end = 0x09f;
652e3ec7017SPing-Ke Shih 		break;
653e3ec7017SPing-Ke Shih 	case RTW89_DBG_SEL_MAC_C0:
654e3ec7017SPing-Ke Shih 		seq_puts(m, "Debug selected MAC page 0xc0\n");
655e3ec7017SPing-Ke Shih 		start = 0x0c0;
656e3ec7017SPing-Ke Shih 		end = 0x0df;
657e3ec7017SPing-Ke Shih 		break;
658e3ec7017SPing-Ke Shih 	case RTW89_DBG_SEL_MAC_E0:
659e3ec7017SPing-Ke Shih 		seq_puts(m, "Debug selected MAC page 0xe0\n");
660e3ec7017SPing-Ke Shih 		start = 0x0e0;
661e3ec7017SPing-Ke Shih 		end = 0x0ff;
662e3ec7017SPing-Ke Shih 		break;
663e3ec7017SPing-Ke Shih 	case RTW89_DBG_SEL_BB:
664e3ec7017SPing-Ke Shih 		seq_puts(m, "Debug selected BB register\n");
665e3ec7017SPing-Ke Shih 		start = 0x100;
666e3ec7017SPing-Ke Shih 		end = 0x17f;
667e3ec7017SPing-Ke Shih 		break;
668e3ec7017SPing-Ke Shih 	case RTW89_DBG_SEL_IQK:
669e3ec7017SPing-Ke Shih 		seq_puts(m, "Debug selected IQK register\n");
670e3ec7017SPing-Ke Shih 		start = 0x180;
671e3ec7017SPing-Ke Shih 		end = 0x1bf;
672e3ec7017SPing-Ke Shih 		break;
673e3ec7017SPing-Ke Shih 	case RTW89_DBG_SEL_RFC:
674e3ec7017SPing-Ke Shih 		seq_puts(m, "Debug selected RFC register\n");
675e3ec7017SPing-Ke Shih 		start = 0x1c0;
676e3ec7017SPing-Ke Shih 		end = 0x1ff;
677e3ec7017SPing-Ke Shih 		break;
678e3ec7017SPing-Ke Shih 	default:
679e3ec7017SPing-Ke Shih 		seq_puts(m, "Selected invalid register page\n");
680e3ec7017SPing-Ke Shih 		return -EINVAL;
681e3ec7017SPing-Ke Shih 	}
682e3ec7017SPing-Ke Shih 
683e3ec7017SPing-Ke Shih 	for (i = start; i <= end; i++) {
684e3ec7017SPing-Ke Shih 		page = i << 8;
685e3ec7017SPing-Ke Shih 		for (j = page; j < page + RTW89_MAC_PAGE_SIZE; j += 16) {
686e3ec7017SPing-Ke Shih 			seq_printf(m, "%08xh : ", 0x18600000 + j);
687e3ec7017SPing-Ke Shih 			for (k = 0; k < 4; k++) {
688e3ec7017SPing-Ke Shih 				val = rtw89_read32(rtwdev, j + (k << 2));
689e3ec7017SPing-Ke Shih 				seq_printf(m, "%08x ", val);
690e3ec7017SPing-Ke Shih 			}
691e3ec7017SPing-Ke Shih 			seq_puts(m, "\n");
692e3ec7017SPing-Ke Shih 		}
693e3ec7017SPing-Ke Shih 	}
694e3ec7017SPing-Ke Shih 
695e3ec7017SPing-Ke Shih 	return 0;
696e3ec7017SPing-Ke Shih }
697e3ec7017SPing-Ke Shih 
698e3ec7017SPing-Ke Shih static ssize_t
699e3ec7017SPing-Ke Shih rtw89_debug_priv_mac_mem_dump_select(struct file *filp,
700e3ec7017SPing-Ke Shih 				     const char __user *user_buf,
701e3ec7017SPing-Ke Shih 				     size_t count, loff_t *loff)
702e3ec7017SPing-Ke Shih {
703e3ec7017SPing-Ke Shih 	struct seq_file *m = (struct seq_file *)filp->private_data;
704e3ec7017SPing-Ke Shih 	struct rtw89_debugfs_priv *debugfs_priv = m->private;
705e3ec7017SPing-Ke Shih 	struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;
706e3ec7017SPing-Ke Shih 	char buf[32];
707e3ec7017SPing-Ke Shih 	size_t buf_size;
708e3ec7017SPing-Ke Shih 	u32 sel, start_addr, len;
709e3ec7017SPing-Ke Shih 	int num;
710e3ec7017SPing-Ke Shih 
711e3ec7017SPing-Ke Shih 	buf_size = min(count, sizeof(buf) - 1);
712e3ec7017SPing-Ke Shih 	if (copy_from_user(buf, user_buf, buf_size))
713e3ec7017SPing-Ke Shih 		return -EFAULT;
714e3ec7017SPing-Ke Shih 
715e3ec7017SPing-Ke Shih 	buf[buf_size] = '\0';
716e3ec7017SPing-Ke Shih 	num = sscanf(buf, "%x %x %x", &sel, &start_addr, &len);
717e3ec7017SPing-Ke Shih 	if (num != 3) {
718e3ec7017SPing-Ke Shih 		rtw89_info(rtwdev, "invalid format: <sel> <start> <len>\n");
719e3ec7017SPing-Ke Shih 		return -EINVAL;
720e3ec7017SPing-Ke Shih 	}
721e3ec7017SPing-Ke Shih 
722e3ec7017SPing-Ke Shih 	debugfs_priv->mac_mem.sel = sel;
723e3ec7017SPing-Ke Shih 	debugfs_priv->mac_mem.start = start_addr;
724e3ec7017SPing-Ke Shih 	debugfs_priv->mac_mem.len = len;
725e3ec7017SPing-Ke Shih 
726e3ec7017SPing-Ke Shih 	rtw89_info(rtwdev, "select mem %d start %d len %d\n",
727e3ec7017SPing-Ke Shih 		   sel, start_addr, len);
728e3ec7017SPing-Ke Shih 
729e3ec7017SPing-Ke Shih 	return count;
730e3ec7017SPing-Ke Shih }
731e3ec7017SPing-Ke Shih 
732e3ec7017SPing-Ke Shih static void rtw89_debug_dump_mac_mem(struct seq_file *m,
733e3ec7017SPing-Ke Shih 				     struct rtw89_dev *rtwdev,
734e3ec7017SPing-Ke Shih 				     u8 sel, u32 start_addr, u32 len)
735e3ec7017SPing-Ke Shih {
736e3ec7017SPing-Ke Shih 	u32 base_addr, start_page, residue;
737e3ec7017SPing-Ke Shih 	u32 i, j, p, pages;
738e3ec7017SPing-Ke Shih 	u32 dump_len, remain;
739e3ec7017SPing-Ke Shih 	u32 val;
740e3ec7017SPing-Ke Shih 
741e3ec7017SPing-Ke Shih 	remain = len;
742e3ec7017SPing-Ke Shih 	pages = len / MAC_MEM_DUMP_PAGE_SIZE + 1;
743e3ec7017SPing-Ke Shih 	start_page = start_addr / MAC_MEM_DUMP_PAGE_SIZE;
744e3ec7017SPing-Ke Shih 	residue = start_addr % MAC_MEM_DUMP_PAGE_SIZE;
745e1400b11SZong-Zhe Yang 	base_addr = rtw89_mac_mem_base_addrs[sel];
746e3ec7017SPing-Ke Shih 	base_addr += start_page * MAC_MEM_DUMP_PAGE_SIZE;
747e3ec7017SPing-Ke Shih 
748e3ec7017SPing-Ke Shih 	for (p = 0; p < pages; p++) {
749e3ec7017SPing-Ke Shih 		dump_len = min_t(u32, remain, MAC_MEM_DUMP_PAGE_SIZE);
750e3ec7017SPing-Ke Shih 		rtw89_write32(rtwdev, R_AX_FILTER_MODEL_ADDR, base_addr);
751e3ec7017SPing-Ke Shih 		for (i = R_AX_INDIR_ACCESS_ENTRY + residue;
752e3ec7017SPing-Ke Shih 		     i < R_AX_INDIR_ACCESS_ENTRY + dump_len;) {
753e3ec7017SPing-Ke Shih 			seq_printf(m, "%08xh:", i);
754e3ec7017SPing-Ke Shih 			for (j = 0;
755e3ec7017SPing-Ke Shih 			     j < 4 && i < R_AX_INDIR_ACCESS_ENTRY + dump_len;
756e3ec7017SPing-Ke Shih 			     j++, i += 4) {
757e3ec7017SPing-Ke Shih 				val = rtw89_read32(rtwdev, i);
758e3ec7017SPing-Ke Shih 				seq_printf(m, "  %08x", val);
759e3ec7017SPing-Ke Shih 				remain -= 4;
760e3ec7017SPing-Ke Shih 			}
761e3ec7017SPing-Ke Shih 			seq_puts(m, "\n");
762e3ec7017SPing-Ke Shih 		}
763e3ec7017SPing-Ke Shih 		base_addr += MAC_MEM_DUMP_PAGE_SIZE;
764e3ec7017SPing-Ke Shih 	}
765e3ec7017SPing-Ke Shih }
766e3ec7017SPing-Ke Shih 
767e3ec7017SPing-Ke Shih static int
768e3ec7017SPing-Ke Shih rtw89_debug_priv_mac_mem_dump_get(struct seq_file *m, void *v)
769e3ec7017SPing-Ke Shih {
770e3ec7017SPing-Ke Shih 	struct rtw89_debugfs_priv *debugfs_priv = m->private;
771e3ec7017SPing-Ke Shih 	struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;
772e3ec7017SPing-Ke Shih 
773e3ec7017SPing-Ke Shih 	mutex_lock(&rtwdev->mutex);
774e3ec7017SPing-Ke Shih 	rtw89_leave_ps_mode(rtwdev);
775e3ec7017SPing-Ke Shih 	rtw89_debug_dump_mac_mem(m, rtwdev,
776e3ec7017SPing-Ke Shih 				 debugfs_priv->mac_mem.sel,
777e3ec7017SPing-Ke Shih 				 debugfs_priv->mac_mem.start,
778e3ec7017SPing-Ke Shih 				 debugfs_priv->mac_mem.len);
779e3ec7017SPing-Ke Shih 	mutex_unlock(&rtwdev->mutex);
780e3ec7017SPing-Ke Shih 
781e3ec7017SPing-Ke Shih 	return 0;
782e3ec7017SPing-Ke Shih }
783e3ec7017SPing-Ke Shih 
784e3ec7017SPing-Ke Shih static ssize_t
785e3ec7017SPing-Ke Shih rtw89_debug_priv_mac_dbg_port_dump_select(struct file *filp,
786e3ec7017SPing-Ke Shih 					  const char __user *user_buf,
787e3ec7017SPing-Ke Shih 					  size_t count, loff_t *loff)
788e3ec7017SPing-Ke Shih {
789e3ec7017SPing-Ke Shih 	struct seq_file *m = (struct seq_file *)filp->private_data;
790e3ec7017SPing-Ke Shih 	struct rtw89_debugfs_priv *debugfs_priv = m->private;
791e3ec7017SPing-Ke Shih 	struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;
792e3ec7017SPing-Ke Shih 	char buf[32];
793e3ec7017SPing-Ke Shih 	size_t buf_size;
794e3ec7017SPing-Ke Shih 	int sel, set;
795e3ec7017SPing-Ke Shih 	int num;
796e3ec7017SPing-Ke Shih 	bool enable;
797e3ec7017SPing-Ke Shih 
798e3ec7017SPing-Ke Shih 	buf_size = min(count, sizeof(buf) - 1);
799e3ec7017SPing-Ke Shih 	if (copy_from_user(buf, user_buf, buf_size))
800e3ec7017SPing-Ke Shih 		return -EFAULT;
801e3ec7017SPing-Ke Shih 
802e3ec7017SPing-Ke Shih 	buf[buf_size] = '\0';
803e3ec7017SPing-Ke Shih 	num = sscanf(buf, "%d %d", &sel, &set);
804e3ec7017SPing-Ke Shih 	if (num != 2) {
805e3ec7017SPing-Ke Shih 		rtw89_info(rtwdev, "invalid format: <sel> <set>\n");
806e3ec7017SPing-Ke Shih 		return -EINVAL;
807e3ec7017SPing-Ke Shih 	}
808e3ec7017SPing-Ke Shih 
8091646ce8fSYe Guojin 	enable = set != 0;
810e3ec7017SPing-Ke Shih 	switch (sel) {
811e3ec7017SPing-Ke Shih 	case 0:
812e3ec7017SPing-Ke Shih 		debugfs_priv->dbgpkg_en.ss_dbg = enable;
813e3ec7017SPing-Ke Shih 		break;
814e3ec7017SPing-Ke Shih 	case 1:
815e3ec7017SPing-Ke Shih 		debugfs_priv->dbgpkg_en.dle_dbg = enable;
816e3ec7017SPing-Ke Shih 		break;
817e3ec7017SPing-Ke Shih 	case 2:
818e3ec7017SPing-Ke Shih 		debugfs_priv->dbgpkg_en.dmac_dbg = enable;
819e3ec7017SPing-Ke Shih 		break;
820e3ec7017SPing-Ke Shih 	case 3:
821e3ec7017SPing-Ke Shih 		debugfs_priv->dbgpkg_en.cmac_dbg = enable;
822e3ec7017SPing-Ke Shih 		break;
823e3ec7017SPing-Ke Shih 	case 4:
824e3ec7017SPing-Ke Shih 		debugfs_priv->dbgpkg_en.dbg_port = enable;
825e3ec7017SPing-Ke Shih 		break;
826e3ec7017SPing-Ke Shih 	default:
827e3ec7017SPing-Ke Shih 		rtw89_info(rtwdev, "invalid args: sel %d set %d\n", sel, set);
828e3ec7017SPing-Ke Shih 		return -EINVAL;
829e3ec7017SPing-Ke Shih 	}
830e3ec7017SPing-Ke Shih 
831e3ec7017SPing-Ke Shih 	rtw89_info(rtwdev, "%s debug port dump %d\n",
832e3ec7017SPing-Ke Shih 		   enable ? "Enable" : "Disable", sel);
833e3ec7017SPing-Ke Shih 
834e3ec7017SPing-Ke Shih 	return count;
835e3ec7017SPing-Ke Shih }
836e3ec7017SPing-Ke Shih 
837e3ec7017SPing-Ke Shih static int rtw89_debug_mac_dump_ss_dbg(struct rtw89_dev *rtwdev,
838e3ec7017SPing-Ke Shih 				       struct seq_file *m)
839e3ec7017SPing-Ke Shih {
840e3ec7017SPing-Ke Shih 	return 0;
841e3ec7017SPing-Ke Shih }
842e3ec7017SPing-Ke Shih 
843e3ec7017SPing-Ke Shih static int rtw89_debug_mac_dump_dle_dbg(struct rtw89_dev *rtwdev,
844e3ec7017SPing-Ke Shih 					struct seq_file *m)
845e3ec7017SPing-Ke Shih {
846e3ec7017SPing-Ke Shih #define DLE_DFI_DUMP(__type, __target, __sel)				\
847e3ec7017SPing-Ke Shih ({									\
848e3ec7017SPing-Ke Shih 	u32 __ctrl;							\
849e3ec7017SPing-Ke Shih 	u32 __reg_ctrl = R_AX_##__type##_DBG_FUN_INTF_CTL;		\
850e3ec7017SPing-Ke Shih 	u32 __reg_data = R_AX_##__type##_DBG_FUN_INTF_DATA;		\
851e3ec7017SPing-Ke Shih 	u32 __data, __val32;						\
852e3ec7017SPing-Ke Shih 	int __ret;							\
853e3ec7017SPing-Ke Shih 									\
854e3ec7017SPing-Ke Shih 	__ctrl = FIELD_PREP(B_AX_##__type##_DFI_TRGSEL_MASK,		\
855e3ec7017SPing-Ke Shih 			    DLE_DFI_TYPE_##__target) |			\
856e3ec7017SPing-Ke Shih 		 FIELD_PREP(B_AX_##__type##_DFI_ADDR_MASK, __sel) |	\
857e3ec7017SPing-Ke Shih 		 B_AX_WDE_DFI_ACTIVE;					\
858e3ec7017SPing-Ke Shih 	rtw89_write32(rtwdev, __reg_ctrl, __ctrl);			\
859e3ec7017SPing-Ke Shih 	__ret = read_poll_timeout(rtw89_read32, __val32,		\
860e3ec7017SPing-Ke Shih 			!(__val32 & B_AX_##__type##_DFI_ACTIVE),	\
861e3ec7017SPing-Ke Shih 			1000, 50000, false,				\
862e3ec7017SPing-Ke Shih 			rtwdev, __reg_ctrl);				\
863e3ec7017SPing-Ke Shih 	if (__ret) {							\
864e3ec7017SPing-Ke Shih 		rtw89_err(rtwdev, "failed to dump DLE %s %s %d\n",	\
865e3ec7017SPing-Ke Shih 			  #__type, #__target, __sel);			\
866e3ec7017SPing-Ke Shih 		return __ret;						\
867e3ec7017SPing-Ke Shih 	}								\
868e3ec7017SPing-Ke Shih 									\
869e3ec7017SPing-Ke Shih 	__data = rtw89_read32(rtwdev, __reg_data);			\
870e3ec7017SPing-Ke Shih 	__data;								\
871e3ec7017SPing-Ke Shih })
872e3ec7017SPing-Ke Shih 
873e3ec7017SPing-Ke Shih #define DLE_DFI_FREE_PAGE_DUMP(__m, __type)				\
874e3ec7017SPing-Ke Shih ({									\
875e3ec7017SPing-Ke Shih 	u32 __freepg, __pubpg;						\
876e3ec7017SPing-Ke Shih 	u32 __freepg_head, __freepg_tail, __pubpg_num;			\
877e3ec7017SPing-Ke Shih 									\
878e3ec7017SPing-Ke Shih 	__freepg = DLE_DFI_DUMP(__type, FREEPG, 0);			\
879e3ec7017SPing-Ke Shih 	__pubpg = DLE_DFI_DUMP(__type, FREEPG, 1);			\
880e3ec7017SPing-Ke Shih 	__freepg_head = FIELD_GET(B_AX_DLE_FREE_HEADPG, __freepg);	\
881e3ec7017SPing-Ke Shih 	__freepg_tail = FIELD_GET(B_AX_DLE_FREE_TAILPG, __freepg);	\
882e3ec7017SPing-Ke Shih 	__pubpg_num = FIELD_GET(B_AX_DLE_PUB_PGNUM, __pubpg);		\
883e3ec7017SPing-Ke Shih 	seq_printf(__m, "[%s] freepg head: %d\n",			\
884e3ec7017SPing-Ke Shih 		   #__type, __freepg_head);				\
885e3ec7017SPing-Ke Shih 	seq_printf(__m, "[%s] freepg tail: %d\n",			\
886e3ec7017SPing-Ke Shih 		   #__type, __freepg_tail);				\
887e3ec7017SPing-Ke Shih 	seq_printf(__m, "[%s] pubpg num  : %d\n",			\
888e3ec7017SPing-Ke Shih 		  #__type, __pubpg_num);				\
889e3ec7017SPing-Ke Shih })
890e3ec7017SPing-Ke Shih 
891e3ec7017SPing-Ke Shih #define case_QUOTA(__m, __type, __id)					\
892e3ec7017SPing-Ke Shih 	case __type##_QTAID_##__id:					\
893e3ec7017SPing-Ke Shih 		val32 = DLE_DFI_DUMP(__type, QUOTA, __type##_QTAID_##__id);	\
894e3ec7017SPing-Ke Shih 		rsv_pgnum = FIELD_GET(B_AX_DLE_RSV_PGNUM, val32);	\
895e3ec7017SPing-Ke Shih 		use_pgnum = FIELD_GET(B_AX_DLE_USE_PGNUM, val32);	\
896e3ec7017SPing-Ke Shih 		seq_printf(__m, "[%s][%s] rsv_pgnum: %d\n",		\
897e3ec7017SPing-Ke Shih 			   #__type, #__id, rsv_pgnum);			\
898e3ec7017SPing-Ke Shih 		seq_printf(__m, "[%s][%s] use_pgnum: %d\n",		\
899e3ec7017SPing-Ke Shih 			   #__type, #__id, use_pgnum);			\
900e3ec7017SPing-Ke Shih 		break
901e3ec7017SPing-Ke Shih 	u32 quota_id;
902e3ec7017SPing-Ke Shih 	u32 val32;
903e3ec7017SPing-Ke Shih 	u16 rsv_pgnum, use_pgnum;
904e3ec7017SPing-Ke Shih 	int ret;
905e3ec7017SPing-Ke Shih 
906e3ec7017SPing-Ke Shih 	ret = rtw89_mac_check_mac_en(rtwdev, 0, RTW89_DMAC_SEL);
907e3ec7017SPing-Ke Shih 	if (ret) {
908e3ec7017SPing-Ke Shih 		seq_puts(m, "[DLE]  : DMAC not enabled\n");
909e3ec7017SPing-Ke Shih 		return ret;
910e3ec7017SPing-Ke Shih 	}
911e3ec7017SPing-Ke Shih 
912e3ec7017SPing-Ke Shih 	DLE_DFI_FREE_PAGE_DUMP(m, WDE);
913e3ec7017SPing-Ke Shih 	DLE_DFI_FREE_PAGE_DUMP(m, PLE);
914e3ec7017SPing-Ke Shih 	for (quota_id = 0; quota_id <= WDE_QTAID_CPUIO; quota_id++) {
915e3ec7017SPing-Ke Shih 		switch (quota_id) {
916e3ec7017SPing-Ke Shih 		case_QUOTA(m, WDE, HOST_IF);
917e3ec7017SPing-Ke Shih 		case_QUOTA(m, WDE, WLAN_CPU);
918e3ec7017SPing-Ke Shih 		case_QUOTA(m, WDE, DATA_CPU);
919e3ec7017SPing-Ke Shih 		case_QUOTA(m, WDE, PKTIN);
920e3ec7017SPing-Ke Shih 		case_QUOTA(m, WDE, CPUIO);
921e3ec7017SPing-Ke Shih 		}
922e3ec7017SPing-Ke Shih 	}
923e3ec7017SPing-Ke Shih 	for (quota_id = 0; quota_id <= PLE_QTAID_CPUIO; quota_id++) {
924e3ec7017SPing-Ke Shih 		switch (quota_id) {
925e3ec7017SPing-Ke Shih 		case_QUOTA(m, PLE, B0_TXPL);
926e3ec7017SPing-Ke Shih 		case_QUOTA(m, PLE, B1_TXPL);
927e3ec7017SPing-Ke Shih 		case_QUOTA(m, PLE, C2H);
928e3ec7017SPing-Ke Shih 		case_QUOTA(m, PLE, H2C);
929e3ec7017SPing-Ke Shih 		case_QUOTA(m, PLE, WLAN_CPU);
930e3ec7017SPing-Ke Shih 		case_QUOTA(m, PLE, MPDU);
931e3ec7017SPing-Ke Shih 		case_QUOTA(m, PLE, CMAC0_RX);
932e3ec7017SPing-Ke Shih 		case_QUOTA(m, PLE, CMAC1_RX);
933e3ec7017SPing-Ke Shih 		case_QUOTA(m, PLE, CMAC1_BBRPT);
934e3ec7017SPing-Ke Shih 		case_QUOTA(m, PLE, WDRLS);
935e3ec7017SPing-Ke Shih 		case_QUOTA(m, PLE, CPUIO);
936e3ec7017SPing-Ke Shih 		}
937e3ec7017SPing-Ke Shih 	}
938e3ec7017SPing-Ke Shih 
939e3ec7017SPing-Ke Shih 	return 0;
940e3ec7017SPing-Ke Shih 
941e3ec7017SPing-Ke Shih #undef case_QUOTA
942e3ec7017SPing-Ke Shih #undef DLE_DFI_DUMP
943e3ec7017SPing-Ke Shih #undef DLE_DFI_FREE_PAGE_DUMP
944e3ec7017SPing-Ke Shih }
945e3ec7017SPing-Ke Shih 
946e3ec7017SPing-Ke Shih static int rtw89_debug_mac_dump_dmac_dbg(struct rtw89_dev *rtwdev,
947e3ec7017SPing-Ke Shih 					 struct seq_file *m)
948e3ec7017SPing-Ke Shih {
949e3ec7017SPing-Ke Shih 	int ret;
950e3ec7017SPing-Ke Shih 
951e3ec7017SPing-Ke Shih 	ret = rtw89_mac_check_mac_en(rtwdev, 0, RTW89_DMAC_SEL);
952e3ec7017SPing-Ke Shih 	if (ret) {
953e3ec7017SPing-Ke Shih 		seq_puts(m, "[DMAC] : DMAC not enabled\n");
954e3ec7017SPing-Ke Shih 		return ret;
955e3ec7017SPing-Ke Shih 	}
956e3ec7017SPing-Ke Shih 
957e3ec7017SPing-Ke Shih 	seq_printf(m, "R_AX_DMAC_ERR_ISR=0x%08x\n",
958e3ec7017SPing-Ke Shih 		   rtw89_read32(rtwdev, R_AX_DMAC_ERR_ISR));
959e3ec7017SPing-Ke Shih 	seq_printf(m, "[0]R_AX_WDRLS_ERR_ISR=0x%08x\n",
960e3ec7017SPing-Ke Shih 		   rtw89_read32(rtwdev, R_AX_WDRLS_ERR_ISR));
961e3ec7017SPing-Ke Shih 	seq_printf(m, "[1]R_AX_SEC_ERR_IMR_ISR=0x%08x\n",
962e3ec7017SPing-Ke Shih 		   rtw89_read32(rtwdev, R_AX_SEC_ERR_IMR_ISR));
963e3ec7017SPing-Ke Shih 	seq_printf(m, "[2.1]R_AX_MPDU_TX_ERR_ISR=0x%08x\n",
964e3ec7017SPing-Ke Shih 		   rtw89_read32(rtwdev, R_AX_MPDU_TX_ERR_ISR));
965e3ec7017SPing-Ke Shih 	seq_printf(m, "[2.2]R_AX_MPDU_RX_ERR_ISR=0x%08x\n",
966e3ec7017SPing-Ke Shih 		   rtw89_read32(rtwdev, R_AX_MPDU_RX_ERR_ISR));
967e3ec7017SPing-Ke Shih 	seq_printf(m, "[3]R_AX_STA_SCHEDULER_ERR_ISR=0x%08x\n",
968e3ec7017SPing-Ke Shih 		   rtw89_read32(rtwdev, R_AX_STA_SCHEDULER_ERR_ISR));
969e3ec7017SPing-Ke Shih 	seq_printf(m, "[4]R_AX_WDE_ERR_ISR=0x%08x\n",
970e3ec7017SPing-Ke Shih 		   rtw89_read32(rtwdev, R_AX_WDE_ERR_ISR));
971e3ec7017SPing-Ke Shih 	seq_printf(m, "[5.1]R_AX_TXPKTCTL_ERR_IMR_ISR=0x%08x\n",
972e3ec7017SPing-Ke Shih 		   rtw89_read32(rtwdev, R_AX_TXPKTCTL_ERR_IMR_ISR));
973e3ec7017SPing-Ke Shih 	seq_printf(m, "[5.2]R_AX_TXPKTCTL_ERR_IMR_ISR_B1=0x%08x\n",
974e3ec7017SPing-Ke Shih 		   rtw89_read32(rtwdev, R_AX_TXPKTCTL_ERR_IMR_ISR_B1));
975e3ec7017SPing-Ke Shih 	seq_printf(m, "[6]R_AX_PLE_ERR_FLAG_ISR=0x%08x\n",
976e3ec7017SPing-Ke Shih 		   rtw89_read32(rtwdev, R_AX_PLE_ERR_FLAG_ISR));
977e3ec7017SPing-Ke Shih 	seq_printf(m, "[7]R_AX_PKTIN_ERR_ISR=0x%08x\n",
978e3ec7017SPing-Ke Shih 		   rtw89_read32(rtwdev, R_AX_PKTIN_ERR_ISR));
979e3ec7017SPing-Ke Shih 	seq_printf(m, "[8.1]R_AX_OTHER_DISPATCHER_ERR_ISR=0x%08x\n",
980e3ec7017SPing-Ke Shih 		   rtw89_read32(rtwdev, R_AX_OTHER_DISPATCHER_ERR_ISR));
981e3ec7017SPing-Ke Shih 	seq_printf(m, "[8.2]R_AX_HOST_DISPATCHER_ERR_ISR=0x%08x\n",
982e3ec7017SPing-Ke Shih 		   rtw89_read32(rtwdev, R_AX_HOST_DISPATCHER_ERR_ISR));
983e3ec7017SPing-Ke Shih 	seq_printf(m, "[8.3]R_AX_CPU_DISPATCHER_ERR_ISR=0x%08x\n",
984e3ec7017SPing-Ke Shih 		   rtw89_read32(rtwdev, R_AX_CPU_DISPATCHER_ERR_ISR));
985e3ec7017SPing-Ke Shih 	seq_printf(m, "[10]R_AX_CPUIO_ERR_ISR=0x%08x\n",
986e3ec7017SPing-Ke Shih 		   rtw89_read32(rtwdev, R_AX_CPUIO_ERR_ISR));
987e3ec7017SPing-Ke Shih 	seq_printf(m, "[11.1]R_AX_BBRPT_COM_ERR_IMR_ISR=0x%08x\n",
988e3ec7017SPing-Ke Shih 		   rtw89_read32(rtwdev, R_AX_BBRPT_COM_ERR_IMR_ISR));
989e3ec7017SPing-Ke Shih 	seq_printf(m, "[11.2]R_AX_BBRPT_CHINFO_ERR_IMR_ISR=0x%08x\n",
990e3ec7017SPing-Ke Shih 		   rtw89_read32(rtwdev, R_AX_BBRPT_CHINFO_ERR_IMR_ISR));
991e3ec7017SPing-Ke Shih 	seq_printf(m, "[11.3]R_AX_BBRPT_DFS_ERR_IMR_ISR=0x%08x\n",
992e3ec7017SPing-Ke Shih 		   rtw89_read32(rtwdev, R_AX_BBRPT_DFS_ERR_IMR_ISR));
993e3ec7017SPing-Ke Shih 	seq_printf(m, "[11.4]R_AX_LA_ERRFLAG=0x%08x\n",
994e3ec7017SPing-Ke Shih 		   rtw89_read32(rtwdev, R_AX_LA_ERRFLAG));
995e3ec7017SPing-Ke Shih 
996e3ec7017SPing-Ke Shih 	return 0;
997e3ec7017SPing-Ke Shih }
998e3ec7017SPing-Ke Shih 
999e3ec7017SPing-Ke Shih static int rtw89_debug_mac_dump_cmac_dbg(struct rtw89_dev *rtwdev,
1000e3ec7017SPing-Ke Shih 					 struct seq_file *m)
1001e3ec7017SPing-Ke Shih {
1002e3ec7017SPing-Ke Shih 	int ret;
1003e3ec7017SPing-Ke Shih 
1004e3ec7017SPing-Ke Shih 	ret = rtw89_mac_check_mac_en(rtwdev, 0, RTW89_CMAC_SEL);
1005e3ec7017SPing-Ke Shih 	if (ret) {
1006e3ec7017SPing-Ke Shih 		seq_puts(m, "[CMAC] : CMAC 0 not enabled\n");
1007e3ec7017SPing-Ke Shih 		return ret;
1008e3ec7017SPing-Ke Shih 	}
1009e3ec7017SPing-Ke Shih 
1010e3ec7017SPing-Ke Shih 	seq_printf(m, "R_AX_CMAC_ERR_ISR=0x%08x\n",
1011e3ec7017SPing-Ke Shih 		   rtw89_read32(rtwdev, R_AX_CMAC_ERR_ISR));
1012e3ec7017SPing-Ke Shih 	seq_printf(m, "[0]R_AX_SCHEDULE_ERR_ISR=0x%08x\n",
1013e3ec7017SPing-Ke Shih 		   rtw89_read32(rtwdev, R_AX_SCHEDULE_ERR_ISR));
1014e3ec7017SPing-Ke Shih 	seq_printf(m, "[1]R_AX_PTCL_ISR0=0x%08x\n",
1015e3ec7017SPing-Ke Shih 		   rtw89_read32(rtwdev, R_AX_PTCL_ISR0));
1016e3ec7017SPing-Ke Shih 	seq_printf(m, "[3]R_AX_DLE_CTRL=0x%08x\n",
1017e3ec7017SPing-Ke Shih 		   rtw89_read32(rtwdev, R_AX_DLE_CTRL));
1018e3ec7017SPing-Ke Shih 	seq_printf(m, "[4]R_AX_PHYINFO_ERR_ISR=0x%08x\n",
1019e3ec7017SPing-Ke Shih 		   rtw89_read32(rtwdev, R_AX_PHYINFO_ERR_ISR));
1020e3ec7017SPing-Ke Shih 	seq_printf(m, "[5]R_AX_TXPWR_ISR=0x%08x\n",
1021e3ec7017SPing-Ke Shih 		   rtw89_read32(rtwdev, R_AX_TXPWR_ISR));
1022e3ec7017SPing-Ke Shih 	seq_printf(m, "[6]R_AX_RMAC_ERR_ISR=0x%08x\n",
1023e3ec7017SPing-Ke Shih 		   rtw89_read32(rtwdev, R_AX_RMAC_ERR_ISR));
1024e3ec7017SPing-Ke Shih 	seq_printf(m, "[7]R_AX_TMAC_ERR_IMR_ISR=0x%08x\n",
1025e3ec7017SPing-Ke Shih 		   rtw89_read32(rtwdev, R_AX_TMAC_ERR_IMR_ISR));
1026e3ec7017SPing-Ke Shih 
1027e3ec7017SPing-Ke Shih 	ret = rtw89_mac_check_mac_en(rtwdev, 1, RTW89_CMAC_SEL);
1028e3ec7017SPing-Ke Shih 	if (ret) {
1029e3ec7017SPing-Ke Shih 		seq_puts(m, "[CMAC] : CMAC 1 not enabled\n");
1030e3ec7017SPing-Ke Shih 		return ret;
1031e3ec7017SPing-Ke Shih 	}
1032e3ec7017SPing-Ke Shih 
1033e3ec7017SPing-Ke Shih 	seq_printf(m, "R_AX_CMAC_ERR_ISR_C1=0x%08x\n",
1034e3ec7017SPing-Ke Shih 		   rtw89_read32(rtwdev, R_AX_CMAC_ERR_ISR_C1));
1035e3ec7017SPing-Ke Shih 	seq_printf(m, "[0]R_AX_SCHEDULE_ERR_ISR_C1=0x%08x\n",
1036e3ec7017SPing-Ke Shih 		   rtw89_read32(rtwdev, R_AX_SCHEDULE_ERR_ISR_C1));
1037e3ec7017SPing-Ke Shih 	seq_printf(m, "[1]R_AX_PTCL_ISR0_C1=0x%08x\n",
1038e3ec7017SPing-Ke Shih 		   rtw89_read32(rtwdev, R_AX_PTCL_ISR0_C1));
1039e3ec7017SPing-Ke Shih 	seq_printf(m, "[3]R_AX_DLE_CTRL_C1=0x%08x\n",
1040e3ec7017SPing-Ke Shih 		   rtw89_read32(rtwdev, R_AX_DLE_CTRL_C1));
1041e3ec7017SPing-Ke Shih 	seq_printf(m, "[4]R_AX_PHYINFO_ERR_ISR_C1=0x%02x\n",
1042e3ec7017SPing-Ke Shih 		   rtw89_read32(rtwdev, R_AX_PHYINFO_ERR_ISR_C1));
1043e3ec7017SPing-Ke Shih 	seq_printf(m, "[5]R_AX_TXPWR_ISR_C1=0x%08x\n",
1044e3ec7017SPing-Ke Shih 		   rtw89_read32(rtwdev, R_AX_TXPWR_ISR_C1));
1045e3ec7017SPing-Ke Shih 	seq_printf(m, "[6]R_AX_RMAC_ERR_ISR_C1=0x%08x\n",
1046e3ec7017SPing-Ke Shih 		   rtw89_read32(rtwdev, R_AX_RMAC_ERR_ISR_C1));
1047e3ec7017SPing-Ke Shih 	seq_printf(m, "[7]R_AX_TMAC_ERR_IMR_ISR_C1=0x%08x\n",
1048e3ec7017SPing-Ke Shih 		   rtw89_read32(rtwdev, R_AX_TMAC_ERR_IMR_ISR_C1));
1049e3ec7017SPing-Ke Shih 
1050e3ec7017SPing-Ke Shih 	return 0;
1051e3ec7017SPing-Ke Shih }
1052e3ec7017SPing-Ke Shih 
1053e3ec7017SPing-Ke Shih static const struct rtw89_mac_dbg_port_info dbg_port_ptcl_c0 = {
1054e3ec7017SPing-Ke Shih 	.sel_addr = R_AX_PTCL_DBG,
1055e3ec7017SPing-Ke Shih 	.sel_byte = 1,
1056e3ec7017SPing-Ke Shih 	.sel_msk = B_AX_PTCL_DBG_SEL_MASK,
1057e3ec7017SPing-Ke Shih 	.srt = 0x00,
1058e3ec7017SPing-Ke Shih 	.end = 0x3F,
1059e3ec7017SPing-Ke Shih 	.rd_addr = R_AX_PTCL_DBG_INFO,
1060e3ec7017SPing-Ke Shih 	.rd_byte = 4,
1061e3ec7017SPing-Ke Shih 	.rd_msk = B_AX_PTCL_DBG_INFO_MASK
1062e3ec7017SPing-Ke Shih };
1063e3ec7017SPing-Ke Shih 
1064e3ec7017SPing-Ke Shih static const struct rtw89_mac_dbg_port_info dbg_port_ptcl_c1 = {
1065e3ec7017SPing-Ke Shih 	.sel_addr = R_AX_PTCL_DBG_C1,
1066e3ec7017SPing-Ke Shih 	.sel_byte = 1,
1067e3ec7017SPing-Ke Shih 	.sel_msk = B_AX_PTCL_DBG_SEL_MASK,
1068e3ec7017SPing-Ke Shih 	.srt = 0x00,
1069e3ec7017SPing-Ke Shih 	.end = 0x3F,
1070e3ec7017SPing-Ke Shih 	.rd_addr = R_AX_PTCL_DBG_INFO_C1,
1071e3ec7017SPing-Ke Shih 	.rd_byte = 4,
1072e3ec7017SPing-Ke Shih 	.rd_msk = B_AX_PTCL_DBG_INFO_MASK
1073e3ec7017SPing-Ke Shih };
1074e3ec7017SPing-Ke Shih 
1075e3ec7017SPing-Ke Shih static const struct rtw89_mac_dbg_port_info dbg_port_sch_c0 = {
1076e3ec7017SPing-Ke Shih 	.sel_addr = R_AX_SCH_DBG_SEL,
1077e3ec7017SPing-Ke Shih 	.sel_byte = 1,
1078e3ec7017SPing-Ke Shih 	.sel_msk = B_AX_SCH_DBG_SEL_MASK,
1079e3ec7017SPing-Ke Shih 	.srt = 0x00,
1080e3ec7017SPing-Ke Shih 	.end = 0x2F,
1081e3ec7017SPing-Ke Shih 	.rd_addr = R_AX_SCH_DBG,
1082e3ec7017SPing-Ke Shih 	.rd_byte = 4,
1083e3ec7017SPing-Ke Shih 	.rd_msk = B_AX_SCHEDULER_DBG_MASK
1084e3ec7017SPing-Ke Shih };
1085e3ec7017SPing-Ke Shih 
1086e3ec7017SPing-Ke Shih static const struct rtw89_mac_dbg_port_info dbg_port_sch_c1 = {
1087e3ec7017SPing-Ke Shih 	.sel_addr = R_AX_SCH_DBG_SEL_C1,
1088e3ec7017SPing-Ke Shih 	.sel_byte = 1,
1089e3ec7017SPing-Ke Shih 	.sel_msk = B_AX_SCH_DBG_SEL_MASK,
1090e3ec7017SPing-Ke Shih 	.srt = 0x00,
1091e3ec7017SPing-Ke Shih 	.end = 0x2F,
1092e3ec7017SPing-Ke Shih 	.rd_addr = R_AX_SCH_DBG_C1,
1093e3ec7017SPing-Ke Shih 	.rd_byte = 4,
1094e3ec7017SPing-Ke Shih 	.rd_msk = B_AX_SCHEDULER_DBG_MASK
1095e3ec7017SPing-Ke Shih };
1096e3ec7017SPing-Ke Shih 
1097e3ec7017SPing-Ke Shih static const struct rtw89_mac_dbg_port_info dbg_port_tmac_c0 = {
1098e3ec7017SPing-Ke Shih 	.sel_addr = R_AX_MACTX_DBG_SEL_CNT,
1099e3ec7017SPing-Ke Shih 	.sel_byte = 1,
1100e3ec7017SPing-Ke Shih 	.sel_msk = B_AX_DBGSEL_MACTX_MASK,
1101e3ec7017SPing-Ke Shih 	.srt = 0x00,
1102e3ec7017SPing-Ke Shih 	.end = 0x19,
1103e3ec7017SPing-Ke Shih 	.rd_addr = R_AX_DBG_PORT_SEL,
1104e3ec7017SPing-Ke Shih 	.rd_byte = 4,
1105e3ec7017SPing-Ke Shih 	.rd_msk = B_AX_DEBUG_ST_MASK
1106e3ec7017SPing-Ke Shih };
1107e3ec7017SPing-Ke Shih 
1108e3ec7017SPing-Ke Shih static const struct rtw89_mac_dbg_port_info dbg_port_tmac_c1 = {
1109e3ec7017SPing-Ke Shih 	.sel_addr = R_AX_MACTX_DBG_SEL_CNT_C1,
1110e3ec7017SPing-Ke Shih 	.sel_byte = 1,
1111e3ec7017SPing-Ke Shih 	.sel_msk = B_AX_DBGSEL_MACTX_MASK,
1112e3ec7017SPing-Ke Shih 	.srt = 0x00,
1113e3ec7017SPing-Ke Shih 	.end = 0x19,
1114e3ec7017SPing-Ke Shih 	.rd_addr = R_AX_DBG_PORT_SEL,
1115e3ec7017SPing-Ke Shih 	.rd_byte = 4,
1116e3ec7017SPing-Ke Shih 	.rd_msk = B_AX_DEBUG_ST_MASK
1117e3ec7017SPing-Ke Shih };
1118e3ec7017SPing-Ke Shih 
1119e3ec7017SPing-Ke Shih static const struct rtw89_mac_dbg_port_info dbg_port_rmac_c0 = {
1120e3ec7017SPing-Ke Shih 	.sel_addr = R_AX_RX_DEBUG_SELECT,
1121e3ec7017SPing-Ke Shih 	.sel_byte = 1,
1122e3ec7017SPing-Ke Shih 	.sel_msk = B_AX_DEBUG_SEL_MASK,
1123e3ec7017SPing-Ke Shih 	.srt = 0x00,
1124e3ec7017SPing-Ke Shih 	.end = 0x58,
1125e3ec7017SPing-Ke Shih 	.rd_addr = R_AX_DBG_PORT_SEL,
1126e3ec7017SPing-Ke Shih 	.rd_byte = 4,
1127e3ec7017SPing-Ke Shih 	.rd_msk = B_AX_DEBUG_ST_MASK
1128e3ec7017SPing-Ke Shih };
1129e3ec7017SPing-Ke Shih 
1130e3ec7017SPing-Ke Shih static const struct rtw89_mac_dbg_port_info dbg_port_rmac_c1 = {
1131e3ec7017SPing-Ke Shih 	.sel_addr = R_AX_RX_DEBUG_SELECT_C1,
1132e3ec7017SPing-Ke Shih 	.sel_byte = 1,
1133e3ec7017SPing-Ke Shih 	.sel_msk = B_AX_DEBUG_SEL_MASK,
1134e3ec7017SPing-Ke Shih 	.srt = 0x00,
1135e3ec7017SPing-Ke Shih 	.end = 0x58,
1136e3ec7017SPing-Ke Shih 	.rd_addr = R_AX_DBG_PORT_SEL,
1137e3ec7017SPing-Ke Shih 	.rd_byte = 4,
1138e3ec7017SPing-Ke Shih 	.rd_msk = B_AX_DEBUG_ST_MASK
1139e3ec7017SPing-Ke Shih };
1140e3ec7017SPing-Ke Shih 
1141e3ec7017SPing-Ke Shih static const struct rtw89_mac_dbg_port_info dbg_port_rmacst_c0 = {
1142e3ec7017SPing-Ke Shih 	.sel_addr = R_AX_RX_STATE_MONITOR,
1143e3ec7017SPing-Ke Shih 	.sel_byte = 1,
1144e3ec7017SPing-Ke Shih 	.sel_msk = B_AX_STATE_SEL_MASK,
1145e3ec7017SPing-Ke Shih 	.srt = 0x00,
1146e3ec7017SPing-Ke Shih 	.end = 0x17,
1147e3ec7017SPing-Ke Shih 	.rd_addr = R_AX_RX_STATE_MONITOR,
1148e3ec7017SPing-Ke Shih 	.rd_byte = 4,
1149e3ec7017SPing-Ke Shih 	.rd_msk = B_AX_RX_STATE_MONITOR_MASK
1150e3ec7017SPing-Ke Shih };
1151e3ec7017SPing-Ke Shih 
1152e3ec7017SPing-Ke Shih static const struct rtw89_mac_dbg_port_info dbg_port_rmacst_c1 = {
1153e3ec7017SPing-Ke Shih 	.sel_addr = R_AX_RX_STATE_MONITOR_C1,
1154e3ec7017SPing-Ke Shih 	.sel_byte = 1,
1155e3ec7017SPing-Ke Shih 	.sel_msk = B_AX_STATE_SEL_MASK,
1156e3ec7017SPing-Ke Shih 	.srt = 0x00,
1157e3ec7017SPing-Ke Shih 	.end = 0x17,
1158e3ec7017SPing-Ke Shih 	.rd_addr = R_AX_RX_STATE_MONITOR_C1,
1159e3ec7017SPing-Ke Shih 	.rd_byte = 4,
1160e3ec7017SPing-Ke Shih 	.rd_msk = B_AX_RX_STATE_MONITOR_MASK
1161e3ec7017SPing-Ke Shih };
1162e3ec7017SPing-Ke Shih 
1163e3ec7017SPing-Ke Shih static const struct rtw89_mac_dbg_port_info dbg_port_rmac_plcp_c0 = {
1164e3ec7017SPing-Ke Shih 	.sel_addr = R_AX_RMAC_PLCP_MON,
1165e3ec7017SPing-Ke Shih 	.sel_byte = 4,
1166e3ec7017SPing-Ke Shih 	.sel_msk = B_AX_PCLP_MON_SEL_MASK,
1167e3ec7017SPing-Ke Shih 	.srt = 0x0,
1168e3ec7017SPing-Ke Shih 	.end = 0xF,
1169e3ec7017SPing-Ke Shih 	.rd_addr = R_AX_RMAC_PLCP_MON,
1170e3ec7017SPing-Ke Shih 	.rd_byte = 4,
1171e3ec7017SPing-Ke Shih 	.rd_msk = B_AX_RMAC_PLCP_MON_MASK
1172e3ec7017SPing-Ke Shih };
1173e3ec7017SPing-Ke Shih 
1174e3ec7017SPing-Ke Shih static const struct rtw89_mac_dbg_port_info dbg_port_rmac_plcp_c1 = {
1175e3ec7017SPing-Ke Shih 	.sel_addr = R_AX_RMAC_PLCP_MON_C1,
1176e3ec7017SPing-Ke Shih 	.sel_byte = 4,
1177e3ec7017SPing-Ke Shih 	.sel_msk = B_AX_PCLP_MON_SEL_MASK,
1178e3ec7017SPing-Ke Shih 	.srt = 0x0,
1179e3ec7017SPing-Ke Shih 	.end = 0xF,
1180e3ec7017SPing-Ke Shih 	.rd_addr = R_AX_RMAC_PLCP_MON_C1,
1181e3ec7017SPing-Ke Shih 	.rd_byte = 4,
1182e3ec7017SPing-Ke Shih 	.rd_msk = B_AX_RMAC_PLCP_MON_MASK
1183e3ec7017SPing-Ke Shih };
1184e3ec7017SPing-Ke Shih 
1185e3ec7017SPing-Ke Shih static const struct rtw89_mac_dbg_port_info dbg_port_trxptcl_c0 = {
1186e3ec7017SPing-Ke Shih 	.sel_addr = R_AX_DBGSEL_TRXPTCL,
1187e3ec7017SPing-Ke Shih 	.sel_byte = 1,
1188e3ec7017SPing-Ke Shih 	.sel_msk = B_AX_DBGSEL_TRXPTCL_MASK,
1189e3ec7017SPing-Ke Shih 	.srt = 0x08,
1190e3ec7017SPing-Ke Shih 	.end = 0x10,
1191e3ec7017SPing-Ke Shih 	.rd_addr = R_AX_DBG_PORT_SEL,
1192e3ec7017SPing-Ke Shih 	.rd_byte = 4,
1193e3ec7017SPing-Ke Shih 	.rd_msk = B_AX_DEBUG_ST_MASK
1194e3ec7017SPing-Ke Shih };
1195e3ec7017SPing-Ke Shih 
1196e3ec7017SPing-Ke Shih static const struct rtw89_mac_dbg_port_info dbg_port_trxptcl_c1 = {
1197e3ec7017SPing-Ke Shih 	.sel_addr = R_AX_DBGSEL_TRXPTCL_C1,
1198e3ec7017SPing-Ke Shih 	.sel_byte = 1,
1199e3ec7017SPing-Ke Shih 	.sel_msk = B_AX_DBGSEL_TRXPTCL_MASK,
1200e3ec7017SPing-Ke Shih 	.srt = 0x08,
1201e3ec7017SPing-Ke Shih 	.end = 0x10,
1202e3ec7017SPing-Ke Shih 	.rd_addr = R_AX_DBG_PORT_SEL,
1203e3ec7017SPing-Ke Shih 	.rd_byte = 4,
1204e3ec7017SPing-Ke Shih 	.rd_msk = B_AX_DEBUG_ST_MASK
1205e3ec7017SPing-Ke Shih };
1206e3ec7017SPing-Ke Shih 
1207e3ec7017SPing-Ke Shih static const struct rtw89_mac_dbg_port_info dbg_port_tx_infol_c0 = {
1208e3ec7017SPing-Ke Shih 	.sel_addr = R_AX_WMAC_TX_CTRL_DEBUG,
1209e3ec7017SPing-Ke Shih 	.sel_byte = 1,
1210e3ec7017SPing-Ke Shih 	.sel_msk = B_AX_TX_CTRL_DEBUG_SEL_MASK,
1211e3ec7017SPing-Ke Shih 	.srt = 0x00,
1212e3ec7017SPing-Ke Shih 	.end = 0x07,
1213e3ec7017SPing-Ke Shih 	.rd_addr = R_AX_WMAC_TX_INFO0_DEBUG,
1214e3ec7017SPing-Ke Shih 	.rd_byte = 4,
1215e3ec7017SPing-Ke Shih 	.rd_msk = B_AX_TX_CTRL_INFO_P0_MASK
1216e3ec7017SPing-Ke Shih };
1217e3ec7017SPing-Ke Shih 
1218e3ec7017SPing-Ke Shih static const struct rtw89_mac_dbg_port_info dbg_port_tx_infoh_c0 = {
1219e3ec7017SPing-Ke Shih 	.sel_addr = R_AX_WMAC_TX_CTRL_DEBUG,
1220e3ec7017SPing-Ke Shih 	.sel_byte = 1,
1221e3ec7017SPing-Ke Shih 	.sel_msk = B_AX_TX_CTRL_DEBUG_SEL_MASK,
1222e3ec7017SPing-Ke Shih 	.srt = 0x00,
1223e3ec7017SPing-Ke Shih 	.end = 0x07,
1224e3ec7017SPing-Ke Shih 	.rd_addr = R_AX_WMAC_TX_INFO1_DEBUG,
1225e3ec7017SPing-Ke Shih 	.rd_byte = 4,
1226e3ec7017SPing-Ke Shih 	.rd_msk = B_AX_TX_CTRL_INFO_P1_MASK
1227e3ec7017SPing-Ke Shih };
1228e3ec7017SPing-Ke Shih 
1229e3ec7017SPing-Ke Shih static const struct rtw89_mac_dbg_port_info dbg_port_tx_infol_c1 = {
1230e3ec7017SPing-Ke Shih 	.sel_addr = R_AX_WMAC_TX_CTRL_DEBUG_C1,
1231e3ec7017SPing-Ke Shih 	.sel_byte = 1,
1232e3ec7017SPing-Ke Shih 	.sel_msk = B_AX_TX_CTRL_DEBUG_SEL_MASK,
1233e3ec7017SPing-Ke Shih 	.srt = 0x00,
1234e3ec7017SPing-Ke Shih 	.end = 0x07,
1235e3ec7017SPing-Ke Shih 	.rd_addr = R_AX_WMAC_TX_INFO0_DEBUG_C1,
1236e3ec7017SPing-Ke Shih 	.rd_byte = 4,
1237e3ec7017SPing-Ke Shih 	.rd_msk = B_AX_TX_CTRL_INFO_P0_MASK
1238e3ec7017SPing-Ke Shih };
1239e3ec7017SPing-Ke Shih 
1240e3ec7017SPing-Ke Shih static const struct rtw89_mac_dbg_port_info dbg_port_tx_infoh_c1 = {
1241e3ec7017SPing-Ke Shih 	.sel_addr = R_AX_WMAC_TX_CTRL_DEBUG_C1,
1242e3ec7017SPing-Ke Shih 	.sel_byte = 1,
1243e3ec7017SPing-Ke Shih 	.sel_msk = B_AX_TX_CTRL_DEBUG_SEL_MASK,
1244e3ec7017SPing-Ke Shih 	.srt = 0x00,
1245e3ec7017SPing-Ke Shih 	.end = 0x07,
1246e3ec7017SPing-Ke Shih 	.rd_addr = R_AX_WMAC_TX_INFO1_DEBUG_C1,
1247e3ec7017SPing-Ke Shih 	.rd_byte = 4,
1248e3ec7017SPing-Ke Shih 	.rd_msk = B_AX_TX_CTRL_INFO_P1_MASK
1249e3ec7017SPing-Ke Shih };
1250e3ec7017SPing-Ke Shih 
1251e3ec7017SPing-Ke Shih static const struct rtw89_mac_dbg_port_info dbg_port_txtf_infol_c0 = {
1252e3ec7017SPing-Ke Shih 	.sel_addr = R_AX_WMAC_TX_TF_INFO_0,
1253e3ec7017SPing-Ke Shih 	.sel_byte = 1,
1254e3ec7017SPing-Ke Shih 	.sel_msk = B_AX_WMAC_TX_TF_INFO_SEL_MASK,
1255e3ec7017SPing-Ke Shih 	.srt = 0x00,
1256e3ec7017SPing-Ke Shih 	.end = 0x04,
1257e3ec7017SPing-Ke Shih 	.rd_addr = R_AX_WMAC_TX_TF_INFO_1,
1258e3ec7017SPing-Ke Shih 	.rd_byte = 4,
1259e3ec7017SPing-Ke Shih 	.rd_msk = B_AX_WMAC_TX_TF_INFO_P0_MASK
1260e3ec7017SPing-Ke Shih };
1261e3ec7017SPing-Ke Shih 
1262e3ec7017SPing-Ke Shih static const struct rtw89_mac_dbg_port_info dbg_port_txtf_infoh_c0 = {
1263e3ec7017SPing-Ke Shih 	.sel_addr = R_AX_WMAC_TX_TF_INFO_0,
1264e3ec7017SPing-Ke Shih 	.sel_byte = 1,
1265e3ec7017SPing-Ke Shih 	.sel_msk = B_AX_WMAC_TX_TF_INFO_SEL_MASK,
1266e3ec7017SPing-Ke Shih 	.srt = 0x00,
1267e3ec7017SPing-Ke Shih 	.end = 0x04,
1268e3ec7017SPing-Ke Shih 	.rd_addr = R_AX_WMAC_TX_TF_INFO_2,
1269e3ec7017SPing-Ke Shih 	.rd_byte = 4,
1270e3ec7017SPing-Ke Shih 	.rd_msk = B_AX_WMAC_TX_TF_INFO_P1_MASK
1271e3ec7017SPing-Ke Shih };
1272e3ec7017SPing-Ke Shih 
1273e3ec7017SPing-Ke Shih static const struct rtw89_mac_dbg_port_info dbg_port_txtf_infol_c1 = {
1274e3ec7017SPing-Ke Shih 	.sel_addr = R_AX_WMAC_TX_TF_INFO_0_C1,
1275e3ec7017SPing-Ke Shih 	.sel_byte = 1,
1276e3ec7017SPing-Ke Shih 	.sel_msk = B_AX_WMAC_TX_TF_INFO_SEL_MASK,
1277e3ec7017SPing-Ke Shih 	.srt = 0x00,
1278e3ec7017SPing-Ke Shih 	.end = 0x04,
1279e3ec7017SPing-Ke Shih 	.rd_addr = R_AX_WMAC_TX_TF_INFO_1_C1,
1280e3ec7017SPing-Ke Shih 	.rd_byte = 4,
1281e3ec7017SPing-Ke Shih 	.rd_msk = B_AX_WMAC_TX_TF_INFO_P0_MASK
1282e3ec7017SPing-Ke Shih };
1283e3ec7017SPing-Ke Shih 
1284e3ec7017SPing-Ke Shih static const struct rtw89_mac_dbg_port_info dbg_port_txtf_infoh_c1 = {
1285e3ec7017SPing-Ke Shih 	.sel_addr = R_AX_WMAC_TX_TF_INFO_0_C1,
1286e3ec7017SPing-Ke Shih 	.sel_byte = 1,
1287e3ec7017SPing-Ke Shih 	.sel_msk = B_AX_WMAC_TX_TF_INFO_SEL_MASK,
1288e3ec7017SPing-Ke Shih 	.srt = 0x00,
1289e3ec7017SPing-Ke Shih 	.end = 0x04,
1290e3ec7017SPing-Ke Shih 	.rd_addr = R_AX_WMAC_TX_TF_INFO_2_C1,
1291e3ec7017SPing-Ke Shih 	.rd_byte = 4,
1292e3ec7017SPing-Ke Shih 	.rd_msk = B_AX_WMAC_TX_TF_INFO_P1_MASK
1293e3ec7017SPing-Ke Shih };
1294e3ec7017SPing-Ke Shih 
1295e3ec7017SPing-Ke Shih static const struct rtw89_mac_dbg_port_info dbg_port_wde_bufmgn_freepg = {
1296e3ec7017SPing-Ke Shih 	.sel_addr = R_AX_WDE_DBG_FUN_INTF_CTL,
1297e3ec7017SPing-Ke Shih 	.sel_byte = 4,
1298e3ec7017SPing-Ke Shih 	.sel_msk = B_AX_WDE_DFI_DATA_MASK,
1299e3ec7017SPing-Ke Shih 	.srt = 0x80000000,
1300e3ec7017SPing-Ke Shih 	.end = 0x80000001,
1301e3ec7017SPing-Ke Shih 	.rd_addr = R_AX_WDE_DBG_FUN_INTF_DATA,
1302e3ec7017SPing-Ke Shih 	.rd_byte = 4,
1303e3ec7017SPing-Ke Shih 	.rd_msk = B_AX_WDE_DFI_DATA_MASK
1304e3ec7017SPing-Ke Shih };
1305e3ec7017SPing-Ke Shih 
1306e3ec7017SPing-Ke Shih static const struct rtw89_mac_dbg_port_info dbg_port_wde_bufmgn_quota = {
1307e3ec7017SPing-Ke Shih 	.sel_addr = R_AX_WDE_DBG_FUN_INTF_CTL,
1308e3ec7017SPing-Ke Shih 	.sel_byte = 4,
1309e3ec7017SPing-Ke Shih 	.sel_msk = B_AX_WDE_DFI_DATA_MASK,
1310e3ec7017SPing-Ke Shih 	.srt = 0x80010000,
1311e3ec7017SPing-Ke Shih 	.end = 0x80010004,
1312e3ec7017SPing-Ke Shih 	.rd_addr = R_AX_WDE_DBG_FUN_INTF_DATA,
1313e3ec7017SPing-Ke Shih 	.rd_byte = 4,
1314e3ec7017SPing-Ke Shih 	.rd_msk = B_AX_WDE_DFI_DATA_MASK
1315e3ec7017SPing-Ke Shih };
1316e3ec7017SPing-Ke Shih 
1317e3ec7017SPing-Ke Shih static const struct rtw89_mac_dbg_port_info dbg_port_wde_bufmgn_pagellt = {
1318e3ec7017SPing-Ke Shih 	.sel_addr = R_AX_WDE_DBG_FUN_INTF_CTL,
1319e3ec7017SPing-Ke Shih 	.sel_byte = 4,
1320e3ec7017SPing-Ke Shih 	.sel_msk = B_AX_WDE_DFI_DATA_MASK,
1321e3ec7017SPing-Ke Shih 	.srt = 0x80020000,
1322e3ec7017SPing-Ke Shih 	.end = 0x80020FFF,
1323e3ec7017SPing-Ke Shih 	.rd_addr = R_AX_WDE_DBG_FUN_INTF_DATA,
1324e3ec7017SPing-Ke Shih 	.rd_byte = 4,
1325e3ec7017SPing-Ke Shih 	.rd_msk = B_AX_WDE_DFI_DATA_MASK
1326e3ec7017SPing-Ke Shih };
1327e3ec7017SPing-Ke Shih 
1328e3ec7017SPing-Ke Shih static const struct rtw89_mac_dbg_port_info dbg_port_wde_bufmgn_pktinfo = {
1329e3ec7017SPing-Ke Shih 	.sel_addr = R_AX_WDE_DBG_FUN_INTF_CTL,
1330e3ec7017SPing-Ke Shih 	.sel_byte = 4,
1331e3ec7017SPing-Ke Shih 	.sel_msk = B_AX_WDE_DFI_DATA_MASK,
1332e3ec7017SPing-Ke Shih 	.srt = 0x80030000,
1333e3ec7017SPing-Ke Shih 	.end = 0x80030FFF,
1334e3ec7017SPing-Ke Shih 	.rd_addr = R_AX_WDE_DBG_FUN_INTF_DATA,
1335e3ec7017SPing-Ke Shih 	.rd_byte = 4,
1336e3ec7017SPing-Ke Shih 	.rd_msk = B_AX_WDE_DFI_DATA_MASK
1337e3ec7017SPing-Ke Shih };
1338e3ec7017SPing-Ke Shih 
1339e3ec7017SPing-Ke Shih static const struct rtw89_mac_dbg_port_info dbg_port_wde_quemgn_prepkt = {
1340e3ec7017SPing-Ke Shih 	.sel_addr = R_AX_WDE_DBG_FUN_INTF_CTL,
1341e3ec7017SPing-Ke Shih 	.sel_byte = 4,
1342e3ec7017SPing-Ke Shih 	.sel_msk = B_AX_WDE_DFI_DATA_MASK,
1343e3ec7017SPing-Ke Shih 	.srt = 0x80040000,
1344e3ec7017SPing-Ke Shih 	.end = 0x80040FFF,
1345e3ec7017SPing-Ke Shih 	.rd_addr = R_AX_WDE_DBG_FUN_INTF_DATA,
1346e3ec7017SPing-Ke Shih 	.rd_byte = 4,
1347e3ec7017SPing-Ke Shih 	.rd_msk = B_AX_WDE_DFI_DATA_MASK
1348e3ec7017SPing-Ke Shih };
1349e3ec7017SPing-Ke Shih 
1350e3ec7017SPing-Ke Shih static const struct rtw89_mac_dbg_port_info dbg_port_wde_quemgn_nxtpkt = {
1351e3ec7017SPing-Ke Shih 	.sel_addr = R_AX_WDE_DBG_FUN_INTF_CTL,
1352e3ec7017SPing-Ke Shih 	.sel_byte = 4,
1353e3ec7017SPing-Ke Shih 	.sel_msk = B_AX_WDE_DFI_DATA_MASK,
1354e3ec7017SPing-Ke Shih 	.srt = 0x80050000,
1355e3ec7017SPing-Ke Shih 	.end = 0x80050FFF,
1356e3ec7017SPing-Ke Shih 	.rd_addr = R_AX_WDE_DBG_FUN_INTF_DATA,
1357e3ec7017SPing-Ke Shih 	.rd_byte = 4,
1358e3ec7017SPing-Ke Shih 	.rd_msk = B_AX_WDE_DFI_DATA_MASK
1359e3ec7017SPing-Ke Shih };
1360e3ec7017SPing-Ke Shih 
1361e3ec7017SPing-Ke Shih static const struct rtw89_mac_dbg_port_info dbg_port_wde_quemgn_qlnktbl = {
1362e3ec7017SPing-Ke Shih 	.sel_addr = R_AX_WDE_DBG_FUN_INTF_CTL,
1363e3ec7017SPing-Ke Shih 	.sel_byte = 4,
1364e3ec7017SPing-Ke Shih 	.sel_msk = B_AX_WDE_DFI_DATA_MASK,
1365e3ec7017SPing-Ke Shih 	.srt = 0x80060000,
1366e3ec7017SPing-Ke Shih 	.end = 0x80060453,
1367e3ec7017SPing-Ke Shih 	.rd_addr = R_AX_WDE_DBG_FUN_INTF_DATA,
1368e3ec7017SPing-Ke Shih 	.rd_byte = 4,
1369e3ec7017SPing-Ke Shih 	.rd_msk = B_AX_WDE_DFI_DATA_MASK
1370e3ec7017SPing-Ke Shih };
1371e3ec7017SPing-Ke Shih 
1372e3ec7017SPing-Ke Shih static const struct rtw89_mac_dbg_port_info dbg_port_wde_quemgn_qempty = {
1373e3ec7017SPing-Ke Shih 	.sel_addr = R_AX_WDE_DBG_FUN_INTF_CTL,
1374e3ec7017SPing-Ke Shih 	.sel_byte = 4,
1375e3ec7017SPing-Ke Shih 	.sel_msk = B_AX_WDE_DFI_DATA_MASK,
1376e3ec7017SPing-Ke Shih 	.srt = 0x80070000,
1377e3ec7017SPing-Ke Shih 	.end = 0x80070011,
1378e3ec7017SPing-Ke Shih 	.rd_addr = R_AX_WDE_DBG_FUN_INTF_DATA,
1379e3ec7017SPing-Ke Shih 	.rd_byte = 4,
1380e3ec7017SPing-Ke Shih 	.rd_msk = B_AX_WDE_DFI_DATA_MASK
1381e3ec7017SPing-Ke Shih };
1382e3ec7017SPing-Ke Shih 
1383e3ec7017SPing-Ke Shih static const struct rtw89_mac_dbg_port_info dbg_port_ple_bufmgn_freepg = {
1384e3ec7017SPing-Ke Shih 	.sel_addr = R_AX_PLE_DBG_FUN_INTF_CTL,
1385e3ec7017SPing-Ke Shih 	.sel_byte = 4,
1386e3ec7017SPing-Ke Shih 	.sel_msk = B_AX_PLE_DFI_DATA_MASK,
1387e3ec7017SPing-Ke Shih 	.srt = 0x80000000,
1388e3ec7017SPing-Ke Shih 	.end = 0x80000001,
1389e3ec7017SPing-Ke Shih 	.rd_addr = R_AX_PLE_DBG_FUN_INTF_DATA,
1390e3ec7017SPing-Ke Shih 	.rd_byte = 4,
1391e3ec7017SPing-Ke Shih 	.rd_msk = B_AX_PLE_DFI_DATA_MASK
1392e3ec7017SPing-Ke Shih };
1393e3ec7017SPing-Ke Shih 
1394e3ec7017SPing-Ke Shih static const struct rtw89_mac_dbg_port_info dbg_port_ple_bufmgn_quota = {
1395e3ec7017SPing-Ke Shih 	.sel_addr = R_AX_PLE_DBG_FUN_INTF_CTL,
1396e3ec7017SPing-Ke Shih 	.sel_byte = 4,
1397e3ec7017SPing-Ke Shih 	.sel_msk = B_AX_PLE_DFI_DATA_MASK,
1398e3ec7017SPing-Ke Shih 	.srt = 0x80010000,
1399e3ec7017SPing-Ke Shih 	.end = 0x8001000A,
1400e3ec7017SPing-Ke Shih 	.rd_addr = R_AX_PLE_DBG_FUN_INTF_DATA,
1401e3ec7017SPing-Ke Shih 	.rd_byte = 4,
1402e3ec7017SPing-Ke Shih 	.rd_msk = B_AX_PLE_DFI_DATA_MASK
1403e3ec7017SPing-Ke Shih };
1404e3ec7017SPing-Ke Shih 
1405e3ec7017SPing-Ke Shih static const struct rtw89_mac_dbg_port_info dbg_port_ple_bufmgn_pagellt = {
1406e3ec7017SPing-Ke Shih 	.sel_addr = R_AX_PLE_DBG_FUN_INTF_CTL,
1407e3ec7017SPing-Ke Shih 	.sel_byte = 4,
1408e3ec7017SPing-Ke Shih 	.sel_msk = B_AX_PLE_DFI_DATA_MASK,
1409e3ec7017SPing-Ke Shih 	.srt = 0x80020000,
1410e3ec7017SPing-Ke Shih 	.end = 0x80020DBF,
1411e3ec7017SPing-Ke Shih 	.rd_addr = R_AX_PLE_DBG_FUN_INTF_DATA,
1412e3ec7017SPing-Ke Shih 	.rd_byte = 4,
1413e3ec7017SPing-Ke Shih 	.rd_msk = B_AX_PLE_DFI_DATA_MASK
1414e3ec7017SPing-Ke Shih };
1415e3ec7017SPing-Ke Shih 
1416e3ec7017SPing-Ke Shih static const struct rtw89_mac_dbg_port_info dbg_port_ple_bufmgn_pktinfo = {
1417e3ec7017SPing-Ke Shih 	.sel_addr = R_AX_PLE_DBG_FUN_INTF_CTL,
1418e3ec7017SPing-Ke Shih 	.sel_byte = 4,
1419e3ec7017SPing-Ke Shih 	.sel_msk = B_AX_PLE_DFI_DATA_MASK,
1420e3ec7017SPing-Ke Shih 	.srt = 0x80030000,
1421e3ec7017SPing-Ke Shih 	.end = 0x80030DBF,
1422e3ec7017SPing-Ke Shih 	.rd_addr = R_AX_PLE_DBG_FUN_INTF_DATA,
1423e3ec7017SPing-Ke Shih 	.rd_byte = 4,
1424e3ec7017SPing-Ke Shih 	.rd_msk = B_AX_PLE_DFI_DATA_MASK
1425e3ec7017SPing-Ke Shih };
1426e3ec7017SPing-Ke Shih 
1427e3ec7017SPing-Ke Shih static const struct rtw89_mac_dbg_port_info dbg_port_ple_quemgn_prepkt = {
1428e3ec7017SPing-Ke Shih 	.sel_addr = R_AX_PLE_DBG_FUN_INTF_CTL,
1429e3ec7017SPing-Ke Shih 	.sel_byte = 4,
1430e3ec7017SPing-Ke Shih 	.sel_msk = B_AX_PLE_DFI_DATA_MASK,
1431e3ec7017SPing-Ke Shih 	.srt = 0x80040000,
1432e3ec7017SPing-Ke Shih 	.end = 0x80040DBF,
1433e3ec7017SPing-Ke Shih 	.rd_addr = R_AX_PLE_DBG_FUN_INTF_DATA,
1434e3ec7017SPing-Ke Shih 	.rd_byte = 4,
1435e3ec7017SPing-Ke Shih 	.rd_msk = B_AX_PLE_DFI_DATA_MASK
1436e3ec7017SPing-Ke Shih };
1437e3ec7017SPing-Ke Shih 
1438e3ec7017SPing-Ke Shih static const struct rtw89_mac_dbg_port_info dbg_port_ple_quemgn_nxtpkt = {
1439e3ec7017SPing-Ke Shih 	.sel_addr = R_AX_PLE_DBG_FUN_INTF_CTL,
1440e3ec7017SPing-Ke Shih 	.sel_byte = 4,
1441e3ec7017SPing-Ke Shih 	.sel_msk = B_AX_PLE_DFI_DATA_MASK,
1442e3ec7017SPing-Ke Shih 	.srt = 0x80050000,
1443e3ec7017SPing-Ke Shih 	.end = 0x80050DBF,
1444e3ec7017SPing-Ke Shih 	.rd_addr = R_AX_PLE_DBG_FUN_INTF_DATA,
1445e3ec7017SPing-Ke Shih 	.rd_byte = 4,
1446e3ec7017SPing-Ke Shih 	.rd_msk = B_AX_PLE_DFI_DATA_MASK
1447e3ec7017SPing-Ke Shih };
1448e3ec7017SPing-Ke Shih 
1449e3ec7017SPing-Ke Shih static const struct rtw89_mac_dbg_port_info dbg_port_ple_quemgn_qlnktbl = {
1450e3ec7017SPing-Ke Shih 	.sel_addr = R_AX_PLE_DBG_FUN_INTF_CTL,
1451e3ec7017SPing-Ke Shih 	.sel_byte = 4,
1452e3ec7017SPing-Ke Shih 	.sel_msk = B_AX_PLE_DFI_DATA_MASK,
1453e3ec7017SPing-Ke Shih 	.srt = 0x80060000,
1454e3ec7017SPing-Ke Shih 	.end = 0x80060041,
1455e3ec7017SPing-Ke Shih 	.rd_addr = R_AX_PLE_DBG_FUN_INTF_DATA,
1456e3ec7017SPing-Ke Shih 	.rd_byte = 4,
1457e3ec7017SPing-Ke Shih 	.rd_msk = B_AX_PLE_DFI_DATA_MASK
1458e3ec7017SPing-Ke Shih };
1459e3ec7017SPing-Ke Shih 
1460e3ec7017SPing-Ke Shih static const struct rtw89_mac_dbg_port_info dbg_port_ple_quemgn_qempty = {
1461e3ec7017SPing-Ke Shih 	.sel_addr = R_AX_PLE_DBG_FUN_INTF_CTL,
1462e3ec7017SPing-Ke Shih 	.sel_byte = 4,
1463e3ec7017SPing-Ke Shih 	.sel_msk = B_AX_PLE_DFI_DATA_MASK,
1464e3ec7017SPing-Ke Shih 	.srt = 0x80070000,
1465e3ec7017SPing-Ke Shih 	.end = 0x80070001,
1466e3ec7017SPing-Ke Shih 	.rd_addr = R_AX_PLE_DBG_FUN_INTF_DATA,
1467e3ec7017SPing-Ke Shih 	.rd_byte = 4,
1468e3ec7017SPing-Ke Shih 	.rd_msk = B_AX_PLE_DFI_DATA_MASK
1469e3ec7017SPing-Ke Shih };
1470e3ec7017SPing-Ke Shih 
1471e3ec7017SPing-Ke Shih static const struct rtw89_mac_dbg_port_info dbg_port_pktinfo = {
1472e3ec7017SPing-Ke Shih 	.sel_addr = R_AX_DBG_FUN_INTF_CTL,
1473e3ec7017SPing-Ke Shih 	.sel_byte = 4,
1474e3ec7017SPing-Ke Shih 	.sel_msk = B_AX_DFI_DATA_MASK,
1475e3ec7017SPing-Ke Shih 	.srt = 0x80000000,
1476e3ec7017SPing-Ke Shih 	.end = 0x8000017f,
1477e3ec7017SPing-Ke Shih 	.rd_addr = R_AX_DBG_FUN_INTF_DATA,
1478e3ec7017SPing-Ke Shih 	.rd_byte = 4,
1479e3ec7017SPing-Ke Shih 	.rd_msk = B_AX_DFI_DATA_MASK
1480e3ec7017SPing-Ke Shih };
1481e3ec7017SPing-Ke Shih 
1482e3ec7017SPing-Ke Shih static const struct rtw89_mac_dbg_port_info dbg_port_pcie_txdma = {
1483e3ec7017SPing-Ke Shih 	.sel_addr = R_AX_PCIE_DBG_CTRL,
1484e3ec7017SPing-Ke Shih 	.sel_byte = 2,
1485e3ec7017SPing-Ke Shih 	.sel_msk = B_AX_DBG_SEL_MASK,
1486e3ec7017SPing-Ke Shih 	.srt = 0x00,
1487e3ec7017SPing-Ke Shih 	.end = 0x03,
1488e3ec7017SPing-Ke Shih 	.rd_addr = R_AX_DBG_PORT_SEL,
1489e3ec7017SPing-Ke Shih 	.rd_byte = 4,
1490e3ec7017SPing-Ke Shih 	.rd_msk = B_AX_DEBUG_ST_MASK
1491e3ec7017SPing-Ke Shih };
1492e3ec7017SPing-Ke Shih 
1493e3ec7017SPing-Ke Shih static const struct rtw89_mac_dbg_port_info dbg_port_pcie_rxdma = {
1494e3ec7017SPing-Ke Shih 	.sel_addr = R_AX_PCIE_DBG_CTRL,
1495e3ec7017SPing-Ke Shih 	.sel_byte = 2,
1496e3ec7017SPing-Ke Shih 	.sel_msk = B_AX_DBG_SEL_MASK,
1497e3ec7017SPing-Ke Shih 	.srt = 0x00,
1498e3ec7017SPing-Ke Shih 	.end = 0x04,
1499e3ec7017SPing-Ke Shih 	.rd_addr = R_AX_DBG_PORT_SEL,
1500e3ec7017SPing-Ke Shih 	.rd_byte = 4,
1501e3ec7017SPing-Ke Shih 	.rd_msk = B_AX_DEBUG_ST_MASK
1502e3ec7017SPing-Ke Shih };
1503e3ec7017SPing-Ke Shih 
1504e3ec7017SPing-Ke Shih static const struct rtw89_mac_dbg_port_info dbg_port_pcie_cvt = {
1505e3ec7017SPing-Ke Shih 	.sel_addr = R_AX_PCIE_DBG_CTRL,
1506e3ec7017SPing-Ke Shih 	.sel_byte = 2,
1507e3ec7017SPing-Ke Shih 	.sel_msk = B_AX_DBG_SEL_MASK,
1508e3ec7017SPing-Ke Shih 	.srt = 0x00,
1509e3ec7017SPing-Ke Shih 	.end = 0x01,
1510e3ec7017SPing-Ke Shih 	.rd_addr = R_AX_DBG_PORT_SEL,
1511e3ec7017SPing-Ke Shih 	.rd_byte = 4,
1512e3ec7017SPing-Ke Shih 	.rd_msk = B_AX_DEBUG_ST_MASK
1513e3ec7017SPing-Ke Shih };
1514e3ec7017SPing-Ke Shih 
1515e3ec7017SPing-Ke Shih static const struct rtw89_mac_dbg_port_info dbg_port_pcie_cxpl = {
1516e3ec7017SPing-Ke Shih 	.sel_addr = R_AX_PCIE_DBG_CTRL,
1517e3ec7017SPing-Ke Shih 	.sel_byte = 2,
1518e3ec7017SPing-Ke Shih 	.sel_msk = B_AX_DBG_SEL_MASK,
1519e3ec7017SPing-Ke Shih 	.srt = 0x00,
1520e3ec7017SPing-Ke Shih 	.end = 0x05,
1521e3ec7017SPing-Ke Shih 	.rd_addr = R_AX_DBG_PORT_SEL,
1522e3ec7017SPing-Ke Shih 	.rd_byte = 4,
1523e3ec7017SPing-Ke Shih 	.rd_msk = B_AX_DEBUG_ST_MASK
1524e3ec7017SPing-Ke Shih };
1525e3ec7017SPing-Ke Shih 
1526e3ec7017SPing-Ke Shih static const struct rtw89_mac_dbg_port_info dbg_port_pcie_io = {
1527e3ec7017SPing-Ke Shih 	.sel_addr = R_AX_PCIE_DBG_CTRL,
1528e3ec7017SPing-Ke Shih 	.sel_byte = 2,
1529e3ec7017SPing-Ke Shih 	.sel_msk = B_AX_DBG_SEL_MASK,
1530e3ec7017SPing-Ke Shih 	.srt = 0x00,
1531e3ec7017SPing-Ke Shih 	.end = 0x05,
1532e3ec7017SPing-Ke Shih 	.rd_addr = R_AX_DBG_PORT_SEL,
1533e3ec7017SPing-Ke Shih 	.rd_byte = 4,
1534e3ec7017SPing-Ke Shih 	.rd_msk = B_AX_DEBUG_ST_MASK
1535e3ec7017SPing-Ke Shih };
1536e3ec7017SPing-Ke Shih 
1537e3ec7017SPing-Ke Shih static const struct rtw89_mac_dbg_port_info dbg_port_pcie_misc = {
1538e3ec7017SPing-Ke Shih 	.sel_addr = R_AX_PCIE_DBG_CTRL,
1539e3ec7017SPing-Ke Shih 	.sel_byte = 2,
1540e3ec7017SPing-Ke Shih 	.sel_msk = B_AX_DBG_SEL_MASK,
1541e3ec7017SPing-Ke Shih 	.srt = 0x00,
1542e3ec7017SPing-Ke Shih 	.end = 0x06,
1543e3ec7017SPing-Ke Shih 	.rd_addr = R_AX_DBG_PORT_SEL,
1544e3ec7017SPing-Ke Shih 	.rd_byte = 4,
1545e3ec7017SPing-Ke Shih 	.rd_msk = B_AX_DEBUG_ST_MASK
1546e3ec7017SPing-Ke Shih };
1547e3ec7017SPing-Ke Shih 
1548e3ec7017SPing-Ke Shih static const struct rtw89_mac_dbg_port_info dbg_port_pcie_misc2 = {
1549e3ec7017SPing-Ke Shih 	.sel_addr = R_AX_DBG_CTRL,
1550e3ec7017SPing-Ke Shih 	.sel_byte = 1,
1551e3ec7017SPing-Ke Shih 	.sel_msk = B_AX_DBG_SEL0,
1552e3ec7017SPing-Ke Shih 	.srt = 0x34,
1553e3ec7017SPing-Ke Shih 	.end = 0x3C,
1554e3ec7017SPing-Ke Shih 	.rd_addr = R_AX_DBG_PORT_SEL,
1555e3ec7017SPing-Ke Shih 	.rd_byte = 4,
1556e3ec7017SPing-Ke Shih 	.rd_msk = B_AX_DEBUG_ST_MASK
1557e3ec7017SPing-Ke Shih };
1558e3ec7017SPing-Ke Shih 
1559e3ec7017SPing-Ke Shih static const struct rtw89_mac_dbg_port_info *
1560e3ec7017SPing-Ke Shih rtw89_debug_mac_dbg_port_sel(struct seq_file *m,
1561e3ec7017SPing-Ke Shih 			     struct rtw89_dev *rtwdev, u32 sel)
1562e3ec7017SPing-Ke Shih {
1563e3ec7017SPing-Ke Shih 	const struct rtw89_mac_dbg_port_info *info;
1564e3ec7017SPing-Ke Shih 	u32 val32;
1565e3ec7017SPing-Ke Shih 	u16 val16;
1566e3ec7017SPing-Ke Shih 	u8 val8;
1567e3ec7017SPing-Ke Shih 
1568e3ec7017SPing-Ke Shih 	switch (sel) {
1569e3ec7017SPing-Ke Shih 	case RTW89_DBG_PORT_SEL_PTCL_C0:
1570e3ec7017SPing-Ke Shih 		info = &dbg_port_ptcl_c0;
1571e3ec7017SPing-Ke Shih 		val16 = rtw89_read16(rtwdev, R_AX_PTCL_DBG);
1572e3ec7017SPing-Ke Shih 		val16 |= B_AX_PTCL_DBG_EN;
1573e3ec7017SPing-Ke Shih 		rtw89_write16(rtwdev, R_AX_PTCL_DBG, val16);
1574e3ec7017SPing-Ke Shih 		seq_puts(m, "Enable PTCL C0 dbgport.\n");
1575e3ec7017SPing-Ke Shih 		break;
1576e3ec7017SPing-Ke Shih 	case RTW89_DBG_PORT_SEL_PTCL_C1:
1577e3ec7017SPing-Ke Shih 		info = &dbg_port_ptcl_c1;
1578e3ec7017SPing-Ke Shih 		val16 = rtw89_read16(rtwdev, R_AX_PTCL_DBG_C1);
1579e3ec7017SPing-Ke Shih 		val16 |= B_AX_PTCL_DBG_EN;
1580e3ec7017SPing-Ke Shih 		rtw89_write16(rtwdev, R_AX_PTCL_DBG_C1, val16);
1581e3ec7017SPing-Ke Shih 		seq_puts(m, "Enable PTCL C1 dbgport.\n");
1582e3ec7017SPing-Ke Shih 		break;
1583e3ec7017SPing-Ke Shih 	case RTW89_DBG_PORT_SEL_SCH_C0:
1584e3ec7017SPing-Ke Shih 		info = &dbg_port_sch_c0;
1585e3ec7017SPing-Ke Shih 		val32 = rtw89_read32(rtwdev, R_AX_SCH_DBG_SEL);
1586e3ec7017SPing-Ke Shih 		val32 |= B_AX_SCH_DBG_EN;
1587e3ec7017SPing-Ke Shih 		rtw89_write32(rtwdev, R_AX_SCH_DBG_SEL, val32);
1588e3ec7017SPing-Ke Shih 		seq_puts(m, "Enable SCH C0 dbgport.\n");
1589e3ec7017SPing-Ke Shih 		break;
1590e3ec7017SPing-Ke Shih 	case RTW89_DBG_PORT_SEL_SCH_C1:
1591e3ec7017SPing-Ke Shih 		info = &dbg_port_sch_c1;
1592e3ec7017SPing-Ke Shih 		val32 = rtw89_read32(rtwdev, R_AX_SCH_DBG_SEL_C1);
1593e3ec7017SPing-Ke Shih 		val32 |= B_AX_SCH_DBG_EN;
1594e3ec7017SPing-Ke Shih 		rtw89_write32(rtwdev, R_AX_SCH_DBG_SEL_C1, val32);
1595e3ec7017SPing-Ke Shih 		seq_puts(m, "Enable SCH C1 dbgport.\n");
1596e3ec7017SPing-Ke Shih 		break;
1597e3ec7017SPing-Ke Shih 	case RTW89_DBG_PORT_SEL_TMAC_C0:
1598e3ec7017SPing-Ke Shih 		info = &dbg_port_tmac_c0;
1599e3ec7017SPing-Ke Shih 		val32 = rtw89_read32(rtwdev, R_AX_DBGSEL_TRXPTCL);
1600e3ec7017SPing-Ke Shih 		val32 = u32_replace_bits(val32, TRXPTRL_DBG_SEL_TMAC,
1601e3ec7017SPing-Ke Shih 					 B_AX_DBGSEL_TRXPTCL_MASK);
1602e3ec7017SPing-Ke Shih 		rtw89_write32(rtwdev, R_AX_DBGSEL_TRXPTCL, val32);
1603e3ec7017SPing-Ke Shih 
1604e3ec7017SPing-Ke Shih 		val32 = rtw89_read32(rtwdev, R_AX_DBG_CTRL);
1605e3ec7017SPing-Ke Shih 		val32 = u32_replace_bits(val32, TMAC_DBG_SEL_C0, B_AX_DBG_SEL0);
1606e3ec7017SPing-Ke Shih 		val32 = u32_replace_bits(val32, TMAC_DBG_SEL_C0, B_AX_DBG_SEL1);
1607e3ec7017SPing-Ke Shih 		rtw89_write32(rtwdev, R_AX_DBG_CTRL, val32);
1608e3ec7017SPing-Ke Shih 
1609e3ec7017SPing-Ke Shih 		val32 = rtw89_read32(rtwdev, R_AX_SYS_STATUS1);
1610e3ec7017SPing-Ke Shih 		val32 = u32_replace_bits(val32, MAC_DBG_SEL, B_AX_SEL_0XC0_MASK);
1611e3ec7017SPing-Ke Shih 		rtw89_write32(rtwdev, R_AX_SYS_STATUS1, val32);
1612e3ec7017SPing-Ke Shih 		seq_puts(m, "Enable TMAC C0 dbgport.\n");
1613e3ec7017SPing-Ke Shih 		break;
1614e3ec7017SPing-Ke Shih 	case RTW89_DBG_PORT_SEL_TMAC_C1:
1615e3ec7017SPing-Ke Shih 		info = &dbg_port_tmac_c1;
1616e3ec7017SPing-Ke Shih 		val32 = rtw89_read32(rtwdev, R_AX_DBGSEL_TRXPTCL_C1);
1617e3ec7017SPing-Ke Shih 		val32 = u32_replace_bits(val32, TRXPTRL_DBG_SEL_TMAC,
1618e3ec7017SPing-Ke Shih 					 B_AX_DBGSEL_TRXPTCL_MASK);
1619e3ec7017SPing-Ke Shih 		rtw89_write32(rtwdev, R_AX_DBGSEL_TRXPTCL_C1, val32);
1620e3ec7017SPing-Ke Shih 
1621e3ec7017SPing-Ke Shih 		val32 = rtw89_read32(rtwdev, R_AX_DBG_CTRL);
1622e3ec7017SPing-Ke Shih 		val32 = u32_replace_bits(val32, TMAC_DBG_SEL_C1, B_AX_DBG_SEL0);
1623e3ec7017SPing-Ke Shih 		val32 = u32_replace_bits(val32, TMAC_DBG_SEL_C1, B_AX_DBG_SEL1);
1624e3ec7017SPing-Ke Shih 		rtw89_write32(rtwdev, R_AX_DBG_CTRL, val32);
1625e3ec7017SPing-Ke Shih 
1626e3ec7017SPing-Ke Shih 		val32 = rtw89_read32(rtwdev, R_AX_SYS_STATUS1);
1627e3ec7017SPing-Ke Shih 		val32 = u32_replace_bits(val32, MAC_DBG_SEL, B_AX_SEL_0XC0_MASK);
1628e3ec7017SPing-Ke Shih 		rtw89_write32(rtwdev, R_AX_SYS_STATUS1, val32);
1629e3ec7017SPing-Ke Shih 		seq_puts(m, "Enable TMAC C1 dbgport.\n");
1630e3ec7017SPing-Ke Shih 		break;
1631e3ec7017SPing-Ke Shih 	case RTW89_DBG_PORT_SEL_RMAC_C0:
1632e3ec7017SPing-Ke Shih 		info = &dbg_port_rmac_c0;
1633e3ec7017SPing-Ke Shih 		val32 = rtw89_read32(rtwdev, R_AX_DBGSEL_TRXPTCL);
1634e3ec7017SPing-Ke Shih 		val32 = u32_replace_bits(val32, TRXPTRL_DBG_SEL_RMAC,
1635e3ec7017SPing-Ke Shih 					 B_AX_DBGSEL_TRXPTCL_MASK);
1636e3ec7017SPing-Ke Shih 		rtw89_write32(rtwdev, R_AX_DBGSEL_TRXPTCL, val32);
1637e3ec7017SPing-Ke Shih 
1638e3ec7017SPing-Ke Shih 		val32 = rtw89_read32(rtwdev, R_AX_DBG_CTRL);
1639e3ec7017SPing-Ke Shih 		val32 = u32_replace_bits(val32, RMAC_DBG_SEL_C0, B_AX_DBG_SEL0);
1640e3ec7017SPing-Ke Shih 		val32 = u32_replace_bits(val32, RMAC_DBG_SEL_C0, B_AX_DBG_SEL1);
1641e3ec7017SPing-Ke Shih 		rtw89_write32(rtwdev, R_AX_DBG_CTRL, val32);
1642e3ec7017SPing-Ke Shih 
1643e3ec7017SPing-Ke Shih 		val32 = rtw89_read32(rtwdev, R_AX_SYS_STATUS1);
1644e3ec7017SPing-Ke Shih 		val32 = u32_replace_bits(val32, MAC_DBG_SEL, B_AX_SEL_0XC0_MASK);
1645e3ec7017SPing-Ke Shih 		rtw89_write32(rtwdev, R_AX_SYS_STATUS1, val32);
1646e3ec7017SPing-Ke Shih 
1647e3ec7017SPing-Ke Shih 		val8 = rtw89_read8(rtwdev, R_AX_DBGSEL_TRXPTCL);
1648e3ec7017SPing-Ke Shih 		val8 = u8_replace_bits(val8, RMAC_CMAC_DBG_SEL,
1649e3ec7017SPing-Ke Shih 				       B_AX_DBGSEL_TRXPTCL_MASK);
1650e3ec7017SPing-Ke Shih 		rtw89_write8(rtwdev, R_AX_DBGSEL_TRXPTCL, val8);
1651e3ec7017SPing-Ke Shih 		seq_puts(m, "Enable RMAC C0 dbgport.\n");
1652e3ec7017SPing-Ke Shih 		break;
1653e3ec7017SPing-Ke Shih 	case RTW89_DBG_PORT_SEL_RMAC_C1:
1654e3ec7017SPing-Ke Shih 		info = &dbg_port_rmac_c1;
1655e3ec7017SPing-Ke Shih 		val32 = rtw89_read32(rtwdev, R_AX_DBGSEL_TRXPTCL_C1);
1656e3ec7017SPing-Ke Shih 		val32 = u32_replace_bits(val32, TRXPTRL_DBG_SEL_RMAC,
1657e3ec7017SPing-Ke Shih 					 B_AX_DBGSEL_TRXPTCL_MASK);
1658e3ec7017SPing-Ke Shih 		rtw89_write32(rtwdev, R_AX_DBGSEL_TRXPTCL_C1, val32);
1659e3ec7017SPing-Ke Shih 
1660e3ec7017SPing-Ke Shih 		val32 = rtw89_read32(rtwdev, R_AX_DBG_CTRL);
1661e3ec7017SPing-Ke Shih 		val32 = u32_replace_bits(val32, RMAC_DBG_SEL_C1, B_AX_DBG_SEL0);
1662e3ec7017SPing-Ke Shih 		val32 = u32_replace_bits(val32, RMAC_DBG_SEL_C1, B_AX_DBG_SEL1);
1663e3ec7017SPing-Ke Shih 		rtw89_write32(rtwdev, R_AX_DBG_CTRL, val32);
1664e3ec7017SPing-Ke Shih 
1665e3ec7017SPing-Ke Shih 		val32 = rtw89_read32(rtwdev, R_AX_SYS_STATUS1);
1666e3ec7017SPing-Ke Shih 		val32 = u32_replace_bits(val32, MAC_DBG_SEL, B_AX_SEL_0XC0_MASK);
1667e3ec7017SPing-Ke Shih 		rtw89_write32(rtwdev, R_AX_SYS_STATUS1, val32);
1668e3ec7017SPing-Ke Shih 
1669e3ec7017SPing-Ke Shih 		val8 = rtw89_read8(rtwdev, R_AX_DBGSEL_TRXPTCL_C1);
1670e3ec7017SPing-Ke Shih 		val8 = u8_replace_bits(val8, RMAC_CMAC_DBG_SEL,
1671e3ec7017SPing-Ke Shih 				       B_AX_DBGSEL_TRXPTCL_MASK);
1672e3ec7017SPing-Ke Shih 		rtw89_write8(rtwdev, R_AX_DBGSEL_TRXPTCL_C1, val8);
1673e3ec7017SPing-Ke Shih 		seq_puts(m, "Enable RMAC C1 dbgport.\n");
1674e3ec7017SPing-Ke Shih 		break;
1675e3ec7017SPing-Ke Shih 	case RTW89_DBG_PORT_SEL_RMACST_C0:
1676e3ec7017SPing-Ke Shih 		info = &dbg_port_rmacst_c0;
1677e3ec7017SPing-Ke Shih 		seq_puts(m, "Enable RMAC state C0 dbgport.\n");
1678e3ec7017SPing-Ke Shih 		break;
1679e3ec7017SPing-Ke Shih 	case RTW89_DBG_PORT_SEL_RMACST_C1:
1680e3ec7017SPing-Ke Shih 		info = &dbg_port_rmacst_c1;
1681e3ec7017SPing-Ke Shih 		seq_puts(m, "Enable RMAC state C1 dbgport.\n");
1682e3ec7017SPing-Ke Shih 		break;
1683e3ec7017SPing-Ke Shih 	case RTW89_DBG_PORT_SEL_RMAC_PLCP_C0:
1684e3ec7017SPing-Ke Shih 		info = &dbg_port_rmac_plcp_c0;
1685e3ec7017SPing-Ke Shih 		seq_puts(m, "Enable RMAC PLCP C0 dbgport.\n");
1686e3ec7017SPing-Ke Shih 		break;
1687e3ec7017SPing-Ke Shih 	case RTW89_DBG_PORT_SEL_RMAC_PLCP_C1:
1688e3ec7017SPing-Ke Shih 		info = &dbg_port_rmac_plcp_c1;
1689e3ec7017SPing-Ke Shih 		seq_puts(m, "Enable RMAC PLCP C1 dbgport.\n");
1690e3ec7017SPing-Ke Shih 		break;
1691e3ec7017SPing-Ke Shih 	case RTW89_DBG_PORT_SEL_TRXPTCL_C0:
1692e3ec7017SPing-Ke Shih 		info = &dbg_port_trxptcl_c0;
1693e3ec7017SPing-Ke Shih 		val32 = rtw89_read32(rtwdev, R_AX_DBG_CTRL);
1694e3ec7017SPing-Ke Shih 		val32 = u32_replace_bits(val32, TRXPTCL_DBG_SEL_C0, B_AX_DBG_SEL0);
1695e3ec7017SPing-Ke Shih 		val32 = u32_replace_bits(val32, TRXPTCL_DBG_SEL_C0, B_AX_DBG_SEL1);
1696e3ec7017SPing-Ke Shih 		rtw89_write32(rtwdev, R_AX_DBG_CTRL, val32);
1697e3ec7017SPing-Ke Shih 
1698e3ec7017SPing-Ke Shih 		val32 = rtw89_read32(rtwdev, R_AX_SYS_STATUS1);
1699e3ec7017SPing-Ke Shih 		val32 = u32_replace_bits(val32, MAC_DBG_SEL, B_AX_SEL_0XC0_MASK);
1700e3ec7017SPing-Ke Shih 		rtw89_write32(rtwdev, R_AX_SYS_STATUS1, val32);
1701e3ec7017SPing-Ke Shih 		seq_puts(m, "Enable TRXPTCL C0 dbgport.\n");
1702e3ec7017SPing-Ke Shih 		break;
1703e3ec7017SPing-Ke Shih 	case RTW89_DBG_PORT_SEL_TRXPTCL_C1:
1704e3ec7017SPing-Ke Shih 		info = &dbg_port_trxptcl_c1;
1705e3ec7017SPing-Ke Shih 		val32 = rtw89_read32(rtwdev, R_AX_DBG_CTRL);
1706e3ec7017SPing-Ke Shih 		val32 = u32_replace_bits(val32, TRXPTCL_DBG_SEL_C1, B_AX_DBG_SEL0);
1707e3ec7017SPing-Ke Shih 		val32 = u32_replace_bits(val32, TRXPTCL_DBG_SEL_C1, B_AX_DBG_SEL1);
1708e3ec7017SPing-Ke Shih 		rtw89_write32(rtwdev, R_AX_DBG_CTRL, val32);
1709e3ec7017SPing-Ke Shih 
1710e3ec7017SPing-Ke Shih 		val32 = rtw89_read32(rtwdev, R_AX_SYS_STATUS1);
1711e3ec7017SPing-Ke Shih 		val32 = u32_replace_bits(val32, MAC_DBG_SEL, B_AX_SEL_0XC0_MASK);
1712e3ec7017SPing-Ke Shih 		rtw89_write32(rtwdev, R_AX_SYS_STATUS1, val32);
1713e3ec7017SPing-Ke Shih 		seq_puts(m, "Enable TRXPTCL C1 dbgport.\n");
1714e3ec7017SPing-Ke Shih 		break;
1715e3ec7017SPing-Ke Shih 	case RTW89_DBG_PORT_SEL_TX_INFOL_C0:
1716e3ec7017SPing-Ke Shih 		info = &dbg_port_tx_infol_c0;
1717e3ec7017SPing-Ke Shih 		val32 = rtw89_read32(rtwdev, R_AX_TCR1);
1718e3ec7017SPing-Ke Shih 		val32 |= B_AX_TCR_FORCE_READ_TXDFIFO;
1719e3ec7017SPing-Ke Shih 		rtw89_write32(rtwdev, R_AX_TCR1, val32);
1720e3ec7017SPing-Ke Shih 		seq_puts(m, "Enable tx infol dump.\n");
1721e3ec7017SPing-Ke Shih 		break;
1722e3ec7017SPing-Ke Shih 	case RTW89_DBG_PORT_SEL_TX_INFOH_C0:
1723e3ec7017SPing-Ke Shih 		info = &dbg_port_tx_infoh_c0;
1724e3ec7017SPing-Ke Shih 		val32 = rtw89_read32(rtwdev, R_AX_TCR1);
1725e3ec7017SPing-Ke Shih 		val32 |= B_AX_TCR_FORCE_READ_TXDFIFO;
1726e3ec7017SPing-Ke Shih 		rtw89_write32(rtwdev, R_AX_TCR1, val32);
1727e3ec7017SPing-Ke Shih 		seq_puts(m, "Enable tx infoh dump.\n");
1728e3ec7017SPing-Ke Shih 		break;
1729e3ec7017SPing-Ke Shih 	case RTW89_DBG_PORT_SEL_TX_INFOL_C1:
1730e3ec7017SPing-Ke Shih 		info = &dbg_port_tx_infol_c1;
1731e3ec7017SPing-Ke Shih 		val32 = rtw89_read32(rtwdev, R_AX_TCR1_C1);
1732e3ec7017SPing-Ke Shih 		val32 |= B_AX_TCR_FORCE_READ_TXDFIFO;
1733e3ec7017SPing-Ke Shih 		rtw89_write32(rtwdev, R_AX_TCR1_C1, val32);
1734e3ec7017SPing-Ke Shih 		seq_puts(m, "Enable tx infol dump.\n");
1735e3ec7017SPing-Ke Shih 		break;
1736e3ec7017SPing-Ke Shih 	case RTW89_DBG_PORT_SEL_TX_INFOH_C1:
1737e3ec7017SPing-Ke Shih 		info = &dbg_port_tx_infoh_c1;
1738e3ec7017SPing-Ke Shih 		val32 = rtw89_read32(rtwdev, R_AX_TCR1_C1);
1739e3ec7017SPing-Ke Shih 		val32 |= B_AX_TCR_FORCE_READ_TXDFIFO;
1740e3ec7017SPing-Ke Shih 		rtw89_write32(rtwdev, R_AX_TCR1_C1, val32);
1741e3ec7017SPing-Ke Shih 		seq_puts(m, "Enable tx infoh dump.\n");
1742e3ec7017SPing-Ke Shih 		break;
1743e3ec7017SPing-Ke Shih 	case RTW89_DBG_PORT_SEL_TXTF_INFOL_C0:
1744e3ec7017SPing-Ke Shih 		info = &dbg_port_txtf_infol_c0;
1745e3ec7017SPing-Ke Shih 		val32 = rtw89_read32(rtwdev, R_AX_TCR1);
1746e3ec7017SPing-Ke Shih 		val32 |= B_AX_TCR_FORCE_READ_TXDFIFO;
1747e3ec7017SPing-Ke Shih 		rtw89_write32(rtwdev, R_AX_TCR1, val32);
1748e3ec7017SPing-Ke Shih 		seq_puts(m, "Enable tx tf infol dump.\n");
1749e3ec7017SPing-Ke Shih 		break;
1750e3ec7017SPing-Ke Shih 	case RTW89_DBG_PORT_SEL_TXTF_INFOH_C0:
1751e3ec7017SPing-Ke Shih 		info = &dbg_port_txtf_infoh_c0;
1752e3ec7017SPing-Ke Shih 		val32 = rtw89_read32(rtwdev, R_AX_TCR1);
1753e3ec7017SPing-Ke Shih 		val32 |= B_AX_TCR_FORCE_READ_TXDFIFO;
1754e3ec7017SPing-Ke Shih 		rtw89_write32(rtwdev, R_AX_TCR1, val32);
1755e3ec7017SPing-Ke Shih 		seq_puts(m, "Enable tx tf infoh dump.\n");
1756e3ec7017SPing-Ke Shih 		break;
1757e3ec7017SPing-Ke Shih 	case RTW89_DBG_PORT_SEL_TXTF_INFOL_C1:
1758e3ec7017SPing-Ke Shih 		info = &dbg_port_txtf_infol_c1;
1759e3ec7017SPing-Ke Shih 		val32 = rtw89_read32(rtwdev, R_AX_TCR1_C1);
1760e3ec7017SPing-Ke Shih 		val32 |= B_AX_TCR_FORCE_READ_TXDFIFO;
1761e3ec7017SPing-Ke Shih 		rtw89_write32(rtwdev, R_AX_TCR1_C1, val32);
1762e3ec7017SPing-Ke Shih 		seq_puts(m, "Enable tx tf infol dump.\n");
1763e3ec7017SPing-Ke Shih 		break;
1764e3ec7017SPing-Ke Shih 	case RTW89_DBG_PORT_SEL_TXTF_INFOH_C1:
1765e3ec7017SPing-Ke Shih 		info = &dbg_port_txtf_infoh_c1;
1766e3ec7017SPing-Ke Shih 		val32 = rtw89_read32(rtwdev, R_AX_TCR1_C1);
1767e3ec7017SPing-Ke Shih 		val32 |= B_AX_TCR_FORCE_READ_TXDFIFO;
1768e3ec7017SPing-Ke Shih 		rtw89_write32(rtwdev, R_AX_TCR1_C1, val32);
1769e3ec7017SPing-Ke Shih 		seq_puts(m, "Enable tx tf infoh dump.\n");
1770e3ec7017SPing-Ke Shih 		break;
1771e3ec7017SPing-Ke Shih 	case RTW89_DBG_PORT_SEL_WDE_BUFMGN_FREEPG:
1772e3ec7017SPing-Ke Shih 		info = &dbg_port_wde_bufmgn_freepg;
1773e3ec7017SPing-Ke Shih 		seq_puts(m, "Enable wde bufmgn freepg dump.\n");
1774e3ec7017SPing-Ke Shih 		break;
1775e3ec7017SPing-Ke Shih 	case RTW89_DBG_PORT_SEL_WDE_BUFMGN_QUOTA:
1776e3ec7017SPing-Ke Shih 		info = &dbg_port_wde_bufmgn_quota;
1777e3ec7017SPing-Ke Shih 		seq_puts(m, "Enable wde bufmgn quota dump.\n");
1778e3ec7017SPing-Ke Shih 		break;
1779e3ec7017SPing-Ke Shih 	case RTW89_DBG_PORT_SEL_WDE_BUFMGN_PAGELLT:
1780e3ec7017SPing-Ke Shih 		info = &dbg_port_wde_bufmgn_pagellt;
1781e3ec7017SPing-Ke Shih 		seq_puts(m, "Enable wde bufmgn pagellt dump.\n");
1782e3ec7017SPing-Ke Shih 		break;
1783e3ec7017SPing-Ke Shih 	case RTW89_DBG_PORT_SEL_WDE_BUFMGN_PKTINFO:
1784e3ec7017SPing-Ke Shih 		info = &dbg_port_wde_bufmgn_pktinfo;
1785e3ec7017SPing-Ke Shih 		seq_puts(m, "Enable wde bufmgn pktinfo dump.\n");
1786e3ec7017SPing-Ke Shih 		break;
1787e3ec7017SPing-Ke Shih 	case RTW89_DBG_PORT_SEL_WDE_QUEMGN_PREPKT:
1788e3ec7017SPing-Ke Shih 		info = &dbg_port_wde_quemgn_prepkt;
1789e3ec7017SPing-Ke Shih 		seq_puts(m, "Enable wde quemgn prepkt dump.\n");
1790e3ec7017SPing-Ke Shih 		break;
1791e3ec7017SPing-Ke Shih 	case RTW89_DBG_PORT_SEL_WDE_QUEMGN_NXTPKT:
1792e3ec7017SPing-Ke Shih 		info = &dbg_port_wde_quemgn_nxtpkt;
1793e3ec7017SPing-Ke Shih 		seq_puts(m, "Enable wde quemgn nxtpkt dump.\n");
1794e3ec7017SPing-Ke Shih 		break;
1795e3ec7017SPing-Ke Shih 	case RTW89_DBG_PORT_SEL_WDE_QUEMGN_QLNKTBL:
1796e3ec7017SPing-Ke Shih 		info = &dbg_port_wde_quemgn_qlnktbl;
1797e3ec7017SPing-Ke Shih 		seq_puts(m, "Enable wde quemgn qlnktbl dump.\n");
1798e3ec7017SPing-Ke Shih 		break;
1799e3ec7017SPing-Ke Shih 	case RTW89_DBG_PORT_SEL_WDE_QUEMGN_QEMPTY:
1800e3ec7017SPing-Ke Shih 		info = &dbg_port_wde_quemgn_qempty;
1801e3ec7017SPing-Ke Shih 		seq_puts(m, "Enable wde quemgn qempty dump.\n");
1802e3ec7017SPing-Ke Shih 		break;
1803e3ec7017SPing-Ke Shih 	case RTW89_DBG_PORT_SEL_PLE_BUFMGN_FREEPG:
1804e3ec7017SPing-Ke Shih 		info = &dbg_port_ple_bufmgn_freepg;
1805e3ec7017SPing-Ke Shih 		seq_puts(m, "Enable ple bufmgn freepg dump.\n");
1806e3ec7017SPing-Ke Shih 		break;
1807e3ec7017SPing-Ke Shih 	case RTW89_DBG_PORT_SEL_PLE_BUFMGN_QUOTA:
1808e3ec7017SPing-Ke Shih 		info = &dbg_port_ple_bufmgn_quota;
1809e3ec7017SPing-Ke Shih 		seq_puts(m, "Enable ple bufmgn quota dump.\n");
1810e3ec7017SPing-Ke Shih 		break;
1811e3ec7017SPing-Ke Shih 	case RTW89_DBG_PORT_SEL_PLE_BUFMGN_PAGELLT:
1812e3ec7017SPing-Ke Shih 		info = &dbg_port_ple_bufmgn_pagellt;
1813e3ec7017SPing-Ke Shih 		seq_puts(m, "Enable ple bufmgn pagellt dump.\n");
1814e3ec7017SPing-Ke Shih 		break;
1815e3ec7017SPing-Ke Shih 	case RTW89_DBG_PORT_SEL_PLE_BUFMGN_PKTINFO:
1816e3ec7017SPing-Ke Shih 		info = &dbg_port_ple_bufmgn_pktinfo;
1817e3ec7017SPing-Ke Shih 		seq_puts(m, "Enable ple bufmgn pktinfo dump.\n");
1818e3ec7017SPing-Ke Shih 		break;
1819e3ec7017SPing-Ke Shih 	case RTW89_DBG_PORT_SEL_PLE_QUEMGN_PREPKT:
1820e3ec7017SPing-Ke Shih 		info = &dbg_port_ple_quemgn_prepkt;
1821e3ec7017SPing-Ke Shih 		seq_puts(m, "Enable ple quemgn prepkt dump.\n");
1822e3ec7017SPing-Ke Shih 		break;
1823e3ec7017SPing-Ke Shih 	case RTW89_DBG_PORT_SEL_PLE_QUEMGN_NXTPKT:
1824e3ec7017SPing-Ke Shih 		info = &dbg_port_ple_quemgn_nxtpkt;
1825e3ec7017SPing-Ke Shih 		seq_puts(m, "Enable ple quemgn nxtpkt dump.\n");
1826e3ec7017SPing-Ke Shih 		break;
1827e3ec7017SPing-Ke Shih 	case RTW89_DBG_PORT_SEL_PLE_QUEMGN_QLNKTBL:
1828e3ec7017SPing-Ke Shih 		info = &dbg_port_ple_quemgn_qlnktbl;
1829e3ec7017SPing-Ke Shih 		seq_puts(m, "Enable ple quemgn qlnktbl dump.\n");
1830e3ec7017SPing-Ke Shih 		break;
1831e3ec7017SPing-Ke Shih 	case RTW89_DBG_PORT_SEL_PLE_QUEMGN_QEMPTY:
1832e3ec7017SPing-Ke Shih 		info = &dbg_port_ple_quemgn_qempty;
1833e3ec7017SPing-Ke Shih 		seq_puts(m, "Enable ple quemgn qempty dump.\n");
1834e3ec7017SPing-Ke Shih 		break;
1835e3ec7017SPing-Ke Shih 	case RTW89_DBG_PORT_SEL_PKTINFO:
1836e3ec7017SPing-Ke Shih 		info = &dbg_port_pktinfo;
1837e3ec7017SPing-Ke Shih 		seq_puts(m, "Enable pktinfo dump.\n");
1838e3ec7017SPing-Ke Shih 		break;
1839e3ec7017SPing-Ke Shih 	case RTW89_DBG_PORT_SEL_PCIE_TXDMA:
1840e3ec7017SPing-Ke Shih 		info = &dbg_port_pcie_txdma;
1841e3ec7017SPing-Ke Shih 		val32 = rtw89_read32(rtwdev, R_AX_DBG_CTRL);
1842e3ec7017SPing-Ke Shih 		val32 = u32_replace_bits(val32, PCIE_TXDMA_DBG_SEL, B_AX_DBG_SEL0);
1843e3ec7017SPing-Ke Shih 		val32 = u32_replace_bits(val32, PCIE_TXDMA_DBG_SEL, B_AX_DBG_SEL1);
1844e3ec7017SPing-Ke Shih 		rtw89_write32(rtwdev, R_AX_DBG_CTRL, val32);
1845e3ec7017SPing-Ke Shih 		seq_puts(m, "Enable pcie txdma dump.\n");
1846e3ec7017SPing-Ke Shih 		break;
1847e3ec7017SPing-Ke Shih 	case RTW89_DBG_PORT_SEL_PCIE_RXDMA:
1848e3ec7017SPing-Ke Shih 		info = &dbg_port_pcie_rxdma;
1849e3ec7017SPing-Ke Shih 		val32 = rtw89_read32(rtwdev, R_AX_DBG_CTRL);
1850e3ec7017SPing-Ke Shih 		val32 = u32_replace_bits(val32, PCIE_RXDMA_DBG_SEL, B_AX_DBG_SEL0);
1851e3ec7017SPing-Ke Shih 		val32 = u32_replace_bits(val32, PCIE_RXDMA_DBG_SEL, B_AX_DBG_SEL1);
1852e3ec7017SPing-Ke Shih 		rtw89_write32(rtwdev, R_AX_DBG_CTRL, val32);
1853e3ec7017SPing-Ke Shih 		seq_puts(m, "Enable pcie rxdma dump.\n");
1854e3ec7017SPing-Ke Shih 		break;
1855e3ec7017SPing-Ke Shih 	case RTW89_DBG_PORT_SEL_PCIE_CVT:
1856e3ec7017SPing-Ke Shih 		info = &dbg_port_pcie_cvt;
1857e3ec7017SPing-Ke Shih 		val32 = rtw89_read32(rtwdev, R_AX_DBG_CTRL);
1858e3ec7017SPing-Ke Shih 		val32 = u32_replace_bits(val32, PCIE_CVT_DBG_SEL, B_AX_DBG_SEL0);
1859e3ec7017SPing-Ke Shih 		val32 = u32_replace_bits(val32, PCIE_CVT_DBG_SEL, B_AX_DBG_SEL1);
1860e3ec7017SPing-Ke Shih 		rtw89_write32(rtwdev, R_AX_DBG_CTRL, val32);
1861e3ec7017SPing-Ke Shih 		seq_puts(m, "Enable pcie cvt dump.\n");
1862e3ec7017SPing-Ke Shih 		break;
1863e3ec7017SPing-Ke Shih 	case RTW89_DBG_PORT_SEL_PCIE_CXPL:
1864e3ec7017SPing-Ke Shih 		info = &dbg_port_pcie_cxpl;
1865e3ec7017SPing-Ke Shih 		val32 = rtw89_read32(rtwdev, R_AX_DBG_CTRL);
1866e3ec7017SPing-Ke Shih 		val32 = u32_replace_bits(val32, PCIE_CXPL_DBG_SEL, B_AX_DBG_SEL0);
1867e3ec7017SPing-Ke Shih 		val32 = u32_replace_bits(val32, PCIE_CXPL_DBG_SEL, B_AX_DBG_SEL1);
1868e3ec7017SPing-Ke Shih 		rtw89_write32(rtwdev, R_AX_DBG_CTRL, val32);
1869e3ec7017SPing-Ke Shih 		seq_puts(m, "Enable pcie cxpl dump.\n");
1870e3ec7017SPing-Ke Shih 		break;
1871e3ec7017SPing-Ke Shih 	case RTW89_DBG_PORT_SEL_PCIE_IO:
1872e3ec7017SPing-Ke Shih 		info = &dbg_port_pcie_io;
1873e3ec7017SPing-Ke Shih 		val32 = rtw89_read32(rtwdev, R_AX_DBG_CTRL);
1874e3ec7017SPing-Ke Shih 		val32 = u32_replace_bits(val32, PCIE_IO_DBG_SEL, B_AX_DBG_SEL0);
1875e3ec7017SPing-Ke Shih 		val32 = u32_replace_bits(val32, PCIE_IO_DBG_SEL, B_AX_DBG_SEL1);
1876e3ec7017SPing-Ke Shih 		rtw89_write32(rtwdev, R_AX_DBG_CTRL, val32);
1877e3ec7017SPing-Ke Shih 		seq_puts(m, "Enable pcie io dump.\n");
1878e3ec7017SPing-Ke Shih 		break;
1879e3ec7017SPing-Ke Shih 	case RTW89_DBG_PORT_SEL_PCIE_MISC:
1880e3ec7017SPing-Ke Shih 		info = &dbg_port_pcie_misc;
1881e3ec7017SPing-Ke Shih 		val32 = rtw89_read32(rtwdev, R_AX_DBG_CTRL);
1882e3ec7017SPing-Ke Shih 		val32 = u32_replace_bits(val32, PCIE_MISC_DBG_SEL, B_AX_DBG_SEL0);
1883e3ec7017SPing-Ke Shih 		val32 = u32_replace_bits(val32, PCIE_MISC_DBG_SEL, B_AX_DBG_SEL1);
1884e3ec7017SPing-Ke Shih 		rtw89_write32(rtwdev, R_AX_DBG_CTRL, val32);
1885e3ec7017SPing-Ke Shih 		seq_puts(m, "Enable pcie misc dump.\n");
1886e3ec7017SPing-Ke Shih 		break;
1887e3ec7017SPing-Ke Shih 	case RTW89_DBG_PORT_SEL_PCIE_MISC2:
1888e3ec7017SPing-Ke Shih 		info = &dbg_port_pcie_misc2;
1889e3ec7017SPing-Ke Shih 		val16 = rtw89_read16(rtwdev, R_AX_PCIE_DBG_CTRL);
1890e3ec7017SPing-Ke Shih 		val16 = u16_replace_bits(val16, PCIE_MISC2_DBG_SEL,
1891e3ec7017SPing-Ke Shih 					 B_AX_DBG_SEL_MASK);
1892e3ec7017SPing-Ke Shih 		rtw89_write16(rtwdev, R_AX_PCIE_DBG_CTRL, val16);
1893e3ec7017SPing-Ke Shih 		seq_puts(m, "Enable pcie misc2 dump.\n");
1894e3ec7017SPing-Ke Shih 		break;
1895e3ec7017SPing-Ke Shih 	default:
1896e3ec7017SPing-Ke Shih 		seq_puts(m, "Dbg port select err\n");
1897e3ec7017SPing-Ke Shih 		return NULL;
1898e3ec7017SPing-Ke Shih 	}
1899e3ec7017SPing-Ke Shih 
1900e3ec7017SPing-Ke Shih 	return info;
1901e3ec7017SPing-Ke Shih }
1902e3ec7017SPing-Ke Shih 
1903e3ec7017SPing-Ke Shih static bool is_dbg_port_valid(struct rtw89_dev *rtwdev, u32 sel)
1904e3ec7017SPing-Ke Shih {
1905e3ec7017SPing-Ke Shih 	if (rtwdev->hci.type != RTW89_HCI_TYPE_PCIE &&
1906e3ec7017SPing-Ke Shih 	    sel >= RTW89_DBG_PORT_SEL_PCIE_TXDMA &&
1907e3ec7017SPing-Ke Shih 	    sel <= RTW89_DBG_PORT_SEL_PCIE_MISC2)
1908e3ec7017SPing-Ke Shih 		return false;
1909e3ec7017SPing-Ke Shih 	if (rtwdev->chip->chip_id == RTL8852B &&
1910e3ec7017SPing-Ke Shih 	    sel >= RTW89_DBG_PORT_SEL_PTCL_C1 &&
1911e3ec7017SPing-Ke Shih 	    sel <= RTW89_DBG_PORT_SEL_TXTF_INFOH_C1)
1912e3ec7017SPing-Ke Shih 		return false;
1913e3ec7017SPing-Ke Shih 	if (rtw89_mac_check_mac_en(rtwdev, 0, RTW89_DMAC_SEL) &&
1914e3ec7017SPing-Ke Shih 	    sel >= RTW89_DBG_PORT_SEL_WDE_BUFMGN_FREEPG &&
1915e3ec7017SPing-Ke Shih 	    sel <= RTW89_DBG_PORT_SEL_PKTINFO)
1916e3ec7017SPing-Ke Shih 		return false;
1917e3ec7017SPing-Ke Shih 	if (rtw89_mac_check_mac_en(rtwdev, 0, RTW89_CMAC_SEL) &&
1918e3ec7017SPing-Ke Shih 	    sel >= RTW89_DBG_PORT_SEL_PTCL_C0 &&
1919e3ec7017SPing-Ke Shih 	    sel <= RTW89_DBG_PORT_SEL_TXTF_INFOH_C0)
1920e3ec7017SPing-Ke Shih 		return false;
1921e3ec7017SPing-Ke Shih 	if (rtw89_mac_check_mac_en(rtwdev, 1, RTW89_CMAC_SEL) &&
1922e3ec7017SPing-Ke Shih 	    sel >= RTW89_DBG_PORT_SEL_PTCL_C1 &&
1923e3ec7017SPing-Ke Shih 	    sel <= RTW89_DBG_PORT_SEL_TXTF_INFOH_C1)
1924e3ec7017SPing-Ke Shih 		return false;
1925e3ec7017SPing-Ke Shih 
1926e3ec7017SPing-Ke Shih 	return true;
1927e3ec7017SPing-Ke Shih }
1928e3ec7017SPing-Ke Shih 
1929e3ec7017SPing-Ke Shih static int rtw89_debug_mac_dbg_port_dump(struct rtw89_dev *rtwdev,
1930e3ec7017SPing-Ke Shih 					 struct seq_file *m, u32 sel)
1931e3ec7017SPing-Ke Shih {
1932e3ec7017SPing-Ke Shih 	const struct rtw89_mac_dbg_port_info *info;
1933e3ec7017SPing-Ke Shih 	u8 val8;
1934e3ec7017SPing-Ke Shih 	u16 val16;
1935e3ec7017SPing-Ke Shih 	u32 val32;
1936e3ec7017SPing-Ke Shih 	u32 i;
1937e3ec7017SPing-Ke Shih 
1938e3ec7017SPing-Ke Shih 	info = rtw89_debug_mac_dbg_port_sel(m, rtwdev, sel);
1939e3ec7017SPing-Ke Shih 	if (!info) {
1940e3ec7017SPing-Ke Shih 		rtw89_err(rtwdev, "failed to select debug port %d\n", sel);
1941e3ec7017SPing-Ke Shih 		return -EINVAL;
1942e3ec7017SPing-Ke Shih 	}
1943e3ec7017SPing-Ke Shih 
1944e3ec7017SPing-Ke Shih #define case_DBG_SEL(__sel) \
1945e3ec7017SPing-Ke Shih 	case RTW89_DBG_PORT_SEL_##__sel: \
1946e3ec7017SPing-Ke Shih 		seq_puts(m, "Dump debug port " #__sel ":\n"); \
1947e3ec7017SPing-Ke Shih 		break
1948e3ec7017SPing-Ke Shih 
1949e3ec7017SPing-Ke Shih 	switch (sel) {
1950e3ec7017SPing-Ke Shih 	case_DBG_SEL(PTCL_C0);
1951e3ec7017SPing-Ke Shih 	case_DBG_SEL(PTCL_C1);
1952e3ec7017SPing-Ke Shih 	case_DBG_SEL(SCH_C0);
1953e3ec7017SPing-Ke Shih 	case_DBG_SEL(SCH_C1);
1954e3ec7017SPing-Ke Shih 	case_DBG_SEL(TMAC_C0);
1955e3ec7017SPing-Ke Shih 	case_DBG_SEL(TMAC_C1);
1956e3ec7017SPing-Ke Shih 	case_DBG_SEL(RMAC_C0);
1957e3ec7017SPing-Ke Shih 	case_DBG_SEL(RMAC_C1);
1958e3ec7017SPing-Ke Shih 	case_DBG_SEL(RMACST_C0);
1959e3ec7017SPing-Ke Shih 	case_DBG_SEL(RMACST_C1);
1960e3ec7017SPing-Ke Shih 	case_DBG_SEL(TRXPTCL_C0);
1961e3ec7017SPing-Ke Shih 	case_DBG_SEL(TRXPTCL_C1);
1962e3ec7017SPing-Ke Shih 	case_DBG_SEL(TX_INFOL_C0);
1963e3ec7017SPing-Ke Shih 	case_DBG_SEL(TX_INFOH_C0);
1964e3ec7017SPing-Ke Shih 	case_DBG_SEL(TX_INFOL_C1);
1965e3ec7017SPing-Ke Shih 	case_DBG_SEL(TX_INFOH_C1);
1966e3ec7017SPing-Ke Shih 	case_DBG_SEL(TXTF_INFOL_C0);
1967e3ec7017SPing-Ke Shih 	case_DBG_SEL(TXTF_INFOH_C0);
1968e3ec7017SPing-Ke Shih 	case_DBG_SEL(TXTF_INFOL_C1);
1969e3ec7017SPing-Ke Shih 	case_DBG_SEL(TXTF_INFOH_C1);
1970e3ec7017SPing-Ke Shih 	case_DBG_SEL(WDE_BUFMGN_FREEPG);
1971e3ec7017SPing-Ke Shih 	case_DBG_SEL(WDE_BUFMGN_QUOTA);
1972e3ec7017SPing-Ke Shih 	case_DBG_SEL(WDE_BUFMGN_PAGELLT);
1973e3ec7017SPing-Ke Shih 	case_DBG_SEL(WDE_BUFMGN_PKTINFO);
1974e3ec7017SPing-Ke Shih 	case_DBG_SEL(WDE_QUEMGN_PREPKT);
1975e3ec7017SPing-Ke Shih 	case_DBG_SEL(WDE_QUEMGN_NXTPKT);
1976e3ec7017SPing-Ke Shih 	case_DBG_SEL(WDE_QUEMGN_QLNKTBL);
1977e3ec7017SPing-Ke Shih 	case_DBG_SEL(WDE_QUEMGN_QEMPTY);
1978e3ec7017SPing-Ke Shih 	case_DBG_SEL(PLE_BUFMGN_FREEPG);
1979e3ec7017SPing-Ke Shih 	case_DBG_SEL(PLE_BUFMGN_QUOTA);
1980e3ec7017SPing-Ke Shih 	case_DBG_SEL(PLE_BUFMGN_PAGELLT);
1981e3ec7017SPing-Ke Shih 	case_DBG_SEL(PLE_BUFMGN_PKTINFO);
1982e3ec7017SPing-Ke Shih 	case_DBG_SEL(PLE_QUEMGN_PREPKT);
1983e3ec7017SPing-Ke Shih 	case_DBG_SEL(PLE_QUEMGN_NXTPKT);
1984e3ec7017SPing-Ke Shih 	case_DBG_SEL(PLE_QUEMGN_QLNKTBL);
1985e3ec7017SPing-Ke Shih 	case_DBG_SEL(PLE_QUEMGN_QEMPTY);
1986e3ec7017SPing-Ke Shih 	case_DBG_SEL(PKTINFO);
1987e3ec7017SPing-Ke Shih 	case_DBG_SEL(PCIE_TXDMA);
1988e3ec7017SPing-Ke Shih 	case_DBG_SEL(PCIE_RXDMA);
1989e3ec7017SPing-Ke Shih 	case_DBG_SEL(PCIE_CVT);
1990e3ec7017SPing-Ke Shih 	case_DBG_SEL(PCIE_CXPL);
1991e3ec7017SPing-Ke Shih 	case_DBG_SEL(PCIE_IO);
1992e3ec7017SPing-Ke Shih 	case_DBG_SEL(PCIE_MISC);
1993e3ec7017SPing-Ke Shih 	case_DBG_SEL(PCIE_MISC2);
1994e3ec7017SPing-Ke Shih 	}
1995e3ec7017SPing-Ke Shih 
1996e3ec7017SPing-Ke Shih #undef case_DBG_SEL
1997e3ec7017SPing-Ke Shih 
1998e3ec7017SPing-Ke Shih 	seq_printf(m, "Sel addr = 0x%X\n", info->sel_addr);
1999e3ec7017SPing-Ke Shih 	seq_printf(m, "Read addr = 0x%X\n", info->rd_addr);
2000e3ec7017SPing-Ke Shih 
2001e3ec7017SPing-Ke Shih 	for (i = info->srt; i <= info->end; i++) {
2002e3ec7017SPing-Ke Shih 		switch (info->sel_byte) {
2003e3ec7017SPing-Ke Shih 		case 1:
2004e3ec7017SPing-Ke Shih 		default:
2005e3ec7017SPing-Ke Shih 			rtw89_write8_mask(rtwdev, info->sel_addr,
2006e3ec7017SPing-Ke Shih 					  info->sel_msk, i);
2007e3ec7017SPing-Ke Shih 			seq_printf(m, "0x%02X: ", i);
2008e3ec7017SPing-Ke Shih 			break;
2009e3ec7017SPing-Ke Shih 		case 2:
2010e3ec7017SPing-Ke Shih 			rtw89_write16_mask(rtwdev, info->sel_addr,
2011e3ec7017SPing-Ke Shih 					   info->sel_msk, i);
2012e3ec7017SPing-Ke Shih 			seq_printf(m, "0x%04X: ", i);
2013e3ec7017SPing-Ke Shih 			break;
2014e3ec7017SPing-Ke Shih 		case 4:
2015e3ec7017SPing-Ke Shih 			rtw89_write32_mask(rtwdev, info->sel_addr,
2016e3ec7017SPing-Ke Shih 					   info->sel_msk, i);
2017e3ec7017SPing-Ke Shih 			seq_printf(m, "0x%04X: ", i);
2018e3ec7017SPing-Ke Shih 			break;
2019e3ec7017SPing-Ke Shih 		}
2020e3ec7017SPing-Ke Shih 
2021e3ec7017SPing-Ke Shih 		udelay(10);
2022e3ec7017SPing-Ke Shih 
2023e3ec7017SPing-Ke Shih 		switch (info->rd_byte) {
2024e3ec7017SPing-Ke Shih 		case 1:
2025e3ec7017SPing-Ke Shih 		default:
2026e3ec7017SPing-Ke Shih 			val8 = rtw89_read8_mask(rtwdev,
2027e3ec7017SPing-Ke Shih 						info->rd_addr, info->rd_msk);
2028e3ec7017SPing-Ke Shih 			seq_printf(m, "0x%02X\n", val8);
2029e3ec7017SPing-Ke Shih 			break;
2030e3ec7017SPing-Ke Shih 		case 2:
2031e3ec7017SPing-Ke Shih 			val16 = rtw89_read16_mask(rtwdev,
2032e3ec7017SPing-Ke Shih 						  info->rd_addr, info->rd_msk);
2033e3ec7017SPing-Ke Shih 			seq_printf(m, "0x%04X\n", val16);
2034e3ec7017SPing-Ke Shih 			break;
2035e3ec7017SPing-Ke Shih 		case 4:
2036e3ec7017SPing-Ke Shih 			val32 = rtw89_read32_mask(rtwdev,
2037e3ec7017SPing-Ke Shih 						  info->rd_addr, info->rd_msk);
2038e3ec7017SPing-Ke Shih 			seq_printf(m, "0x%08X\n", val32);
2039e3ec7017SPing-Ke Shih 			break;
2040e3ec7017SPing-Ke Shih 		}
2041e3ec7017SPing-Ke Shih 	}
2042e3ec7017SPing-Ke Shih 
2043e3ec7017SPing-Ke Shih 	return 0;
2044e3ec7017SPing-Ke Shih }
2045e3ec7017SPing-Ke Shih 
2046e3ec7017SPing-Ke Shih static int rtw89_debug_mac_dump_dbg_port(struct rtw89_dev *rtwdev,
2047e3ec7017SPing-Ke Shih 					 struct seq_file *m)
2048e3ec7017SPing-Ke Shih {
2049e3ec7017SPing-Ke Shih 	u32 sel;
2050e3ec7017SPing-Ke Shih 	int ret = 0;
2051e3ec7017SPing-Ke Shih 
2052e3ec7017SPing-Ke Shih 	for (sel = RTW89_DBG_PORT_SEL_PTCL_C0;
2053e3ec7017SPing-Ke Shih 	     sel < RTW89_DBG_PORT_SEL_LAST; sel++) {
2054e3ec7017SPing-Ke Shih 		if (!is_dbg_port_valid(rtwdev, sel))
2055e3ec7017SPing-Ke Shih 			continue;
2056e3ec7017SPing-Ke Shih 		ret = rtw89_debug_mac_dbg_port_dump(rtwdev, m, sel);
2057e3ec7017SPing-Ke Shih 		if (ret) {
2058e3ec7017SPing-Ke Shih 			rtw89_err(rtwdev,
2059e3ec7017SPing-Ke Shih 				  "failed to dump debug port %d\n", sel);
2060e3ec7017SPing-Ke Shih 			break;
2061e3ec7017SPing-Ke Shih 		}
2062e3ec7017SPing-Ke Shih 	}
2063e3ec7017SPing-Ke Shih 
2064e3ec7017SPing-Ke Shih 	return ret;
2065e3ec7017SPing-Ke Shih }
2066e3ec7017SPing-Ke Shih 
2067e3ec7017SPing-Ke Shih static int
2068e3ec7017SPing-Ke Shih rtw89_debug_priv_mac_dbg_port_dump_get(struct seq_file *m, void *v)
2069e3ec7017SPing-Ke Shih {
2070e3ec7017SPing-Ke Shih 	struct rtw89_debugfs_priv *debugfs_priv = m->private;
2071e3ec7017SPing-Ke Shih 	struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;
2072e3ec7017SPing-Ke Shih 
2073e3ec7017SPing-Ke Shih 	if (debugfs_priv->dbgpkg_en.ss_dbg)
2074e3ec7017SPing-Ke Shih 		rtw89_debug_mac_dump_ss_dbg(rtwdev, m);
2075e3ec7017SPing-Ke Shih 	if (debugfs_priv->dbgpkg_en.dle_dbg)
2076e3ec7017SPing-Ke Shih 		rtw89_debug_mac_dump_dle_dbg(rtwdev, m);
2077e3ec7017SPing-Ke Shih 	if (debugfs_priv->dbgpkg_en.dmac_dbg)
2078e3ec7017SPing-Ke Shih 		rtw89_debug_mac_dump_dmac_dbg(rtwdev, m);
2079e3ec7017SPing-Ke Shih 	if (debugfs_priv->dbgpkg_en.cmac_dbg)
2080e3ec7017SPing-Ke Shih 		rtw89_debug_mac_dump_cmac_dbg(rtwdev, m);
2081e3ec7017SPing-Ke Shih 	if (debugfs_priv->dbgpkg_en.dbg_port)
2082e3ec7017SPing-Ke Shih 		rtw89_debug_mac_dump_dbg_port(rtwdev, m);
2083e3ec7017SPing-Ke Shih 
2084e3ec7017SPing-Ke Shih 	return 0;
2085e3ec7017SPing-Ke Shih };
2086e3ec7017SPing-Ke Shih 
2087e3ec7017SPing-Ke Shih static u8 *rtw89_hex2bin_user(struct rtw89_dev *rtwdev,
2088e3ec7017SPing-Ke Shih 			      const char __user *user_buf, size_t count)
2089e3ec7017SPing-Ke Shih {
2090e3ec7017SPing-Ke Shih 	char *buf;
2091e3ec7017SPing-Ke Shih 	u8 *bin;
2092e3ec7017SPing-Ke Shih 	int num;
2093e3ec7017SPing-Ke Shih 	int err = 0;
2094e3ec7017SPing-Ke Shih 
2095e3ec7017SPing-Ke Shih 	buf = memdup_user(user_buf, count);
2096e3ec7017SPing-Ke Shih 	if (IS_ERR(buf))
2097e3ec7017SPing-Ke Shih 		return buf;
2098e3ec7017SPing-Ke Shih 
2099e3ec7017SPing-Ke Shih 	num = count / 2;
2100e3ec7017SPing-Ke Shih 	bin = kmalloc(num, GFP_KERNEL);
2101e3ec7017SPing-Ke Shih 	if (!bin) {
2102e3ec7017SPing-Ke Shih 		err = -EFAULT;
2103e3ec7017SPing-Ke Shih 		goto out;
2104e3ec7017SPing-Ke Shih 	}
2105e3ec7017SPing-Ke Shih 
2106e3ec7017SPing-Ke Shih 	if (hex2bin(bin, buf, num)) {
2107e3ec7017SPing-Ke Shih 		rtw89_info(rtwdev, "valid format: H1H2H3...\n");
2108e3ec7017SPing-Ke Shih 		kfree(bin);
2109e3ec7017SPing-Ke Shih 		err = -EINVAL;
2110e3ec7017SPing-Ke Shih 	}
2111e3ec7017SPing-Ke Shih 
2112e3ec7017SPing-Ke Shih out:
2113e3ec7017SPing-Ke Shih 	kfree(buf);
2114e3ec7017SPing-Ke Shih 
2115e3ec7017SPing-Ke Shih 	return err ? ERR_PTR(err) : bin;
2116e3ec7017SPing-Ke Shih }
2117e3ec7017SPing-Ke Shih 
2118e3ec7017SPing-Ke Shih static ssize_t rtw89_debug_priv_send_h2c_set(struct file *filp,
2119e3ec7017SPing-Ke Shih 					     const char __user *user_buf,
2120e3ec7017SPing-Ke Shih 					     size_t count, loff_t *loff)
2121e3ec7017SPing-Ke Shih {
2122e3ec7017SPing-Ke Shih 	struct rtw89_debugfs_priv *debugfs_priv = filp->private_data;
2123e3ec7017SPing-Ke Shih 	struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;
2124e3ec7017SPing-Ke Shih 	u8 *h2c;
2125e3ec7017SPing-Ke Shih 	u16 h2c_len = count / 2;
2126e3ec7017SPing-Ke Shih 
2127e3ec7017SPing-Ke Shih 	h2c = rtw89_hex2bin_user(rtwdev, user_buf, count);
2128e3ec7017SPing-Ke Shih 	if (IS_ERR(h2c))
2129e3ec7017SPing-Ke Shih 		return -EFAULT;
2130e3ec7017SPing-Ke Shih 
2131e3ec7017SPing-Ke Shih 	rtw89_fw_h2c_raw(rtwdev, h2c, h2c_len);
2132e3ec7017SPing-Ke Shih 
2133e3ec7017SPing-Ke Shih 	kfree(h2c);
2134e3ec7017SPing-Ke Shih 
2135e3ec7017SPing-Ke Shih 	return count;
2136e3ec7017SPing-Ke Shih }
2137e3ec7017SPing-Ke Shih 
2138e3ec7017SPing-Ke Shih static int
2139e3ec7017SPing-Ke Shih rtw89_debug_priv_early_h2c_get(struct seq_file *m, void *v)
2140e3ec7017SPing-Ke Shih {
2141e3ec7017SPing-Ke Shih 	struct rtw89_debugfs_priv *debugfs_priv = m->private;
2142e3ec7017SPing-Ke Shih 	struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;
2143e3ec7017SPing-Ke Shih 	struct rtw89_early_h2c *early_h2c;
2144e3ec7017SPing-Ke Shih 	int seq = 0;
2145e3ec7017SPing-Ke Shih 
2146e3ec7017SPing-Ke Shih 	mutex_lock(&rtwdev->mutex);
2147e3ec7017SPing-Ke Shih 	list_for_each_entry(early_h2c, &rtwdev->early_h2c_list, list)
2148e3ec7017SPing-Ke Shih 		seq_printf(m, "%d: %*ph\n", ++seq, early_h2c->h2c_len, early_h2c->h2c);
2149e3ec7017SPing-Ke Shih 	mutex_unlock(&rtwdev->mutex);
2150e3ec7017SPing-Ke Shih 
2151e3ec7017SPing-Ke Shih 	return 0;
2152e3ec7017SPing-Ke Shih }
2153e3ec7017SPing-Ke Shih 
2154e3ec7017SPing-Ke Shih static ssize_t
2155e3ec7017SPing-Ke Shih rtw89_debug_priv_early_h2c_set(struct file *filp, const char __user *user_buf,
2156e3ec7017SPing-Ke Shih 			       size_t count, loff_t *loff)
2157e3ec7017SPing-Ke Shih {
2158e3ec7017SPing-Ke Shih 	struct seq_file *m = (struct seq_file *)filp->private_data;
2159e3ec7017SPing-Ke Shih 	struct rtw89_debugfs_priv *debugfs_priv = m->private;
2160e3ec7017SPing-Ke Shih 	struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;
2161e3ec7017SPing-Ke Shih 	struct rtw89_early_h2c *early_h2c;
2162e3ec7017SPing-Ke Shih 	u8 *h2c;
2163e3ec7017SPing-Ke Shih 	u16 h2c_len = count / 2;
2164e3ec7017SPing-Ke Shih 
2165e3ec7017SPing-Ke Shih 	h2c = rtw89_hex2bin_user(rtwdev, user_buf, count);
2166e3ec7017SPing-Ke Shih 	if (IS_ERR(h2c))
2167e3ec7017SPing-Ke Shih 		return -EFAULT;
2168e3ec7017SPing-Ke Shih 
2169e3ec7017SPing-Ke Shih 	if (h2c_len >= 2 && h2c[0] == 0x00 && h2c[1] == 0x00) {
2170e3ec7017SPing-Ke Shih 		kfree(h2c);
2171e3ec7017SPing-Ke Shih 		rtw89_fw_free_all_early_h2c(rtwdev);
2172e3ec7017SPing-Ke Shih 		goto out;
2173e3ec7017SPing-Ke Shih 	}
2174e3ec7017SPing-Ke Shih 
2175e3ec7017SPing-Ke Shih 	early_h2c = kmalloc(sizeof(*early_h2c), GFP_KERNEL);
2176e3ec7017SPing-Ke Shih 	if (!early_h2c) {
2177e3ec7017SPing-Ke Shih 		kfree(h2c);
2178e3ec7017SPing-Ke Shih 		return -EFAULT;
2179e3ec7017SPing-Ke Shih 	}
2180e3ec7017SPing-Ke Shih 
2181e3ec7017SPing-Ke Shih 	early_h2c->h2c = h2c;
2182e3ec7017SPing-Ke Shih 	early_h2c->h2c_len = h2c_len;
2183e3ec7017SPing-Ke Shih 
2184e3ec7017SPing-Ke Shih 	mutex_lock(&rtwdev->mutex);
2185e3ec7017SPing-Ke Shih 	list_add_tail(&early_h2c->list, &rtwdev->early_h2c_list);
2186e3ec7017SPing-Ke Shih 	mutex_unlock(&rtwdev->mutex);
2187e3ec7017SPing-Ke Shih 
2188e3ec7017SPing-Ke Shih out:
2189e3ec7017SPing-Ke Shih 	return count;
2190e3ec7017SPing-Ke Shih }
2191e3ec7017SPing-Ke Shih 
2192edb89629SZong-Zhe Yang static int
2193edb89629SZong-Zhe Yang rtw89_debug_priv_fw_crash_get(struct seq_file *m, void *v)
2194edb89629SZong-Zhe Yang {
2195edb89629SZong-Zhe Yang 	struct rtw89_debugfs_priv *debugfs_priv = m->private;
2196edb89629SZong-Zhe Yang 	struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;
2197edb89629SZong-Zhe Yang 
2198edb89629SZong-Zhe Yang 	seq_printf(m, "%d\n",
2199edb89629SZong-Zhe Yang 		   test_bit(RTW89_FLAG_RESTART_TRIGGER, rtwdev->flags));
2200edb89629SZong-Zhe Yang 	return 0;
2201edb89629SZong-Zhe Yang }
2202edb89629SZong-Zhe Yang 
2203edb89629SZong-Zhe Yang static ssize_t
2204edb89629SZong-Zhe Yang rtw89_debug_priv_fw_crash_set(struct file *filp, const char __user *user_buf,
2205edb89629SZong-Zhe Yang 			      size_t count, loff_t *loff)
2206edb89629SZong-Zhe Yang {
2207edb89629SZong-Zhe Yang 	struct seq_file *m = (struct seq_file *)filp->private_data;
2208edb89629SZong-Zhe Yang 	struct rtw89_debugfs_priv *debugfs_priv = m->private;
2209edb89629SZong-Zhe Yang 	struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;
2210edb89629SZong-Zhe Yang 	bool fw_crash;
2211edb89629SZong-Zhe Yang 	int ret;
2212edb89629SZong-Zhe Yang 
2213edb89629SZong-Zhe Yang 	if (!RTW89_CHK_FW_FEATURE(CRASH_TRIGGER, &rtwdev->fw))
2214edb89629SZong-Zhe Yang 		return -EOPNOTSUPP;
2215edb89629SZong-Zhe Yang 
2216edb89629SZong-Zhe Yang 	ret = kstrtobool_from_user(user_buf, count, &fw_crash);
2217edb89629SZong-Zhe Yang 	if (ret)
2218edb89629SZong-Zhe Yang 		return -EINVAL;
2219edb89629SZong-Zhe Yang 
2220edb89629SZong-Zhe Yang 	if (!fw_crash)
2221edb89629SZong-Zhe Yang 		return -EINVAL;
2222edb89629SZong-Zhe Yang 
2223edb89629SZong-Zhe Yang 	mutex_lock(&rtwdev->mutex);
2224edb89629SZong-Zhe Yang 	set_bit(RTW89_FLAG_RESTART_TRIGGER, rtwdev->flags);
2225edb89629SZong-Zhe Yang 	ret = rtw89_fw_h2c_trigger_cpu_exception(rtwdev);
2226edb89629SZong-Zhe Yang 	mutex_unlock(&rtwdev->mutex);
2227edb89629SZong-Zhe Yang 
2228edb89629SZong-Zhe Yang 	if (ret)
2229edb89629SZong-Zhe Yang 		return ret;
2230edb89629SZong-Zhe Yang 
2231edb89629SZong-Zhe Yang 	return count;
2232edb89629SZong-Zhe Yang }
2233edb89629SZong-Zhe Yang 
2234e3ec7017SPing-Ke Shih static int rtw89_debug_priv_btc_info_get(struct seq_file *m, void *v)
2235e3ec7017SPing-Ke Shih {
2236e3ec7017SPing-Ke Shih 	struct rtw89_debugfs_priv *debugfs_priv = m->private;
2237e3ec7017SPing-Ke Shih 	struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;
2238e3ec7017SPing-Ke Shih 
2239e3ec7017SPing-Ke Shih 	rtw89_btc_dump_info(rtwdev, m);
2240e3ec7017SPing-Ke Shih 
2241e3ec7017SPing-Ke Shih 	return 0;
2242e3ec7017SPing-Ke Shih }
2243e3ec7017SPing-Ke Shih 
2244e3ec7017SPing-Ke Shih static ssize_t rtw89_debug_priv_btc_manual_set(struct file *filp,
2245e3ec7017SPing-Ke Shih 					       const char __user *user_buf,
2246e3ec7017SPing-Ke Shih 					       size_t count, loff_t *loff)
2247e3ec7017SPing-Ke Shih {
2248e3ec7017SPing-Ke Shih 	struct rtw89_debugfs_priv *debugfs_priv = filp->private_data;
2249e3ec7017SPing-Ke Shih 	struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;
2250e3ec7017SPing-Ke Shih 	struct rtw89_btc *btc = &rtwdev->btc;
2251e3ec7017SPing-Ke Shih 	bool btc_manual;
2252e3ec7017SPing-Ke Shih 
2253e3ec7017SPing-Ke Shih 	if (kstrtobool_from_user(user_buf, count, &btc_manual))
2254e3ec7017SPing-Ke Shih 		goto out;
2255e3ec7017SPing-Ke Shih 
2256e3ec7017SPing-Ke Shih 	btc->ctrl.manual = btc_manual;
2257e3ec7017SPing-Ke Shih out:
2258e3ec7017SPing-Ke Shih 	return count;
2259e3ec7017SPing-Ke Shih }
2260e3ec7017SPing-Ke Shih 
2261e3ec7017SPing-Ke Shih static ssize_t rtw89_debug_fw_log_btc_manual_set(struct file *filp,
2262e3ec7017SPing-Ke Shih 						 const char __user *user_buf,
2263e3ec7017SPing-Ke Shih 						 size_t count, loff_t *loff)
2264e3ec7017SPing-Ke Shih {
2265e3ec7017SPing-Ke Shih 	struct rtw89_debugfs_priv *debugfs_priv = filp->private_data;
2266e3ec7017SPing-Ke Shih 	struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;
2267e3ec7017SPing-Ke Shih 	struct rtw89_fw_info *fw_info = &rtwdev->fw;
2268e3ec7017SPing-Ke Shih 	bool fw_log_manual;
2269e3ec7017SPing-Ke Shih 
2270e3ec7017SPing-Ke Shih 	if (kstrtobool_from_user(user_buf, count, &fw_log_manual))
2271e3ec7017SPing-Ke Shih 		goto out;
2272e3ec7017SPing-Ke Shih 
2273e3ec7017SPing-Ke Shih 	mutex_lock(&rtwdev->mutex);
2274e3ec7017SPing-Ke Shih 	fw_info->fw_log_enable = fw_log_manual;
2275e3ec7017SPing-Ke Shih 	rtw89_fw_h2c_fw_log(rtwdev, fw_log_manual);
2276e3ec7017SPing-Ke Shih 	mutex_unlock(&rtwdev->mutex);
2277e3ec7017SPing-Ke Shih out:
2278e3ec7017SPing-Ke Shih 	return count;
2279e3ec7017SPing-Ke Shih }
2280e3ec7017SPing-Ke Shih 
2281e3ec7017SPing-Ke Shih static void rtw89_sta_info_get_iter(void *data, struct ieee80211_sta *sta)
2282e3ec7017SPing-Ke Shih {
2283e3ec7017SPing-Ke Shih 	static const char * const he_gi_str[] = {
2284e3ec7017SPing-Ke Shih 		[NL80211_RATE_INFO_HE_GI_0_8] = "0.8",
2285e3ec7017SPing-Ke Shih 		[NL80211_RATE_INFO_HE_GI_1_6] = "1.6",
2286e3ec7017SPing-Ke Shih 		[NL80211_RATE_INFO_HE_GI_3_2] = "3.2",
2287e3ec7017SPing-Ke Shih 	};
2288e3ec7017SPing-Ke Shih 	struct rtw89_sta *rtwsta = (struct rtw89_sta *)sta->drv_priv;
2289e3ec7017SPing-Ke Shih 	struct rate_info *rate = &rtwsta->ra_report.txrate;
2290e3ec7017SPing-Ke Shih 	struct ieee80211_rx_status *status = &rtwsta->rx_status;
2291e3ec7017SPing-Ke Shih 	struct seq_file *m = (struct seq_file *)data;
2292e3ec7017SPing-Ke Shih 	u8 rssi;
2293e3ec7017SPing-Ke Shih 
2294e3ec7017SPing-Ke Shih 	seq_printf(m, "TX rate [%d]: ", rtwsta->mac_id);
2295e3ec7017SPing-Ke Shih 
2296e3ec7017SPing-Ke Shih 	if (rate->flags & RATE_INFO_FLAGS_MCS)
2297e3ec7017SPing-Ke Shih 		seq_printf(m, "HT MCS-%d%s", rate->mcs,
2298e3ec7017SPing-Ke Shih 			   rate->flags & RATE_INFO_FLAGS_SHORT_GI ? " SGI" : "");
2299e3ec7017SPing-Ke Shih 	else if (rate->flags & RATE_INFO_FLAGS_VHT_MCS)
2300e3ec7017SPing-Ke Shih 		seq_printf(m, "VHT %dSS MCS-%d%s", rate->nss, rate->mcs,
2301e3ec7017SPing-Ke Shih 			   rate->flags & RATE_INFO_FLAGS_SHORT_GI ? " SGI" : "");
2302e3ec7017SPing-Ke Shih 	else if (rate->flags & RATE_INFO_FLAGS_HE_MCS)
2303e3ec7017SPing-Ke Shih 		seq_printf(m, "HE %dSS MCS-%d GI:%s", rate->nss, rate->mcs,
2304e3ec7017SPing-Ke Shih 			   rate->he_gi <= NL80211_RATE_INFO_HE_GI_3_2 ?
2305e3ec7017SPing-Ke Shih 			   he_gi_str[rate->he_gi] : "N/A");
2306e3ec7017SPing-Ke Shih 	else
2307e3ec7017SPing-Ke Shih 		seq_printf(m, "Legacy %d", rate->legacy);
2308e3ec7017SPing-Ke Shih 	seq_printf(m, "\t(hw_rate=0x%x)", rtwsta->ra_report.hw_rate);
2309e3ec7017SPing-Ke Shih 	seq_printf(m, "\t==> agg_wait=%d (%d)\n", rtwsta->max_agg_wait,
2310e3ec7017SPing-Ke Shih 		   sta->max_rc_amsdu_len);
2311e3ec7017SPing-Ke Shih 
2312e3ec7017SPing-Ke Shih 	seq_printf(m, "RX rate [%d]: ", rtwsta->mac_id);
2313e3ec7017SPing-Ke Shih 
2314e3ec7017SPing-Ke Shih 	switch (status->encoding) {
2315e3ec7017SPing-Ke Shih 	case RX_ENC_LEGACY:
2316e3ec7017SPing-Ke Shih 		seq_printf(m, "Legacy %d", status->rate_idx +
2317eb4e52b3SPo Hao Huang 			   (status->band != NL80211_BAND_2GHZ ? 4 : 0));
2318e3ec7017SPing-Ke Shih 		break;
2319e3ec7017SPing-Ke Shih 	case RX_ENC_HT:
2320e3ec7017SPing-Ke Shih 		seq_printf(m, "HT MCS-%d%s", status->rate_idx,
2321e3ec7017SPing-Ke Shih 			   status->enc_flags & RX_ENC_FLAG_SHORT_GI ? " SGI" : "");
2322e3ec7017SPing-Ke Shih 		break;
2323e3ec7017SPing-Ke Shih 	case RX_ENC_VHT:
2324e3ec7017SPing-Ke Shih 		seq_printf(m, "VHT %dSS MCS-%d%s", status->nss, status->rate_idx,
2325e3ec7017SPing-Ke Shih 			   status->enc_flags & RX_ENC_FLAG_SHORT_GI ? " SGI" : "");
2326e3ec7017SPing-Ke Shih 		break;
2327e3ec7017SPing-Ke Shih 	case RX_ENC_HE:
2328e3ec7017SPing-Ke Shih 		seq_printf(m, "HE %dSS MCS-%d GI:%s", status->nss, status->rate_idx,
2329e3ec7017SPing-Ke Shih 			   status->he_gi <= NL80211_RATE_INFO_HE_GI_3_2 ?
2330e3ec7017SPing-Ke Shih 			   he_gi_str[rate->he_gi] : "N/A");
2331e3ec7017SPing-Ke Shih 		break;
2332e3ec7017SPing-Ke Shih 	}
2333e3ec7017SPing-Ke Shih 	seq_printf(m, "\t(hw_rate=0x%x)\n", rtwsta->rx_hw_rate);
2334e3ec7017SPing-Ke Shih 
2335e3ec7017SPing-Ke Shih 	rssi = ewma_rssi_read(&rtwsta->avg_rssi);
2336e3ec7017SPing-Ke Shih 	seq_printf(m, "RSSI: %d dBm (raw=%d, prev=%d)\n",
2337e3ec7017SPing-Ke Shih 		   RTW89_RSSI_RAW_TO_DBM(rssi), rssi, rtwsta->prev_rssi);
2338e3ec7017SPing-Ke Shih }
2339e3ec7017SPing-Ke Shih 
2340e3ec7017SPing-Ke Shih static void
2341e3ec7017SPing-Ke Shih rtw89_debug_append_rx_rate(struct seq_file *m, struct rtw89_pkt_stat *pkt_stat,
2342e3ec7017SPing-Ke Shih 			   enum rtw89_hw_rate first_rate, int len)
2343e3ec7017SPing-Ke Shih {
2344e3ec7017SPing-Ke Shih 	int i;
2345e3ec7017SPing-Ke Shih 
2346e3ec7017SPing-Ke Shih 	for (i = 0; i < len; i++)
2347e3ec7017SPing-Ke Shih 		seq_printf(m, "%s%u", i == 0 ? "" : ", ",
2348e3ec7017SPing-Ke Shih 			   pkt_stat->rx_rate_cnt[first_rate + i]);
2349e3ec7017SPing-Ke Shih }
2350e3ec7017SPing-Ke Shih 
2351e3ec7017SPing-Ke Shih static const struct rtw89_rx_rate_cnt_info {
2352e3ec7017SPing-Ke Shih 	enum rtw89_hw_rate first_rate;
2353e3ec7017SPing-Ke Shih 	int len;
2354e56f3420SPing-Ke Shih 	int ext;
2355e3ec7017SPing-Ke Shih 	const char *rate_mode;
2356e3ec7017SPing-Ke Shih } rtw89_rx_rate_cnt_infos[] = {
2357e56f3420SPing-Ke Shih 	{RTW89_HW_RATE_CCK1, 4, 0, "Legacy:"},
2358e56f3420SPing-Ke Shih 	{RTW89_HW_RATE_OFDM6, 8, 0, "OFDM:"},
2359e56f3420SPing-Ke Shih 	{RTW89_HW_RATE_MCS0, 8, 0, "HT 0:"},
2360e56f3420SPing-Ke Shih 	{RTW89_HW_RATE_MCS8, 8, 0, "HT 1:"},
2361e56f3420SPing-Ke Shih 	{RTW89_HW_RATE_VHT_NSS1_MCS0, 10, 2, "VHT 1SS:"},
2362e56f3420SPing-Ke Shih 	{RTW89_HW_RATE_VHT_NSS2_MCS0, 10, 2, "VHT 2SS:"},
2363e56f3420SPing-Ke Shih 	{RTW89_HW_RATE_HE_NSS1_MCS0, 12, 0, "HE 1SS:"},
2364e56f3420SPing-Ke Shih 	{RTW89_HW_RATE_HE_NSS2_MCS0, 12, 0, "HE 2ss:"},
2365e3ec7017SPing-Ke Shih };
2366e3ec7017SPing-Ke Shih 
2367e3ec7017SPing-Ke Shih static int rtw89_debug_priv_phy_info_get(struct seq_file *m, void *v)
2368e3ec7017SPing-Ke Shih {
2369e3ec7017SPing-Ke Shih 	struct rtw89_debugfs_priv *debugfs_priv = m->private;
2370e3ec7017SPing-Ke Shih 	struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;
2371e3ec7017SPing-Ke Shih 	struct rtw89_traffic_stats *stats = &rtwdev->stats;
2372e3ec7017SPing-Ke Shih 	struct rtw89_pkt_stat *pkt_stat = &rtwdev->phystat.last_pkt_stat;
2373e3ec7017SPing-Ke Shih 	const struct rtw89_rx_rate_cnt_info *info;
2374e3ec7017SPing-Ke Shih 	int i;
2375e3ec7017SPing-Ke Shih 
2376e3ec7017SPing-Ke Shih 	seq_printf(m, "TP TX: %u [%u] Mbps (lv: %d), RX: %u [%u] Mbps (lv: %d)\n",
2377e3ec7017SPing-Ke Shih 		   stats->tx_throughput, stats->tx_throughput_raw, stats->tx_tfc_lv,
2378e3ec7017SPing-Ke Shih 		   stats->rx_throughput, stats->rx_throughput_raw, stats->rx_tfc_lv);
2379e3ec7017SPing-Ke Shih 	seq_printf(m, "Beacon: %u\n", pkt_stat->beacon_nr);
2380e3ec7017SPing-Ke Shih 	seq_printf(m, "Avg packet length: TX=%u, RX=%u\n", stats->tx_avg_len,
2381e3ec7017SPing-Ke Shih 		   stats->rx_avg_len);
2382e3ec7017SPing-Ke Shih 
2383e3ec7017SPing-Ke Shih 	seq_puts(m, "RX count:\n");
2384e3ec7017SPing-Ke Shih 	for (i = 0; i < ARRAY_SIZE(rtw89_rx_rate_cnt_infos); i++) {
2385e3ec7017SPing-Ke Shih 		info = &rtw89_rx_rate_cnt_infos[i];
2386e3ec7017SPing-Ke Shih 		seq_printf(m, "%10s [", info->rate_mode);
2387e3ec7017SPing-Ke Shih 		rtw89_debug_append_rx_rate(m, pkt_stat,
2388e3ec7017SPing-Ke Shih 					   info->first_rate, info->len);
2389e56f3420SPing-Ke Shih 		if (info->ext) {
2390e56f3420SPing-Ke Shih 			seq_puts(m, "][");
2391e56f3420SPing-Ke Shih 			rtw89_debug_append_rx_rate(m, pkt_stat,
2392e56f3420SPing-Ke Shih 						   info->first_rate + info->len, info->ext);
2393e56f3420SPing-Ke Shih 		}
2394e3ec7017SPing-Ke Shih 		seq_puts(m, "]\n");
2395e3ec7017SPing-Ke Shih 	}
2396e3ec7017SPing-Ke Shih 
2397e3ec7017SPing-Ke Shih 	ieee80211_iterate_stations_atomic(rtwdev->hw, rtw89_sta_info_get_iter, m);
2398e3ec7017SPing-Ke Shih 
2399e3ec7017SPing-Ke Shih 	return 0;
2400e3ec7017SPing-Ke Shih }
2401e3ec7017SPing-Ke Shih 
2402d95d8d6bSPing-Ke Shih static void rtw89_dump_addr_cam(struct seq_file *m,
2403d95d8d6bSPing-Ke Shih 				struct rtw89_addr_cam_entry *addr_cam)
2404d95d8d6bSPing-Ke Shih {
2405d95d8d6bSPing-Ke Shih 	struct rtw89_sec_cam_entry *sec_entry;
2406d95d8d6bSPing-Ke Shih 	int i;
2407d95d8d6bSPing-Ke Shih 
2408d95d8d6bSPing-Ke Shih 	seq_printf(m, "\taddr_cam_idx=%u\n", addr_cam->addr_cam_idx);
2409d95d8d6bSPing-Ke Shih 	seq_printf(m, "\t-> bssid_cam_idx=%u\n", addr_cam->bssid_cam_idx);
2410d95d8d6bSPing-Ke Shih 	seq_printf(m, "\tsec_cam_bitmap=%*ph\n", (int)sizeof(addr_cam->sec_cam_map),
2411d95d8d6bSPing-Ke Shih 		   addr_cam->sec_cam_map);
2412d95d8d6bSPing-Ke Shih 	for (i = 0; i < RTW89_SEC_CAM_IN_ADDR_CAM; i++) {
2413d95d8d6bSPing-Ke Shih 		sec_entry = addr_cam->sec_entries[i];
2414d95d8d6bSPing-Ke Shih 		if (!sec_entry)
2415d95d8d6bSPing-Ke Shih 			continue;
2416d95d8d6bSPing-Ke Shih 		seq_printf(m, "\tsec[%d]: sec_cam_idx %u", i, sec_entry->sec_cam_idx);
2417d95d8d6bSPing-Ke Shih 		if (sec_entry->ext_key)
2418d95d8d6bSPing-Ke Shih 			seq_printf(m, ", %u", sec_entry->sec_cam_idx + 1);
2419d95d8d6bSPing-Ke Shih 		seq_puts(m, "\n");
2420d95d8d6bSPing-Ke Shih 	}
2421d95d8d6bSPing-Ke Shih }
2422d95d8d6bSPing-Ke Shih 
2423d95d8d6bSPing-Ke Shih static
2424d95d8d6bSPing-Ke Shih void rtw89_vif_ids_get_iter(void *data, u8 *mac, struct ieee80211_vif *vif)
2425d95d8d6bSPing-Ke Shih {
2426d95d8d6bSPing-Ke Shih 	struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv;
2427d95d8d6bSPing-Ke Shih 	struct seq_file *m = (struct seq_file *)data;
2428d95d8d6bSPing-Ke Shih 	struct rtw89_bssid_cam_entry *bssid_cam = &rtwvif->bssid_cam;
2429d95d8d6bSPing-Ke Shih 
2430d95d8d6bSPing-Ke Shih 	seq_printf(m, "VIF [%d] %pM\n", rtwvif->mac_id, rtwvif->mac_addr);
2431d95d8d6bSPing-Ke Shih 	seq_printf(m, "\tbssid_cam_idx=%u\n", bssid_cam->bssid_cam_idx);
2432d95d8d6bSPing-Ke Shih 	rtw89_dump_addr_cam(m, &rtwvif->addr_cam);
2433d95d8d6bSPing-Ke Shih }
2434d95d8d6bSPing-Ke Shih 
2435d95d8d6bSPing-Ke Shih static void rtw89_sta_ids_get_iter(void *data, struct ieee80211_sta *sta)
2436d95d8d6bSPing-Ke Shih {
2437d95d8d6bSPing-Ke Shih 	struct rtw89_sta *rtwsta = (struct rtw89_sta *)sta->drv_priv;
2438d95d8d6bSPing-Ke Shih 	struct seq_file *m = (struct seq_file *)data;
2439d95d8d6bSPing-Ke Shih 
2440d95d8d6bSPing-Ke Shih 	seq_printf(m, "STA [%d] %pM\n", rtwsta->mac_id, sta->addr);
2441d95d8d6bSPing-Ke Shih 	rtw89_dump_addr_cam(m, &rtwsta->addr_cam);
2442d95d8d6bSPing-Ke Shih }
2443d95d8d6bSPing-Ke Shih 
2444d95d8d6bSPing-Ke Shih static int rtw89_debug_priv_stations_get(struct seq_file *m, void *v)
2445d95d8d6bSPing-Ke Shih {
2446d95d8d6bSPing-Ke Shih 	struct rtw89_debugfs_priv *debugfs_priv = m->private;
2447d95d8d6bSPing-Ke Shih 	struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;
2448d95d8d6bSPing-Ke Shih 	struct rtw89_cam_info *cam_info = &rtwdev->cam_info;
2449d95d8d6bSPing-Ke Shih 
2450d95d8d6bSPing-Ke Shih 	seq_puts(m, "map:\n");
2451d95d8d6bSPing-Ke Shih 	seq_printf(m, "\tmac_id:    %*ph\n", (int)sizeof(rtwdev->mac_id_map),
2452d95d8d6bSPing-Ke Shih 		   rtwdev->mac_id_map);
2453d95d8d6bSPing-Ke Shih 	seq_printf(m, "\taddr_cam:  %*ph\n", (int)sizeof(cam_info->addr_cam_map),
2454d95d8d6bSPing-Ke Shih 		   cam_info->addr_cam_map);
2455d95d8d6bSPing-Ke Shih 	seq_printf(m, "\tbssid_cam: %*ph\n", (int)sizeof(cam_info->bssid_cam_map),
2456d95d8d6bSPing-Ke Shih 		   cam_info->bssid_cam_map);
2457d95d8d6bSPing-Ke Shih 	seq_printf(m, "\tsec_cam:   %*ph\n", (int)sizeof(cam_info->sec_cam_map),
2458d95d8d6bSPing-Ke Shih 		   cam_info->sec_cam_map);
2459d95d8d6bSPing-Ke Shih 
2460d95d8d6bSPing-Ke Shih 	ieee80211_iterate_active_interfaces_atomic(rtwdev->hw,
2461d95d8d6bSPing-Ke Shih 		IEEE80211_IFACE_ITER_NORMAL, rtw89_vif_ids_get_iter, m);
2462d95d8d6bSPing-Ke Shih 
2463d95d8d6bSPing-Ke Shih 	ieee80211_iterate_stations_atomic(rtwdev->hw, rtw89_sta_ids_get_iter, m);
2464d95d8d6bSPing-Ke Shih 
2465d95d8d6bSPing-Ke Shih 	return 0;
2466d95d8d6bSPing-Ke Shih }
2467d95d8d6bSPing-Ke Shih 
2468e3ec7017SPing-Ke Shih static struct rtw89_debugfs_priv rtw89_debug_priv_read_reg = {
2469e3ec7017SPing-Ke Shih 	.cb_read = rtw89_debug_priv_read_reg_get,
2470e3ec7017SPing-Ke Shih 	.cb_write = rtw89_debug_priv_read_reg_select,
2471e3ec7017SPing-Ke Shih };
2472e3ec7017SPing-Ke Shih 
2473e3ec7017SPing-Ke Shih static struct rtw89_debugfs_priv rtw89_debug_priv_write_reg = {
2474e3ec7017SPing-Ke Shih 	.cb_write = rtw89_debug_priv_write_reg_set,
2475e3ec7017SPing-Ke Shih };
2476e3ec7017SPing-Ke Shih 
2477e3ec7017SPing-Ke Shih static struct rtw89_debugfs_priv rtw89_debug_priv_read_rf = {
2478e3ec7017SPing-Ke Shih 	.cb_read = rtw89_debug_priv_read_rf_get,
2479e3ec7017SPing-Ke Shih 	.cb_write = rtw89_debug_priv_read_rf_select,
2480e3ec7017SPing-Ke Shih };
2481e3ec7017SPing-Ke Shih 
2482e3ec7017SPing-Ke Shih static struct rtw89_debugfs_priv rtw89_debug_priv_write_rf = {
2483e3ec7017SPing-Ke Shih 	.cb_write = rtw89_debug_priv_write_rf_set,
2484e3ec7017SPing-Ke Shih };
2485e3ec7017SPing-Ke Shih 
2486e3ec7017SPing-Ke Shih static struct rtw89_debugfs_priv rtw89_debug_priv_rf_reg_dump = {
2487e3ec7017SPing-Ke Shih 	.cb_read = rtw89_debug_priv_rf_reg_dump_get,
2488e3ec7017SPing-Ke Shih };
2489e3ec7017SPing-Ke Shih 
2490e3ec7017SPing-Ke Shih static struct rtw89_debugfs_priv rtw89_debug_priv_txpwr_table = {
2491e3ec7017SPing-Ke Shih 	.cb_read = rtw89_debug_priv_txpwr_table_get,
2492e3ec7017SPing-Ke Shih };
2493e3ec7017SPing-Ke Shih 
2494e3ec7017SPing-Ke Shih static struct rtw89_debugfs_priv rtw89_debug_priv_mac_reg_dump = {
2495e3ec7017SPing-Ke Shih 	.cb_read = rtw89_debug_priv_mac_reg_dump_get,
2496e3ec7017SPing-Ke Shih 	.cb_write = rtw89_debug_priv_mac_reg_dump_select,
2497e3ec7017SPing-Ke Shih };
2498e3ec7017SPing-Ke Shih 
2499e3ec7017SPing-Ke Shih static struct rtw89_debugfs_priv rtw89_debug_priv_mac_mem_dump = {
2500e3ec7017SPing-Ke Shih 	.cb_read = rtw89_debug_priv_mac_mem_dump_get,
2501e3ec7017SPing-Ke Shih 	.cb_write = rtw89_debug_priv_mac_mem_dump_select,
2502e3ec7017SPing-Ke Shih };
2503e3ec7017SPing-Ke Shih 
2504e3ec7017SPing-Ke Shih static struct rtw89_debugfs_priv rtw89_debug_priv_mac_dbg_port_dump = {
2505e3ec7017SPing-Ke Shih 	.cb_read = rtw89_debug_priv_mac_dbg_port_dump_get,
2506e3ec7017SPing-Ke Shih 	.cb_write = rtw89_debug_priv_mac_dbg_port_dump_select,
2507e3ec7017SPing-Ke Shih };
2508e3ec7017SPing-Ke Shih 
2509e3ec7017SPing-Ke Shih static struct rtw89_debugfs_priv rtw89_debug_priv_send_h2c = {
2510e3ec7017SPing-Ke Shih 	.cb_write = rtw89_debug_priv_send_h2c_set,
2511e3ec7017SPing-Ke Shih };
2512e3ec7017SPing-Ke Shih 
2513e3ec7017SPing-Ke Shih static struct rtw89_debugfs_priv rtw89_debug_priv_early_h2c = {
2514e3ec7017SPing-Ke Shih 	.cb_read = rtw89_debug_priv_early_h2c_get,
2515e3ec7017SPing-Ke Shih 	.cb_write = rtw89_debug_priv_early_h2c_set,
2516e3ec7017SPing-Ke Shih };
2517e3ec7017SPing-Ke Shih 
2518edb89629SZong-Zhe Yang static struct rtw89_debugfs_priv rtw89_debug_priv_fw_crash = {
2519edb89629SZong-Zhe Yang 	.cb_read = rtw89_debug_priv_fw_crash_get,
2520edb89629SZong-Zhe Yang 	.cb_write = rtw89_debug_priv_fw_crash_set,
2521edb89629SZong-Zhe Yang };
2522edb89629SZong-Zhe Yang 
2523e3ec7017SPing-Ke Shih static struct rtw89_debugfs_priv rtw89_debug_priv_btc_info = {
2524e3ec7017SPing-Ke Shih 	.cb_read = rtw89_debug_priv_btc_info_get,
2525e3ec7017SPing-Ke Shih };
2526e3ec7017SPing-Ke Shih 
2527e3ec7017SPing-Ke Shih static struct rtw89_debugfs_priv rtw89_debug_priv_btc_manual = {
2528e3ec7017SPing-Ke Shih 	.cb_write = rtw89_debug_priv_btc_manual_set,
2529e3ec7017SPing-Ke Shih };
2530e3ec7017SPing-Ke Shih 
2531e3ec7017SPing-Ke Shih static struct rtw89_debugfs_priv rtw89_debug_priv_fw_log_manual = {
2532e3ec7017SPing-Ke Shih 	.cb_write = rtw89_debug_fw_log_btc_manual_set,
2533e3ec7017SPing-Ke Shih };
2534e3ec7017SPing-Ke Shih 
2535e3ec7017SPing-Ke Shih static struct rtw89_debugfs_priv rtw89_debug_priv_phy_info = {
2536e3ec7017SPing-Ke Shih 	.cb_read = rtw89_debug_priv_phy_info_get,
2537e3ec7017SPing-Ke Shih };
2538e3ec7017SPing-Ke Shih 
2539d95d8d6bSPing-Ke Shih static struct rtw89_debugfs_priv rtw89_debug_priv_stations = {
2540d95d8d6bSPing-Ke Shih 	.cb_read = rtw89_debug_priv_stations_get,
2541d95d8d6bSPing-Ke Shih };
2542d95d8d6bSPing-Ke Shih 
2543e3ec7017SPing-Ke Shih #define rtw89_debugfs_add(name, mode, fopname, parent)				\
2544e3ec7017SPing-Ke Shih 	do {									\
2545e3ec7017SPing-Ke Shih 		rtw89_debug_priv_ ##name.rtwdev = rtwdev;			\
2546e3ec7017SPing-Ke Shih 		if (!debugfs_create_file(#name, mode,				\
2547e3ec7017SPing-Ke Shih 					 parent, &rtw89_debug_priv_ ##name,	\
2548e3ec7017SPing-Ke Shih 					 &file_ops_ ##fopname))			\
2549e3ec7017SPing-Ke Shih 			pr_debug("Unable to initialize debugfs:%s\n", #name);	\
2550e3ec7017SPing-Ke Shih 	} while (0)
2551e3ec7017SPing-Ke Shih 
2552e3ec7017SPing-Ke Shih #define rtw89_debugfs_add_w(name)						\
2553e3ec7017SPing-Ke Shih 	rtw89_debugfs_add(name, S_IFREG | 0222, single_w, debugfs_topdir)
2554e3ec7017SPing-Ke Shih #define rtw89_debugfs_add_rw(name)						\
2555e3ec7017SPing-Ke Shih 	rtw89_debugfs_add(name, S_IFREG | 0666, common_rw, debugfs_topdir)
2556e3ec7017SPing-Ke Shih #define rtw89_debugfs_add_r(name)						\
2557e3ec7017SPing-Ke Shih 	rtw89_debugfs_add(name, S_IFREG | 0444, single_r, debugfs_topdir)
2558e3ec7017SPing-Ke Shih 
2559e3ec7017SPing-Ke Shih void rtw89_debugfs_init(struct rtw89_dev *rtwdev)
2560e3ec7017SPing-Ke Shih {
2561e3ec7017SPing-Ke Shih 	struct dentry *debugfs_topdir;
2562e3ec7017SPing-Ke Shih 
2563e3ec7017SPing-Ke Shih 	debugfs_topdir = debugfs_create_dir("rtw89",
2564e3ec7017SPing-Ke Shih 					    rtwdev->hw->wiphy->debugfsdir);
2565e3ec7017SPing-Ke Shih 
2566e3ec7017SPing-Ke Shih 	rtw89_debugfs_add_rw(read_reg);
2567e3ec7017SPing-Ke Shih 	rtw89_debugfs_add_w(write_reg);
2568e3ec7017SPing-Ke Shih 	rtw89_debugfs_add_rw(read_rf);
2569e3ec7017SPing-Ke Shih 	rtw89_debugfs_add_w(write_rf);
2570e3ec7017SPing-Ke Shih 	rtw89_debugfs_add_r(rf_reg_dump);
2571e3ec7017SPing-Ke Shih 	rtw89_debugfs_add_r(txpwr_table);
2572e3ec7017SPing-Ke Shih 	rtw89_debugfs_add_rw(mac_reg_dump);
2573e3ec7017SPing-Ke Shih 	rtw89_debugfs_add_rw(mac_mem_dump);
2574e3ec7017SPing-Ke Shih 	rtw89_debugfs_add_rw(mac_dbg_port_dump);
2575e3ec7017SPing-Ke Shih 	rtw89_debugfs_add_w(send_h2c);
2576e3ec7017SPing-Ke Shih 	rtw89_debugfs_add_rw(early_h2c);
2577edb89629SZong-Zhe Yang 	rtw89_debugfs_add_rw(fw_crash);
2578e3ec7017SPing-Ke Shih 	rtw89_debugfs_add_r(btc_info);
2579e3ec7017SPing-Ke Shih 	rtw89_debugfs_add_w(btc_manual);
2580e3ec7017SPing-Ke Shih 	rtw89_debugfs_add_w(fw_log_manual);
2581e3ec7017SPing-Ke Shih 	rtw89_debugfs_add_r(phy_info);
2582d95d8d6bSPing-Ke Shih 	rtw89_debugfs_add_r(stations);
2583e3ec7017SPing-Ke Shih }
2584e3ec7017SPing-Ke Shih #endif
2585e3ec7017SPing-Ke Shih 
2586e3ec7017SPing-Ke Shih #ifdef CONFIG_RTW89_DEBUGMSG
2587e3ec7017SPing-Ke Shih void __rtw89_debug(struct rtw89_dev *rtwdev,
2588e3ec7017SPing-Ke Shih 		   enum rtw89_debug_mask mask,
2589e3ec7017SPing-Ke Shih 		   const char *fmt, ...)
2590e3ec7017SPing-Ke Shih {
2591e3ec7017SPing-Ke Shih 	struct va_format vaf = {
2592e3ec7017SPing-Ke Shih 	.fmt = fmt,
2593e3ec7017SPing-Ke Shih 	};
2594e3ec7017SPing-Ke Shih 
2595e3ec7017SPing-Ke Shih 	va_list args;
2596e3ec7017SPing-Ke Shih 
2597e3ec7017SPing-Ke Shih 	va_start(args, fmt);
2598e3ec7017SPing-Ke Shih 	vaf.va = &args;
2599e3ec7017SPing-Ke Shih 
2600e3ec7017SPing-Ke Shih 	if (rtw89_debug_mask & mask)
2601e3ec7017SPing-Ke Shih 		dev_printk(KERN_DEBUG, rtwdev->dev, "%pV", &vaf);
2602e3ec7017SPing-Ke Shih 
2603e3ec7017SPing-Ke Shih 	va_end(args);
2604e3ec7017SPing-Ke Shih }
2605e3ec7017SPing-Ke Shih EXPORT_SYMBOL(__rtw89_debug);
2606e3ec7017SPing-Ke Shih #endif
2607