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