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