162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause 262306a36Sopenharmony_ci/* Copyright(c) 2019-2020 Realtek Corporation 362306a36Sopenharmony_ci */ 462306a36Sopenharmony_ci 562306a36Sopenharmony_ci#include <linux/vmalloc.h> 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#include "coex.h" 862306a36Sopenharmony_ci#include "debug.h" 962306a36Sopenharmony_ci#include "fw.h" 1062306a36Sopenharmony_ci#include "mac.h" 1162306a36Sopenharmony_ci#include "pci.h" 1262306a36Sopenharmony_ci#include "ps.h" 1362306a36Sopenharmony_ci#include "reg.h" 1462306a36Sopenharmony_ci#include "sar.h" 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci#ifdef CONFIG_RTW89_DEBUGMSG 1762306a36Sopenharmony_ciunsigned int rtw89_debug_mask; 1862306a36Sopenharmony_ciEXPORT_SYMBOL(rtw89_debug_mask); 1962306a36Sopenharmony_cimodule_param_named(debug_mask, rtw89_debug_mask, uint, 0644); 2062306a36Sopenharmony_ciMODULE_PARM_DESC(debug_mask, "Debugging mask"); 2162306a36Sopenharmony_ci#endif 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci#ifdef CONFIG_RTW89_DEBUGFS 2462306a36Sopenharmony_cistruct rtw89_debugfs_priv { 2562306a36Sopenharmony_ci struct rtw89_dev *rtwdev; 2662306a36Sopenharmony_ci int (*cb_read)(struct seq_file *m, void *v); 2762306a36Sopenharmony_ci ssize_t (*cb_write)(struct file *filp, const char __user *buffer, 2862306a36Sopenharmony_ci size_t count, loff_t *loff); 2962306a36Sopenharmony_ci union { 3062306a36Sopenharmony_ci u32 cb_data; 3162306a36Sopenharmony_ci struct { 3262306a36Sopenharmony_ci u32 addr; 3362306a36Sopenharmony_ci u32 len; 3462306a36Sopenharmony_ci } read_reg; 3562306a36Sopenharmony_ci struct { 3662306a36Sopenharmony_ci u32 addr; 3762306a36Sopenharmony_ci u32 mask; 3862306a36Sopenharmony_ci u8 path; 3962306a36Sopenharmony_ci } read_rf; 4062306a36Sopenharmony_ci struct { 4162306a36Sopenharmony_ci u8 ss_dbg:1; 4262306a36Sopenharmony_ci u8 dle_dbg:1; 4362306a36Sopenharmony_ci u8 dmac_dbg:1; 4462306a36Sopenharmony_ci u8 cmac_dbg:1; 4562306a36Sopenharmony_ci u8 dbg_port:1; 4662306a36Sopenharmony_ci } dbgpkg_en; 4762306a36Sopenharmony_ci struct { 4862306a36Sopenharmony_ci u32 start; 4962306a36Sopenharmony_ci u32 len; 5062306a36Sopenharmony_ci u8 sel; 5162306a36Sopenharmony_ci } mac_mem; 5262306a36Sopenharmony_ci }; 5362306a36Sopenharmony_ci}; 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_cistatic const u16 rtw89_rate_info_bw_to_mhz_map[] = { 5662306a36Sopenharmony_ci [RATE_INFO_BW_20] = 20, 5762306a36Sopenharmony_ci [RATE_INFO_BW_40] = 40, 5862306a36Sopenharmony_ci [RATE_INFO_BW_80] = 80, 5962306a36Sopenharmony_ci [RATE_INFO_BW_160] = 160, 6062306a36Sopenharmony_ci [RATE_INFO_BW_320] = 320, 6162306a36Sopenharmony_ci}; 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_cistatic u16 rtw89_rate_info_bw_to_mhz(enum rate_info_bw bw) 6462306a36Sopenharmony_ci{ 6562306a36Sopenharmony_ci if (bw < ARRAY_SIZE(rtw89_rate_info_bw_to_mhz_map)) 6662306a36Sopenharmony_ci return rtw89_rate_info_bw_to_mhz_map[bw]; 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_ci return 0; 6962306a36Sopenharmony_ci} 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_cistatic int rtw89_debugfs_single_show(struct seq_file *m, void *v) 7262306a36Sopenharmony_ci{ 7362306a36Sopenharmony_ci struct rtw89_debugfs_priv *debugfs_priv = m->private; 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_ci return debugfs_priv->cb_read(m, v); 7662306a36Sopenharmony_ci} 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_cistatic ssize_t rtw89_debugfs_single_write(struct file *filp, 7962306a36Sopenharmony_ci const char __user *buffer, 8062306a36Sopenharmony_ci size_t count, loff_t *loff) 8162306a36Sopenharmony_ci{ 8262306a36Sopenharmony_ci struct rtw89_debugfs_priv *debugfs_priv = filp->private_data; 8362306a36Sopenharmony_ci 8462306a36Sopenharmony_ci return debugfs_priv->cb_write(filp, buffer, count, loff); 8562306a36Sopenharmony_ci} 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_cistatic ssize_t rtw89_debugfs_seq_file_write(struct file *filp, 8862306a36Sopenharmony_ci const char __user *buffer, 8962306a36Sopenharmony_ci size_t count, loff_t *loff) 9062306a36Sopenharmony_ci{ 9162306a36Sopenharmony_ci struct seq_file *seqpriv = (struct seq_file *)filp->private_data; 9262306a36Sopenharmony_ci struct rtw89_debugfs_priv *debugfs_priv = seqpriv->private; 9362306a36Sopenharmony_ci 9462306a36Sopenharmony_ci return debugfs_priv->cb_write(filp, buffer, count, loff); 9562306a36Sopenharmony_ci} 9662306a36Sopenharmony_ci 9762306a36Sopenharmony_cistatic int rtw89_debugfs_single_open(struct inode *inode, struct file *filp) 9862306a36Sopenharmony_ci{ 9962306a36Sopenharmony_ci return single_open(filp, rtw89_debugfs_single_show, inode->i_private); 10062306a36Sopenharmony_ci} 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_cistatic int rtw89_debugfs_close(struct inode *inode, struct file *filp) 10362306a36Sopenharmony_ci{ 10462306a36Sopenharmony_ci return 0; 10562306a36Sopenharmony_ci} 10662306a36Sopenharmony_ci 10762306a36Sopenharmony_cistatic const struct file_operations file_ops_single_r = { 10862306a36Sopenharmony_ci .owner = THIS_MODULE, 10962306a36Sopenharmony_ci .open = rtw89_debugfs_single_open, 11062306a36Sopenharmony_ci .read = seq_read, 11162306a36Sopenharmony_ci .llseek = seq_lseek, 11262306a36Sopenharmony_ci .release = single_release, 11362306a36Sopenharmony_ci}; 11462306a36Sopenharmony_ci 11562306a36Sopenharmony_cistatic const struct file_operations file_ops_common_rw = { 11662306a36Sopenharmony_ci .owner = THIS_MODULE, 11762306a36Sopenharmony_ci .open = rtw89_debugfs_single_open, 11862306a36Sopenharmony_ci .release = single_release, 11962306a36Sopenharmony_ci .read = seq_read, 12062306a36Sopenharmony_ci .llseek = seq_lseek, 12162306a36Sopenharmony_ci .write = rtw89_debugfs_seq_file_write, 12262306a36Sopenharmony_ci}; 12362306a36Sopenharmony_ci 12462306a36Sopenharmony_cistatic const struct file_operations file_ops_single_w = { 12562306a36Sopenharmony_ci .owner = THIS_MODULE, 12662306a36Sopenharmony_ci .write = rtw89_debugfs_single_write, 12762306a36Sopenharmony_ci .open = simple_open, 12862306a36Sopenharmony_ci .release = rtw89_debugfs_close, 12962306a36Sopenharmony_ci}; 13062306a36Sopenharmony_ci 13162306a36Sopenharmony_cistatic ssize_t 13262306a36Sopenharmony_cirtw89_debug_priv_read_reg_select(struct file *filp, 13362306a36Sopenharmony_ci const char __user *user_buf, 13462306a36Sopenharmony_ci size_t count, loff_t *loff) 13562306a36Sopenharmony_ci{ 13662306a36Sopenharmony_ci struct seq_file *m = (struct seq_file *)filp->private_data; 13762306a36Sopenharmony_ci struct rtw89_debugfs_priv *debugfs_priv = m->private; 13862306a36Sopenharmony_ci struct rtw89_dev *rtwdev = debugfs_priv->rtwdev; 13962306a36Sopenharmony_ci char buf[32]; 14062306a36Sopenharmony_ci size_t buf_size; 14162306a36Sopenharmony_ci u32 addr, len; 14262306a36Sopenharmony_ci int num; 14362306a36Sopenharmony_ci 14462306a36Sopenharmony_ci buf_size = min(count, sizeof(buf) - 1); 14562306a36Sopenharmony_ci if (copy_from_user(buf, user_buf, buf_size)) 14662306a36Sopenharmony_ci return -EFAULT; 14762306a36Sopenharmony_ci 14862306a36Sopenharmony_ci buf[buf_size] = '\0'; 14962306a36Sopenharmony_ci num = sscanf(buf, "%x %x", &addr, &len); 15062306a36Sopenharmony_ci if (num != 2) { 15162306a36Sopenharmony_ci rtw89_info(rtwdev, "invalid format: <addr> <len>\n"); 15262306a36Sopenharmony_ci return -EINVAL; 15362306a36Sopenharmony_ci } 15462306a36Sopenharmony_ci 15562306a36Sopenharmony_ci debugfs_priv->read_reg.addr = addr; 15662306a36Sopenharmony_ci debugfs_priv->read_reg.len = len; 15762306a36Sopenharmony_ci 15862306a36Sopenharmony_ci rtw89_info(rtwdev, "select read %d bytes from 0x%08x\n", len, addr); 15962306a36Sopenharmony_ci 16062306a36Sopenharmony_ci return count; 16162306a36Sopenharmony_ci} 16262306a36Sopenharmony_ci 16362306a36Sopenharmony_cistatic int rtw89_debug_priv_read_reg_get(struct seq_file *m, void *v) 16462306a36Sopenharmony_ci{ 16562306a36Sopenharmony_ci struct rtw89_debugfs_priv *debugfs_priv = m->private; 16662306a36Sopenharmony_ci struct rtw89_dev *rtwdev = debugfs_priv->rtwdev; 16762306a36Sopenharmony_ci u32 addr, end, data, k; 16862306a36Sopenharmony_ci u32 len; 16962306a36Sopenharmony_ci 17062306a36Sopenharmony_ci len = debugfs_priv->read_reg.len; 17162306a36Sopenharmony_ci addr = debugfs_priv->read_reg.addr; 17262306a36Sopenharmony_ci 17362306a36Sopenharmony_ci if (len > 4) 17462306a36Sopenharmony_ci goto ndata; 17562306a36Sopenharmony_ci 17662306a36Sopenharmony_ci switch (len) { 17762306a36Sopenharmony_ci case 1: 17862306a36Sopenharmony_ci data = rtw89_read8(rtwdev, addr); 17962306a36Sopenharmony_ci break; 18062306a36Sopenharmony_ci case 2: 18162306a36Sopenharmony_ci data = rtw89_read16(rtwdev, addr); 18262306a36Sopenharmony_ci break; 18362306a36Sopenharmony_ci case 4: 18462306a36Sopenharmony_ci data = rtw89_read32(rtwdev, addr); 18562306a36Sopenharmony_ci break; 18662306a36Sopenharmony_ci default: 18762306a36Sopenharmony_ci rtw89_info(rtwdev, "invalid read reg len %d\n", len); 18862306a36Sopenharmony_ci return -EINVAL; 18962306a36Sopenharmony_ci } 19062306a36Sopenharmony_ci 19162306a36Sopenharmony_ci seq_printf(m, "get %d bytes at 0x%08x=0x%08x\n", len, addr, data); 19262306a36Sopenharmony_ci 19362306a36Sopenharmony_ci return 0; 19462306a36Sopenharmony_ci 19562306a36Sopenharmony_cindata: 19662306a36Sopenharmony_ci end = addr + len; 19762306a36Sopenharmony_ci 19862306a36Sopenharmony_ci for (; addr < end; addr += 16) { 19962306a36Sopenharmony_ci seq_printf(m, "%08xh : ", 0x18600000 + addr); 20062306a36Sopenharmony_ci for (k = 0; k < 16; k += 4) { 20162306a36Sopenharmony_ci data = rtw89_read32(rtwdev, addr + k); 20262306a36Sopenharmony_ci seq_printf(m, "%08x ", data); 20362306a36Sopenharmony_ci } 20462306a36Sopenharmony_ci seq_puts(m, "\n"); 20562306a36Sopenharmony_ci } 20662306a36Sopenharmony_ci 20762306a36Sopenharmony_ci return 0; 20862306a36Sopenharmony_ci} 20962306a36Sopenharmony_ci 21062306a36Sopenharmony_cistatic ssize_t rtw89_debug_priv_write_reg_set(struct file *filp, 21162306a36Sopenharmony_ci const char __user *user_buf, 21262306a36Sopenharmony_ci size_t count, loff_t *loff) 21362306a36Sopenharmony_ci{ 21462306a36Sopenharmony_ci struct rtw89_debugfs_priv *debugfs_priv = filp->private_data; 21562306a36Sopenharmony_ci struct rtw89_dev *rtwdev = debugfs_priv->rtwdev; 21662306a36Sopenharmony_ci char buf[32]; 21762306a36Sopenharmony_ci size_t buf_size; 21862306a36Sopenharmony_ci u32 addr, val, len; 21962306a36Sopenharmony_ci int num; 22062306a36Sopenharmony_ci 22162306a36Sopenharmony_ci buf_size = min(count, sizeof(buf) - 1); 22262306a36Sopenharmony_ci if (copy_from_user(buf, user_buf, buf_size)) 22362306a36Sopenharmony_ci return -EFAULT; 22462306a36Sopenharmony_ci 22562306a36Sopenharmony_ci buf[buf_size] = '\0'; 22662306a36Sopenharmony_ci num = sscanf(buf, "%x %x %x", &addr, &val, &len); 22762306a36Sopenharmony_ci if (num != 3) { 22862306a36Sopenharmony_ci rtw89_info(rtwdev, "invalid format: <addr> <val> <len>\n"); 22962306a36Sopenharmony_ci return -EINVAL; 23062306a36Sopenharmony_ci } 23162306a36Sopenharmony_ci 23262306a36Sopenharmony_ci switch (len) { 23362306a36Sopenharmony_ci case 1: 23462306a36Sopenharmony_ci rtw89_info(rtwdev, "reg write8 0x%08x: 0x%02x\n", addr, val); 23562306a36Sopenharmony_ci rtw89_write8(rtwdev, addr, (u8)val); 23662306a36Sopenharmony_ci break; 23762306a36Sopenharmony_ci case 2: 23862306a36Sopenharmony_ci rtw89_info(rtwdev, "reg write16 0x%08x: 0x%04x\n", addr, val); 23962306a36Sopenharmony_ci rtw89_write16(rtwdev, addr, (u16)val); 24062306a36Sopenharmony_ci break; 24162306a36Sopenharmony_ci case 4: 24262306a36Sopenharmony_ci rtw89_info(rtwdev, "reg write32 0x%08x: 0x%08x\n", addr, val); 24362306a36Sopenharmony_ci rtw89_write32(rtwdev, addr, (u32)val); 24462306a36Sopenharmony_ci break; 24562306a36Sopenharmony_ci default: 24662306a36Sopenharmony_ci rtw89_info(rtwdev, "invalid read write len %d\n", len); 24762306a36Sopenharmony_ci break; 24862306a36Sopenharmony_ci } 24962306a36Sopenharmony_ci 25062306a36Sopenharmony_ci return count; 25162306a36Sopenharmony_ci} 25262306a36Sopenharmony_ci 25362306a36Sopenharmony_cistatic ssize_t 25462306a36Sopenharmony_cirtw89_debug_priv_read_rf_select(struct file *filp, 25562306a36Sopenharmony_ci const char __user *user_buf, 25662306a36Sopenharmony_ci size_t count, loff_t *loff) 25762306a36Sopenharmony_ci{ 25862306a36Sopenharmony_ci struct seq_file *m = (struct seq_file *)filp->private_data; 25962306a36Sopenharmony_ci struct rtw89_debugfs_priv *debugfs_priv = m->private; 26062306a36Sopenharmony_ci struct rtw89_dev *rtwdev = debugfs_priv->rtwdev; 26162306a36Sopenharmony_ci char buf[32]; 26262306a36Sopenharmony_ci size_t buf_size; 26362306a36Sopenharmony_ci u32 addr, mask; 26462306a36Sopenharmony_ci u8 path; 26562306a36Sopenharmony_ci int num; 26662306a36Sopenharmony_ci 26762306a36Sopenharmony_ci buf_size = min(count, sizeof(buf) - 1); 26862306a36Sopenharmony_ci if (copy_from_user(buf, user_buf, buf_size)) 26962306a36Sopenharmony_ci return -EFAULT; 27062306a36Sopenharmony_ci 27162306a36Sopenharmony_ci buf[buf_size] = '\0'; 27262306a36Sopenharmony_ci num = sscanf(buf, "%hhd %x %x", &path, &addr, &mask); 27362306a36Sopenharmony_ci if (num != 3) { 27462306a36Sopenharmony_ci rtw89_info(rtwdev, "invalid format: <path> <addr> <mask>\n"); 27562306a36Sopenharmony_ci return -EINVAL; 27662306a36Sopenharmony_ci } 27762306a36Sopenharmony_ci 27862306a36Sopenharmony_ci if (path >= rtwdev->chip->rf_path_num) { 27962306a36Sopenharmony_ci rtw89_info(rtwdev, "wrong rf path\n"); 28062306a36Sopenharmony_ci return -EINVAL; 28162306a36Sopenharmony_ci } 28262306a36Sopenharmony_ci debugfs_priv->read_rf.addr = addr; 28362306a36Sopenharmony_ci debugfs_priv->read_rf.mask = mask; 28462306a36Sopenharmony_ci debugfs_priv->read_rf.path = path; 28562306a36Sopenharmony_ci 28662306a36Sopenharmony_ci rtw89_info(rtwdev, "select read rf path %d from 0x%08x\n", path, addr); 28762306a36Sopenharmony_ci 28862306a36Sopenharmony_ci return count; 28962306a36Sopenharmony_ci} 29062306a36Sopenharmony_ci 29162306a36Sopenharmony_cistatic int rtw89_debug_priv_read_rf_get(struct seq_file *m, void *v) 29262306a36Sopenharmony_ci{ 29362306a36Sopenharmony_ci struct rtw89_debugfs_priv *debugfs_priv = m->private; 29462306a36Sopenharmony_ci struct rtw89_dev *rtwdev = debugfs_priv->rtwdev; 29562306a36Sopenharmony_ci u32 addr, data, mask; 29662306a36Sopenharmony_ci u8 path; 29762306a36Sopenharmony_ci 29862306a36Sopenharmony_ci addr = debugfs_priv->read_rf.addr; 29962306a36Sopenharmony_ci mask = debugfs_priv->read_rf.mask; 30062306a36Sopenharmony_ci path = debugfs_priv->read_rf.path; 30162306a36Sopenharmony_ci 30262306a36Sopenharmony_ci data = rtw89_read_rf(rtwdev, path, addr, mask); 30362306a36Sopenharmony_ci 30462306a36Sopenharmony_ci seq_printf(m, "path %d, rf register 0x%08x=0x%08x\n", path, addr, data); 30562306a36Sopenharmony_ci 30662306a36Sopenharmony_ci return 0; 30762306a36Sopenharmony_ci} 30862306a36Sopenharmony_ci 30962306a36Sopenharmony_cistatic ssize_t rtw89_debug_priv_write_rf_set(struct file *filp, 31062306a36Sopenharmony_ci const char __user *user_buf, 31162306a36Sopenharmony_ci size_t count, loff_t *loff) 31262306a36Sopenharmony_ci{ 31362306a36Sopenharmony_ci struct rtw89_debugfs_priv *debugfs_priv = filp->private_data; 31462306a36Sopenharmony_ci struct rtw89_dev *rtwdev = debugfs_priv->rtwdev; 31562306a36Sopenharmony_ci char buf[32]; 31662306a36Sopenharmony_ci size_t buf_size; 31762306a36Sopenharmony_ci u32 addr, val, mask; 31862306a36Sopenharmony_ci u8 path; 31962306a36Sopenharmony_ci int num; 32062306a36Sopenharmony_ci 32162306a36Sopenharmony_ci buf_size = min(count, sizeof(buf) - 1); 32262306a36Sopenharmony_ci if (copy_from_user(buf, user_buf, buf_size)) 32362306a36Sopenharmony_ci return -EFAULT; 32462306a36Sopenharmony_ci 32562306a36Sopenharmony_ci buf[buf_size] = '\0'; 32662306a36Sopenharmony_ci num = sscanf(buf, "%hhd %x %x %x", &path, &addr, &mask, &val); 32762306a36Sopenharmony_ci if (num != 4) { 32862306a36Sopenharmony_ci rtw89_info(rtwdev, "invalid format: <path> <addr> <mask> <val>\n"); 32962306a36Sopenharmony_ci return -EINVAL; 33062306a36Sopenharmony_ci } 33162306a36Sopenharmony_ci 33262306a36Sopenharmony_ci if (path >= rtwdev->chip->rf_path_num) { 33362306a36Sopenharmony_ci rtw89_info(rtwdev, "wrong rf path\n"); 33462306a36Sopenharmony_ci return -EINVAL; 33562306a36Sopenharmony_ci } 33662306a36Sopenharmony_ci 33762306a36Sopenharmony_ci rtw89_info(rtwdev, "path %d, rf register write 0x%08x=0x%08x (mask = 0x%08x)\n", 33862306a36Sopenharmony_ci path, addr, val, mask); 33962306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, addr, mask, val); 34062306a36Sopenharmony_ci 34162306a36Sopenharmony_ci return count; 34262306a36Sopenharmony_ci} 34362306a36Sopenharmony_ci 34462306a36Sopenharmony_cistatic int rtw89_debug_priv_rf_reg_dump_get(struct seq_file *m, void *v) 34562306a36Sopenharmony_ci{ 34662306a36Sopenharmony_ci struct rtw89_debugfs_priv *debugfs_priv = m->private; 34762306a36Sopenharmony_ci struct rtw89_dev *rtwdev = debugfs_priv->rtwdev; 34862306a36Sopenharmony_ci const struct rtw89_chip_info *chip = rtwdev->chip; 34962306a36Sopenharmony_ci u32 addr, offset, data; 35062306a36Sopenharmony_ci u8 path; 35162306a36Sopenharmony_ci 35262306a36Sopenharmony_ci for (path = 0; path < chip->rf_path_num; path++) { 35362306a36Sopenharmony_ci seq_printf(m, "RF path %d:\n\n", path); 35462306a36Sopenharmony_ci for (addr = 0; addr < 0x100; addr += 4) { 35562306a36Sopenharmony_ci seq_printf(m, "0x%08x: ", addr); 35662306a36Sopenharmony_ci for (offset = 0; offset < 4; offset++) { 35762306a36Sopenharmony_ci data = rtw89_read_rf(rtwdev, path, 35862306a36Sopenharmony_ci addr + offset, RFREG_MASK); 35962306a36Sopenharmony_ci seq_printf(m, "0x%05x ", data); 36062306a36Sopenharmony_ci } 36162306a36Sopenharmony_ci seq_puts(m, "\n"); 36262306a36Sopenharmony_ci } 36362306a36Sopenharmony_ci seq_puts(m, "\n"); 36462306a36Sopenharmony_ci } 36562306a36Sopenharmony_ci 36662306a36Sopenharmony_ci return 0; 36762306a36Sopenharmony_ci} 36862306a36Sopenharmony_ci 36962306a36Sopenharmony_cistruct txpwr_ent { 37062306a36Sopenharmony_ci const char *txt; 37162306a36Sopenharmony_ci u8 len; 37262306a36Sopenharmony_ci}; 37362306a36Sopenharmony_ci 37462306a36Sopenharmony_cistruct txpwr_map { 37562306a36Sopenharmony_ci const struct txpwr_ent *ent; 37662306a36Sopenharmony_ci u8 size; 37762306a36Sopenharmony_ci u32 addr_from; 37862306a36Sopenharmony_ci u32 addr_to; 37962306a36Sopenharmony_ci u32 addr_to_1ss; 38062306a36Sopenharmony_ci}; 38162306a36Sopenharmony_ci 38262306a36Sopenharmony_ci#define __GEN_TXPWR_ENT2(_t, _e0, _e1) \ 38362306a36Sopenharmony_ci { .len = 2, .txt = _t "\t- " _e0 " " _e1 } 38462306a36Sopenharmony_ci 38562306a36Sopenharmony_ci#define __GEN_TXPWR_ENT4(_t, _e0, _e1, _e2, _e3) \ 38662306a36Sopenharmony_ci { .len = 4, .txt = _t "\t- " _e0 " " _e1 " " _e2 " " _e3 } 38762306a36Sopenharmony_ci 38862306a36Sopenharmony_ci#define __GEN_TXPWR_ENT8(_t, _e0, _e1, _e2, _e3, _e4, _e5, _e6, _e7) \ 38962306a36Sopenharmony_ci { .len = 8, .txt = _t "\t- " \ 39062306a36Sopenharmony_ci _e0 " " _e1 " " _e2 " " _e3 " " \ 39162306a36Sopenharmony_ci _e4 " " _e5 " " _e6 " " _e7 } 39262306a36Sopenharmony_ci 39362306a36Sopenharmony_cistatic const struct txpwr_ent __txpwr_ent_byr[] = { 39462306a36Sopenharmony_ci __GEN_TXPWR_ENT4("CCK ", "1M ", "2M ", "5.5M ", "11M "), 39562306a36Sopenharmony_ci __GEN_TXPWR_ENT4("LEGACY ", "6M ", "9M ", "12M ", "18M "), 39662306a36Sopenharmony_ci __GEN_TXPWR_ENT4("LEGACY ", "24M ", "36M ", "48M ", "54M "), 39762306a36Sopenharmony_ci /* 1NSS */ 39862306a36Sopenharmony_ci __GEN_TXPWR_ENT4("MCS_1NSS ", "MCS0 ", "MCS1 ", "MCS2 ", "MCS3 "), 39962306a36Sopenharmony_ci __GEN_TXPWR_ENT4("MCS_1NSS ", "MCS4 ", "MCS5 ", "MCS6 ", "MCS7 "), 40062306a36Sopenharmony_ci __GEN_TXPWR_ENT4("MCS_1NSS ", "MCS8 ", "MCS9 ", "MCS10", "MCS11"), 40162306a36Sopenharmony_ci __GEN_TXPWR_ENT4("HEDCM_1NSS", "MCS0 ", "MCS1 ", "MCS3 ", "MCS4 "), 40262306a36Sopenharmony_ci /* 2NSS */ 40362306a36Sopenharmony_ci __GEN_TXPWR_ENT4("MCS_2NSS ", "MCS0 ", "MCS1 ", "MCS2 ", "MCS3 "), 40462306a36Sopenharmony_ci __GEN_TXPWR_ENT4("MCS_2NSS ", "MCS4 ", "MCS5 ", "MCS6 ", "MCS7 "), 40562306a36Sopenharmony_ci __GEN_TXPWR_ENT4("MCS_2NSS ", "MCS8 ", "MCS9 ", "MCS10", "MCS11"), 40662306a36Sopenharmony_ci __GEN_TXPWR_ENT4("HEDCM_2NSS", "MCS0 ", "MCS1 ", "MCS3 ", "MCS4 "), 40762306a36Sopenharmony_ci}; 40862306a36Sopenharmony_ci 40962306a36Sopenharmony_cistatic_assert((ARRAY_SIZE(__txpwr_ent_byr) * 4) == 41062306a36Sopenharmony_ci (R_AX_PWR_BY_RATE_MAX - R_AX_PWR_BY_RATE + 4)); 41162306a36Sopenharmony_ci 41262306a36Sopenharmony_cistatic const struct txpwr_map __txpwr_map_byr = { 41362306a36Sopenharmony_ci .ent = __txpwr_ent_byr, 41462306a36Sopenharmony_ci .size = ARRAY_SIZE(__txpwr_ent_byr), 41562306a36Sopenharmony_ci .addr_from = R_AX_PWR_BY_RATE, 41662306a36Sopenharmony_ci .addr_to = R_AX_PWR_BY_RATE_MAX, 41762306a36Sopenharmony_ci .addr_to_1ss = R_AX_PWR_BY_RATE_1SS_MAX, 41862306a36Sopenharmony_ci}; 41962306a36Sopenharmony_ci 42062306a36Sopenharmony_cistatic const struct txpwr_ent __txpwr_ent_lmt[] = { 42162306a36Sopenharmony_ci /* 1TX */ 42262306a36Sopenharmony_ci __GEN_TXPWR_ENT2("CCK_1TX_20M ", "NON_BF", "BF"), 42362306a36Sopenharmony_ci __GEN_TXPWR_ENT2("CCK_1TX_40M ", "NON_BF", "BF"), 42462306a36Sopenharmony_ci __GEN_TXPWR_ENT2("OFDM_1TX ", "NON_BF", "BF"), 42562306a36Sopenharmony_ci __GEN_TXPWR_ENT2("MCS_1TX_20M_0 ", "NON_BF", "BF"), 42662306a36Sopenharmony_ci __GEN_TXPWR_ENT2("MCS_1TX_20M_1 ", "NON_BF", "BF"), 42762306a36Sopenharmony_ci __GEN_TXPWR_ENT2("MCS_1TX_20M_2 ", "NON_BF", "BF"), 42862306a36Sopenharmony_ci __GEN_TXPWR_ENT2("MCS_1TX_20M_3 ", "NON_BF", "BF"), 42962306a36Sopenharmony_ci __GEN_TXPWR_ENT2("MCS_1TX_20M_4 ", "NON_BF", "BF"), 43062306a36Sopenharmony_ci __GEN_TXPWR_ENT2("MCS_1TX_20M_5 ", "NON_BF", "BF"), 43162306a36Sopenharmony_ci __GEN_TXPWR_ENT2("MCS_1TX_20M_6 ", "NON_BF", "BF"), 43262306a36Sopenharmony_ci __GEN_TXPWR_ENT2("MCS_1TX_20M_7 ", "NON_BF", "BF"), 43362306a36Sopenharmony_ci __GEN_TXPWR_ENT2("MCS_1TX_40M_0 ", "NON_BF", "BF"), 43462306a36Sopenharmony_ci __GEN_TXPWR_ENT2("MCS_1TX_40M_1 ", "NON_BF", "BF"), 43562306a36Sopenharmony_ci __GEN_TXPWR_ENT2("MCS_1TX_40M_2 ", "NON_BF", "BF"), 43662306a36Sopenharmony_ci __GEN_TXPWR_ENT2("MCS_1TX_40M_3 ", "NON_BF", "BF"), 43762306a36Sopenharmony_ci __GEN_TXPWR_ENT2("MCS_1TX_80M_0 ", "NON_BF", "BF"), 43862306a36Sopenharmony_ci __GEN_TXPWR_ENT2("MCS_1TX_80M_1 ", "NON_BF", "BF"), 43962306a36Sopenharmony_ci __GEN_TXPWR_ENT2("MCS_1TX_160M ", "NON_BF", "BF"), 44062306a36Sopenharmony_ci __GEN_TXPWR_ENT2("MCS_1TX_40M_0p5", "NON_BF", "BF"), 44162306a36Sopenharmony_ci __GEN_TXPWR_ENT2("MCS_1TX_40M_2p5", "NON_BF", "BF"), 44262306a36Sopenharmony_ci /* 2TX */ 44362306a36Sopenharmony_ci __GEN_TXPWR_ENT2("CCK_2TX_20M ", "NON_BF", "BF"), 44462306a36Sopenharmony_ci __GEN_TXPWR_ENT2("CCK_2TX_40M ", "NON_BF", "BF"), 44562306a36Sopenharmony_ci __GEN_TXPWR_ENT2("OFDM_2TX ", "NON_BF", "BF"), 44662306a36Sopenharmony_ci __GEN_TXPWR_ENT2("MCS_2TX_20M_0 ", "NON_BF", "BF"), 44762306a36Sopenharmony_ci __GEN_TXPWR_ENT2("MCS_2TX_20M_1 ", "NON_BF", "BF"), 44862306a36Sopenharmony_ci __GEN_TXPWR_ENT2("MCS_2TX_20M_2 ", "NON_BF", "BF"), 44962306a36Sopenharmony_ci __GEN_TXPWR_ENT2("MCS_2TX_20M_3 ", "NON_BF", "BF"), 45062306a36Sopenharmony_ci __GEN_TXPWR_ENT2("MCS_2TX_20M_4 ", "NON_BF", "BF"), 45162306a36Sopenharmony_ci __GEN_TXPWR_ENT2("MCS_2TX_20M_5 ", "NON_BF", "BF"), 45262306a36Sopenharmony_ci __GEN_TXPWR_ENT2("MCS_2TX_20M_6 ", "NON_BF", "BF"), 45362306a36Sopenharmony_ci __GEN_TXPWR_ENT2("MCS_2TX_20M_7 ", "NON_BF", "BF"), 45462306a36Sopenharmony_ci __GEN_TXPWR_ENT2("MCS_2TX_40M_0 ", "NON_BF", "BF"), 45562306a36Sopenharmony_ci __GEN_TXPWR_ENT2("MCS_2TX_40M_1 ", "NON_BF", "BF"), 45662306a36Sopenharmony_ci __GEN_TXPWR_ENT2("MCS_2TX_40M_2 ", "NON_BF", "BF"), 45762306a36Sopenharmony_ci __GEN_TXPWR_ENT2("MCS_2TX_40M_3 ", "NON_BF", "BF"), 45862306a36Sopenharmony_ci __GEN_TXPWR_ENT2("MCS_2TX_80M_0 ", "NON_BF", "BF"), 45962306a36Sopenharmony_ci __GEN_TXPWR_ENT2("MCS_2TX_80M_1 ", "NON_BF", "BF"), 46062306a36Sopenharmony_ci __GEN_TXPWR_ENT2("MCS_2TX_160M ", "NON_BF", "BF"), 46162306a36Sopenharmony_ci __GEN_TXPWR_ENT2("MCS_2TX_40M_0p5", "NON_BF", "BF"), 46262306a36Sopenharmony_ci __GEN_TXPWR_ENT2("MCS_2TX_40M_2p5", "NON_BF", "BF"), 46362306a36Sopenharmony_ci}; 46462306a36Sopenharmony_ci 46562306a36Sopenharmony_cistatic_assert((ARRAY_SIZE(__txpwr_ent_lmt) * 2) == 46662306a36Sopenharmony_ci (R_AX_PWR_LMT_MAX - R_AX_PWR_LMT + 4)); 46762306a36Sopenharmony_ci 46862306a36Sopenharmony_cistatic const struct txpwr_map __txpwr_map_lmt = { 46962306a36Sopenharmony_ci .ent = __txpwr_ent_lmt, 47062306a36Sopenharmony_ci .size = ARRAY_SIZE(__txpwr_ent_lmt), 47162306a36Sopenharmony_ci .addr_from = R_AX_PWR_LMT, 47262306a36Sopenharmony_ci .addr_to = R_AX_PWR_LMT_MAX, 47362306a36Sopenharmony_ci .addr_to_1ss = R_AX_PWR_LMT_1SS_MAX, 47462306a36Sopenharmony_ci}; 47562306a36Sopenharmony_ci 47662306a36Sopenharmony_cistatic const struct txpwr_ent __txpwr_ent_lmt_ru[] = { 47762306a36Sopenharmony_ci /* 1TX */ 47862306a36Sopenharmony_ci __GEN_TXPWR_ENT8("1TX", "RU26__0", "RU26__1", "RU26__2", "RU26__3", 47962306a36Sopenharmony_ci "RU26__4", "RU26__5", "RU26__6", "RU26__7"), 48062306a36Sopenharmony_ci __GEN_TXPWR_ENT8("1TX", "RU52__0", "RU52__1", "RU52__2", "RU52__3", 48162306a36Sopenharmony_ci "RU52__4", "RU52__5", "RU52__6", "RU52__7"), 48262306a36Sopenharmony_ci __GEN_TXPWR_ENT8("1TX", "RU106_0", "RU106_1", "RU106_2", "RU106_3", 48362306a36Sopenharmony_ci "RU106_4", "RU106_5", "RU106_6", "RU106_7"), 48462306a36Sopenharmony_ci /* 2TX */ 48562306a36Sopenharmony_ci __GEN_TXPWR_ENT8("2TX", "RU26__0", "RU26__1", "RU26__2", "RU26__3", 48662306a36Sopenharmony_ci "RU26__4", "RU26__5", "RU26__6", "RU26__7"), 48762306a36Sopenharmony_ci __GEN_TXPWR_ENT8("2TX", "RU52__0", "RU52__1", "RU52__2", "RU52__3", 48862306a36Sopenharmony_ci "RU52__4", "RU52__5", "RU52__6", "RU52__7"), 48962306a36Sopenharmony_ci __GEN_TXPWR_ENT8("2TX", "RU106_0", "RU106_1", "RU106_2", "RU106_3", 49062306a36Sopenharmony_ci "RU106_4", "RU106_5", "RU106_6", "RU106_7"), 49162306a36Sopenharmony_ci}; 49262306a36Sopenharmony_ci 49362306a36Sopenharmony_cistatic_assert((ARRAY_SIZE(__txpwr_ent_lmt_ru) * 8) == 49462306a36Sopenharmony_ci (R_AX_PWR_RU_LMT_MAX - R_AX_PWR_RU_LMT + 4)); 49562306a36Sopenharmony_ci 49662306a36Sopenharmony_cistatic const struct txpwr_map __txpwr_map_lmt_ru = { 49762306a36Sopenharmony_ci .ent = __txpwr_ent_lmt_ru, 49862306a36Sopenharmony_ci .size = ARRAY_SIZE(__txpwr_ent_lmt_ru), 49962306a36Sopenharmony_ci .addr_from = R_AX_PWR_RU_LMT, 50062306a36Sopenharmony_ci .addr_to = R_AX_PWR_RU_LMT_MAX, 50162306a36Sopenharmony_ci .addr_to_1ss = R_AX_PWR_RU_LMT_1SS_MAX, 50262306a36Sopenharmony_ci}; 50362306a36Sopenharmony_ci 50462306a36Sopenharmony_cistatic u8 __print_txpwr_ent(struct seq_file *m, const struct txpwr_ent *ent, 50562306a36Sopenharmony_ci const s8 *buf, const u8 cur) 50662306a36Sopenharmony_ci{ 50762306a36Sopenharmony_ci char *fmt; 50862306a36Sopenharmony_ci 50962306a36Sopenharmony_ci switch (ent->len) { 51062306a36Sopenharmony_ci case 2: 51162306a36Sopenharmony_ci fmt = "%s\t| %3d, %3d,\tdBm\n"; 51262306a36Sopenharmony_ci seq_printf(m, fmt, ent->txt, buf[cur], buf[cur + 1]); 51362306a36Sopenharmony_ci return 2; 51462306a36Sopenharmony_ci case 4: 51562306a36Sopenharmony_ci fmt = "%s\t| %3d, %3d, %3d, %3d,\tdBm\n"; 51662306a36Sopenharmony_ci seq_printf(m, fmt, ent->txt, buf[cur], buf[cur + 1], 51762306a36Sopenharmony_ci buf[cur + 2], buf[cur + 3]); 51862306a36Sopenharmony_ci return 4; 51962306a36Sopenharmony_ci case 8: 52062306a36Sopenharmony_ci fmt = "%s\t| %3d, %3d, %3d, %3d, %3d, %3d, %3d, %3d,\tdBm\n"; 52162306a36Sopenharmony_ci seq_printf(m, fmt, ent->txt, buf[cur], buf[cur + 1], 52262306a36Sopenharmony_ci buf[cur + 2], buf[cur + 3], buf[cur + 4], 52362306a36Sopenharmony_ci buf[cur + 5], buf[cur + 6], buf[cur + 7]); 52462306a36Sopenharmony_ci return 8; 52562306a36Sopenharmony_ci default: 52662306a36Sopenharmony_ci return 0; 52762306a36Sopenharmony_ci } 52862306a36Sopenharmony_ci} 52962306a36Sopenharmony_ci 53062306a36Sopenharmony_cistatic int __print_txpwr_map(struct seq_file *m, struct rtw89_dev *rtwdev, 53162306a36Sopenharmony_ci const struct txpwr_map *map) 53262306a36Sopenharmony_ci{ 53362306a36Sopenharmony_ci u8 fct = rtwdev->chip->txpwr_factor_mac; 53462306a36Sopenharmony_ci u8 path_num = rtwdev->chip->rf_path_num; 53562306a36Sopenharmony_ci u32 max_valid_addr; 53662306a36Sopenharmony_ci u32 val, addr; 53762306a36Sopenharmony_ci s8 *buf, tmp; 53862306a36Sopenharmony_ci u8 cur, i; 53962306a36Sopenharmony_ci int ret; 54062306a36Sopenharmony_ci 54162306a36Sopenharmony_ci buf = vzalloc(map->addr_to - map->addr_from + 4); 54262306a36Sopenharmony_ci if (!buf) 54362306a36Sopenharmony_ci return -ENOMEM; 54462306a36Sopenharmony_ci 54562306a36Sopenharmony_ci if (path_num == 1) 54662306a36Sopenharmony_ci max_valid_addr = map->addr_to_1ss; 54762306a36Sopenharmony_ci else 54862306a36Sopenharmony_ci max_valid_addr = map->addr_to; 54962306a36Sopenharmony_ci 55062306a36Sopenharmony_ci for (addr = map->addr_from; addr <= max_valid_addr; addr += 4) { 55162306a36Sopenharmony_ci ret = rtw89_mac_txpwr_read32(rtwdev, RTW89_PHY_0, addr, &val); 55262306a36Sopenharmony_ci if (ret) 55362306a36Sopenharmony_ci val = MASKDWORD; 55462306a36Sopenharmony_ci 55562306a36Sopenharmony_ci cur = addr - map->addr_from; 55662306a36Sopenharmony_ci for (i = 0; i < 4; i++, val >>= 8) { 55762306a36Sopenharmony_ci /* signed 7 bits, and reserved BIT(7) */ 55862306a36Sopenharmony_ci tmp = sign_extend32(val, 6); 55962306a36Sopenharmony_ci buf[cur + i] = tmp >> fct; 56062306a36Sopenharmony_ci } 56162306a36Sopenharmony_ci } 56262306a36Sopenharmony_ci 56362306a36Sopenharmony_ci for (cur = 0, i = 0; i < map->size; i++) 56462306a36Sopenharmony_ci cur += __print_txpwr_ent(m, &map->ent[i], buf, cur); 56562306a36Sopenharmony_ci 56662306a36Sopenharmony_ci vfree(buf); 56762306a36Sopenharmony_ci return 0; 56862306a36Sopenharmony_ci} 56962306a36Sopenharmony_ci 57062306a36Sopenharmony_ci#define case_REGD(_regd) \ 57162306a36Sopenharmony_ci case RTW89_ ## _regd: \ 57262306a36Sopenharmony_ci seq_puts(m, #_regd "\n"); \ 57362306a36Sopenharmony_ci break 57462306a36Sopenharmony_ci 57562306a36Sopenharmony_cistatic void __print_regd(struct seq_file *m, struct rtw89_dev *rtwdev, 57662306a36Sopenharmony_ci const struct rtw89_chan *chan) 57762306a36Sopenharmony_ci{ 57862306a36Sopenharmony_ci u8 band = chan->band_type; 57962306a36Sopenharmony_ci u8 regd = rtw89_regd_get(rtwdev, band); 58062306a36Sopenharmony_ci 58162306a36Sopenharmony_ci switch (regd) { 58262306a36Sopenharmony_ci default: 58362306a36Sopenharmony_ci seq_printf(m, "UNKNOWN: %d\n", regd); 58462306a36Sopenharmony_ci break; 58562306a36Sopenharmony_ci case_REGD(WW); 58662306a36Sopenharmony_ci case_REGD(ETSI); 58762306a36Sopenharmony_ci case_REGD(FCC); 58862306a36Sopenharmony_ci case_REGD(MKK); 58962306a36Sopenharmony_ci case_REGD(NA); 59062306a36Sopenharmony_ci case_REGD(IC); 59162306a36Sopenharmony_ci case_REGD(KCC); 59262306a36Sopenharmony_ci case_REGD(NCC); 59362306a36Sopenharmony_ci case_REGD(CHILE); 59462306a36Sopenharmony_ci case_REGD(ACMA); 59562306a36Sopenharmony_ci case_REGD(MEXICO); 59662306a36Sopenharmony_ci case_REGD(UKRAINE); 59762306a36Sopenharmony_ci case_REGD(CN); 59862306a36Sopenharmony_ci } 59962306a36Sopenharmony_ci} 60062306a36Sopenharmony_ci 60162306a36Sopenharmony_ci#undef case_REGD 60262306a36Sopenharmony_ci 60362306a36Sopenharmony_cistatic int rtw89_debug_priv_txpwr_table_get(struct seq_file *m, void *v) 60462306a36Sopenharmony_ci{ 60562306a36Sopenharmony_ci struct rtw89_debugfs_priv *debugfs_priv = m->private; 60662306a36Sopenharmony_ci struct rtw89_dev *rtwdev = debugfs_priv->rtwdev; 60762306a36Sopenharmony_ci const struct rtw89_chan *chan; 60862306a36Sopenharmony_ci int ret = 0; 60962306a36Sopenharmony_ci 61062306a36Sopenharmony_ci mutex_lock(&rtwdev->mutex); 61162306a36Sopenharmony_ci rtw89_leave_ps_mode(rtwdev); 61262306a36Sopenharmony_ci chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 61362306a36Sopenharmony_ci 61462306a36Sopenharmony_ci seq_puts(m, "[Regulatory] "); 61562306a36Sopenharmony_ci __print_regd(m, rtwdev, chan); 61662306a36Sopenharmony_ci 61762306a36Sopenharmony_ci seq_puts(m, "[SAR]\n"); 61862306a36Sopenharmony_ci rtw89_print_sar(m, rtwdev, chan->freq); 61962306a36Sopenharmony_ci 62062306a36Sopenharmony_ci seq_puts(m, "[TAS]\n"); 62162306a36Sopenharmony_ci rtw89_print_tas(m, rtwdev); 62262306a36Sopenharmony_ci 62362306a36Sopenharmony_ci seq_puts(m, "\n[TX power byrate]\n"); 62462306a36Sopenharmony_ci ret = __print_txpwr_map(m, rtwdev, &__txpwr_map_byr); 62562306a36Sopenharmony_ci if (ret) 62662306a36Sopenharmony_ci goto err; 62762306a36Sopenharmony_ci 62862306a36Sopenharmony_ci seq_puts(m, "\n[TX power limit]\n"); 62962306a36Sopenharmony_ci ret = __print_txpwr_map(m, rtwdev, &__txpwr_map_lmt); 63062306a36Sopenharmony_ci if (ret) 63162306a36Sopenharmony_ci goto err; 63262306a36Sopenharmony_ci 63362306a36Sopenharmony_ci seq_puts(m, "\n[TX power limit_ru]\n"); 63462306a36Sopenharmony_ci ret = __print_txpwr_map(m, rtwdev, &__txpwr_map_lmt_ru); 63562306a36Sopenharmony_ci if (ret) 63662306a36Sopenharmony_ci goto err; 63762306a36Sopenharmony_ci 63862306a36Sopenharmony_cierr: 63962306a36Sopenharmony_ci mutex_unlock(&rtwdev->mutex); 64062306a36Sopenharmony_ci return ret; 64162306a36Sopenharmony_ci} 64262306a36Sopenharmony_ci 64362306a36Sopenharmony_cistatic ssize_t 64462306a36Sopenharmony_cirtw89_debug_priv_mac_reg_dump_select(struct file *filp, 64562306a36Sopenharmony_ci const char __user *user_buf, 64662306a36Sopenharmony_ci size_t count, loff_t *loff) 64762306a36Sopenharmony_ci{ 64862306a36Sopenharmony_ci struct seq_file *m = (struct seq_file *)filp->private_data; 64962306a36Sopenharmony_ci struct rtw89_debugfs_priv *debugfs_priv = m->private; 65062306a36Sopenharmony_ci struct rtw89_dev *rtwdev = debugfs_priv->rtwdev; 65162306a36Sopenharmony_ci const struct rtw89_chip_info *chip = rtwdev->chip; 65262306a36Sopenharmony_ci char buf[32]; 65362306a36Sopenharmony_ci size_t buf_size; 65462306a36Sopenharmony_ci int sel; 65562306a36Sopenharmony_ci int ret; 65662306a36Sopenharmony_ci 65762306a36Sopenharmony_ci buf_size = min(count, sizeof(buf) - 1); 65862306a36Sopenharmony_ci if (copy_from_user(buf, user_buf, buf_size)) 65962306a36Sopenharmony_ci return -EFAULT; 66062306a36Sopenharmony_ci 66162306a36Sopenharmony_ci buf[buf_size] = '\0'; 66262306a36Sopenharmony_ci ret = kstrtoint(buf, 0, &sel); 66362306a36Sopenharmony_ci if (ret) 66462306a36Sopenharmony_ci return ret; 66562306a36Sopenharmony_ci 66662306a36Sopenharmony_ci if (sel < RTW89_DBG_SEL_MAC_00 || sel > RTW89_DBG_SEL_RFC) { 66762306a36Sopenharmony_ci rtw89_info(rtwdev, "invalid args: %d\n", sel); 66862306a36Sopenharmony_ci return -EINVAL; 66962306a36Sopenharmony_ci } 67062306a36Sopenharmony_ci 67162306a36Sopenharmony_ci if (sel == RTW89_DBG_SEL_MAC_30 && chip->chip_id != RTL8852C) { 67262306a36Sopenharmony_ci rtw89_info(rtwdev, "sel %d is address hole on chip %d\n", sel, 67362306a36Sopenharmony_ci chip->chip_id); 67462306a36Sopenharmony_ci return -EINVAL; 67562306a36Sopenharmony_ci } 67662306a36Sopenharmony_ci 67762306a36Sopenharmony_ci debugfs_priv->cb_data = sel; 67862306a36Sopenharmony_ci rtw89_info(rtwdev, "select mac page dump %d\n", debugfs_priv->cb_data); 67962306a36Sopenharmony_ci 68062306a36Sopenharmony_ci return count; 68162306a36Sopenharmony_ci} 68262306a36Sopenharmony_ci 68362306a36Sopenharmony_ci#define RTW89_MAC_PAGE_SIZE 0x100 68462306a36Sopenharmony_ci 68562306a36Sopenharmony_cistatic int rtw89_debug_priv_mac_reg_dump_get(struct seq_file *m, void *v) 68662306a36Sopenharmony_ci{ 68762306a36Sopenharmony_ci struct rtw89_debugfs_priv *debugfs_priv = m->private; 68862306a36Sopenharmony_ci struct rtw89_dev *rtwdev = debugfs_priv->rtwdev; 68962306a36Sopenharmony_ci enum rtw89_debug_mac_reg_sel reg_sel = debugfs_priv->cb_data; 69062306a36Sopenharmony_ci u32 start, end; 69162306a36Sopenharmony_ci u32 i, j, k, page; 69262306a36Sopenharmony_ci u32 val; 69362306a36Sopenharmony_ci 69462306a36Sopenharmony_ci switch (reg_sel) { 69562306a36Sopenharmony_ci case RTW89_DBG_SEL_MAC_00: 69662306a36Sopenharmony_ci seq_puts(m, "Debug selected MAC page 0x00\n"); 69762306a36Sopenharmony_ci start = 0x000; 69862306a36Sopenharmony_ci end = 0x014; 69962306a36Sopenharmony_ci break; 70062306a36Sopenharmony_ci case RTW89_DBG_SEL_MAC_30: 70162306a36Sopenharmony_ci seq_puts(m, "Debug selected MAC page 0x30\n"); 70262306a36Sopenharmony_ci start = 0x030; 70362306a36Sopenharmony_ci end = 0x033; 70462306a36Sopenharmony_ci break; 70562306a36Sopenharmony_ci case RTW89_DBG_SEL_MAC_40: 70662306a36Sopenharmony_ci seq_puts(m, "Debug selected MAC page 0x40\n"); 70762306a36Sopenharmony_ci start = 0x040; 70862306a36Sopenharmony_ci end = 0x07f; 70962306a36Sopenharmony_ci break; 71062306a36Sopenharmony_ci case RTW89_DBG_SEL_MAC_80: 71162306a36Sopenharmony_ci seq_puts(m, "Debug selected MAC page 0x80\n"); 71262306a36Sopenharmony_ci start = 0x080; 71362306a36Sopenharmony_ci end = 0x09f; 71462306a36Sopenharmony_ci break; 71562306a36Sopenharmony_ci case RTW89_DBG_SEL_MAC_C0: 71662306a36Sopenharmony_ci seq_puts(m, "Debug selected MAC page 0xc0\n"); 71762306a36Sopenharmony_ci start = 0x0c0; 71862306a36Sopenharmony_ci end = 0x0df; 71962306a36Sopenharmony_ci break; 72062306a36Sopenharmony_ci case RTW89_DBG_SEL_MAC_E0: 72162306a36Sopenharmony_ci seq_puts(m, "Debug selected MAC page 0xe0\n"); 72262306a36Sopenharmony_ci start = 0x0e0; 72362306a36Sopenharmony_ci end = 0x0ff; 72462306a36Sopenharmony_ci break; 72562306a36Sopenharmony_ci case RTW89_DBG_SEL_BB: 72662306a36Sopenharmony_ci seq_puts(m, "Debug selected BB register\n"); 72762306a36Sopenharmony_ci start = 0x100; 72862306a36Sopenharmony_ci end = 0x17f; 72962306a36Sopenharmony_ci break; 73062306a36Sopenharmony_ci case RTW89_DBG_SEL_IQK: 73162306a36Sopenharmony_ci seq_puts(m, "Debug selected IQK register\n"); 73262306a36Sopenharmony_ci start = 0x180; 73362306a36Sopenharmony_ci end = 0x1bf; 73462306a36Sopenharmony_ci break; 73562306a36Sopenharmony_ci case RTW89_DBG_SEL_RFC: 73662306a36Sopenharmony_ci seq_puts(m, "Debug selected RFC register\n"); 73762306a36Sopenharmony_ci start = 0x1c0; 73862306a36Sopenharmony_ci end = 0x1ff; 73962306a36Sopenharmony_ci break; 74062306a36Sopenharmony_ci default: 74162306a36Sopenharmony_ci seq_puts(m, "Selected invalid register page\n"); 74262306a36Sopenharmony_ci return -EINVAL; 74362306a36Sopenharmony_ci } 74462306a36Sopenharmony_ci 74562306a36Sopenharmony_ci for (i = start; i <= end; i++) { 74662306a36Sopenharmony_ci page = i << 8; 74762306a36Sopenharmony_ci for (j = page; j < page + RTW89_MAC_PAGE_SIZE; j += 16) { 74862306a36Sopenharmony_ci seq_printf(m, "%08xh : ", 0x18600000 + j); 74962306a36Sopenharmony_ci for (k = 0; k < 4; k++) { 75062306a36Sopenharmony_ci val = rtw89_read32(rtwdev, j + (k << 2)); 75162306a36Sopenharmony_ci seq_printf(m, "%08x ", val); 75262306a36Sopenharmony_ci } 75362306a36Sopenharmony_ci seq_puts(m, "\n"); 75462306a36Sopenharmony_ci } 75562306a36Sopenharmony_ci } 75662306a36Sopenharmony_ci 75762306a36Sopenharmony_ci return 0; 75862306a36Sopenharmony_ci} 75962306a36Sopenharmony_ci 76062306a36Sopenharmony_cistatic ssize_t 76162306a36Sopenharmony_cirtw89_debug_priv_mac_mem_dump_select(struct file *filp, 76262306a36Sopenharmony_ci const char __user *user_buf, 76362306a36Sopenharmony_ci size_t count, loff_t *loff) 76462306a36Sopenharmony_ci{ 76562306a36Sopenharmony_ci struct seq_file *m = (struct seq_file *)filp->private_data; 76662306a36Sopenharmony_ci struct rtw89_debugfs_priv *debugfs_priv = m->private; 76762306a36Sopenharmony_ci struct rtw89_dev *rtwdev = debugfs_priv->rtwdev; 76862306a36Sopenharmony_ci char buf[32]; 76962306a36Sopenharmony_ci size_t buf_size; 77062306a36Sopenharmony_ci u32 sel, start_addr, len; 77162306a36Sopenharmony_ci int num; 77262306a36Sopenharmony_ci 77362306a36Sopenharmony_ci buf_size = min(count, sizeof(buf) - 1); 77462306a36Sopenharmony_ci if (copy_from_user(buf, user_buf, buf_size)) 77562306a36Sopenharmony_ci return -EFAULT; 77662306a36Sopenharmony_ci 77762306a36Sopenharmony_ci buf[buf_size] = '\0'; 77862306a36Sopenharmony_ci num = sscanf(buf, "%x %x %x", &sel, &start_addr, &len); 77962306a36Sopenharmony_ci if (num != 3) { 78062306a36Sopenharmony_ci rtw89_info(rtwdev, "invalid format: <sel> <start> <len>\n"); 78162306a36Sopenharmony_ci return -EINVAL; 78262306a36Sopenharmony_ci } 78362306a36Sopenharmony_ci 78462306a36Sopenharmony_ci debugfs_priv->mac_mem.sel = sel; 78562306a36Sopenharmony_ci debugfs_priv->mac_mem.start = start_addr; 78662306a36Sopenharmony_ci debugfs_priv->mac_mem.len = len; 78762306a36Sopenharmony_ci 78862306a36Sopenharmony_ci rtw89_info(rtwdev, "select mem %d start %d len %d\n", 78962306a36Sopenharmony_ci sel, start_addr, len); 79062306a36Sopenharmony_ci 79162306a36Sopenharmony_ci return count; 79262306a36Sopenharmony_ci} 79362306a36Sopenharmony_ci 79462306a36Sopenharmony_cistatic void rtw89_debug_dump_mac_mem(struct seq_file *m, 79562306a36Sopenharmony_ci struct rtw89_dev *rtwdev, 79662306a36Sopenharmony_ci u8 sel, u32 start_addr, u32 len) 79762306a36Sopenharmony_ci{ 79862306a36Sopenharmony_ci const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def; 79962306a36Sopenharmony_ci u32 filter_model_addr = mac->filter_model_addr; 80062306a36Sopenharmony_ci u32 indir_access_addr = mac->indir_access_addr; 80162306a36Sopenharmony_ci u32 base_addr, start_page, residue; 80262306a36Sopenharmony_ci u32 i, j, p, pages; 80362306a36Sopenharmony_ci u32 dump_len, remain; 80462306a36Sopenharmony_ci u32 val; 80562306a36Sopenharmony_ci 80662306a36Sopenharmony_ci remain = len; 80762306a36Sopenharmony_ci pages = len / MAC_MEM_DUMP_PAGE_SIZE + 1; 80862306a36Sopenharmony_ci start_page = start_addr / MAC_MEM_DUMP_PAGE_SIZE; 80962306a36Sopenharmony_ci residue = start_addr % MAC_MEM_DUMP_PAGE_SIZE; 81062306a36Sopenharmony_ci base_addr = mac->mem_base_addrs[sel]; 81162306a36Sopenharmony_ci base_addr += start_page * MAC_MEM_DUMP_PAGE_SIZE; 81262306a36Sopenharmony_ci 81362306a36Sopenharmony_ci for (p = 0; p < pages; p++) { 81462306a36Sopenharmony_ci dump_len = min_t(u32, remain, MAC_MEM_DUMP_PAGE_SIZE); 81562306a36Sopenharmony_ci rtw89_write32(rtwdev, filter_model_addr, base_addr); 81662306a36Sopenharmony_ci for (i = indir_access_addr + residue; 81762306a36Sopenharmony_ci i < indir_access_addr + dump_len;) { 81862306a36Sopenharmony_ci seq_printf(m, "%08xh:", i); 81962306a36Sopenharmony_ci for (j = 0; 82062306a36Sopenharmony_ci j < 4 && i < indir_access_addr + dump_len; 82162306a36Sopenharmony_ci j++, i += 4) { 82262306a36Sopenharmony_ci val = rtw89_read32(rtwdev, i); 82362306a36Sopenharmony_ci seq_printf(m, " %08x", val); 82462306a36Sopenharmony_ci remain -= 4; 82562306a36Sopenharmony_ci } 82662306a36Sopenharmony_ci seq_puts(m, "\n"); 82762306a36Sopenharmony_ci } 82862306a36Sopenharmony_ci base_addr += MAC_MEM_DUMP_PAGE_SIZE; 82962306a36Sopenharmony_ci } 83062306a36Sopenharmony_ci} 83162306a36Sopenharmony_ci 83262306a36Sopenharmony_cistatic int 83362306a36Sopenharmony_cirtw89_debug_priv_mac_mem_dump_get(struct seq_file *m, void *v) 83462306a36Sopenharmony_ci{ 83562306a36Sopenharmony_ci struct rtw89_debugfs_priv *debugfs_priv = m->private; 83662306a36Sopenharmony_ci struct rtw89_dev *rtwdev = debugfs_priv->rtwdev; 83762306a36Sopenharmony_ci bool grant_read = false; 83862306a36Sopenharmony_ci 83962306a36Sopenharmony_ci if (debugfs_priv->mac_mem.sel >= RTW89_MAC_MEM_NUM) 84062306a36Sopenharmony_ci return -ENOENT; 84162306a36Sopenharmony_ci 84262306a36Sopenharmony_ci if (rtwdev->chip->chip_id == RTL8852C) { 84362306a36Sopenharmony_ci switch (debugfs_priv->mac_mem.sel) { 84462306a36Sopenharmony_ci case RTW89_MAC_MEM_TXD_FIFO_0_V1: 84562306a36Sopenharmony_ci case RTW89_MAC_MEM_TXD_FIFO_1_V1: 84662306a36Sopenharmony_ci case RTW89_MAC_MEM_TXDATA_FIFO_0: 84762306a36Sopenharmony_ci case RTW89_MAC_MEM_TXDATA_FIFO_1: 84862306a36Sopenharmony_ci grant_read = true; 84962306a36Sopenharmony_ci break; 85062306a36Sopenharmony_ci default: 85162306a36Sopenharmony_ci break; 85262306a36Sopenharmony_ci } 85362306a36Sopenharmony_ci } 85462306a36Sopenharmony_ci 85562306a36Sopenharmony_ci mutex_lock(&rtwdev->mutex); 85662306a36Sopenharmony_ci rtw89_leave_ps_mode(rtwdev); 85762306a36Sopenharmony_ci if (grant_read) 85862306a36Sopenharmony_ci rtw89_write32_set(rtwdev, R_AX_TCR1, B_AX_TCR_FORCE_READ_TXDFIFO); 85962306a36Sopenharmony_ci rtw89_debug_dump_mac_mem(m, rtwdev, 86062306a36Sopenharmony_ci debugfs_priv->mac_mem.sel, 86162306a36Sopenharmony_ci debugfs_priv->mac_mem.start, 86262306a36Sopenharmony_ci debugfs_priv->mac_mem.len); 86362306a36Sopenharmony_ci if (grant_read) 86462306a36Sopenharmony_ci rtw89_write32_clr(rtwdev, R_AX_TCR1, B_AX_TCR_FORCE_READ_TXDFIFO); 86562306a36Sopenharmony_ci mutex_unlock(&rtwdev->mutex); 86662306a36Sopenharmony_ci 86762306a36Sopenharmony_ci return 0; 86862306a36Sopenharmony_ci} 86962306a36Sopenharmony_ci 87062306a36Sopenharmony_cistatic ssize_t 87162306a36Sopenharmony_cirtw89_debug_priv_mac_dbg_port_dump_select(struct file *filp, 87262306a36Sopenharmony_ci const char __user *user_buf, 87362306a36Sopenharmony_ci size_t count, loff_t *loff) 87462306a36Sopenharmony_ci{ 87562306a36Sopenharmony_ci struct seq_file *m = (struct seq_file *)filp->private_data; 87662306a36Sopenharmony_ci struct rtw89_debugfs_priv *debugfs_priv = m->private; 87762306a36Sopenharmony_ci struct rtw89_dev *rtwdev = debugfs_priv->rtwdev; 87862306a36Sopenharmony_ci char buf[32]; 87962306a36Sopenharmony_ci size_t buf_size; 88062306a36Sopenharmony_ci int sel, set; 88162306a36Sopenharmony_ci int num; 88262306a36Sopenharmony_ci bool enable; 88362306a36Sopenharmony_ci 88462306a36Sopenharmony_ci buf_size = min(count, sizeof(buf) - 1); 88562306a36Sopenharmony_ci if (copy_from_user(buf, user_buf, buf_size)) 88662306a36Sopenharmony_ci return -EFAULT; 88762306a36Sopenharmony_ci 88862306a36Sopenharmony_ci buf[buf_size] = '\0'; 88962306a36Sopenharmony_ci num = sscanf(buf, "%d %d", &sel, &set); 89062306a36Sopenharmony_ci if (num != 2) { 89162306a36Sopenharmony_ci rtw89_info(rtwdev, "invalid format: <sel> <set>\n"); 89262306a36Sopenharmony_ci return -EINVAL; 89362306a36Sopenharmony_ci } 89462306a36Sopenharmony_ci 89562306a36Sopenharmony_ci enable = set != 0; 89662306a36Sopenharmony_ci switch (sel) { 89762306a36Sopenharmony_ci case 0: 89862306a36Sopenharmony_ci debugfs_priv->dbgpkg_en.ss_dbg = enable; 89962306a36Sopenharmony_ci break; 90062306a36Sopenharmony_ci case 1: 90162306a36Sopenharmony_ci debugfs_priv->dbgpkg_en.dle_dbg = enable; 90262306a36Sopenharmony_ci break; 90362306a36Sopenharmony_ci case 2: 90462306a36Sopenharmony_ci debugfs_priv->dbgpkg_en.dmac_dbg = enable; 90562306a36Sopenharmony_ci break; 90662306a36Sopenharmony_ci case 3: 90762306a36Sopenharmony_ci debugfs_priv->dbgpkg_en.cmac_dbg = enable; 90862306a36Sopenharmony_ci break; 90962306a36Sopenharmony_ci case 4: 91062306a36Sopenharmony_ci debugfs_priv->dbgpkg_en.dbg_port = enable; 91162306a36Sopenharmony_ci break; 91262306a36Sopenharmony_ci default: 91362306a36Sopenharmony_ci rtw89_info(rtwdev, "invalid args: sel %d set %d\n", sel, set); 91462306a36Sopenharmony_ci return -EINVAL; 91562306a36Sopenharmony_ci } 91662306a36Sopenharmony_ci 91762306a36Sopenharmony_ci rtw89_info(rtwdev, "%s debug port dump %d\n", 91862306a36Sopenharmony_ci enable ? "Enable" : "Disable", sel); 91962306a36Sopenharmony_ci 92062306a36Sopenharmony_ci return count; 92162306a36Sopenharmony_ci} 92262306a36Sopenharmony_ci 92362306a36Sopenharmony_cistatic int rtw89_debug_mac_dump_ss_dbg(struct rtw89_dev *rtwdev, 92462306a36Sopenharmony_ci struct seq_file *m) 92562306a36Sopenharmony_ci{ 92662306a36Sopenharmony_ci return 0; 92762306a36Sopenharmony_ci} 92862306a36Sopenharmony_ci 92962306a36Sopenharmony_cistatic int rtw89_debug_mac_dump_dle_dbg(struct rtw89_dev *rtwdev, 93062306a36Sopenharmony_ci struct seq_file *m) 93162306a36Sopenharmony_ci{ 93262306a36Sopenharmony_ci#define DLE_DFI_DUMP(__type, __target, __sel) \ 93362306a36Sopenharmony_ci({ \ 93462306a36Sopenharmony_ci u32 __ctrl; \ 93562306a36Sopenharmony_ci u32 __reg_ctrl = R_AX_##__type##_DBG_FUN_INTF_CTL; \ 93662306a36Sopenharmony_ci u32 __reg_data = R_AX_##__type##_DBG_FUN_INTF_DATA; \ 93762306a36Sopenharmony_ci u32 __data, __val32; \ 93862306a36Sopenharmony_ci int __ret; \ 93962306a36Sopenharmony_ci \ 94062306a36Sopenharmony_ci __ctrl = FIELD_PREP(B_AX_##__type##_DFI_TRGSEL_MASK, \ 94162306a36Sopenharmony_ci DLE_DFI_TYPE_##__target) | \ 94262306a36Sopenharmony_ci FIELD_PREP(B_AX_##__type##_DFI_ADDR_MASK, __sel) | \ 94362306a36Sopenharmony_ci B_AX_WDE_DFI_ACTIVE; \ 94462306a36Sopenharmony_ci rtw89_write32(rtwdev, __reg_ctrl, __ctrl); \ 94562306a36Sopenharmony_ci __ret = read_poll_timeout(rtw89_read32, __val32, \ 94662306a36Sopenharmony_ci !(__val32 & B_AX_##__type##_DFI_ACTIVE), \ 94762306a36Sopenharmony_ci 1000, 50000, false, \ 94862306a36Sopenharmony_ci rtwdev, __reg_ctrl); \ 94962306a36Sopenharmony_ci if (__ret) { \ 95062306a36Sopenharmony_ci rtw89_err(rtwdev, "failed to dump DLE %s %s %d\n", \ 95162306a36Sopenharmony_ci #__type, #__target, __sel); \ 95262306a36Sopenharmony_ci return __ret; \ 95362306a36Sopenharmony_ci } \ 95462306a36Sopenharmony_ci \ 95562306a36Sopenharmony_ci __data = rtw89_read32(rtwdev, __reg_data); \ 95662306a36Sopenharmony_ci __data; \ 95762306a36Sopenharmony_ci}) 95862306a36Sopenharmony_ci 95962306a36Sopenharmony_ci#define DLE_DFI_FREE_PAGE_DUMP(__m, __type) \ 96062306a36Sopenharmony_ci({ \ 96162306a36Sopenharmony_ci u32 __freepg, __pubpg; \ 96262306a36Sopenharmony_ci u32 __freepg_head, __freepg_tail, __pubpg_num; \ 96362306a36Sopenharmony_ci \ 96462306a36Sopenharmony_ci __freepg = DLE_DFI_DUMP(__type, FREEPG, 0); \ 96562306a36Sopenharmony_ci __pubpg = DLE_DFI_DUMP(__type, FREEPG, 1); \ 96662306a36Sopenharmony_ci __freepg_head = FIELD_GET(B_AX_DLE_FREE_HEADPG, __freepg); \ 96762306a36Sopenharmony_ci __freepg_tail = FIELD_GET(B_AX_DLE_FREE_TAILPG, __freepg); \ 96862306a36Sopenharmony_ci __pubpg_num = FIELD_GET(B_AX_DLE_PUB_PGNUM, __pubpg); \ 96962306a36Sopenharmony_ci seq_printf(__m, "[%s] freepg head: %d\n", \ 97062306a36Sopenharmony_ci #__type, __freepg_head); \ 97162306a36Sopenharmony_ci seq_printf(__m, "[%s] freepg tail: %d\n", \ 97262306a36Sopenharmony_ci #__type, __freepg_tail); \ 97362306a36Sopenharmony_ci seq_printf(__m, "[%s] pubpg num : %d\n", \ 97462306a36Sopenharmony_ci #__type, __pubpg_num); \ 97562306a36Sopenharmony_ci}) 97662306a36Sopenharmony_ci 97762306a36Sopenharmony_ci#define case_QUOTA(__m, __type, __id) \ 97862306a36Sopenharmony_ci case __type##_QTAID_##__id: \ 97962306a36Sopenharmony_ci val32 = DLE_DFI_DUMP(__type, QUOTA, __type##_QTAID_##__id); \ 98062306a36Sopenharmony_ci rsv_pgnum = FIELD_GET(B_AX_DLE_RSV_PGNUM, val32); \ 98162306a36Sopenharmony_ci use_pgnum = FIELD_GET(B_AX_DLE_USE_PGNUM, val32); \ 98262306a36Sopenharmony_ci seq_printf(__m, "[%s][%s] rsv_pgnum: %d\n", \ 98362306a36Sopenharmony_ci #__type, #__id, rsv_pgnum); \ 98462306a36Sopenharmony_ci seq_printf(__m, "[%s][%s] use_pgnum: %d\n", \ 98562306a36Sopenharmony_ci #__type, #__id, use_pgnum); \ 98662306a36Sopenharmony_ci break 98762306a36Sopenharmony_ci u32 quota_id; 98862306a36Sopenharmony_ci u32 val32; 98962306a36Sopenharmony_ci u16 rsv_pgnum, use_pgnum; 99062306a36Sopenharmony_ci int ret; 99162306a36Sopenharmony_ci 99262306a36Sopenharmony_ci ret = rtw89_mac_check_mac_en(rtwdev, 0, RTW89_DMAC_SEL); 99362306a36Sopenharmony_ci if (ret) { 99462306a36Sopenharmony_ci seq_puts(m, "[DLE] : DMAC not enabled\n"); 99562306a36Sopenharmony_ci return ret; 99662306a36Sopenharmony_ci } 99762306a36Sopenharmony_ci 99862306a36Sopenharmony_ci DLE_DFI_FREE_PAGE_DUMP(m, WDE); 99962306a36Sopenharmony_ci DLE_DFI_FREE_PAGE_DUMP(m, PLE); 100062306a36Sopenharmony_ci for (quota_id = 0; quota_id <= WDE_QTAID_CPUIO; quota_id++) { 100162306a36Sopenharmony_ci switch (quota_id) { 100262306a36Sopenharmony_ci case_QUOTA(m, WDE, HOST_IF); 100362306a36Sopenharmony_ci case_QUOTA(m, WDE, WLAN_CPU); 100462306a36Sopenharmony_ci case_QUOTA(m, WDE, DATA_CPU); 100562306a36Sopenharmony_ci case_QUOTA(m, WDE, PKTIN); 100662306a36Sopenharmony_ci case_QUOTA(m, WDE, CPUIO); 100762306a36Sopenharmony_ci } 100862306a36Sopenharmony_ci } 100962306a36Sopenharmony_ci for (quota_id = 0; quota_id <= PLE_QTAID_CPUIO; quota_id++) { 101062306a36Sopenharmony_ci switch (quota_id) { 101162306a36Sopenharmony_ci case_QUOTA(m, PLE, B0_TXPL); 101262306a36Sopenharmony_ci case_QUOTA(m, PLE, B1_TXPL); 101362306a36Sopenharmony_ci case_QUOTA(m, PLE, C2H); 101462306a36Sopenharmony_ci case_QUOTA(m, PLE, H2C); 101562306a36Sopenharmony_ci case_QUOTA(m, PLE, WLAN_CPU); 101662306a36Sopenharmony_ci case_QUOTA(m, PLE, MPDU); 101762306a36Sopenharmony_ci case_QUOTA(m, PLE, CMAC0_RX); 101862306a36Sopenharmony_ci case_QUOTA(m, PLE, CMAC1_RX); 101962306a36Sopenharmony_ci case_QUOTA(m, PLE, CMAC1_BBRPT); 102062306a36Sopenharmony_ci case_QUOTA(m, PLE, WDRLS); 102162306a36Sopenharmony_ci case_QUOTA(m, PLE, CPUIO); 102262306a36Sopenharmony_ci } 102362306a36Sopenharmony_ci } 102462306a36Sopenharmony_ci 102562306a36Sopenharmony_ci return 0; 102662306a36Sopenharmony_ci 102762306a36Sopenharmony_ci#undef case_QUOTA 102862306a36Sopenharmony_ci#undef DLE_DFI_DUMP 102962306a36Sopenharmony_ci#undef DLE_DFI_FREE_PAGE_DUMP 103062306a36Sopenharmony_ci} 103162306a36Sopenharmony_ci 103262306a36Sopenharmony_cistatic int rtw89_debug_mac_dump_dmac_dbg(struct rtw89_dev *rtwdev, 103362306a36Sopenharmony_ci struct seq_file *m) 103462306a36Sopenharmony_ci{ 103562306a36Sopenharmony_ci const struct rtw89_chip_info *chip = rtwdev->chip; 103662306a36Sopenharmony_ci u32 dmac_err; 103762306a36Sopenharmony_ci int i, ret; 103862306a36Sopenharmony_ci 103962306a36Sopenharmony_ci ret = rtw89_mac_check_mac_en(rtwdev, 0, RTW89_DMAC_SEL); 104062306a36Sopenharmony_ci if (ret) { 104162306a36Sopenharmony_ci seq_puts(m, "[DMAC] : DMAC not enabled\n"); 104262306a36Sopenharmony_ci return ret; 104362306a36Sopenharmony_ci } 104462306a36Sopenharmony_ci 104562306a36Sopenharmony_ci dmac_err = rtw89_read32(rtwdev, R_AX_DMAC_ERR_ISR); 104662306a36Sopenharmony_ci seq_printf(m, "R_AX_DMAC_ERR_ISR=0x%08x\n", dmac_err); 104762306a36Sopenharmony_ci seq_printf(m, "R_AX_DMAC_ERR_IMR=0x%08x\n", 104862306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_DMAC_ERR_IMR)); 104962306a36Sopenharmony_ci 105062306a36Sopenharmony_ci if (dmac_err) { 105162306a36Sopenharmony_ci seq_printf(m, "R_AX_WDE_ERR_FLAG_CFG=0x%08x\n", 105262306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_WDE_ERR_FLAG_CFG_NUM1)); 105362306a36Sopenharmony_ci seq_printf(m, "R_AX_PLE_ERR_FLAG_CFG=0x%08x\n", 105462306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_PLE_ERR_FLAG_CFG_NUM1)); 105562306a36Sopenharmony_ci if (chip->chip_id == RTL8852C) { 105662306a36Sopenharmony_ci seq_printf(m, "R_AX_PLE_ERRFLAG_MSG=0x%08x\n", 105762306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_PLE_ERRFLAG_MSG)); 105862306a36Sopenharmony_ci seq_printf(m, "R_AX_WDE_ERRFLAG_MSG=0x%08x\n", 105962306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_WDE_ERRFLAG_MSG)); 106062306a36Sopenharmony_ci seq_printf(m, "R_AX_PLE_DBGERR_LOCKEN=0x%08x\n", 106162306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_PLE_DBGERR_LOCKEN)); 106262306a36Sopenharmony_ci seq_printf(m, "R_AX_PLE_DBGERR_STS=0x%08x\n", 106362306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_PLE_DBGERR_STS)); 106462306a36Sopenharmony_ci } 106562306a36Sopenharmony_ci } 106662306a36Sopenharmony_ci 106762306a36Sopenharmony_ci if (dmac_err & B_AX_WDRLS_ERR_FLAG) { 106862306a36Sopenharmony_ci seq_printf(m, "R_AX_WDRLS_ERR_IMR=0x%08x\n", 106962306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_WDRLS_ERR_IMR)); 107062306a36Sopenharmony_ci seq_printf(m, "R_AX_WDRLS_ERR_ISR=0x%08x\n", 107162306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_WDRLS_ERR_ISR)); 107262306a36Sopenharmony_ci if (chip->chip_id == RTL8852C) 107362306a36Sopenharmony_ci seq_printf(m, "R_AX_RPQ_RXBD_IDX=0x%08x\n", 107462306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_RPQ_RXBD_IDX_V1)); 107562306a36Sopenharmony_ci else 107662306a36Sopenharmony_ci seq_printf(m, "R_AX_RPQ_RXBD_IDX=0x%08x\n", 107762306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_RPQ_RXBD_IDX)); 107862306a36Sopenharmony_ci } 107962306a36Sopenharmony_ci 108062306a36Sopenharmony_ci if (dmac_err & B_AX_WSEC_ERR_FLAG) { 108162306a36Sopenharmony_ci if (chip->chip_id == RTL8852C) { 108262306a36Sopenharmony_ci seq_printf(m, "R_AX_SEC_ERR_IMR=0x%08x\n", 108362306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_SEC_ERROR_FLAG_IMR)); 108462306a36Sopenharmony_ci seq_printf(m, "R_AX_SEC_ERR_ISR=0x%08x\n", 108562306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_SEC_ERROR_FLAG)); 108662306a36Sopenharmony_ci seq_printf(m, "R_AX_SEC_ENG_CTRL=0x%08x\n", 108762306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_SEC_ENG_CTRL)); 108862306a36Sopenharmony_ci seq_printf(m, "R_AX_SEC_MPDU_PROC=0x%08x\n", 108962306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_SEC_MPDU_PROC)); 109062306a36Sopenharmony_ci seq_printf(m, "R_AX_SEC_CAM_ACCESS=0x%08x\n", 109162306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_SEC_CAM_ACCESS)); 109262306a36Sopenharmony_ci seq_printf(m, "R_AX_SEC_CAM_RDATA=0x%08x\n", 109362306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_SEC_CAM_RDATA)); 109462306a36Sopenharmony_ci seq_printf(m, "R_AX_SEC_DEBUG1=0x%08x\n", 109562306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_SEC_DEBUG1)); 109662306a36Sopenharmony_ci seq_printf(m, "R_AX_SEC_TX_DEBUG=0x%08x\n", 109762306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_SEC_TX_DEBUG)); 109862306a36Sopenharmony_ci seq_printf(m, "R_AX_SEC_RX_DEBUG=0x%08x\n", 109962306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_SEC_RX_DEBUG)); 110062306a36Sopenharmony_ci 110162306a36Sopenharmony_ci rtw89_write32_mask(rtwdev, R_AX_DBG_CTRL, 110262306a36Sopenharmony_ci B_AX_DBG_SEL0, 0x8B); 110362306a36Sopenharmony_ci rtw89_write32_mask(rtwdev, R_AX_DBG_CTRL, 110462306a36Sopenharmony_ci B_AX_DBG_SEL1, 0x8B); 110562306a36Sopenharmony_ci rtw89_write32_mask(rtwdev, R_AX_SYS_STATUS1, 110662306a36Sopenharmony_ci B_AX_SEL_0XC0_MASK, 1); 110762306a36Sopenharmony_ci for (i = 0; i < 0x10; i++) { 110862306a36Sopenharmony_ci rtw89_write32_mask(rtwdev, R_AX_SEC_ENG_CTRL, 110962306a36Sopenharmony_ci B_AX_SEC_DBG_PORT_FIELD_MASK, i); 111062306a36Sopenharmony_ci seq_printf(m, "sel=%x,R_AX_SEC_DEBUG2=0x%08x\n", 111162306a36Sopenharmony_ci i, rtw89_read32(rtwdev, R_AX_SEC_DEBUG2)); 111262306a36Sopenharmony_ci } 111362306a36Sopenharmony_ci } else { 111462306a36Sopenharmony_ci seq_printf(m, "R_AX_SEC_ERR_IMR_ISR=0x%08x\n", 111562306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_SEC_DEBUG)); 111662306a36Sopenharmony_ci seq_printf(m, "R_AX_SEC_ENG_CTRL=0x%08x\n", 111762306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_SEC_ENG_CTRL)); 111862306a36Sopenharmony_ci seq_printf(m, "R_AX_SEC_MPDU_PROC=0x%08x\n", 111962306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_SEC_MPDU_PROC)); 112062306a36Sopenharmony_ci seq_printf(m, "R_AX_SEC_CAM_ACCESS=0x%08x\n", 112162306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_SEC_CAM_ACCESS)); 112262306a36Sopenharmony_ci seq_printf(m, "R_AX_SEC_CAM_RDATA=0x%08x\n", 112362306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_SEC_CAM_RDATA)); 112462306a36Sopenharmony_ci seq_printf(m, "R_AX_SEC_CAM_WDATA=0x%08x\n", 112562306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_SEC_CAM_WDATA)); 112662306a36Sopenharmony_ci seq_printf(m, "R_AX_SEC_TX_DEBUG=0x%08x\n", 112762306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_SEC_TX_DEBUG)); 112862306a36Sopenharmony_ci seq_printf(m, "R_AX_SEC_RX_DEBUG=0x%08x\n", 112962306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_SEC_RX_DEBUG)); 113062306a36Sopenharmony_ci seq_printf(m, "R_AX_SEC_TRX_PKT_CNT=0x%08x\n", 113162306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_SEC_TRX_PKT_CNT)); 113262306a36Sopenharmony_ci seq_printf(m, "R_AX_SEC_TRX_BLK_CNT=0x%08x\n", 113362306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_SEC_TRX_BLK_CNT)); 113462306a36Sopenharmony_ci } 113562306a36Sopenharmony_ci } 113662306a36Sopenharmony_ci 113762306a36Sopenharmony_ci if (dmac_err & B_AX_MPDU_ERR_FLAG) { 113862306a36Sopenharmony_ci seq_printf(m, "R_AX_MPDU_TX_ERR_IMR=0x%08x\n", 113962306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_MPDU_TX_ERR_IMR)); 114062306a36Sopenharmony_ci seq_printf(m, "R_AX_MPDU_TX_ERR_ISR=0x%08x\n", 114162306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_MPDU_TX_ERR_ISR)); 114262306a36Sopenharmony_ci seq_printf(m, "R_AX_MPDU_RX_ERR_IMR=0x%08x\n", 114362306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_MPDU_RX_ERR_IMR)); 114462306a36Sopenharmony_ci seq_printf(m, "R_AX_MPDU_RX_ERR_ISR=0x%08x\n", 114562306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_MPDU_RX_ERR_ISR)); 114662306a36Sopenharmony_ci } 114762306a36Sopenharmony_ci 114862306a36Sopenharmony_ci if (dmac_err & B_AX_STA_SCHEDULER_ERR_FLAG) { 114962306a36Sopenharmony_ci seq_printf(m, "R_AX_STA_SCHEDULER_ERR_IMR=0x%08x\n", 115062306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_STA_SCHEDULER_ERR_IMR)); 115162306a36Sopenharmony_ci seq_printf(m, "R_AX_STA_SCHEDULER_ERR_ISR=0x%08x\n", 115262306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_STA_SCHEDULER_ERR_ISR)); 115362306a36Sopenharmony_ci } 115462306a36Sopenharmony_ci 115562306a36Sopenharmony_ci if (dmac_err & B_AX_WDE_DLE_ERR_FLAG) { 115662306a36Sopenharmony_ci seq_printf(m, "R_AX_WDE_ERR_IMR=0x%08x\n", 115762306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_WDE_ERR_IMR)); 115862306a36Sopenharmony_ci seq_printf(m, "R_AX_WDE_ERR_ISR=0x%08x\n", 115962306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_WDE_ERR_ISR)); 116062306a36Sopenharmony_ci seq_printf(m, "R_AX_PLE_ERR_IMR=0x%08x\n", 116162306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_PLE_ERR_IMR)); 116262306a36Sopenharmony_ci seq_printf(m, "R_AX_PLE_ERR_FLAG_ISR=0x%08x\n", 116362306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_PLE_ERR_FLAG_ISR)); 116462306a36Sopenharmony_ci } 116562306a36Sopenharmony_ci 116662306a36Sopenharmony_ci if (dmac_err & B_AX_TXPKTCTRL_ERR_FLAG) { 116762306a36Sopenharmony_ci if (chip->chip_id == RTL8852C) { 116862306a36Sopenharmony_ci seq_printf(m, "R_AX_TXPKTCTL_B0_ERRFLAG_IMR=0x%08x\n", 116962306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_TXPKTCTL_B0_ERRFLAG_IMR)); 117062306a36Sopenharmony_ci seq_printf(m, "R_AX_TXPKTCTL_B0_ERRFLAG_ISR=0x%08x\n", 117162306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_TXPKTCTL_B0_ERRFLAG_ISR)); 117262306a36Sopenharmony_ci seq_printf(m, "R_AX_TXPKTCTL_B1_ERRFLAG_IMR=0x%08x\n", 117362306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_TXPKTCTL_B1_ERRFLAG_IMR)); 117462306a36Sopenharmony_ci seq_printf(m, "R_AX_TXPKTCTL_B1_ERRFLAG_ISR=0x%08x\n", 117562306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_TXPKTCTL_B1_ERRFLAG_ISR)); 117662306a36Sopenharmony_ci } else { 117762306a36Sopenharmony_ci seq_printf(m, "R_AX_TXPKTCTL_ERR_IMR_ISR=0x%08x\n", 117862306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_TXPKTCTL_ERR_IMR_ISR)); 117962306a36Sopenharmony_ci seq_printf(m, "R_AX_TXPKTCTL_ERR_IMR_ISR_B1=0x%08x\n", 118062306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_TXPKTCTL_ERR_IMR_ISR_B1)); 118162306a36Sopenharmony_ci } 118262306a36Sopenharmony_ci } 118362306a36Sopenharmony_ci 118462306a36Sopenharmony_ci if (dmac_err & B_AX_PLE_DLE_ERR_FLAG) { 118562306a36Sopenharmony_ci seq_printf(m, "R_AX_WDE_ERR_IMR=0x%08x\n", 118662306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_WDE_ERR_IMR)); 118762306a36Sopenharmony_ci seq_printf(m, "R_AX_WDE_ERR_ISR=0x%08x\n", 118862306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_WDE_ERR_ISR)); 118962306a36Sopenharmony_ci seq_printf(m, "R_AX_PLE_ERR_IMR=0x%08x\n", 119062306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_PLE_ERR_IMR)); 119162306a36Sopenharmony_ci seq_printf(m, "R_AX_PLE_ERR_FLAG_ISR=0x%08x\n", 119262306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_PLE_ERR_FLAG_ISR)); 119362306a36Sopenharmony_ci seq_printf(m, "R_AX_WD_CPUQ_OP_0=0x%08x\n", 119462306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_WD_CPUQ_OP_0)); 119562306a36Sopenharmony_ci seq_printf(m, "R_AX_WD_CPUQ_OP_1=0x%08x\n", 119662306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_WD_CPUQ_OP_1)); 119762306a36Sopenharmony_ci seq_printf(m, "R_AX_WD_CPUQ_OP_2=0x%08x\n", 119862306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_WD_CPUQ_OP_2)); 119962306a36Sopenharmony_ci seq_printf(m, "R_AX_WD_CPUQ_OP_STATUS=0x%08x\n", 120062306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_WD_CPUQ_OP_STATUS)); 120162306a36Sopenharmony_ci seq_printf(m, "R_AX_PL_CPUQ_OP_0=0x%08x\n", 120262306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_PL_CPUQ_OP_0)); 120362306a36Sopenharmony_ci seq_printf(m, "R_AX_PL_CPUQ_OP_1=0x%08x\n", 120462306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_PL_CPUQ_OP_1)); 120562306a36Sopenharmony_ci seq_printf(m, "R_AX_PL_CPUQ_OP_2=0x%08x\n", 120662306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_PL_CPUQ_OP_2)); 120762306a36Sopenharmony_ci seq_printf(m, "R_AX_PL_CPUQ_OP_STATUS=0x%08x\n", 120862306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_PL_CPUQ_OP_STATUS)); 120962306a36Sopenharmony_ci if (chip->chip_id == RTL8852C) { 121062306a36Sopenharmony_ci seq_printf(m, "R_AX_RX_CTRL0=0x%08x\n", 121162306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_RX_CTRL0)); 121262306a36Sopenharmony_ci seq_printf(m, "R_AX_RX_CTRL1=0x%08x\n", 121362306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_RX_CTRL1)); 121462306a36Sopenharmony_ci seq_printf(m, "R_AX_RX_CTRL2=0x%08x\n", 121562306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_RX_CTRL2)); 121662306a36Sopenharmony_ci } else { 121762306a36Sopenharmony_ci seq_printf(m, "R_AX_RXDMA_PKT_INFO_0=0x%08x\n", 121862306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_RXDMA_PKT_INFO_0)); 121962306a36Sopenharmony_ci seq_printf(m, "R_AX_RXDMA_PKT_INFO_1=0x%08x\n", 122062306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_RXDMA_PKT_INFO_1)); 122162306a36Sopenharmony_ci seq_printf(m, "R_AX_RXDMA_PKT_INFO_2=0x%08x\n", 122262306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_RXDMA_PKT_INFO_2)); 122362306a36Sopenharmony_ci } 122462306a36Sopenharmony_ci } 122562306a36Sopenharmony_ci 122662306a36Sopenharmony_ci if (dmac_err & B_AX_PKTIN_ERR_FLAG) { 122762306a36Sopenharmony_ci seq_printf(m, "R_AX_PKTIN_ERR_IMR=0x%08x\n", 122862306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_PKTIN_ERR_IMR)); 122962306a36Sopenharmony_ci seq_printf(m, "R_AX_PKTIN_ERR_ISR=0x%08x\n", 123062306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_PKTIN_ERR_ISR)); 123162306a36Sopenharmony_ci } 123262306a36Sopenharmony_ci 123362306a36Sopenharmony_ci if (dmac_err & B_AX_DISPATCH_ERR_FLAG) { 123462306a36Sopenharmony_ci seq_printf(m, "R_AX_HOST_DISPATCHER_ERR_IMR=0x%08x\n", 123562306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_HOST_DISPATCHER_ERR_IMR)); 123662306a36Sopenharmony_ci seq_printf(m, "R_AX_HOST_DISPATCHER_ERR_ISR=0x%08x\n", 123762306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_HOST_DISPATCHER_ERR_ISR)); 123862306a36Sopenharmony_ci seq_printf(m, "R_AX_CPU_DISPATCHER_ERR_IMR=0x%08x\n", 123962306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_CPU_DISPATCHER_ERR_IMR)); 124062306a36Sopenharmony_ci seq_printf(m, "R_AX_CPU_DISPATCHER_ERR_ISR=0x%08x\n", 124162306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_CPU_DISPATCHER_ERR_ISR)); 124262306a36Sopenharmony_ci seq_printf(m, "R_AX_OTHER_DISPATCHER_ERR_IMR=0x%08x\n", 124362306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_OTHER_DISPATCHER_ERR_IMR)); 124462306a36Sopenharmony_ci seq_printf(m, "R_AX_OTHER_DISPATCHER_ERR_ISR=0x%08x\n", 124562306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_OTHER_DISPATCHER_ERR_ISR)); 124662306a36Sopenharmony_ci } 124762306a36Sopenharmony_ci 124862306a36Sopenharmony_ci if (dmac_err & B_AX_BBRPT_ERR_FLAG) { 124962306a36Sopenharmony_ci if (chip->chip_id == RTL8852C) { 125062306a36Sopenharmony_ci seq_printf(m, "R_AX_BBRPT_COM_ERR_IMR=0x%08x\n", 125162306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_BBRPT_COM_ERR_IMR)); 125262306a36Sopenharmony_ci seq_printf(m, "R_AX_BBRPT_COM_ERR_ISR=0x%08x\n", 125362306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_BBRPT_COM_ERR_ISR)); 125462306a36Sopenharmony_ci seq_printf(m, "R_AX_BBRPT_CHINFO_ERR_ISR=0x%08x\n", 125562306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_BBRPT_CHINFO_ERR_ISR)); 125662306a36Sopenharmony_ci seq_printf(m, "R_AX_BBRPT_CHINFO_ERR_IMR=0x%08x\n", 125762306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_BBRPT_CHINFO_ERR_IMR)); 125862306a36Sopenharmony_ci seq_printf(m, "R_AX_BBRPT_DFS_ERR_IMR=0x%08x\n", 125962306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_BBRPT_DFS_ERR_IMR)); 126062306a36Sopenharmony_ci seq_printf(m, "R_AX_BBRPT_DFS_ERR_ISR=0x%08x\n", 126162306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_BBRPT_DFS_ERR_ISR)); 126262306a36Sopenharmony_ci } else { 126362306a36Sopenharmony_ci seq_printf(m, "R_AX_BBRPT_COM_ERR_IMR_ISR=0x%08x\n", 126462306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_BBRPT_COM_ERR_IMR_ISR)); 126562306a36Sopenharmony_ci seq_printf(m, "R_AX_BBRPT_CHINFO_ERR_ISR=0x%08x\n", 126662306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_BBRPT_CHINFO_ERR_ISR)); 126762306a36Sopenharmony_ci seq_printf(m, "R_AX_BBRPT_CHINFO_ERR_IMR=0x%08x\n", 126862306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_BBRPT_CHINFO_ERR_IMR)); 126962306a36Sopenharmony_ci seq_printf(m, "R_AX_BBRPT_DFS_ERR_IMR=0x%08x\n", 127062306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_BBRPT_DFS_ERR_IMR)); 127162306a36Sopenharmony_ci seq_printf(m, "R_AX_BBRPT_DFS_ERR_ISR=0x%08x\n", 127262306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_BBRPT_DFS_ERR_ISR)); 127362306a36Sopenharmony_ci } 127462306a36Sopenharmony_ci } 127562306a36Sopenharmony_ci 127662306a36Sopenharmony_ci if (dmac_err & B_AX_HAXIDMA_ERR_FLAG && chip->chip_id == RTL8852C) { 127762306a36Sopenharmony_ci seq_printf(m, "R_AX_HAXIDMA_ERR_IMR=0x%08x\n", 127862306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_HAXI_IDCT_MSK)); 127962306a36Sopenharmony_ci seq_printf(m, "R_AX_HAXIDMA_ERR_ISR=0x%08x\n", 128062306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_HAXI_IDCT)); 128162306a36Sopenharmony_ci } 128262306a36Sopenharmony_ci 128362306a36Sopenharmony_ci return 0; 128462306a36Sopenharmony_ci} 128562306a36Sopenharmony_ci 128662306a36Sopenharmony_cistatic int rtw89_debug_mac_dump_cmac_err(struct rtw89_dev *rtwdev, 128762306a36Sopenharmony_ci struct seq_file *m, 128862306a36Sopenharmony_ci enum rtw89_mac_idx band) 128962306a36Sopenharmony_ci{ 129062306a36Sopenharmony_ci const struct rtw89_chip_info *chip = rtwdev->chip; 129162306a36Sopenharmony_ci u32 offset = 0; 129262306a36Sopenharmony_ci u32 cmac_err; 129362306a36Sopenharmony_ci int ret; 129462306a36Sopenharmony_ci 129562306a36Sopenharmony_ci ret = rtw89_mac_check_mac_en(rtwdev, band, RTW89_CMAC_SEL); 129662306a36Sopenharmony_ci if (ret) { 129762306a36Sopenharmony_ci if (band) 129862306a36Sopenharmony_ci seq_puts(m, "[CMAC] : CMAC1 not enabled\n"); 129962306a36Sopenharmony_ci else 130062306a36Sopenharmony_ci seq_puts(m, "[CMAC] : CMAC0 not enabled\n"); 130162306a36Sopenharmony_ci return ret; 130262306a36Sopenharmony_ci } 130362306a36Sopenharmony_ci 130462306a36Sopenharmony_ci if (band) 130562306a36Sopenharmony_ci offset = RTW89_MAC_AX_BAND_REG_OFFSET; 130662306a36Sopenharmony_ci 130762306a36Sopenharmony_ci cmac_err = rtw89_read32(rtwdev, R_AX_CMAC_ERR_ISR + offset); 130862306a36Sopenharmony_ci seq_printf(m, "R_AX_CMAC_ERR_ISR [%d]=0x%08x\n", band, 130962306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_CMAC_ERR_ISR + offset)); 131062306a36Sopenharmony_ci seq_printf(m, "R_AX_CMAC_FUNC_EN [%d]=0x%08x\n", band, 131162306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_CMAC_FUNC_EN + offset)); 131262306a36Sopenharmony_ci seq_printf(m, "R_AX_CK_EN [%d]=0x%08x\n", band, 131362306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_CK_EN + offset)); 131462306a36Sopenharmony_ci 131562306a36Sopenharmony_ci if (cmac_err & B_AX_SCHEDULE_TOP_ERR_IND) { 131662306a36Sopenharmony_ci seq_printf(m, "R_AX_SCHEDULE_ERR_IMR [%d]=0x%08x\n", band, 131762306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_SCHEDULE_ERR_IMR + offset)); 131862306a36Sopenharmony_ci seq_printf(m, "R_AX_SCHEDULE_ERR_ISR [%d]=0x%08x\n", band, 131962306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_SCHEDULE_ERR_ISR + offset)); 132062306a36Sopenharmony_ci } 132162306a36Sopenharmony_ci 132262306a36Sopenharmony_ci if (cmac_err & B_AX_PTCL_TOP_ERR_IND) { 132362306a36Sopenharmony_ci seq_printf(m, "R_AX_PTCL_IMR0 [%d]=0x%08x\n", band, 132462306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_PTCL_IMR0 + offset)); 132562306a36Sopenharmony_ci seq_printf(m, "R_AX_PTCL_ISR0 [%d]=0x%08x\n", band, 132662306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_PTCL_ISR0 + offset)); 132762306a36Sopenharmony_ci } 132862306a36Sopenharmony_ci 132962306a36Sopenharmony_ci if (cmac_err & B_AX_DMA_TOP_ERR_IND) { 133062306a36Sopenharmony_ci if (chip->chip_id == RTL8852C) { 133162306a36Sopenharmony_ci seq_printf(m, "R_AX_RX_ERR_FLAG [%d]=0x%08x\n", band, 133262306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_RX_ERR_FLAG + offset)); 133362306a36Sopenharmony_ci seq_printf(m, "R_AX_RX_ERR_FLAG_IMR [%d]=0x%08x\n", band, 133462306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_RX_ERR_FLAG_IMR + offset)); 133562306a36Sopenharmony_ci } else { 133662306a36Sopenharmony_ci seq_printf(m, "R_AX_DLE_CTRL [%d]=0x%08x\n", band, 133762306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_DLE_CTRL + offset)); 133862306a36Sopenharmony_ci } 133962306a36Sopenharmony_ci } 134062306a36Sopenharmony_ci 134162306a36Sopenharmony_ci if (cmac_err & B_AX_DMA_TOP_ERR_IND || cmac_err & B_AX_WMAC_RX_ERR_IND) { 134262306a36Sopenharmony_ci if (chip->chip_id == RTL8852C) { 134362306a36Sopenharmony_ci seq_printf(m, "R_AX_PHYINFO_ERR_ISR [%d]=0x%08x\n", band, 134462306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_PHYINFO_ERR_ISR + offset)); 134562306a36Sopenharmony_ci seq_printf(m, "R_AX_PHYINFO_ERR_IMR [%d]=0x%08x\n", band, 134662306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_PHYINFO_ERR_IMR + offset)); 134762306a36Sopenharmony_ci } else { 134862306a36Sopenharmony_ci seq_printf(m, "R_AX_PHYINFO_ERR_IMR [%d]=0x%08x\n", band, 134962306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_PHYINFO_ERR_IMR + offset)); 135062306a36Sopenharmony_ci } 135162306a36Sopenharmony_ci } 135262306a36Sopenharmony_ci 135362306a36Sopenharmony_ci if (cmac_err & B_AX_TXPWR_CTRL_ERR_IND) { 135462306a36Sopenharmony_ci seq_printf(m, "R_AX_TXPWR_IMR [%d]=0x%08x\n", band, 135562306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_TXPWR_IMR + offset)); 135662306a36Sopenharmony_ci seq_printf(m, "R_AX_TXPWR_ISR [%d]=0x%08x\n", band, 135762306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_TXPWR_ISR + offset)); 135862306a36Sopenharmony_ci } 135962306a36Sopenharmony_ci 136062306a36Sopenharmony_ci if (cmac_err & B_AX_WMAC_TX_ERR_IND) { 136162306a36Sopenharmony_ci if (chip->chip_id == RTL8852C) { 136262306a36Sopenharmony_ci seq_printf(m, "R_AX_TRXPTCL_ERROR_INDICA [%d]=0x%08x\n", band, 136362306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_TRXPTCL_ERROR_INDICA + offset)); 136462306a36Sopenharmony_ci seq_printf(m, "R_AX_TRXPTCL_ERROR_INDICA_MASK [%d]=0x%08x\n", band, 136562306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_TRXPTCL_ERROR_INDICA_MASK + offset)); 136662306a36Sopenharmony_ci } else { 136762306a36Sopenharmony_ci seq_printf(m, "R_AX_TMAC_ERR_IMR_ISR [%d]=0x%08x\n", band, 136862306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_TMAC_ERR_IMR_ISR + offset)); 136962306a36Sopenharmony_ci } 137062306a36Sopenharmony_ci seq_printf(m, "R_AX_DBGSEL_TRXPTCL [%d]=0x%08x\n", band, 137162306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_DBGSEL_TRXPTCL + offset)); 137262306a36Sopenharmony_ci } 137362306a36Sopenharmony_ci 137462306a36Sopenharmony_ci seq_printf(m, "R_AX_CMAC_ERR_IMR [%d]=0x%08x\n", band, 137562306a36Sopenharmony_ci rtw89_read32(rtwdev, R_AX_CMAC_ERR_IMR + offset)); 137662306a36Sopenharmony_ci 137762306a36Sopenharmony_ci return 0; 137862306a36Sopenharmony_ci} 137962306a36Sopenharmony_ci 138062306a36Sopenharmony_cistatic int rtw89_debug_mac_dump_cmac_dbg(struct rtw89_dev *rtwdev, 138162306a36Sopenharmony_ci struct seq_file *m) 138262306a36Sopenharmony_ci{ 138362306a36Sopenharmony_ci rtw89_debug_mac_dump_cmac_err(rtwdev, m, RTW89_MAC_0); 138462306a36Sopenharmony_ci if (rtwdev->dbcc_en) 138562306a36Sopenharmony_ci rtw89_debug_mac_dump_cmac_err(rtwdev, m, RTW89_MAC_1); 138662306a36Sopenharmony_ci 138762306a36Sopenharmony_ci return 0; 138862306a36Sopenharmony_ci} 138962306a36Sopenharmony_ci 139062306a36Sopenharmony_cistatic const struct rtw89_mac_dbg_port_info dbg_port_ptcl_c0 = { 139162306a36Sopenharmony_ci .sel_addr = R_AX_PTCL_DBG, 139262306a36Sopenharmony_ci .sel_byte = 1, 139362306a36Sopenharmony_ci .sel_msk = B_AX_PTCL_DBG_SEL_MASK, 139462306a36Sopenharmony_ci .srt = 0x00, 139562306a36Sopenharmony_ci .end = 0x3F, 139662306a36Sopenharmony_ci .rd_addr = R_AX_PTCL_DBG_INFO, 139762306a36Sopenharmony_ci .rd_byte = 4, 139862306a36Sopenharmony_ci .rd_msk = B_AX_PTCL_DBG_INFO_MASK 139962306a36Sopenharmony_ci}; 140062306a36Sopenharmony_ci 140162306a36Sopenharmony_cistatic const struct rtw89_mac_dbg_port_info dbg_port_ptcl_c1 = { 140262306a36Sopenharmony_ci .sel_addr = R_AX_PTCL_DBG_C1, 140362306a36Sopenharmony_ci .sel_byte = 1, 140462306a36Sopenharmony_ci .sel_msk = B_AX_PTCL_DBG_SEL_MASK, 140562306a36Sopenharmony_ci .srt = 0x00, 140662306a36Sopenharmony_ci .end = 0x3F, 140762306a36Sopenharmony_ci .rd_addr = R_AX_PTCL_DBG_INFO_C1, 140862306a36Sopenharmony_ci .rd_byte = 4, 140962306a36Sopenharmony_ci .rd_msk = B_AX_PTCL_DBG_INFO_MASK 141062306a36Sopenharmony_ci}; 141162306a36Sopenharmony_ci 141262306a36Sopenharmony_cistatic const struct rtw89_mac_dbg_port_info dbg_port_dspt_hdt_tx0_5 = { 141362306a36Sopenharmony_ci .sel_addr = R_AX_DISPATCHER_DBG_PORT, 141462306a36Sopenharmony_ci .sel_byte = 2, 141562306a36Sopenharmony_ci .sel_msk = B_AX_DISPATCHER_DBG_SEL_MASK, 141662306a36Sopenharmony_ci .srt = 0x0, 141762306a36Sopenharmony_ci .end = 0xD, 141862306a36Sopenharmony_ci .rd_addr = R_AX_DBG_PORT_SEL, 141962306a36Sopenharmony_ci .rd_byte = 4, 142062306a36Sopenharmony_ci .rd_msk = B_AX_DEBUG_ST_MASK 142162306a36Sopenharmony_ci}; 142262306a36Sopenharmony_ci 142362306a36Sopenharmony_cistatic const struct rtw89_mac_dbg_port_info dbg_port_dspt_hdt_tx6 = { 142462306a36Sopenharmony_ci .sel_addr = R_AX_DISPATCHER_DBG_PORT, 142562306a36Sopenharmony_ci .sel_byte = 2, 142662306a36Sopenharmony_ci .sel_msk = B_AX_DISPATCHER_DBG_SEL_MASK, 142762306a36Sopenharmony_ci .srt = 0x0, 142862306a36Sopenharmony_ci .end = 0x5, 142962306a36Sopenharmony_ci .rd_addr = R_AX_DBG_PORT_SEL, 143062306a36Sopenharmony_ci .rd_byte = 4, 143162306a36Sopenharmony_ci .rd_msk = B_AX_DEBUG_ST_MASK 143262306a36Sopenharmony_ci}; 143362306a36Sopenharmony_ci 143462306a36Sopenharmony_cistatic const struct rtw89_mac_dbg_port_info dbg_port_dspt_hdt_tx7 = { 143562306a36Sopenharmony_ci .sel_addr = R_AX_DISPATCHER_DBG_PORT, 143662306a36Sopenharmony_ci .sel_byte = 2, 143762306a36Sopenharmony_ci .sel_msk = B_AX_DISPATCHER_DBG_SEL_MASK, 143862306a36Sopenharmony_ci .srt = 0x0, 143962306a36Sopenharmony_ci .end = 0x9, 144062306a36Sopenharmony_ci .rd_addr = R_AX_DBG_PORT_SEL, 144162306a36Sopenharmony_ci .rd_byte = 4, 144262306a36Sopenharmony_ci .rd_msk = B_AX_DEBUG_ST_MASK 144362306a36Sopenharmony_ci}; 144462306a36Sopenharmony_ci 144562306a36Sopenharmony_cistatic const struct rtw89_mac_dbg_port_info dbg_port_dspt_hdt_tx8 = { 144662306a36Sopenharmony_ci .sel_addr = R_AX_DISPATCHER_DBG_PORT, 144762306a36Sopenharmony_ci .sel_byte = 2, 144862306a36Sopenharmony_ci .sel_msk = B_AX_DISPATCHER_DBG_SEL_MASK, 144962306a36Sopenharmony_ci .srt = 0x0, 145062306a36Sopenharmony_ci .end = 0x3, 145162306a36Sopenharmony_ci .rd_addr = R_AX_DBG_PORT_SEL, 145262306a36Sopenharmony_ci .rd_byte = 4, 145362306a36Sopenharmony_ci .rd_msk = B_AX_DEBUG_ST_MASK 145462306a36Sopenharmony_ci}; 145562306a36Sopenharmony_ci 145662306a36Sopenharmony_cistatic const struct rtw89_mac_dbg_port_info dbg_port_dspt_hdt_tx9_C = { 145762306a36Sopenharmony_ci .sel_addr = R_AX_DISPATCHER_DBG_PORT, 145862306a36Sopenharmony_ci .sel_byte = 2, 145962306a36Sopenharmony_ci .sel_msk = B_AX_DISPATCHER_DBG_SEL_MASK, 146062306a36Sopenharmony_ci .srt = 0x0, 146162306a36Sopenharmony_ci .end = 0x1, 146262306a36Sopenharmony_ci .rd_addr = R_AX_DBG_PORT_SEL, 146362306a36Sopenharmony_ci .rd_byte = 4, 146462306a36Sopenharmony_ci .rd_msk = B_AX_DEBUG_ST_MASK 146562306a36Sopenharmony_ci}; 146662306a36Sopenharmony_ci 146762306a36Sopenharmony_cistatic const struct rtw89_mac_dbg_port_info dbg_port_dspt_hdt_txD = { 146862306a36Sopenharmony_ci .sel_addr = R_AX_DISPATCHER_DBG_PORT, 146962306a36Sopenharmony_ci .sel_byte = 2, 147062306a36Sopenharmony_ci .sel_msk = B_AX_DISPATCHER_DBG_SEL_MASK, 147162306a36Sopenharmony_ci .srt = 0x0, 147262306a36Sopenharmony_ci .end = 0x0, 147362306a36Sopenharmony_ci .rd_addr = R_AX_DBG_PORT_SEL, 147462306a36Sopenharmony_ci .rd_byte = 4, 147562306a36Sopenharmony_ci .rd_msk = B_AX_DEBUG_ST_MASK 147662306a36Sopenharmony_ci}; 147762306a36Sopenharmony_ci 147862306a36Sopenharmony_cistatic const struct rtw89_mac_dbg_port_info dbg_port_dspt_cdt_tx0 = { 147962306a36Sopenharmony_ci .sel_addr = R_AX_DISPATCHER_DBG_PORT, 148062306a36Sopenharmony_ci .sel_byte = 2, 148162306a36Sopenharmony_ci .sel_msk = B_AX_DISPATCHER_DBG_SEL_MASK, 148262306a36Sopenharmony_ci .srt = 0x0, 148362306a36Sopenharmony_ci .end = 0xB, 148462306a36Sopenharmony_ci .rd_addr = R_AX_DBG_PORT_SEL, 148562306a36Sopenharmony_ci .rd_byte = 4, 148662306a36Sopenharmony_ci .rd_msk = B_AX_DEBUG_ST_MASK 148762306a36Sopenharmony_ci}; 148862306a36Sopenharmony_ci 148962306a36Sopenharmony_cistatic const struct rtw89_mac_dbg_port_info dbg_port_dspt_cdt_tx1 = { 149062306a36Sopenharmony_ci .sel_addr = R_AX_DISPATCHER_DBG_PORT, 149162306a36Sopenharmony_ci .sel_byte = 2, 149262306a36Sopenharmony_ci .sel_msk = B_AX_DISPATCHER_DBG_SEL_MASK, 149362306a36Sopenharmony_ci .srt = 0x0, 149462306a36Sopenharmony_ci .end = 0x4, 149562306a36Sopenharmony_ci .rd_addr = R_AX_DBG_PORT_SEL, 149662306a36Sopenharmony_ci .rd_byte = 4, 149762306a36Sopenharmony_ci .rd_msk = B_AX_DEBUG_ST_MASK 149862306a36Sopenharmony_ci}; 149962306a36Sopenharmony_ci 150062306a36Sopenharmony_cistatic const struct rtw89_mac_dbg_port_info dbg_port_dspt_cdt_tx3 = { 150162306a36Sopenharmony_ci .sel_addr = R_AX_DISPATCHER_DBG_PORT, 150262306a36Sopenharmony_ci .sel_byte = 2, 150362306a36Sopenharmony_ci .sel_msk = B_AX_DISPATCHER_DBG_SEL_MASK, 150462306a36Sopenharmony_ci .srt = 0x0, 150562306a36Sopenharmony_ci .end = 0x8, 150662306a36Sopenharmony_ci .rd_addr = R_AX_DBG_PORT_SEL, 150762306a36Sopenharmony_ci .rd_byte = 4, 150862306a36Sopenharmony_ci .rd_msk = B_AX_DEBUG_ST_MASK 150962306a36Sopenharmony_ci}; 151062306a36Sopenharmony_ci 151162306a36Sopenharmony_cistatic const struct rtw89_mac_dbg_port_info dbg_port_dspt_cdt_tx4 = { 151262306a36Sopenharmony_ci .sel_addr = R_AX_DISPATCHER_DBG_PORT, 151362306a36Sopenharmony_ci .sel_byte = 2, 151462306a36Sopenharmony_ci .sel_msk = B_AX_DISPATCHER_DBG_SEL_MASK, 151562306a36Sopenharmony_ci .srt = 0x0, 151662306a36Sopenharmony_ci .end = 0x7, 151762306a36Sopenharmony_ci .rd_addr = R_AX_DBG_PORT_SEL, 151862306a36Sopenharmony_ci .rd_byte = 4, 151962306a36Sopenharmony_ci .rd_msk = B_AX_DEBUG_ST_MASK 152062306a36Sopenharmony_ci}; 152162306a36Sopenharmony_ci 152262306a36Sopenharmony_cistatic const struct rtw89_mac_dbg_port_info dbg_port_dspt_cdt_tx5_8 = { 152362306a36Sopenharmony_ci .sel_addr = R_AX_DISPATCHER_DBG_PORT, 152462306a36Sopenharmony_ci .sel_byte = 2, 152562306a36Sopenharmony_ci .sel_msk = B_AX_DISPATCHER_DBG_SEL_MASK, 152662306a36Sopenharmony_ci .srt = 0x0, 152762306a36Sopenharmony_ci .end = 0x1, 152862306a36Sopenharmony_ci .rd_addr = R_AX_DBG_PORT_SEL, 152962306a36Sopenharmony_ci .rd_byte = 4, 153062306a36Sopenharmony_ci .rd_msk = B_AX_DEBUG_ST_MASK 153162306a36Sopenharmony_ci}; 153262306a36Sopenharmony_ci 153362306a36Sopenharmony_cistatic const struct rtw89_mac_dbg_port_info dbg_port_dspt_cdt_tx9 = { 153462306a36Sopenharmony_ci .sel_addr = R_AX_DISPATCHER_DBG_PORT, 153562306a36Sopenharmony_ci .sel_byte = 2, 153662306a36Sopenharmony_ci .sel_msk = B_AX_DISPATCHER_DBG_SEL_MASK, 153762306a36Sopenharmony_ci .srt = 0x0, 153862306a36Sopenharmony_ci .end = 0x3, 153962306a36Sopenharmony_ci .rd_addr = R_AX_DBG_PORT_SEL, 154062306a36Sopenharmony_ci .rd_byte = 4, 154162306a36Sopenharmony_ci .rd_msk = B_AX_DEBUG_ST_MASK 154262306a36Sopenharmony_ci}; 154362306a36Sopenharmony_ci 154462306a36Sopenharmony_cistatic const struct rtw89_mac_dbg_port_info dbg_port_dspt_cdt_txA_C = { 154562306a36Sopenharmony_ci .sel_addr = R_AX_DISPATCHER_DBG_PORT, 154662306a36Sopenharmony_ci .sel_byte = 2, 154762306a36Sopenharmony_ci .sel_msk = B_AX_DISPATCHER_DBG_SEL_MASK, 154862306a36Sopenharmony_ci .srt = 0x0, 154962306a36Sopenharmony_ci .end = 0x0, 155062306a36Sopenharmony_ci .rd_addr = R_AX_DBG_PORT_SEL, 155162306a36Sopenharmony_ci .rd_byte = 4, 155262306a36Sopenharmony_ci .rd_msk = B_AX_DEBUG_ST_MASK 155362306a36Sopenharmony_ci}; 155462306a36Sopenharmony_ci 155562306a36Sopenharmony_cistatic const struct rtw89_mac_dbg_port_info dbg_port_dspt_hdt_rx0 = { 155662306a36Sopenharmony_ci .sel_addr = R_AX_DISPATCHER_DBG_PORT, 155762306a36Sopenharmony_ci .sel_byte = 2, 155862306a36Sopenharmony_ci .sel_msk = B_AX_DISPATCHER_DBG_SEL_MASK, 155962306a36Sopenharmony_ci .srt = 0x0, 156062306a36Sopenharmony_ci .end = 0x8, 156162306a36Sopenharmony_ci .rd_addr = R_AX_DBG_PORT_SEL, 156262306a36Sopenharmony_ci .rd_byte = 4, 156362306a36Sopenharmony_ci .rd_msk = B_AX_DEBUG_ST_MASK 156462306a36Sopenharmony_ci}; 156562306a36Sopenharmony_ci 156662306a36Sopenharmony_cistatic const struct rtw89_mac_dbg_port_info dbg_port_dspt_hdt_rx1_2 = { 156762306a36Sopenharmony_ci .sel_addr = R_AX_DISPATCHER_DBG_PORT, 156862306a36Sopenharmony_ci .sel_byte = 2, 156962306a36Sopenharmony_ci .sel_msk = B_AX_DISPATCHER_DBG_SEL_MASK, 157062306a36Sopenharmony_ci .srt = 0x0, 157162306a36Sopenharmony_ci .end = 0x0, 157262306a36Sopenharmony_ci .rd_addr = R_AX_DBG_PORT_SEL, 157362306a36Sopenharmony_ci .rd_byte = 4, 157462306a36Sopenharmony_ci .rd_msk = B_AX_DEBUG_ST_MASK 157562306a36Sopenharmony_ci}; 157662306a36Sopenharmony_ci 157762306a36Sopenharmony_cistatic const struct rtw89_mac_dbg_port_info dbg_port_dspt_hdt_rx3 = { 157862306a36Sopenharmony_ci .sel_addr = R_AX_DISPATCHER_DBG_PORT, 157962306a36Sopenharmony_ci .sel_byte = 2, 158062306a36Sopenharmony_ci .sel_msk = B_AX_DISPATCHER_DBG_SEL_MASK, 158162306a36Sopenharmony_ci .srt = 0x0, 158262306a36Sopenharmony_ci .end = 0x6, 158362306a36Sopenharmony_ci .rd_addr = R_AX_DBG_PORT_SEL, 158462306a36Sopenharmony_ci .rd_byte = 4, 158562306a36Sopenharmony_ci .rd_msk = B_AX_DEBUG_ST_MASK 158662306a36Sopenharmony_ci}; 158762306a36Sopenharmony_ci 158862306a36Sopenharmony_cistatic const struct rtw89_mac_dbg_port_info dbg_port_dspt_hdt_rx4 = { 158962306a36Sopenharmony_ci .sel_addr = R_AX_DISPATCHER_DBG_PORT, 159062306a36Sopenharmony_ci .sel_byte = 2, 159162306a36Sopenharmony_ci .sel_msk = B_AX_DISPATCHER_DBG_SEL_MASK, 159262306a36Sopenharmony_ci .srt = 0x0, 159362306a36Sopenharmony_ci .end = 0x0, 159462306a36Sopenharmony_ci .rd_addr = R_AX_DBG_PORT_SEL, 159562306a36Sopenharmony_ci .rd_byte = 4, 159662306a36Sopenharmony_ci .rd_msk = B_AX_DEBUG_ST_MASK 159762306a36Sopenharmony_ci}; 159862306a36Sopenharmony_ci 159962306a36Sopenharmony_cistatic const struct rtw89_mac_dbg_port_info dbg_port_dspt_hdt_rx5 = { 160062306a36Sopenharmony_ci .sel_addr = R_AX_DISPATCHER_DBG_PORT, 160162306a36Sopenharmony_ci .sel_byte = 2, 160262306a36Sopenharmony_ci .sel_msk = B_AX_DISPATCHER_DBG_SEL_MASK, 160362306a36Sopenharmony_ci .srt = 0x0, 160462306a36Sopenharmony_ci .end = 0x0, 160562306a36Sopenharmony_ci .rd_addr = R_AX_DBG_PORT_SEL, 160662306a36Sopenharmony_ci .rd_byte = 4, 160762306a36Sopenharmony_ci .rd_msk = B_AX_DEBUG_ST_MASK 160862306a36Sopenharmony_ci}; 160962306a36Sopenharmony_ci 161062306a36Sopenharmony_cistatic const struct rtw89_mac_dbg_port_info dbg_port_dspt_cdt_rx_p0_0 = { 161162306a36Sopenharmony_ci .sel_addr = R_AX_DISPATCHER_DBG_PORT, 161262306a36Sopenharmony_ci .sel_byte = 1, 161362306a36Sopenharmony_ci .sel_msk = B_AX_DISPATCHER_CH_SEL_MASK, 161462306a36Sopenharmony_ci .srt = 0x0, 161562306a36Sopenharmony_ci .end = 0x3, 161662306a36Sopenharmony_ci .rd_addr = R_AX_DBG_PORT_SEL, 161762306a36Sopenharmony_ci .rd_byte = 4, 161862306a36Sopenharmony_ci .rd_msk = B_AX_DEBUG_ST_MASK 161962306a36Sopenharmony_ci}; 162062306a36Sopenharmony_ci 162162306a36Sopenharmony_cistatic const struct rtw89_mac_dbg_port_info dbg_port_dspt_cdt_rx_p0_1 = { 162262306a36Sopenharmony_ci .sel_addr = R_AX_DISPATCHER_DBG_PORT, 162362306a36Sopenharmony_ci .sel_byte = 1, 162462306a36Sopenharmony_ci .sel_msk = B_AX_DISPATCHER_CH_SEL_MASK, 162562306a36Sopenharmony_ci .srt = 0x0, 162662306a36Sopenharmony_ci .end = 0x6, 162762306a36Sopenharmony_ci .rd_addr = R_AX_DBG_PORT_SEL, 162862306a36Sopenharmony_ci .rd_byte = 4, 162962306a36Sopenharmony_ci .rd_msk = B_AX_DEBUG_ST_MASK 163062306a36Sopenharmony_ci}; 163162306a36Sopenharmony_ci 163262306a36Sopenharmony_cistatic const struct rtw89_mac_dbg_port_info dbg_port_dspt_cdt_rx_p0_2 = { 163362306a36Sopenharmony_ci .sel_addr = R_AX_DISPATCHER_DBG_PORT, 163462306a36Sopenharmony_ci .sel_byte = 1, 163562306a36Sopenharmony_ci .sel_msk = B_AX_DISPATCHER_CH_SEL_MASK, 163662306a36Sopenharmony_ci .srt = 0x0, 163762306a36Sopenharmony_ci .end = 0x0, 163862306a36Sopenharmony_ci .rd_addr = R_AX_DBG_PORT_SEL, 163962306a36Sopenharmony_ci .rd_byte = 4, 164062306a36Sopenharmony_ci .rd_msk = B_AX_DEBUG_ST_MASK 164162306a36Sopenharmony_ci}; 164262306a36Sopenharmony_ci 164362306a36Sopenharmony_cistatic const struct rtw89_mac_dbg_port_info dbg_port_dspt_cdt_rx_p1 = { 164462306a36Sopenharmony_ci .sel_addr = R_AX_DISPATCHER_DBG_PORT, 164562306a36Sopenharmony_ci .sel_byte = 1, 164662306a36Sopenharmony_ci .sel_msk = B_AX_DISPATCHER_CH_SEL_MASK, 164762306a36Sopenharmony_ci .srt = 0x8, 164862306a36Sopenharmony_ci .end = 0xE, 164962306a36Sopenharmony_ci .rd_addr = R_AX_DBG_PORT_SEL, 165062306a36Sopenharmony_ci .rd_byte = 4, 165162306a36Sopenharmony_ci .rd_msk = B_AX_DEBUG_ST_MASK 165262306a36Sopenharmony_ci}; 165362306a36Sopenharmony_ci 165462306a36Sopenharmony_cistatic const struct rtw89_mac_dbg_port_info dbg_port_dspt_stf_ctrl = { 165562306a36Sopenharmony_ci .sel_addr = R_AX_DISPATCHER_DBG_PORT, 165662306a36Sopenharmony_ci .sel_byte = 1, 165762306a36Sopenharmony_ci .sel_msk = B_AX_DISPATCHER_CH_SEL_MASK, 165862306a36Sopenharmony_ci .srt = 0x0, 165962306a36Sopenharmony_ci .end = 0x5, 166062306a36Sopenharmony_ci .rd_addr = R_AX_DBG_PORT_SEL, 166162306a36Sopenharmony_ci .rd_byte = 4, 166262306a36Sopenharmony_ci .rd_msk = B_AX_DEBUG_ST_MASK 166362306a36Sopenharmony_ci}; 166462306a36Sopenharmony_ci 166562306a36Sopenharmony_cistatic const struct rtw89_mac_dbg_port_info dbg_port_dspt_addr_ctrl = { 166662306a36Sopenharmony_ci .sel_addr = R_AX_DISPATCHER_DBG_PORT, 166762306a36Sopenharmony_ci .sel_byte = 1, 166862306a36Sopenharmony_ci .sel_msk = B_AX_DISPATCHER_CH_SEL_MASK, 166962306a36Sopenharmony_ci .srt = 0x0, 167062306a36Sopenharmony_ci .end = 0x6, 167162306a36Sopenharmony_ci .rd_addr = R_AX_DBG_PORT_SEL, 167262306a36Sopenharmony_ci .rd_byte = 4, 167362306a36Sopenharmony_ci .rd_msk = B_AX_DEBUG_ST_MASK 167462306a36Sopenharmony_ci}; 167562306a36Sopenharmony_ci 167662306a36Sopenharmony_cistatic const struct rtw89_mac_dbg_port_info dbg_port_dspt_wde_intf = { 167762306a36Sopenharmony_ci .sel_addr = R_AX_DISPATCHER_DBG_PORT, 167862306a36Sopenharmony_ci .sel_byte = 1, 167962306a36Sopenharmony_ci .sel_msk = B_AX_DISPATCHER_CH_SEL_MASK, 168062306a36Sopenharmony_ci .srt = 0x0, 168162306a36Sopenharmony_ci .end = 0xF, 168262306a36Sopenharmony_ci .rd_addr = R_AX_DBG_PORT_SEL, 168362306a36Sopenharmony_ci .rd_byte = 4, 168462306a36Sopenharmony_ci .rd_msk = B_AX_DEBUG_ST_MASK 168562306a36Sopenharmony_ci}; 168662306a36Sopenharmony_ci 168762306a36Sopenharmony_cistatic const struct rtw89_mac_dbg_port_info dbg_port_dspt_ple_intf = { 168862306a36Sopenharmony_ci .sel_addr = R_AX_DISPATCHER_DBG_PORT, 168962306a36Sopenharmony_ci .sel_byte = 1, 169062306a36Sopenharmony_ci .sel_msk = B_AX_DISPATCHER_CH_SEL_MASK, 169162306a36Sopenharmony_ci .srt = 0x0, 169262306a36Sopenharmony_ci .end = 0x9, 169362306a36Sopenharmony_ci .rd_addr = R_AX_DBG_PORT_SEL, 169462306a36Sopenharmony_ci .rd_byte = 4, 169562306a36Sopenharmony_ci .rd_msk = B_AX_DEBUG_ST_MASK 169662306a36Sopenharmony_ci}; 169762306a36Sopenharmony_ci 169862306a36Sopenharmony_cistatic const struct rtw89_mac_dbg_port_info dbg_port_dspt_flow_ctrl = { 169962306a36Sopenharmony_ci .sel_addr = R_AX_DISPATCHER_DBG_PORT, 170062306a36Sopenharmony_ci .sel_byte = 1, 170162306a36Sopenharmony_ci .sel_msk = B_AX_DISPATCHER_CH_SEL_MASK, 170262306a36Sopenharmony_ci .srt = 0x0, 170362306a36Sopenharmony_ci .end = 0x3, 170462306a36Sopenharmony_ci .rd_addr = R_AX_DBG_PORT_SEL, 170562306a36Sopenharmony_ci .rd_byte = 4, 170662306a36Sopenharmony_ci .rd_msk = B_AX_DEBUG_ST_MASK 170762306a36Sopenharmony_ci}; 170862306a36Sopenharmony_ci 170962306a36Sopenharmony_cistatic const struct rtw89_mac_dbg_port_info dbg_port_sch_c0 = { 171062306a36Sopenharmony_ci .sel_addr = R_AX_SCH_DBG_SEL, 171162306a36Sopenharmony_ci .sel_byte = 1, 171262306a36Sopenharmony_ci .sel_msk = B_AX_SCH_DBG_SEL_MASK, 171362306a36Sopenharmony_ci .srt = 0x00, 171462306a36Sopenharmony_ci .end = 0x2F, 171562306a36Sopenharmony_ci .rd_addr = R_AX_SCH_DBG, 171662306a36Sopenharmony_ci .rd_byte = 4, 171762306a36Sopenharmony_ci .rd_msk = B_AX_SCHEDULER_DBG_MASK 171862306a36Sopenharmony_ci}; 171962306a36Sopenharmony_ci 172062306a36Sopenharmony_cistatic const struct rtw89_mac_dbg_port_info dbg_port_sch_c1 = { 172162306a36Sopenharmony_ci .sel_addr = R_AX_SCH_DBG_SEL_C1, 172262306a36Sopenharmony_ci .sel_byte = 1, 172362306a36Sopenharmony_ci .sel_msk = B_AX_SCH_DBG_SEL_MASK, 172462306a36Sopenharmony_ci .srt = 0x00, 172562306a36Sopenharmony_ci .end = 0x2F, 172662306a36Sopenharmony_ci .rd_addr = R_AX_SCH_DBG_C1, 172762306a36Sopenharmony_ci .rd_byte = 4, 172862306a36Sopenharmony_ci .rd_msk = B_AX_SCHEDULER_DBG_MASK 172962306a36Sopenharmony_ci}; 173062306a36Sopenharmony_ci 173162306a36Sopenharmony_cistatic const struct rtw89_mac_dbg_port_info dbg_port_tmac_c0 = { 173262306a36Sopenharmony_ci .sel_addr = R_AX_MACTX_DBG_SEL_CNT, 173362306a36Sopenharmony_ci .sel_byte = 1, 173462306a36Sopenharmony_ci .sel_msk = B_AX_DBGSEL_MACTX_MASK, 173562306a36Sopenharmony_ci .srt = 0x00, 173662306a36Sopenharmony_ci .end = 0x19, 173762306a36Sopenharmony_ci .rd_addr = R_AX_DBG_PORT_SEL, 173862306a36Sopenharmony_ci .rd_byte = 4, 173962306a36Sopenharmony_ci .rd_msk = B_AX_DEBUG_ST_MASK 174062306a36Sopenharmony_ci}; 174162306a36Sopenharmony_ci 174262306a36Sopenharmony_cistatic const struct rtw89_mac_dbg_port_info dbg_port_tmac_c1 = { 174362306a36Sopenharmony_ci .sel_addr = R_AX_MACTX_DBG_SEL_CNT_C1, 174462306a36Sopenharmony_ci .sel_byte = 1, 174562306a36Sopenharmony_ci .sel_msk = B_AX_DBGSEL_MACTX_MASK, 174662306a36Sopenharmony_ci .srt = 0x00, 174762306a36Sopenharmony_ci .end = 0x19, 174862306a36Sopenharmony_ci .rd_addr = R_AX_DBG_PORT_SEL, 174962306a36Sopenharmony_ci .rd_byte = 4, 175062306a36Sopenharmony_ci .rd_msk = B_AX_DEBUG_ST_MASK 175162306a36Sopenharmony_ci}; 175262306a36Sopenharmony_ci 175362306a36Sopenharmony_cistatic const struct rtw89_mac_dbg_port_info dbg_port_rmac_c0 = { 175462306a36Sopenharmony_ci .sel_addr = R_AX_RX_DEBUG_SELECT, 175562306a36Sopenharmony_ci .sel_byte = 1, 175662306a36Sopenharmony_ci .sel_msk = B_AX_DEBUG_SEL_MASK, 175762306a36Sopenharmony_ci .srt = 0x00, 175862306a36Sopenharmony_ci .end = 0x58, 175962306a36Sopenharmony_ci .rd_addr = R_AX_DBG_PORT_SEL, 176062306a36Sopenharmony_ci .rd_byte = 4, 176162306a36Sopenharmony_ci .rd_msk = B_AX_DEBUG_ST_MASK 176262306a36Sopenharmony_ci}; 176362306a36Sopenharmony_ci 176462306a36Sopenharmony_cistatic const struct rtw89_mac_dbg_port_info dbg_port_rmac_c1 = { 176562306a36Sopenharmony_ci .sel_addr = R_AX_RX_DEBUG_SELECT_C1, 176662306a36Sopenharmony_ci .sel_byte = 1, 176762306a36Sopenharmony_ci .sel_msk = B_AX_DEBUG_SEL_MASK, 176862306a36Sopenharmony_ci .srt = 0x00, 176962306a36Sopenharmony_ci .end = 0x58, 177062306a36Sopenharmony_ci .rd_addr = R_AX_DBG_PORT_SEL, 177162306a36Sopenharmony_ci .rd_byte = 4, 177262306a36Sopenharmony_ci .rd_msk = B_AX_DEBUG_ST_MASK 177362306a36Sopenharmony_ci}; 177462306a36Sopenharmony_ci 177562306a36Sopenharmony_cistatic const struct rtw89_mac_dbg_port_info dbg_port_rmacst_c0 = { 177662306a36Sopenharmony_ci .sel_addr = R_AX_RX_STATE_MONITOR, 177762306a36Sopenharmony_ci .sel_byte = 1, 177862306a36Sopenharmony_ci .sel_msk = B_AX_STATE_SEL_MASK, 177962306a36Sopenharmony_ci .srt = 0x00, 178062306a36Sopenharmony_ci .end = 0x17, 178162306a36Sopenharmony_ci .rd_addr = R_AX_RX_STATE_MONITOR, 178262306a36Sopenharmony_ci .rd_byte = 4, 178362306a36Sopenharmony_ci .rd_msk = B_AX_RX_STATE_MONITOR_MASK 178462306a36Sopenharmony_ci}; 178562306a36Sopenharmony_ci 178662306a36Sopenharmony_cistatic const struct rtw89_mac_dbg_port_info dbg_port_rmacst_c1 = { 178762306a36Sopenharmony_ci .sel_addr = R_AX_RX_STATE_MONITOR_C1, 178862306a36Sopenharmony_ci .sel_byte = 1, 178962306a36Sopenharmony_ci .sel_msk = B_AX_STATE_SEL_MASK, 179062306a36Sopenharmony_ci .srt = 0x00, 179162306a36Sopenharmony_ci .end = 0x17, 179262306a36Sopenharmony_ci .rd_addr = R_AX_RX_STATE_MONITOR_C1, 179362306a36Sopenharmony_ci .rd_byte = 4, 179462306a36Sopenharmony_ci .rd_msk = B_AX_RX_STATE_MONITOR_MASK 179562306a36Sopenharmony_ci}; 179662306a36Sopenharmony_ci 179762306a36Sopenharmony_cistatic const struct rtw89_mac_dbg_port_info dbg_port_rmac_plcp_c0 = { 179862306a36Sopenharmony_ci .sel_addr = R_AX_RMAC_PLCP_MON, 179962306a36Sopenharmony_ci .sel_byte = 4, 180062306a36Sopenharmony_ci .sel_msk = B_AX_PCLP_MON_SEL_MASK, 180162306a36Sopenharmony_ci .srt = 0x0, 180262306a36Sopenharmony_ci .end = 0xF, 180362306a36Sopenharmony_ci .rd_addr = R_AX_RMAC_PLCP_MON, 180462306a36Sopenharmony_ci .rd_byte = 4, 180562306a36Sopenharmony_ci .rd_msk = B_AX_RMAC_PLCP_MON_MASK 180662306a36Sopenharmony_ci}; 180762306a36Sopenharmony_ci 180862306a36Sopenharmony_cistatic const struct rtw89_mac_dbg_port_info dbg_port_rmac_plcp_c1 = { 180962306a36Sopenharmony_ci .sel_addr = R_AX_RMAC_PLCP_MON_C1, 181062306a36Sopenharmony_ci .sel_byte = 4, 181162306a36Sopenharmony_ci .sel_msk = B_AX_PCLP_MON_SEL_MASK, 181262306a36Sopenharmony_ci .srt = 0x0, 181362306a36Sopenharmony_ci .end = 0xF, 181462306a36Sopenharmony_ci .rd_addr = R_AX_RMAC_PLCP_MON_C1, 181562306a36Sopenharmony_ci .rd_byte = 4, 181662306a36Sopenharmony_ci .rd_msk = B_AX_RMAC_PLCP_MON_MASK 181762306a36Sopenharmony_ci}; 181862306a36Sopenharmony_ci 181962306a36Sopenharmony_cistatic const struct rtw89_mac_dbg_port_info dbg_port_trxptcl_c0 = { 182062306a36Sopenharmony_ci .sel_addr = R_AX_DBGSEL_TRXPTCL, 182162306a36Sopenharmony_ci .sel_byte = 1, 182262306a36Sopenharmony_ci .sel_msk = B_AX_DBGSEL_TRXPTCL_MASK, 182362306a36Sopenharmony_ci .srt = 0x08, 182462306a36Sopenharmony_ci .end = 0x10, 182562306a36Sopenharmony_ci .rd_addr = R_AX_DBG_PORT_SEL, 182662306a36Sopenharmony_ci .rd_byte = 4, 182762306a36Sopenharmony_ci .rd_msk = B_AX_DEBUG_ST_MASK 182862306a36Sopenharmony_ci}; 182962306a36Sopenharmony_ci 183062306a36Sopenharmony_cistatic const struct rtw89_mac_dbg_port_info dbg_port_trxptcl_c1 = { 183162306a36Sopenharmony_ci .sel_addr = R_AX_DBGSEL_TRXPTCL_C1, 183262306a36Sopenharmony_ci .sel_byte = 1, 183362306a36Sopenharmony_ci .sel_msk = B_AX_DBGSEL_TRXPTCL_MASK, 183462306a36Sopenharmony_ci .srt = 0x08, 183562306a36Sopenharmony_ci .end = 0x10, 183662306a36Sopenharmony_ci .rd_addr = R_AX_DBG_PORT_SEL, 183762306a36Sopenharmony_ci .rd_byte = 4, 183862306a36Sopenharmony_ci .rd_msk = B_AX_DEBUG_ST_MASK 183962306a36Sopenharmony_ci}; 184062306a36Sopenharmony_ci 184162306a36Sopenharmony_cistatic const struct rtw89_mac_dbg_port_info dbg_port_tx_infol_c0 = { 184262306a36Sopenharmony_ci .sel_addr = R_AX_WMAC_TX_CTRL_DEBUG, 184362306a36Sopenharmony_ci .sel_byte = 1, 184462306a36Sopenharmony_ci .sel_msk = B_AX_TX_CTRL_DEBUG_SEL_MASK, 184562306a36Sopenharmony_ci .srt = 0x00, 184662306a36Sopenharmony_ci .end = 0x07, 184762306a36Sopenharmony_ci .rd_addr = R_AX_WMAC_TX_INFO0_DEBUG, 184862306a36Sopenharmony_ci .rd_byte = 4, 184962306a36Sopenharmony_ci .rd_msk = B_AX_TX_CTRL_INFO_P0_MASK 185062306a36Sopenharmony_ci}; 185162306a36Sopenharmony_ci 185262306a36Sopenharmony_cistatic const struct rtw89_mac_dbg_port_info dbg_port_tx_infoh_c0 = { 185362306a36Sopenharmony_ci .sel_addr = R_AX_WMAC_TX_CTRL_DEBUG, 185462306a36Sopenharmony_ci .sel_byte = 1, 185562306a36Sopenharmony_ci .sel_msk = B_AX_TX_CTRL_DEBUG_SEL_MASK, 185662306a36Sopenharmony_ci .srt = 0x00, 185762306a36Sopenharmony_ci .end = 0x07, 185862306a36Sopenharmony_ci .rd_addr = R_AX_WMAC_TX_INFO1_DEBUG, 185962306a36Sopenharmony_ci .rd_byte = 4, 186062306a36Sopenharmony_ci .rd_msk = B_AX_TX_CTRL_INFO_P1_MASK 186162306a36Sopenharmony_ci}; 186262306a36Sopenharmony_ci 186362306a36Sopenharmony_cistatic const struct rtw89_mac_dbg_port_info dbg_port_tx_infol_c1 = { 186462306a36Sopenharmony_ci .sel_addr = R_AX_WMAC_TX_CTRL_DEBUG_C1, 186562306a36Sopenharmony_ci .sel_byte = 1, 186662306a36Sopenharmony_ci .sel_msk = B_AX_TX_CTRL_DEBUG_SEL_MASK, 186762306a36Sopenharmony_ci .srt = 0x00, 186862306a36Sopenharmony_ci .end = 0x07, 186962306a36Sopenharmony_ci .rd_addr = R_AX_WMAC_TX_INFO0_DEBUG_C1, 187062306a36Sopenharmony_ci .rd_byte = 4, 187162306a36Sopenharmony_ci .rd_msk = B_AX_TX_CTRL_INFO_P0_MASK 187262306a36Sopenharmony_ci}; 187362306a36Sopenharmony_ci 187462306a36Sopenharmony_cistatic const struct rtw89_mac_dbg_port_info dbg_port_tx_infoh_c1 = { 187562306a36Sopenharmony_ci .sel_addr = R_AX_WMAC_TX_CTRL_DEBUG_C1, 187662306a36Sopenharmony_ci .sel_byte = 1, 187762306a36Sopenharmony_ci .sel_msk = B_AX_TX_CTRL_DEBUG_SEL_MASK, 187862306a36Sopenharmony_ci .srt = 0x00, 187962306a36Sopenharmony_ci .end = 0x07, 188062306a36Sopenharmony_ci .rd_addr = R_AX_WMAC_TX_INFO1_DEBUG_C1, 188162306a36Sopenharmony_ci .rd_byte = 4, 188262306a36Sopenharmony_ci .rd_msk = B_AX_TX_CTRL_INFO_P1_MASK 188362306a36Sopenharmony_ci}; 188462306a36Sopenharmony_ci 188562306a36Sopenharmony_cistatic const struct rtw89_mac_dbg_port_info dbg_port_txtf_infol_c0 = { 188662306a36Sopenharmony_ci .sel_addr = R_AX_WMAC_TX_TF_INFO_0, 188762306a36Sopenharmony_ci .sel_byte = 1, 188862306a36Sopenharmony_ci .sel_msk = B_AX_WMAC_TX_TF_INFO_SEL_MASK, 188962306a36Sopenharmony_ci .srt = 0x00, 189062306a36Sopenharmony_ci .end = 0x04, 189162306a36Sopenharmony_ci .rd_addr = R_AX_WMAC_TX_TF_INFO_1, 189262306a36Sopenharmony_ci .rd_byte = 4, 189362306a36Sopenharmony_ci .rd_msk = B_AX_WMAC_TX_TF_INFO_P0_MASK 189462306a36Sopenharmony_ci}; 189562306a36Sopenharmony_ci 189662306a36Sopenharmony_cistatic const struct rtw89_mac_dbg_port_info dbg_port_txtf_infoh_c0 = { 189762306a36Sopenharmony_ci .sel_addr = R_AX_WMAC_TX_TF_INFO_0, 189862306a36Sopenharmony_ci .sel_byte = 1, 189962306a36Sopenharmony_ci .sel_msk = B_AX_WMAC_TX_TF_INFO_SEL_MASK, 190062306a36Sopenharmony_ci .srt = 0x00, 190162306a36Sopenharmony_ci .end = 0x04, 190262306a36Sopenharmony_ci .rd_addr = R_AX_WMAC_TX_TF_INFO_2, 190362306a36Sopenharmony_ci .rd_byte = 4, 190462306a36Sopenharmony_ci .rd_msk = B_AX_WMAC_TX_TF_INFO_P1_MASK 190562306a36Sopenharmony_ci}; 190662306a36Sopenharmony_ci 190762306a36Sopenharmony_cistatic const struct rtw89_mac_dbg_port_info dbg_port_txtf_infol_c1 = { 190862306a36Sopenharmony_ci .sel_addr = R_AX_WMAC_TX_TF_INFO_0_C1, 190962306a36Sopenharmony_ci .sel_byte = 1, 191062306a36Sopenharmony_ci .sel_msk = B_AX_WMAC_TX_TF_INFO_SEL_MASK, 191162306a36Sopenharmony_ci .srt = 0x00, 191262306a36Sopenharmony_ci .end = 0x04, 191362306a36Sopenharmony_ci .rd_addr = R_AX_WMAC_TX_TF_INFO_1_C1, 191462306a36Sopenharmony_ci .rd_byte = 4, 191562306a36Sopenharmony_ci .rd_msk = B_AX_WMAC_TX_TF_INFO_P0_MASK 191662306a36Sopenharmony_ci}; 191762306a36Sopenharmony_ci 191862306a36Sopenharmony_cistatic const struct rtw89_mac_dbg_port_info dbg_port_txtf_infoh_c1 = { 191962306a36Sopenharmony_ci .sel_addr = R_AX_WMAC_TX_TF_INFO_0_C1, 192062306a36Sopenharmony_ci .sel_byte = 1, 192162306a36Sopenharmony_ci .sel_msk = B_AX_WMAC_TX_TF_INFO_SEL_MASK, 192262306a36Sopenharmony_ci .srt = 0x00, 192362306a36Sopenharmony_ci .end = 0x04, 192462306a36Sopenharmony_ci .rd_addr = R_AX_WMAC_TX_TF_INFO_2_C1, 192562306a36Sopenharmony_ci .rd_byte = 4, 192662306a36Sopenharmony_ci .rd_msk = B_AX_WMAC_TX_TF_INFO_P1_MASK 192762306a36Sopenharmony_ci}; 192862306a36Sopenharmony_ci 192962306a36Sopenharmony_cistatic const struct rtw89_mac_dbg_port_info dbg_port_wde_bufmgn_freepg = { 193062306a36Sopenharmony_ci .sel_addr = R_AX_WDE_DBG_FUN_INTF_CTL, 193162306a36Sopenharmony_ci .sel_byte = 4, 193262306a36Sopenharmony_ci .sel_msk = B_AX_WDE_DFI_DATA_MASK, 193362306a36Sopenharmony_ci .srt = 0x80000000, 193462306a36Sopenharmony_ci .end = 0x80000001, 193562306a36Sopenharmony_ci .rd_addr = R_AX_WDE_DBG_FUN_INTF_DATA, 193662306a36Sopenharmony_ci .rd_byte = 4, 193762306a36Sopenharmony_ci .rd_msk = B_AX_WDE_DFI_DATA_MASK 193862306a36Sopenharmony_ci}; 193962306a36Sopenharmony_ci 194062306a36Sopenharmony_cistatic const struct rtw89_mac_dbg_port_info dbg_port_wde_bufmgn_quota = { 194162306a36Sopenharmony_ci .sel_addr = R_AX_WDE_DBG_FUN_INTF_CTL, 194262306a36Sopenharmony_ci .sel_byte = 4, 194362306a36Sopenharmony_ci .sel_msk = B_AX_WDE_DFI_DATA_MASK, 194462306a36Sopenharmony_ci .srt = 0x80010000, 194562306a36Sopenharmony_ci .end = 0x80010004, 194662306a36Sopenharmony_ci .rd_addr = R_AX_WDE_DBG_FUN_INTF_DATA, 194762306a36Sopenharmony_ci .rd_byte = 4, 194862306a36Sopenharmony_ci .rd_msk = B_AX_WDE_DFI_DATA_MASK 194962306a36Sopenharmony_ci}; 195062306a36Sopenharmony_ci 195162306a36Sopenharmony_cistatic const struct rtw89_mac_dbg_port_info dbg_port_wde_bufmgn_pagellt = { 195262306a36Sopenharmony_ci .sel_addr = R_AX_WDE_DBG_FUN_INTF_CTL, 195362306a36Sopenharmony_ci .sel_byte = 4, 195462306a36Sopenharmony_ci .sel_msk = B_AX_WDE_DFI_DATA_MASK, 195562306a36Sopenharmony_ci .srt = 0x80020000, 195662306a36Sopenharmony_ci .end = 0x80020FFF, 195762306a36Sopenharmony_ci .rd_addr = R_AX_WDE_DBG_FUN_INTF_DATA, 195862306a36Sopenharmony_ci .rd_byte = 4, 195962306a36Sopenharmony_ci .rd_msk = B_AX_WDE_DFI_DATA_MASK 196062306a36Sopenharmony_ci}; 196162306a36Sopenharmony_ci 196262306a36Sopenharmony_cistatic const struct rtw89_mac_dbg_port_info dbg_port_wde_bufmgn_pktinfo = { 196362306a36Sopenharmony_ci .sel_addr = R_AX_WDE_DBG_FUN_INTF_CTL, 196462306a36Sopenharmony_ci .sel_byte = 4, 196562306a36Sopenharmony_ci .sel_msk = B_AX_WDE_DFI_DATA_MASK, 196662306a36Sopenharmony_ci .srt = 0x80030000, 196762306a36Sopenharmony_ci .end = 0x80030FFF, 196862306a36Sopenharmony_ci .rd_addr = R_AX_WDE_DBG_FUN_INTF_DATA, 196962306a36Sopenharmony_ci .rd_byte = 4, 197062306a36Sopenharmony_ci .rd_msk = B_AX_WDE_DFI_DATA_MASK 197162306a36Sopenharmony_ci}; 197262306a36Sopenharmony_ci 197362306a36Sopenharmony_cistatic const struct rtw89_mac_dbg_port_info dbg_port_wde_quemgn_prepkt = { 197462306a36Sopenharmony_ci .sel_addr = R_AX_WDE_DBG_FUN_INTF_CTL, 197562306a36Sopenharmony_ci .sel_byte = 4, 197662306a36Sopenharmony_ci .sel_msk = B_AX_WDE_DFI_DATA_MASK, 197762306a36Sopenharmony_ci .srt = 0x80040000, 197862306a36Sopenharmony_ci .end = 0x80040FFF, 197962306a36Sopenharmony_ci .rd_addr = R_AX_WDE_DBG_FUN_INTF_DATA, 198062306a36Sopenharmony_ci .rd_byte = 4, 198162306a36Sopenharmony_ci .rd_msk = B_AX_WDE_DFI_DATA_MASK 198262306a36Sopenharmony_ci}; 198362306a36Sopenharmony_ci 198462306a36Sopenharmony_cistatic const struct rtw89_mac_dbg_port_info dbg_port_wde_quemgn_nxtpkt = { 198562306a36Sopenharmony_ci .sel_addr = R_AX_WDE_DBG_FUN_INTF_CTL, 198662306a36Sopenharmony_ci .sel_byte = 4, 198762306a36Sopenharmony_ci .sel_msk = B_AX_WDE_DFI_DATA_MASK, 198862306a36Sopenharmony_ci .srt = 0x80050000, 198962306a36Sopenharmony_ci .end = 0x80050FFF, 199062306a36Sopenharmony_ci .rd_addr = R_AX_WDE_DBG_FUN_INTF_DATA, 199162306a36Sopenharmony_ci .rd_byte = 4, 199262306a36Sopenharmony_ci .rd_msk = B_AX_WDE_DFI_DATA_MASK 199362306a36Sopenharmony_ci}; 199462306a36Sopenharmony_ci 199562306a36Sopenharmony_cistatic const struct rtw89_mac_dbg_port_info dbg_port_wde_quemgn_qlnktbl = { 199662306a36Sopenharmony_ci .sel_addr = R_AX_WDE_DBG_FUN_INTF_CTL, 199762306a36Sopenharmony_ci .sel_byte = 4, 199862306a36Sopenharmony_ci .sel_msk = B_AX_WDE_DFI_DATA_MASK, 199962306a36Sopenharmony_ci .srt = 0x80060000, 200062306a36Sopenharmony_ci .end = 0x80060453, 200162306a36Sopenharmony_ci .rd_addr = R_AX_WDE_DBG_FUN_INTF_DATA, 200262306a36Sopenharmony_ci .rd_byte = 4, 200362306a36Sopenharmony_ci .rd_msk = B_AX_WDE_DFI_DATA_MASK 200462306a36Sopenharmony_ci}; 200562306a36Sopenharmony_ci 200662306a36Sopenharmony_cistatic const struct rtw89_mac_dbg_port_info dbg_port_wde_quemgn_qempty = { 200762306a36Sopenharmony_ci .sel_addr = R_AX_WDE_DBG_FUN_INTF_CTL, 200862306a36Sopenharmony_ci .sel_byte = 4, 200962306a36Sopenharmony_ci .sel_msk = B_AX_WDE_DFI_DATA_MASK, 201062306a36Sopenharmony_ci .srt = 0x80070000, 201162306a36Sopenharmony_ci .end = 0x80070011, 201262306a36Sopenharmony_ci .rd_addr = R_AX_WDE_DBG_FUN_INTF_DATA, 201362306a36Sopenharmony_ci .rd_byte = 4, 201462306a36Sopenharmony_ci .rd_msk = B_AX_WDE_DFI_DATA_MASK 201562306a36Sopenharmony_ci}; 201662306a36Sopenharmony_ci 201762306a36Sopenharmony_cistatic const struct rtw89_mac_dbg_port_info dbg_port_ple_bufmgn_freepg = { 201862306a36Sopenharmony_ci .sel_addr = R_AX_PLE_DBG_FUN_INTF_CTL, 201962306a36Sopenharmony_ci .sel_byte = 4, 202062306a36Sopenharmony_ci .sel_msk = B_AX_PLE_DFI_DATA_MASK, 202162306a36Sopenharmony_ci .srt = 0x80000000, 202262306a36Sopenharmony_ci .end = 0x80000001, 202362306a36Sopenharmony_ci .rd_addr = R_AX_PLE_DBG_FUN_INTF_DATA, 202462306a36Sopenharmony_ci .rd_byte = 4, 202562306a36Sopenharmony_ci .rd_msk = B_AX_PLE_DFI_DATA_MASK 202662306a36Sopenharmony_ci}; 202762306a36Sopenharmony_ci 202862306a36Sopenharmony_cistatic const struct rtw89_mac_dbg_port_info dbg_port_ple_bufmgn_quota = { 202962306a36Sopenharmony_ci .sel_addr = R_AX_PLE_DBG_FUN_INTF_CTL, 203062306a36Sopenharmony_ci .sel_byte = 4, 203162306a36Sopenharmony_ci .sel_msk = B_AX_PLE_DFI_DATA_MASK, 203262306a36Sopenharmony_ci .srt = 0x80010000, 203362306a36Sopenharmony_ci .end = 0x8001000A, 203462306a36Sopenharmony_ci .rd_addr = R_AX_PLE_DBG_FUN_INTF_DATA, 203562306a36Sopenharmony_ci .rd_byte = 4, 203662306a36Sopenharmony_ci .rd_msk = B_AX_PLE_DFI_DATA_MASK 203762306a36Sopenharmony_ci}; 203862306a36Sopenharmony_ci 203962306a36Sopenharmony_cistatic const struct rtw89_mac_dbg_port_info dbg_port_ple_bufmgn_pagellt = { 204062306a36Sopenharmony_ci .sel_addr = R_AX_PLE_DBG_FUN_INTF_CTL, 204162306a36Sopenharmony_ci .sel_byte = 4, 204262306a36Sopenharmony_ci .sel_msk = B_AX_PLE_DFI_DATA_MASK, 204362306a36Sopenharmony_ci .srt = 0x80020000, 204462306a36Sopenharmony_ci .end = 0x80020DBF, 204562306a36Sopenharmony_ci .rd_addr = R_AX_PLE_DBG_FUN_INTF_DATA, 204662306a36Sopenharmony_ci .rd_byte = 4, 204762306a36Sopenharmony_ci .rd_msk = B_AX_PLE_DFI_DATA_MASK 204862306a36Sopenharmony_ci}; 204962306a36Sopenharmony_ci 205062306a36Sopenharmony_cistatic const struct rtw89_mac_dbg_port_info dbg_port_ple_bufmgn_pktinfo = { 205162306a36Sopenharmony_ci .sel_addr = R_AX_PLE_DBG_FUN_INTF_CTL, 205262306a36Sopenharmony_ci .sel_byte = 4, 205362306a36Sopenharmony_ci .sel_msk = B_AX_PLE_DFI_DATA_MASK, 205462306a36Sopenharmony_ci .srt = 0x80030000, 205562306a36Sopenharmony_ci .end = 0x80030DBF, 205662306a36Sopenharmony_ci .rd_addr = R_AX_PLE_DBG_FUN_INTF_DATA, 205762306a36Sopenharmony_ci .rd_byte = 4, 205862306a36Sopenharmony_ci .rd_msk = B_AX_PLE_DFI_DATA_MASK 205962306a36Sopenharmony_ci}; 206062306a36Sopenharmony_ci 206162306a36Sopenharmony_cistatic const struct rtw89_mac_dbg_port_info dbg_port_ple_quemgn_prepkt = { 206262306a36Sopenharmony_ci .sel_addr = R_AX_PLE_DBG_FUN_INTF_CTL, 206362306a36Sopenharmony_ci .sel_byte = 4, 206462306a36Sopenharmony_ci .sel_msk = B_AX_PLE_DFI_DATA_MASK, 206562306a36Sopenharmony_ci .srt = 0x80040000, 206662306a36Sopenharmony_ci .end = 0x80040DBF, 206762306a36Sopenharmony_ci .rd_addr = R_AX_PLE_DBG_FUN_INTF_DATA, 206862306a36Sopenharmony_ci .rd_byte = 4, 206962306a36Sopenharmony_ci .rd_msk = B_AX_PLE_DFI_DATA_MASK 207062306a36Sopenharmony_ci}; 207162306a36Sopenharmony_ci 207262306a36Sopenharmony_cistatic const struct rtw89_mac_dbg_port_info dbg_port_ple_quemgn_nxtpkt = { 207362306a36Sopenharmony_ci .sel_addr = R_AX_PLE_DBG_FUN_INTF_CTL, 207462306a36Sopenharmony_ci .sel_byte = 4, 207562306a36Sopenharmony_ci .sel_msk = B_AX_PLE_DFI_DATA_MASK, 207662306a36Sopenharmony_ci .srt = 0x80050000, 207762306a36Sopenharmony_ci .end = 0x80050DBF, 207862306a36Sopenharmony_ci .rd_addr = R_AX_PLE_DBG_FUN_INTF_DATA, 207962306a36Sopenharmony_ci .rd_byte = 4, 208062306a36Sopenharmony_ci .rd_msk = B_AX_PLE_DFI_DATA_MASK 208162306a36Sopenharmony_ci}; 208262306a36Sopenharmony_ci 208362306a36Sopenharmony_cistatic const struct rtw89_mac_dbg_port_info dbg_port_ple_quemgn_qlnktbl = { 208462306a36Sopenharmony_ci .sel_addr = R_AX_PLE_DBG_FUN_INTF_CTL, 208562306a36Sopenharmony_ci .sel_byte = 4, 208662306a36Sopenharmony_ci .sel_msk = B_AX_PLE_DFI_DATA_MASK, 208762306a36Sopenharmony_ci .srt = 0x80060000, 208862306a36Sopenharmony_ci .end = 0x80060041, 208962306a36Sopenharmony_ci .rd_addr = R_AX_PLE_DBG_FUN_INTF_DATA, 209062306a36Sopenharmony_ci .rd_byte = 4, 209162306a36Sopenharmony_ci .rd_msk = B_AX_PLE_DFI_DATA_MASK 209262306a36Sopenharmony_ci}; 209362306a36Sopenharmony_ci 209462306a36Sopenharmony_cistatic const struct rtw89_mac_dbg_port_info dbg_port_ple_quemgn_qempty = { 209562306a36Sopenharmony_ci .sel_addr = R_AX_PLE_DBG_FUN_INTF_CTL, 209662306a36Sopenharmony_ci .sel_byte = 4, 209762306a36Sopenharmony_ci .sel_msk = B_AX_PLE_DFI_DATA_MASK, 209862306a36Sopenharmony_ci .srt = 0x80070000, 209962306a36Sopenharmony_ci .end = 0x80070001, 210062306a36Sopenharmony_ci .rd_addr = R_AX_PLE_DBG_FUN_INTF_DATA, 210162306a36Sopenharmony_ci .rd_byte = 4, 210262306a36Sopenharmony_ci .rd_msk = B_AX_PLE_DFI_DATA_MASK 210362306a36Sopenharmony_ci}; 210462306a36Sopenharmony_ci 210562306a36Sopenharmony_cistatic const struct rtw89_mac_dbg_port_info dbg_port_pktinfo = { 210662306a36Sopenharmony_ci .sel_addr = R_AX_DBG_FUN_INTF_CTL, 210762306a36Sopenharmony_ci .sel_byte = 4, 210862306a36Sopenharmony_ci .sel_msk = B_AX_DFI_DATA_MASK, 210962306a36Sopenharmony_ci .srt = 0x80000000, 211062306a36Sopenharmony_ci .end = 0x8000017f, 211162306a36Sopenharmony_ci .rd_addr = R_AX_DBG_FUN_INTF_DATA, 211262306a36Sopenharmony_ci .rd_byte = 4, 211362306a36Sopenharmony_ci .rd_msk = B_AX_DFI_DATA_MASK 211462306a36Sopenharmony_ci}; 211562306a36Sopenharmony_ci 211662306a36Sopenharmony_cistatic const struct rtw89_mac_dbg_port_info dbg_port_pcie_txdma = { 211762306a36Sopenharmony_ci .sel_addr = R_AX_PCIE_DBG_CTRL, 211862306a36Sopenharmony_ci .sel_byte = 2, 211962306a36Sopenharmony_ci .sel_msk = B_AX_PCIE_DBG_SEL_MASK, 212062306a36Sopenharmony_ci .srt = 0x00, 212162306a36Sopenharmony_ci .end = 0x03, 212262306a36Sopenharmony_ci .rd_addr = R_AX_DBG_PORT_SEL, 212362306a36Sopenharmony_ci .rd_byte = 4, 212462306a36Sopenharmony_ci .rd_msk = B_AX_DEBUG_ST_MASK 212562306a36Sopenharmony_ci}; 212662306a36Sopenharmony_ci 212762306a36Sopenharmony_cistatic const struct rtw89_mac_dbg_port_info dbg_port_pcie_rxdma = { 212862306a36Sopenharmony_ci .sel_addr = R_AX_PCIE_DBG_CTRL, 212962306a36Sopenharmony_ci .sel_byte = 2, 213062306a36Sopenharmony_ci .sel_msk = B_AX_PCIE_DBG_SEL_MASK, 213162306a36Sopenharmony_ci .srt = 0x00, 213262306a36Sopenharmony_ci .end = 0x04, 213362306a36Sopenharmony_ci .rd_addr = R_AX_DBG_PORT_SEL, 213462306a36Sopenharmony_ci .rd_byte = 4, 213562306a36Sopenharmony_ci .rd_msk = B_AX_DEBUG_ST_MASK 213662306a36Sopenharmony_ci}; 213762306a36Sopenharmony_ci 213862306a36Sopenharmony_cistatic const struct rtw89_mac_dbg_port_info dbg_port_pcie_cvt = { 213962306a36Sopenharmony_ci .sel_addr = R_AX_PCIE_DBG_CTRL, 214062306a36Sopenharmony_ci .sel_byte = 2, 214162306a36Sopenharmony_ci .sel_msk = B_AX_PCIE_DBG_SEL_MASK, 214262306a36Sopenharmony_ci .srt = 0x00, 214362306a36Sopenharmony_ci .end = 0x01, 214462306a36Sopenharmony_ci .rd_addr = R_AX_DBG_PORT_SEL, 214562306a36Sopenharmony_ci .rd_byte = 4, 214662306a36Sopenharmony_ci .rd_msk = B_AX_DEBUG_ST_MASK 214762306a36Sopenharmony_ci}; 214862306a36Sopenharmony_ci 214962306a36Sopenharmony_cistatic const struct rtw89_mac_dbg_port_info dbg_port_pcie_cxpl = { 215062306a36Sopenharmony_ci .sel_addr = R_AX_PCIE_DBG_CTRL, 215162306a36Sopenharmony_ci .sel_byte = 2, 215262306a36Sopenharmony_ci .sel_msk = B_AX_PCIE_DBG_SEL_MASK, 215362306a36Sopenharmony_ci .srt = 0x00, 215462306a36Sopenharmony_ci .end = 0x05, 215562306a36Sopenharmony_ci .rd_addr = R_AX_DBG_PORT_SEL, 215662306a36Sopenharmony_ci .rd_byte = 4, 215762306a36Sopenharmony_ci .rd_msk = B_AX_DEBUG_ST_MASK 215862306a36Sopenharmony_ci}; 215962306a36Sopenharmony_ci 216062306a36Sopenharmony_cistatic const struct rtw89_mac_dbg_port_info dbg_port_pcie_io = { 216162306a36Sopenharmony_ci .sel_addr = R_AX_PCIE_DBG_CTRL, 216262306a36Sopenharmony_ci .sel_byte = 2, 216362306a36Sopenharmony_ci .sel_msk = B_AX_PCIE_DBG_SEL_MASK, 216462306a36Sopenharmony_ci .srt = 0x00, 216562306a36Sopenharmony_ci .end = 0x05, 216662306a36Sopenharmony_ci .rd_addr = R_AX_DBG_PORT_SEL, 216762306a36Sopenharmony_ci .rd_byte = 4, 216862306a36Sopenharmony_ci .rd_msk = B_AX_DEBUG_ST_MASK 216962306a36Sopenharmony_ci}; 217062306a36Sopenharmony_ci 217162306a36Sopenharmony_cistatic const struct rtw89_mac_dbg_port_info dbg_port_pcie_misc = { 217262306a36Sopenharmony_ci .sel_addr = R_AX_PCIE_DBG_CTRL, 217362306a36Sopenharmony_ci .sel_byte = 2, 217462306a36Sopenharmony_ci .sel_msk = B_AX_PCIE_DBG_SEL_MASK, 217562306a36Sopenharmony_ci .srt = 0x00, 217662306a36Sopenharmony_ci .end = 0x06, 217762306a36Sopenharmony_ci .rd_addr = R_AX_DBG_PORT_SEL, 217862306a36Sopenharmony_ci .rd_byte = 4, 217962306a36Sopenharmony_ci .rd_msk = B_AX_DEBUG_ST_MASK 218062306a36Sopenharmony_ci}; 218162306a36Sopenharmony_ci 218262306a36Sopenharmony_cistatic const struct rtw89_mac_dbg_port_info dbg_port_pcie_misc2 = { 218362306a36Sopenharmony_ci .sel_addr = R_AX_DBG_CTRL, 218462306a36Sopenharmony_ci .sel_byte = 1, 218562306a36Sopenharmony_ci .sel_msk = B_AX_DBG_SEL0, 218662306a36Sopenharmony_ci .srt = 0x34, 218762306a36Sopenharmony_ci .end = 0x3C, 218862306a36Sopenharmony_ci .rd_addr = R_AX_DBG_PORT_SEL, 218962306a36Sopenharmony_ci .rd_byte = 4, 219062306a36Sopenharmony_ci .rd_msk = B_AX_DEBUG_ST_MASK 219162306a36Sopenharmony_ci}; 219262306a36Sopenharmony_ci 219362306a36Sopenharmony_cistatic const struct rtw89_mac_dbg_port_info * 219462306a36Sopenharmony_cirtw89_debug_mac_dbg_port_sel(struct seq_file *m, 219562306a36Sopenharmony_ci struct rtw89_dev *rtwdev, u32 sel) 219662306a36Sopenharmony_ci{ 219762306a36Sopenharmony_ci const struct rtw89_mac_dbg_port_info *info; 219862306a36Sopenharmony_ci u32 index; 219962306a36Sopenharmony_ci u32 val32; 220062306a36Sopenharmony_ci u16 val16; 220162306a36Sopenharmony_ci u8 val8; 220262306a36Sopenharmony_ci 220362306a36Sopenharmony_ci switch (sel) { 220462306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_PTCL_C0: 220562306a36Sopenharmony_ci info = &dbg_port_ptcl_c0; 220662306a36Sopenharmony_ci val16 = rtw89_read16(rtwdev, R_AX_PTCL_DBG); 220762306a36Sopenharmony_ci val16 |= B_AX_PTCL_DBG_EN; 220862306a36Sopenharmony_ci rtw89_write16(rtwdev, R_AX_PTCL_DBG, val16); 220962306a36Sopenharmony_ci seq_puts(m, "Enable PTCL C0 dbgport.\n"); 221062306a36Sopenharmony_ci break; 221162306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_PTCL_C1: 221262306a36Sopenharmony_ci info = &dbg_port_ptcl_c1; 221362306a36Sopenharmony_ci val16 = rtw89_read16(rtwdev, R_AX_PTCL_DBG_C1); 221462306a36Sopenharmony_ci val16 |= B_AX_PTCL_DBG_EN; 221562306a36Sopenharmony_ci rtw89_write16(rtwdev, R_AX_PTCL_DBG_C1, val16); 221662306a36Sopenharmony_ci seq_puts(m, "Enable PTCL C1 dbgport.\n"); 221762306a36Sopenharmony_ci break; 221862306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_SCH_C0: 221962306a36Sopenharmony_ci info = &dbg_port_sch_c0; 222062306a36Sopenharmony_ci val32 = rtw89_read32(rtwdev, R_AX_SCH_DBG_SEL); 222162306a36Sopenharmony_ci val32 |= B_AX_SCH_DBG_EN; 222262306a36Sopenharmony_ci rtw89_write32(rtwdev, R_AX_SCH_DBG_SEL, val32); 222362306a36Sopenharmony_ci seq_puts(m, "Enable SCH C0 dbgport.\n"); 222462306a36Sopenharmony_ci break; 222562306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_SCH_C1: 222662306a36Sopenharmony_ci info = &dbg_port_sch_c1; 222762306a36Sopenharmony_ci val32 = rtw89_read32(rtwdev, R_AX_SCH_DBG_SEL_C1); 222862306a36Sopenharmony_ci val32 |= B_AX_SCH_DBG_EN; 222962306a36Sopenharmony_ci rtw89_write32(rtwdev, R_AX_SCH_DBG_SEL_C1, val32); 223062306a36Sopenharmony_ci seq_puts(m, "Enable SCH C1 dbgport.\n"); 223162306a36Sopenharmony_ci break; 223262306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_TMAC_C0: 223362306a36Sopenharmony_ci info = &dbg_port_tmac_c0; 223462306a36Sopenharmony_ci val32 = rtw89_read32(rtwdev, R_AX_DBGSEL_TRXPTCL); 223562306a36Sopenharmony_ci val32 = u32_replace_bits(val32, TRXPTRL_DBG_SEL_TMAC, 223662306a36Sopenharmony_ci B_AX_DBGSEL_TRXPTCL_MASK); 223762306a36Sopenharmony_ci rtw89_write32(rtwdev, R_AX_DBGSEL_TRXPTCL, val32); 223862306a36Sopenharmony_ci 223962306a36Sopenharmony_ci val32 = rtw89_read32(rtwdev, R_AX_DBG_CTRL); 224062306a36Sopenharmony_ci val32 = u32_replace_bits(val32, TMAC_DBG_SEL_C0, B_AX_DBG_SEL0); 224162306a36Sopenharmony_ci val32 = u32_replace_bits(val32, TMAC_DBG_SEL_C0, B_AX_DBG_SEL1); 224262306a36Sopenharmony_ci rtw89_write32(rtwdev, R_AX_DBG_CTRL, val32); 224362306a36Sopenharmony_ci 224462306a36Sopenharmony_ci val32 = rtw89_read32(rtwdev, R_AX_SYS_STATUS1); 224562306a36Sopenharmony_ci val32 = u32_replace_bits(val32, MAC_DBG_SEL, B_AX_SEL_0XC0_MASK); 224662306a36Sopenharmony_ci rtw89_write32(rtwdev, R_AX_SYS_STATUS1, val32); 224762306a36Sopenharmony_ci seq_puts(m, "Enable TMAC C0 dbgport.\n"); 224862306a36Sopenharmony_ci break; 224962306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_TMAC_C1: 225062306a36Sopenharmony_ci info = &dbg_port_tmac_c1; 225162306a36Sopenharmony_ci val32 = rtw89_read32(rtwdev, R_AX_DBGSEL_TRXPTCL_C1); 225262306a36Sopenharmony_ci val32 = u32_replace_bits(val32, TRXPTRL_DBG_SEL_TMAC, 225362306a36Sopenharmony_ci B_AX_DBGSEL_TRXPTCL_MASK); 225462306a36Sopenharmony_ci rtw89_write32(rtwdev, R_AX_DBGSEL_TRXPTCL_C1, val32); 225562306a36Sopenharmony_ci 225662306a36Sopenharmony_ci val32 = rtw89_read32(rtwdev, R_AX_DBG_CTRL); 225762306a36Sopenharmony_ci val32 = u32_replace_bits(val32, TMAC_DBG_SEL_C1, B_AX_DBG_SEL0); 225862306a36Sopenharmony_ci val32 = u32_replace_bits(val32, TMAC_DBG_SEL_C1, B_AX_DBG_SEL1); 225962306a36Sopenharmony_ci rtw89_write32(rtwdev, R_AX_DBG_CTRL, val32); 226062306a36Sopenharmony_ci 226162306a36Sopenharmony_ci val32 = rtw89_read32(rtwdev, R_AX_SYS_STATUS1); 226262306a36Sopenharmony_ci val32 = u32_replace_bits(val32, MAC_DBG_SEL, B_AX_SEL_0XC0_MASK); 226362306a36Sopenharmony_ci rtw89_write32(rtwdev, R_AX_SYS_STATUS1, val32); 226462306a36Sopenharmony_ci seq_puts(m, "Enable TMAC C1 dbgport.\n"); 226562306a36Sopenharmony_ci break; 226662306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_RMAC_C0: 226762306a36Sopenharmony_ci info = &dbg_port_rmac_c0; 226862306a36Sopenharmony_ci val32 = rtw89_read32(rtwdev, R_AX_DBGSEL_TRXPTCL); 226962306a36Sopenharmony_ci val32 = u32_replace_bits(val32, TRXPTRL_DBG_SEL_RMAC, 227062306a36Sopenharmony_ci B_AX_DBGSEL_TRXPTCL_MASK); 227162306a36Sopenharmony_ci rtw89_write32(rtwdev, R_AX_DBGSEL_TRXPTCL, val32); 227262306a36Sopenharmony_ci 227362306a36Sopenharmony_ci val32 = rtw89_read32(rtwdev, R_AX_DBG_CTRL); 227462306a36Sopenharmony_ci val32 = u32_replace_bits(val32, RMAC_DBG_SEL_C0, B_AX_DBG_SEL0); 227562306a36Sopenharmony_ci val32 = u32_replace_bits(val32, RMAC_DBG_SEL_C0, B_AX_DBG_SEL1); 227662306a36Sopenharmony_ci rtw89_write32(rtwdev, R_AX_DBG_CTRL, val32); 227762306a36Sopenharmony_ci 227862306a36Sopenharmony_ci val32 = rtw89_read32(rtwdev, R_AX_SYS_STATUS1); 227962306a36Sopenharmony_ci val32 = u32_replace_bits(val32, MAC_DBG_SEL, B_AX_SEL_0XC0_MASK); 228062306a36Sopenharmony_ci rtw89_write32(rtwdev, R_AX_SYS_STATUS1, val32); 228162306a36Sopenharmony_ci 228262306a36Sopenharmony_ci val8 = rtw89_read8(rtwdev, R_AX_DBGSEL_TRXPTCL); 228362306a36Sopenharmony_ci val8 = u8_replace_bits(val8, RMAC_CMAC_DBG_SEL, 228462306a36Sopenharmony_ci B_AX_DBGSEL_TRXPTCL_MASK); 228562306a36Sopenharmony_ci rtw89_write8(rtwdev, R_AX_DBGSEL_TRXPTCL, val8); 228662306a36Sopenharmony_ci seq_puts(m, "Enable RMAC C0 dbgport.\n"); 228762306a36Sopenharmony_ci break; 228862306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_RMAC_C1: 228962306a36Sopenharmony_ci info = &dbg_port_rmac_c1; 229062306a36Sopenharmony_ci val32 = rtw89_read32(rtwdev, R_AX_DBGSEL_TRXPTCL_C1); 229162306a36Sopenharmony_ci val32 = u32_replace_bits(val32, TRXPTRL_DBG_SEL_RMAC, 229262306a36Sopenharmony_ci B_AX_DBGSEL_TRXPTCL_MASK); 229362306a36Sopenharmony_ci rtw89_write32(rtwdev, R_AX_DBGSEL_TRXPTCL_C1, val32); 229462306a36Sopenharmony_ci 229562306a36Sopenharmony_ci val32 = rtw89_read32(rtwdev, R_AX_DBG_CTRL); 229662306a36Sopenharmony_ci val32 = u32_replace_bits(val32, RMAC_DBG_SEL_C1, B_AX_DBG_SEL0); 229762306a36Sopenharmony_ci val32 = u32_replace_bits(val32, RMAC_DBG_SEL_C1, B_AX_DBG_SEL1); 229862306a36Sopenharmony_ci rtw89_write32(rtwdev, R_AX_DBG_CTRL, val32); 229962306a36Sopenharmony_ci 230062306a36Sopenharmony_ci val32 = rtw89_read32(rtwdev, R_AX_SYS_STATUS1); 230162306a36Sopenharmony_ci val32 = u32_replace_bits(val32, MAC_DBG_SEL, B_AX_SEL_0XC0_MASK); 230262306a36Sopenharmony_ci rtw89_write32(rtwdev, R_AX_SYS_STATUS1, val32); 230362306a36Sopenharmony_ci 230462306a36Sopenharmony_ci val8 = rtw89_read8(rtwdev, R_AX_DBGSEL_TRXPTCL_C1); 230562306a36Sopenharmony_ci val8 = u8_replace_bits(val8, RMAC_CMAC_DBG_SEL, 230662306a36Sopenharmony_ci B_AX_DBGSEL_TRXPTCL_MASK); 230762306a36Sopenharmony_ci rtw89_write8(rtwdev, R_AX_DBGSEL_TRXPTCL_C1, val8); 230862306a36Sopenharmony_ci seq_puts(m, "Enable RMAC C1 dbgport.\n"); 230962306a36Sopenharmony_ci break; 231062306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_RMACST_C0: 231162306a36Sopenharmony_ci info = &dbg_port_rmacst_c0; 231262306a36Sopenharmony_ci seq_puts(m, "Enable RMAC state C0 dbgport.\n"); 231362306a36Sopenharmony_ci break; 231462306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_RMACST_C1: 231562306a36Sopenharmony_ci info = &dbg_port_rmacst_c1; 231662306a36Sopenharmony_ci seq_puts(m, "Enable RMAC state C1 dbgport.\n"); 231762306a36Sopenharmony_ci break; 231862306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_RMAC_PLCP_C0: 231962306a36Sopenharmony_ci info = &dbg_port_rmac_plcp_c0; 232062306a36Sopenharmony_ci seq_puts(m, "Enable RMAC PLCP C0 dbgport.\n"); 232162306a36Sopenharmony_ci break; 232262306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_RMAC_PLCP_C1: 232362306a36Sopenharmony_ci info = &dbg_port_rmac_plcp_c1; 232462306a36Sopenharmony_ci seq_puts(m, "Enable RMAC PLCP C1 dbgport.\n"); 232562306a36Sopenharmony_ci break; 232662306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_TRXPTCL_C0: 232762306a36Sopenharmony_ci info = &dbg_port_trxptcl_c0; 232862306a36Sopenharmony_ci val32 = rtw89_read32(rtwdev, R_AX_DBG_CTRL); 232962306a36Sopenharmony_ci val32 = u32_replace_bits(val32, TRXPTCL_DBG_SEL_C0, B_AX_DBG_SEL0); 233062306a36Sopenharmony_ci val32 = u32_replace_bits(val32, TRXPTCL_DBG_SEL_C0, B_AX_DBG_SEL1); 233162306a36Sopenharmony_ci rtw89_write32(rtwdev, R_AX_DBG_CTRL, val32); 233262306a36Sopenharmony_ci 233362306a36Sopenharmony_ci val32 = rtw89_read32(rtwdev, R_AX_SYS_STATUS1); 233462306a36Sopenharmony_ci val32 = u32_replace_bits(val32, MAC_DBG_SEL, B_AX_SEL_0XC0_MASK); 233562306a36Sopenharmony_ci rtw89_write32(rtwdev, R_AX_SYS_STATUS1, val32); 233662306a36Sopenharmony_ci seq_puts(m, "Enable TRXPTCL C0 dbgport.\n"); 233762306a36Sopenharmony_ci break; 233862306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_TRXPTCL_C1: 233962306a36Sopenharmony_ci info = &dbg_port_trxptcl_c1; 234062306a36Sopenharmony_ci val32 = rtw89_read32(rtwdev, R_AX_DBG_CTRL); 234162306a36Sopenharmony_ci val32 = u32_replace_bits(val32, TRXPTCL_DBG_SEL_C1, B_AX_DBG_SEL0); 234262306a36Sopenharmony_ci val32 = u32_replace_bits(val32, TRXPTCL_DBG_SEL_C1, B_AX_DBG_SEL1); 234362306a36Sopenharmony_ci rtw89_write32(rtwdev, R_AX_DBG_CTRL, val32); 234462306a36Sopenharmony_ci 234562306a36Sopenharmony_ci val32 = rtw89_read32(rtwdev, R_AX_SYS_STATUS1); 234662306a36Sopenharmony_ci val32 = u32_replace_bits(val32, MAC_DBG_SEL, B_AX_SEL_0XC0_MASK); 234762306a36Sopenharmony_ci rtw89_write32(rtwdev, R_AX_SYS_STATUS1, val32); 234862306a36Sopenharmony_ci seq_puts(m, "Enable TRXPTCL C1 dbgport.\n"); 234962306a36Sopenharmony_ci break; 235062306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_TX_INFOL_C0: 235162306a36Sopenharmony_ci info = &dbg_port_tx_infol_c0; 235262306a36Sopenharmony_ci val32 = rtw89_read32(rtwdev, R_AX_TCR1); 235362306a36Sopenharmony_ci val32 |= B_AX_TCR_FORCE_READ_TXDFIFO; 235462306a36Sopenharmony_ci rtw89_write32(rtwdev, R_AX_TCR1, val32); 235562306a36Sopenharmony_ci seq_puts(m, "Enable tx infol dump.\n"); 235662306a36Sopenharmony_ci break; 235762306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_TX_INFOH_C0: 235862306a36Sopenharmony_ci info = &dbg_port_tx_infoh_c0; 235962306a36Sopenharmony_ci val32 = rtw89_read32(rtwdev, R_AX_TCR1); 236062306a36Sopenharmony_ci val32 |= B_AX_TCR_FORCE_READ_TXDFIFO; 236162306a36Sopenharmony_ci rtw89_write32(rtwdev, R_AX_TCR1, val32); 236262306a36Sopenharmony_ci seq_puts(m, "Enable tx infoh dump.\n"); 236362306a36Sopenharmony_ci break; 236462306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_TX_INFOL_C1: 236562306a36Sopenharmony_ci info = &dbg_port_tx_infol_c1; 236662306a36Sopenharmony_ci val32 = rtw89_read32(rtwdev, R_AX_TCR1_C1); 236762306a36Sopenharmony_ci val32 |= B_AX_TCR_FORCE_READ_TXDFIFO; 236862306a36Sopenharmony_ci rtw89_write32(rtwdev, R_AX_TCR1_C1, val32); 236962306a36Sopenharmony_ci seq_puts(m, "Enable tx infol dump.\n"); 237062306a36Sopenharmony_ci break; 237162306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_TX_INFOH_C1: 237262306a36Sopenharmony_ci info = &dbg_port_tx_infoh_c1; 237362306a36Sopenharmony_ci val32 = rtw89_read32(rtwdev, R_AX_TCR1_C1); 237462306a36Sopenharmony_ci val32 |= B_AX_TCR_FORCE_READ_TXDFIFO; 237562306a36Sopenharmony_ci rtw89_write32(rtwdev, R_AX_TCR1_C1, val32); 237662306a36Sopenharmony_ci seq_puts(m, "Enable tx infoh dump.\n"); 237762306a36Sopenharmony_ci break; 237862306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_TXTF_INFOL_C0: 237962306a36Sopenharmony_ci info = &dbg_port_txtf_infol_c0; 238062306a36Sopenharmony_ci val32 = rtw89_read32(rtwdev, R_AX_TCR1); 238162306a36Sopenharmony_ci val32 |= B_AX_TCR_FORCE_READ_TXDFIFO; 238262306a36Sopenharmony_ci rtw89_write32(rtwdev, R_AX_TCR1, val32); 238362306a36Sopenharmony_ci seq_puts(m, "Enable tx tf infol dump.\n"); 238462306a36Sopenharmony_ci break; 238562306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_TXTF_INFOH_C0: 238662306a36Sopenharmony_ci info = &dbg_port_txtf_infoh_c0; 238762306a36Sopenharmony_ci val32 = rtw89_read32(rtwdev, R_AX_TCR1); 238862306a36Sopenharmony_ci val32 |= B_AX_TCR_FORCE_READ_TXDFIFO; 238962306a36Sopenharmony_ci rtw89_write32(rtwdev, R_AX_TCR1, val32); 239062306a36Sopenharmony_ci seq_puts(m, "Enable tx tf infoh dump.\n"); 239162306a36Sopenharmony_ci break; 239262306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_TXTF_INFOL_C1: 239362306a36Sopenharmony_ci info = &dbg_port_txtf_infol_c1; 239462306a36Sopenharmony_ci val32 = rtw89_read32(rtwdev, R_AX_TCR1_C1); 239562306a36Sopenharmony_ci val32 |= B_AX_TCR_FORCE_READ_TXDFIFO; 239662306a36Sopenharmony_ci rtw89_write32(rtwdev, R_AX_TCR1_C1, val32); 239762306a36Sopenharmony_ci seq_puts(m, "Enable tx tf infol dump.\n"); 239862306a36Sopenharmony_ci break; 239962306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_TXTF_INFOH_C1: 240062306a36Sopenharmony_ci info = &dbg_port_txtf_infoh_c1; 240162306a36Sopenharmony_ci val32 = rtw89_read32(rtwdev, R_AX_TCR1_C1); 240262306a36Sopenharmony_ci val32 |= B_AX_TCR_FORCE_READ_TXDFIFO; 240362306a36Sopenharmony_ci rtw89_write32(rtwdev, R_AX_TCR1_C1, val32); 240462306a36Sopenharmony_ci seq_puts(m, "Enable tx tf infoh dump.\n"); 240562306a36Sopenharmony_ci break; 240662306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_WDE_BUFMGN_FREEPG: 240762306a36Sopenharmony_ci info = &dbg_port_wde_bufmgn_freepg; 240862306a36Sopenharmony_ci seq_puts(m, "Enable wde bufmgn freepg dump.\n"); 240962306a36Sopenharmony_ci break; 241062306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_WDE_BUFMGN_QUOTA: 241162306a36Sopenharmony_ci info = &dbg_port_wde_bufmgn_quota; 241262306a36Sopenharmony_ci seq_puts(m, "Enable wde bufmgn quota dump.\n"); 241362306a36Sopenharmony_ci break; 241462306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_WDE_BUFMGN_PAGELLT: 241562306a36Sopenharmony_ci info = &dbg_port_wde_bufmgn_pagellt; 241662306a36Sopenharmony_ci seq_puts(m, "Enable wde bufmgn pagellt dump.\n"); 241762306a36Sopenharmony_ci break; 241862306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_WDE_BUFMGN_PKTINFO: 241962306a36Sopenharmony_ci info = &dbg_port_wde_bufmgn_pktinfo; 242062306a36Sopenharmony_ci seq_puts(m, "Enable wde bufmgn pktinfo dump.\n"); 242162306a36Sopenharmony_ci break; 242262306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_WDE_QUEMGN_PREPKT: 242362306a36Sopenharmony_ci info = &dbg_port_wde_quemgn_prepkt; 242462306a36Sopenharmony_ci seq_puts(m, "Enable wde quemgn prepkt dump.\n"); 242562306a36Sopenharmony_ci break; 242662306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_WDE_QUEMGN_NXTPKT: 242762306a36Sopenharmony_ci info = &dbg_port_wde_quemgn_nxtpkt; 242862306a36Sopenharmony_ci seq_puts(m, "Enable wde quemgn nxtpkt dump.\n"); 242962306a36Sopenharmony_ci break; 243062306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_WDE_QUEMGN_QLNKTBL: 243162306a36Sopenharmony_ci info = &dbg_port_wde_quemgn_qlnktbl; 243262306a36Sopenharmony_ci seq_puts(m, "Enable wde quemgn qlnktbl dump.\n"); 243362306a36Sopenharmony_ci break; 243462306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_WDE_QUEMGN_QEMPTY: 243562306a36Sopenharmony_ci info = &dbg_port_wde_quemgn_qempty; 243662306a36Sopenharmony_ci seq_puts(m, "Enable wde quemgn qempty dump.\n"); 243762306a36Sopenharmony_ci break; 243862306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_PLE_BUFMGN_FREEPG: 243962306a36Sopenharmony_ci info = &dbg_port_ple_bufmgn_freepg; 244062306a36Sopenharmony_ci seq_puts(m, "Enable ple bufmgn freepg dump.\n"); 244162306a36Sopenharmony_ci break; 244262306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_PLE_BUFMGN_QUOTA: 244362306a36Sopenharmony_ci info = &dbg_port_ple_bufmgn_quota; 244462306a36Sopenharmony_ci seq_puts(m, "Enable ple bufmgn quota dump.\n"); 244562306a36Sopenharmony_ci break; 244662306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_PLE_BUFMGN_PAGELLT: 244762306a36Sopenharmony_ci info = &dbg_port_ple_bufmgn_pagellt; 244862306a36Sopenharmony_ci seq_puts(m, "Enable ple bufmgn pagellt dump.\n"); 244962306a36Sopenharmony_ci break; 245062306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_PLE_BUFMGN_PKTINFO: 245162306a36Sopenharmony_ci info = &dbg_port_ple_bufmgn_pktinfo; 245262306a36Sopenharmony_ci seq_puts(m, "Enable ple bufmgn pktinfo dump.\n"); 245362306a36Sopenharmony_ci break; 245462306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_PLE_QUEMGN_PREPKT: 245562306a36Sopenharmony_ci info = &dbg_port_ple_quemgn_prepkt; 245662306a36Sopenharmony_ci seq_puts(m, "Enable ple quemgn prepkt dump.\n"); 245762306a36Sopenharmony_ci break; 245862306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_PLE_QUEMGN_NXTPKT: 245962306a36Sopenharmony_ci info = &dbg_port_ple_quemgn_nxtpkt; 246062306a36Sopenharmony_ci seq_puts(m, "Enable ple quemgn nxtpkt dump.\n"); 246162306a36Sopenharmony_ci break; 246262306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_PLE_QUEMGN_QLNKTBL: 246362306a36Sopenharmony_ci info = &dbg_port_ple_quemgn_qlnktbl; 246462306a36Sopenharmony_ci seq_puts(m, "Enable ple quemgn qlnktbl dump.\n"); 246562306a36Sopenharmony_ci break; 246662306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_PLE_QUEMGN_QEMPTY: 246762306a36Sopenharmony_ci info = &dbg_port_ple_quemgn_qempty; 246862306a36Sopenharmony_ci seq_puts(m, "Enable ple quemgn qempty dump.\n"); 246962306a36Sopenharmony_ci break; 247062306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_PKTINFO: 247162306a36Sopenharmony_ci info = &dbg_port_pktinfo; 247262306a36Sopenharmony_ci seq_puts(m, "Enable pktinfo dump.\n"); 247362306a36Sopenharmony_ci break; 247462306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_DSPT_HDT_TX0: 247562306a36Sopenharmony_ci rtw89_write32_mask(rtwdev, R_AX_DBG_CTRL, 247662306a36Sopenharmony_ci B_AX_DBG_SEL0, 0x80); 247762306a36Sopenharmony_ci rtw89_write32_mask(rtwdev, R_AX_SYS_STATUS1, 247862306a36Sopenharmony_ci B_AX_SEL_0XC0_MASK, 1); 247962306a36Sopenharmony_ci fallthrough; 248062306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_DSPT_HDT_TX1: 248162306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_DSPT_HDT_TX2: 248262306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_DSPT_HDT_TX3: 248362306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_DSPT_HDT_TX4: 248462306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_DSPT_HDT_TX5: 248562306a36Sopenharmony_ci info = &dbg_port_dspt_hdt_tx0_5; 248662306a36Sopenharmony_ci index = sel - RTW89_DBG_PORT_SEL_DSPT_HDT_TX0; 248762306a36Sopenharmony_ci rtw89_write16_mask(rtwdev, info->sel_addr, 248862306a36Sopenharmony_ci B_AX_DISPATCHER_INTN_SEL_MASK, 0); 248962306a36Sopenharmony_ci rtw89_write16_mask(rtwdev, info->sel_addr, 249062306a36Sopenharmony_ci B_AX_DISPATCHER_CH_SEL_MASK, index); 249162306a36Sopenharmony_ci seq_printf(m, "Enable Dispatcher hdt tx%x dump.\n", index); 249262306a36Sopenharmony_ci break; 249362306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_DSPT_HDT_TX6: 249462306a36Sopenharmony_ci info = &dbg_port_dspt_hdt_tx6; 249562306a36Sopenharmony_ci rtw89_write16_mask(rtwdev, info->sel_addr, 249662306a36Sopenharmony_ci B_AX_DISPATCHER_INTN_SEL_MASK, 0); 249762306a36Sopenharmony_ci rtw89_write16_mask(rtwdev, info->sel_addr, 249862306a36Sopenharmony_ci B_AX_DISPATCHER_CH_SEL_MASK, 6); 249962306a36Sopenharmony_ci seq_puts(m, "Enable Dispatcher hdt tx6 dump.\n"); 250062306a36Sopenharmony_ci break; 250162306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_DSPT_HDT_TX7: 250262306a36Sopenharmony_ci info = &dbg_port_dspt_hdt_tx7; 250362306a36Sopenharmony_ci rtw89_write16_mask(rtwdev, info->sel_addr, 250462306a36Sopenharmony_ci B_AX_DISPATCHER_INTN_SEL_MASK, 0); 250562306a36Sopenharmony_ci rtw89_write16_mask(rtwdev, info->sel_addr, 250662306a36Sopenharmony_ci B_AX_DISPATCHER_CH_SEL_MASK, 7); 250762306a36Sopenharmony_ci seq_puts(m, "Enable Dispatcher hdt tx7 dump.\n"); 250862306a36Sopenharmony_ci break; 250962306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_DSPT_HDT_TX8: 251062306a36Sopenharmony_ci info = &dbg_port_dspt_hdt_tx8; 251162306a36Sopenharmony_ci rtw89_write16_mask(rtwdev, info->sel_addr, 251262306a36Sopenharmony_ci B_AX_DISPATCHER_INTN_SEL_MASK, 0); 251362306a36Sopenharmony_ci rtw89_write16_mask(rtwdev, info->sel_addr, 251462306a36Sopenharmony_ci B_AX_DISPATCHER_CH_SEL_MASK, 8); 251562306a36Sopenharmony_ci seq_puts(m, "Enable Dispatcher hdt tx8 dump.\n"); 251662306a36Sopenharmony_ci break; 251762306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_DSPT_HDT_TX9: 251862306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_DSPT_HDT_TXA: 251962306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_DSPT_HDT_TXB: 252062306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_DSPT_HDT_TXC: 252162306a36Sopenharmony_ci info = &dbg_port_dspt_hdt_tx9_C; 252262306a36Sopenharmony_ci index = sel + 9 - RTW89_DBG_PORT_SEL_DSPT_HDT_TX9; 252362306a36Sopenharmony_ci rtw89_write16_mask(rtwdev, info->sel_addr, 252462306a36Sopenharmony_ci B_AX_DISPATCHER_INTN_SEL_MASK, 0); 252562306a36Sopenharmony_ci rtw89_write16_mask(rtwdev, info->sel_addr, 252662306a36Sopenharmony_ci B_AX_DISPATCHER_CH_SEL_MASK, index); 252762306a36Sopenharmony_ci seq_printf(m, "Enable Dispatcher hdt tx%x dump.\n", index); 252862306a36Sopenharmony_ci break; 252962306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_DSPT_HDT_TXD: 253062306a36Sopenharmony_ci info = &dbg_port_dspt_hdt_txD; 253162306a36Sopenharmony_ci rtw89_write16_mask(rtwdev, info->sel_addr, 253262306a36Sopenharmony_ci B_AX_DISPATCHER_INTN_SEL_MASK, 0); 253362306a36Sopenharmony_ci rtw89_write16_mask(rtwdev, info->sel_addr, 253462306a36Sopenharmony_ci B_AX_DISPATCHER_CH_SEL_MASK, 0xD); 253562306a36Sopenharmony_ci seq_puts(m, "Enable Dispatcher hdt txD dump.\n"); 253662306a36Sopenharmony_ci break; 253762306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_DSPT_CDT_TX0: 253862306a36Sopenharmony_ci info = &dbg_port_dspt_cdt_tx0; 253962306a36Sopenharmony_ci rtw89_write16_mask(rtwdev, info->sel_addr, 254062306a36Sopenharmony_ci B_AX_DISPATCHER_INTN_SEL_MASK, 1); 254162306a36Sopenharmony_ci rtw89_write16_mask(rtwdev, info->sel_addr, 254262306a36Sopenharmony_ci B_AX_DISPATCHER_CH_SEL_MASK, 0); 254362306a36Sopenharmony_ci seq_puts(m, "Enable Dispatcher cdt tx0 dump.\n"); 254462306a36Sopenharmony_ci break; 254562306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_DSPT_CDT_TX1: 254662306a36Sopenharmony_ci info = &dbg_port_dspt_cdt_tx1; 254762306a36Sopenharmony_ci rtw89_write16_mask(rtwdev, info->sel_addr, 254862306a36Sopenharmony_ci B_AX_DISPATCHER_INTN_SEL_MASK, 1); 254962306a36Sopenharmony_ci rtw89_write16_mask(rtwdev, info->sel_addr, 255062306a36Sopenharmony_ci B_AX_DISPATCHER_CH_SEL_MASK, 1); 255162306a36Sopenharmony_ci seq_puts(m, "Enable Dispatcher cdt tx1 dump.\n"); 255262306a36Sopenharmony_ci break; 255362306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_DSPT_CDT_TX3: 255462306a36Sopenharmony_ci info = &dbg_port_dspt_cdt_tx3; 255562306a36Sopenharmony_ci rtw89_write16_mask(rtwdev, info->sel_addr, 255662306a36Sopenharmony_ci B_AX_DISPATCHER_INTN_SEL_MASK, 1); 255762306a36Sopenharmony_ci rtw89_write16_mask(rtwdev, info->sel_addr, 255862306a36Sopenharmony_ci B_AX_DISPATCHER_CH_SEL_MASK, 3); 255962306a36Sopenharmony_ci seq_puts(m, "Enable Dispatcher cdt tx3 dump.\n"); 256062306a36Sopenharmony_ci break; 256162306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_DSPT_CDT_TX4: 256262306a36Sopenharmony_ci info = &dbg_port_dspt_cdt_tx4; 256362306a36Sopenharmony_ci rtw89_write16_mask(rtwdev, info->sel_addr, 256462306a36Sopenharmony_ci B_AX_DISPATCHER_INTN_SEL_MASK, 1); 256562306a36Sopenharmony_ci rtw89_write16_mask(rtwdev, info->sel_addr, 256662306a36Sopenharmony_ci B_AX_DISPATCHER_CH_SEL_MASK, 4); 256762306a36Sopenharmony_ci seq_puts(m, "Enable Dispatcher cdt tx4 dump.\n"); 256862306a36Sopenharmony_ci break; 256962306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_DSPT_CDT_TX5: 257062306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_DSPT_CDT_TX6: 257162306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_DSPT_CDT_TX7: 257262306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_DSPT_CDT_TX8: 257362306a36Sopenharmony_ci info = &dbg_port_dspt_cdt_tx5_8; 257462306a36Sopenharmony_ci index = sel + 5 - RTW89_DBG_PORT_SEL_DSPT_CDT_TX5; 257562306a36Sopenharmony_ci rtw89_write16_mask(rtwdev, info->sel_addr, 257662306a36Sopenharmony_ci B_AX_DISPATCHER_INTN_SEL_MASK, 1); 257762306a36Sopenharmony_ci rtw89_write16_mask(rtwdev, info->sel_addr, 257862306a36Sopenharmony_ci B_AX_DISPATCHER_CH_SEL_MASK, index); 257962306a36Sopenharmony_ci seq_printf(m, "Enable Dispatcher cdt tx%x dump.\n", index); 258062306a36Sopenharmony_ci break; 258162306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_DSPT_CDT_TX9: 258262306a36Sopenharmony_ci info = &dbg_port_dspt_cdt_tx9; 258362306a36Sopenharmony_ci rtw89_write16_mask(rtwdev, info->sel_addr, 258462306a36Sopenharmony_ci B_AX_DISPATCHER_INTN_SEL_MASK, 1); 258562306a36Sopenharmony_ci rtw89_write16_mask(rtwdev, info->sel_addr, 258662306a36Sopenharmony_ci B_AX_DISPATCHER_CH_SEL_MASK, 9); 258762306a36Sopenharmony_ci seq_puts(m, "Enable Dispatcher cdt tx9 dump.\n"); 258862306a36Sopenharmony_ci break; 258962306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_DSPT_CDT_TXA: 259062306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_DSPT_CDT_TXB: 259162306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_DSPT_CDT_TXC: 259262306a36Sopenharmony_ci info = &dbg_port_dspt_cdt_txA_C; 259362306a36Sopenharmony_ci index = sel + 0xA - RTW89_DBG_PORT_SEL_DSPT_CDT_TXA; 259462306a36Sopenharmony_ci rtw89_write16_mask(rtwdev, info->sel_addr, 259562306a36Sopenharmony_ci B_AX_DISPATCHER_INTN_SEL_MASK, 1); 259662306a36Sopenharmony_ci rtw89_write16_mask(rtwdev, info->sel_addr, 259762306a36Sopenharmony_ci B_AX_DISPATCHER_CH_SEL_MASK, index); 259862306a36Sopenharmony_ci seq_printf(m, "Enable Dispatcher cdt tx%x dump.\n", index); 259962306a36Sopenharmony_ci break; 260062306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_DSPT_HDT_RX0: 260162306a36Sopenharmony_ci info = &dbg_port_dspt_hdt_rx0; 260262306a36Sopenharmony_ci rtw89_write16_mask(rtwdev, info->sel_addr, 260362306a36Sopenharmony_ci B_AX_DISPATCHER_INTN_SEL_MASK, 2); 260462306a36Sopenharmony_ci rtw89_write16_mask(rtwdev, info->sel_addr, 260562306a36Sopenharmony_ci B_AX_DISPATCHER_CH_SEL_MASK, 0); 260662306a36Sopenharmony_ci seq_puts(m, "Enable Dispatcher hdt rx0 dump.\n"); 260762306a36Sopenharmony_ci break; 260862306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_DSPT_HDT_RX1: 260962306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_DSPT_HDT_RX2: 261062306a36Sopenharmony_ci info = &dbg_port_dspt_hdt_rx1_2; 261162306a36Sopenharmony_ci index = sel + 1 - RTW89_DBG_PORT_SEL_DSPT_HDT_RX1; 261262306a36Sopenharmony_ci rtw89_write16_mask(rtwdev, info->sel_addr, 261362306a36Sopenharmony_ci B_AX_DISPATCHER_INTN_SEL_MASK, 2); 261462306a36Sopenharmony_ci rtw89_write16_mask(rtwdev, info->sel_addr, 261562306a36Sopenharmony_ci B_AX_DISPATCHER_CH_SEL_MASK, index); 261662306a36Sopenharmony_ci seq_printf(m, "Enable Dispatcher hdt rx%x dump.\n", index); 261762306a36Sopenharmony_ci break; 261862306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_DSPT_HDT_RX3: 261962306a36Sopenharmony_ci info = &dbg_port_dspt_hdt_rx3; 262062306a36Sopenharmony_ci rtw89_write16_mask(rtwdev, info->sel_addr, 262162306a36Sopenharmony_ci B_AX_DISPATCHER_INTN_SEL_MASK, 2); 262262306a36Sopenharmony_ci rtw89_write16_mask(rtwdev, info->sel_addr, 262362306a36Sopenharmony_ci B_AX_DISPATCHER_CH_SEL_MASK, 3); 262462306a36Sopenharmony_ci seq_puts(m, "Enable Dispatcher hdt rx3 dump.\n"); 262562306a36Sopenharmony_ci break; 262662306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_DSPT_HDT_RX4: 262762306a36Sopenharmony_ci info = &dbg_port_dspt_hdt_rx4; 262862306a36Sopenharmony_ci rtw89_write16_mask(rtwdev, info->sel_addr, 262962306a36Sopenharmony_ci B_AX_DISPATCHER_INTN_SEL_MASK, 2); 263062306a36Sopenharmony_ci rtw89_write16_mask(rtwdev, info->sel_addr, 263162306a36Sopenharmony_ci B_AX_DISPATCHER_CH_SEL_MASK, 4); 263262306a36Sopenharmony_ci seq_puts(m, "Enable Dispatcher hdt rx4 dump.\n"); 263362306a36Sopenharmony_ci break; 263462306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_DSPT_HDT_RX5: 263562306a36Sopenharmony_ci info = &dbg_port_dspt_hdt_rx5; 263662306a36Sopenharmony_ci rtw89_write16_mask(rtwdev, info->sel_addr, 263762306a36Sopenharmony_ci B_AX_DISPATCHER_INTN_SEL_MASK, 2); 263862306a36Sopenharmony_ci rtw89_write16_mask(rtwdev, info->sel_addr, 263962306a36Sopenharmony_ci B_AX_DISPATCHER_CH_SEL_MASK, 5); 264062306a36Sopenharmony_ci seq_puts(m, "Enable Dispatcher hdt rx5 dump.\n"); 264162306a36Sopenharmony_ci break; 264262306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_DSPT_CDT_RX_P0_0: 264362306a36Sopenharmony_ci info = &dbg_port_dspt_cdt_rx_p0_0; 264462306a36Sopenharmony_ci rtw89_write16_mask(rtwdev, info->sel_addr, 264562306a36Sopenharmony_ci B_AX_DISPATCHER_INTN_SEL_MASK, 3); 264662306a36Sopenharmony_ci rtw89_write16_mask(rtwdev, info->sel_addr, 264762306a36Sopenharmony_ci B_AX_DISPATCHER_CH_SEL_MASK, 0); 264862306a36Sopenharmony_ci seq_puts(m, "Enable Dispatcher cdt rx part0 0 dump.\n"); 264962306a36Sopenharmony_ci break; 265062306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_DSPT_CDT_RX_P0: 265162306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_DSPT_CDT_RX_P0_1: 265262306a36Sopenharmony_ci info = &dbg_port_dspt_cdt_rx_p0_1; 265362306a36Sopenharmony_ci rtw89_write16_mask(rtwdev, info->sel_addr, 265462306a36Sopenharmony_ci B_AX_DISPATCHER_INTN_SEL_MASK, 3); 265562306a36Sopenharmony_ci rtw89_write16_mask(rtwdev, info->sel_addr, 265662306a36Sopenharmony_ci B_AX_DISPATCHER_CH_SEL_MASK, 1); 265762306a36Sopenharmony_ci seq_puts(m, "Enable Dispatcher cdt rx part0 1 dump.\n"); 265862306a36Sopenharmony_ci break; 265962306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_DSPT_CDT_RX_P0_2: 266062306a36Sopenharmony_ci info = &dbg_port_dspt_cdt_rx_p0_2; 266162306a36Sopenharmony_ci rtw89_write16_mask(rtwdev, info->sel_addr, 266262306a36Sopenharmony_ci B_AX_DISPATCHER_INTN_SEL_MASK, 3); 266362306a36Sopenharmony_ci rtw89_write16_mask(rtwdev, info->sel_addr, 266462306a36Sopenharmony_ci B_AX_DISPATCHER_CH_SEL_MASK, 2); 266562306a36Sopenharmony_ci seq_puts(m, "Enable Dispatcher cdt rx part0 2 dump.\n"); 266662306a36Sopenharmony_ci break; 266762306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_DSPT_CDT_RX_P1: 266862306a36Sopenharmony_ci info = &dbg_port_dspt_cdt_rx_p1; 266962306a36Sopenharmony_ci rtw89_write8_mask(rtwdev, info->sel_addr, 267062306a36Sopenharmony_ci B_AX_DISPATCHER_INTN_SEL_MASK, 3); 267162306a36Sopenharmony_ci seq_puts(m, "Enable Dispatcher cdt rx part1 dump.\n"); 267262306a36Sopenharmony_ci break; 267362306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_DSPT_STF_CTRL: 267462306a36Sopenharmony_ci info = &dbg_port_dspt_stf_ctrl; 267562306a36Sopenharmony_ci rtw89_write8_mask(rtwdev, info->sel_addr, 267662306a36Sopenharmony_ci B_AX_DISPATCHER_INTN_SEL_MASK, 4); 267762306a36Sopenharmony_ci seq_puts(m, "Enable Dispatcher stf control dump.\n"); 267862306a36Sopenharmony_ci break; 267962306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_DSPT_ADDR_CTRL: 268062306a36Sopenharmony_ci info = &dbg_port_dspt_addr_ctrl; 268162306a36Sopenharmony_ci rtw89_write8_mask(rtwdev, info->sel_addr, 268262306a36Sopenharmony_ci B_AX_DISPATCHER_INTN_SEL_MASK, 5); 268362306a36Sopenharmony_ci seq_puts(m, "Enable Dispatcher addr control dump.\n"); 268462306a36Sopenharmony_ci break; 268562306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_DSPT_WDE_INTF: 268662306a36Sopenharmony_ci info = &dbg_port_dspt_wde_intf; 268762306a36Sopenharmony_ci rtw89_write8_mask(rtwdev, info->sel_addr, 268862306a36Sopenharmony_ci B_AX_DISPATCHER_INTN_SEL_MASK, 6); 268962306a36Sopenharmony_ci seq_puts(m, "Enable Dispatcher wde interface dump.\n"); 269062306a36Sopenharmony_ci break; 269162306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_DSPT_PLE_INTF: 269262306a36Sopenharmony_ci info = &dbg_port_dspt_ple_intf; 269362306a36Sopenharmony_ci rtw89_write8_mask(rtwdev, info->sel_addr, 269462306a36Sopenharmony_ci B_AX_DISPATCHER_INTN_SEL_MASK, 7); 269562306a36Sopenharmony_ci seq_puts(m, "Enable Dispatcher ple interface dump.\n"); 269662306a36Sopenharmony_ci break; 269762306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_DSPT_FLOW_CTRL: 269862306a36Sopenharmony_ci info = &dbg_port_dspt_flow_ctrl; 269962306a36Sopenharmony_ci rtw89_write8_mask(rtwdev, info->sel_addr, 270062306a36Sopenharmony_ci B_AX_DISPATCHER_INTN_SEL_MASK, 8); 270162306a36Sopenharmony_ci seq_puts(m, "Enable Dispatcher flow control dump.\n"); 270262306a36Sopenharmony_ci break; 270362306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_PCIE_TXDMA: 270462306a36Sopenharmony_ci info = &dbg_port_pcie_txdma; 270562306a36Sopenharmony_ci val32 = rtw89_read32(rtwdev, R_AX_DBG_CTRL); 270662306a36Sopenharmony_ci val32 = u32_replace_bits(val32, PCIE_TXDMA_DBG_SEL, B_AX_DBG_SEL0); 270762306a36Sopenharmony_ci val32 = u32_replace_bits(val32, PCIE_TXDMA_DBG_SEL, B_AX_DBG_SEL1); 270862306a36Sopenharmony_ci rtw89_write32(rtwdev, R_AX_DBG_CTRL, val32); 270962306a36Sopenharmony_ci seq_puts(m, "Enable pcie txdma dump.\n"); 271062306a36Sopenharmony_ci break; 271162306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_PCIE_RXDMA: 271262306a36Sopenharmony_ci info = &dbg_port_pcie_rxdma; 271362306a36Sopenharmony_ci val32 = rtw89_read32(rtwdev, R_AX_DBG_CTRL); 271462306a36Sopenharmony_ci val32 = u32_replace_bits(val32, PCIE_RXDMA_DBG_SEL, B_AX_DBG_SEL0); 271562306a36Sopenharmony_ci val32 = u32_replace_bits(val32, PCIE_RXDMA_DBG_SEL, B_AX_DBG_SEL1); 271662306a36Sopenharmony_ci rtw89_write32(rtwdev, R_AX_DBG_CTRL, val32); 271762306a36Sopenharmony_ci seq_puts(m, "Enable pcie rxdma dump.\n"); 271862306a36Sopenharmony_ci break; 271962306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_PCIE_CVT: 272062306a36Sopenharmony_ci info = &dbg_port_pcie_cvt; 272162306a36Sopenharmony_ci val32 = rtw89_read32(rtwdev, R_AX_DBG_CTRL); 272262306a36Sopenharmony_ci val32 = u32_replace_bits(val32, PCIE_CVT_DBG_SEL, B_AX_DBG_SEL0); 272362306a36Sopenharmony_ci val32 = u32_replace_bits(val32, PCIE_CVT_DBG_SEL, B_AX_DBG_SEL1); 272462306a36Sopenharmony_ci rtw89_write32(rtwdev, R_AX_DBG_CTRL, val32); 272562306a36Sopenharmony_ci seq_puts(m, "Enable pcie cvt dump.\n"); 272662306a36Sopenharmony_ci break; 272762306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_PCIE_CXPL: 272862306a36Sopenharmony_ci info = &dbg_port_pcie_cxpl; 272962306a36Sopenharmony_ci val32 = rtw89_read32(rtwdev, R_AX_DBG_CTRL); 273062306a36Sopenharmony_ci val32 = u32_replace_bits(val32, PCIE_CXPL_DBG_SEL, B_AX_DBG_SEL0); 273162306a36Sopenharmony_ci val32 = u32_replace_bits(val32, PCIE_CXPL_DBG_SEL, B_AX_DBG_SEL1); 273262306a36Sopenharmony_ci rtw89_write32(rtwdev, R_AX_DBG_CTRL, val32); 273362306a36Sopenharmony_ci seq_puts(m, "Enable pcie cxpl dump.\n"); 273462306a36Sopenharmony_ci break; 273562306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_PCIE_IO: 273662306a36Sopenharmony_ci info = &dbg_port_pcie_io; 273762306a36Sopenharmony_ci val32 = rtw89_read32(rtwdev, R_AX_DBG_CTRL); 273862306a36Sopenharmony_ci val32 = u32_replace_bits(val32, PCIE_IO_DBG_SEL, B_AX_DBG_SEL0); 273962306a36Sopenharmony_ci val32 = u32_replace_bits(val32, PCIE_IO_DBG_SEL, B_AX_DBG_SEL1); 274062306a36Sopenharmony_ci rtw89_write32(rtwdev, R_AX_DBG_CTRL, val32); 274162306a36Sopenharmony_ci seq_puts(m, "Enable pcie io dump.\n"); 274262306a36Sopenharmony_ci break; 274362306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_PCIE_MISC: 274462306a36Sopenharmony_ci info = &dbg_port_pcie_misc; 274562306a36Sopenharmony_ci val32 = rtw89_read32(rtwdev, R_AX_DBG_CTRL); 274662306a36Sopenharmony_ci val32 = u32_replace_bits(val32, PCIE_MISC_DBG_SEL, B_AX_DBG_SEL0); 274762306a36Sopenharmony_ci val32 = u32_replace_bits(val32, PCIE_MISC_DBG_SEL, B_AX_DBG_SEL1); 274862306a36Sopenharmony_ci rtw89_write32(rtwdev, R_AX_DBG_CTRL, val32); 274962306a36Sopenharmony_ci seq_puts(m, "Enable pcie misc dump.\n"); 275062306a36Sopenharmony_ci break; 275162306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_PCIE_MISC2: 275262306a36Sopenharmony_ci info = &dbg_port_pcie_misc2; 275362306a36Sopenharmony_ci val16 = rtw89_read16(rtwdev, R_AX_PCIE_DBG_CTRL); 275462306a36Sopenharmony_ci val16 = u16_replace_bits(val16, PCIE_MISC2_DBG_SEL, 275562306a36Sopenharmony_ci B_AX_PCIE_DBG_SEL_MASK); 275662306a36Sopenharmony_ci rtw89_write16(rtwdev, R_AX_PCIE_DBG_CTRL, val16); 275762306a36Sopenharmony_ci seq_puts(m, "Enable pcie misc2 dump.\n"); 275862306a36Sopenharmony_ci break; 275962306a36Sopenharmony_ci default: 276062306a36Sopenharmony_ci seq_puts(m, "Dbg port select err\n"); 276162306a36Sopenharmony_ci return NULL; 276262306a36Sopenharmony_ci } 276362306a36Sopenharmony_ci 276462306a36Sopenharmony_ci return info; 276562306a36Sopenharmony_ci} 276662306a36Sopenharmony_ci 276762306a36Sopenharmony_cistatic bool is_dbg_port_valid(struct rtw89_dev *rtwdev, u32 sel) 276862306a36Sopenharmony_ci{ 276962306a36Sopenharmony_ci if (rtwdev->hci.type != RTW89_HCI_TYPE_PCIE && 277062306a36Sopenharmony_ci sel >= RTW89_DBG_PORT_SEL_PCIE_TXDMA && 277162306a36Sopenharmony_ci sel <= RTW89_DBG_PORT_SEL_PCIE_MISC2) 277262306a36Sopenharmony_ci return false; 277362306a36Sopenharmony_ci if (rtwdev->chip->chip_id == RTL8852B && 277462306a36Sopenharmony_ci sel >= RTW89_DBG_PORT_SEL_PTCL_C1 && 277562306a36Sopenharmony_ci sel <= RTW89_DBG_PORT_SEL_TXTF_INFOH_C1) 277662306a36Sopenharmony_ci return false; 277762306a36Sopenharmony_ci if (rtw89_mac_check_mac_en(rtwdev, 0, RTW89_DMAC_SEL) && 277862306a36Sopenharmony_ci sel >= RTW89_DBG_PORT_SEL_WDE_BUFMGN_FREEPG && 277962306a36Sopenharmony_ci sel <= RTW89_DBG_PORT_SEL_PKTINFO) 278062306a36Sopenharmony_ci return false; 278162306a36Sopenharmony_ci if (rtw89_mac_check_mac_en(rtwdev, 0, RTW89_DMAC_SEL) && 278262306a36Sopenharmony_ci sel >= RTW89_DBG_PORT_SEL_DSPT_HDT_TX0 && 278362306a36Sopenharmony_ci sel <= RTW89_DBG_PORT_SEL_DSPT_FLOW_CTRL) 278462306a36Sopenharmony_ci return false; 278562306a36Sopenharmony_ci if (rtw89_mac_check_mac_en(rtwdev, 0, RTW89_CMAC_SEL) && 278662306a36Sopenharmony_ci sel >= RTW89_DBG_PORT_SEL_PTCL_C0 && 278762306a36Sopenharmony_ci sel <= RTW89_DBG_PORT_SEL_TXTF_INFOH_C0) 278862306a36Sopenharmony_ci return false; 278962306a36Sopenharmony_ci if (rtw89_mac_check_mac_en(rtwdev, 1, RTW89_CMAC_SEL) && 279062306a36Sopenharmony_ci sel >= RTW89_DBG_PORT_SEL_PTCL_C1 && 279162306a36Sopenharmony_ci sel <= RTW89_DBG_PORT_SEL_TXTF_INFOH_C1) 279262306a36Sopenharmony_ci return false; 279362306a36Sopenharmony_ci 279462306a36Sopenharmony_ci return true; 279562306a36Sopenharmony_ci} 279662306a36Sopenharmony_ci 279762306a36Sopenharmony_cistatic int rtw89_debug_mac_dbg_port_dump(struct rtw89_dev *rtwdev, 279862306a36Sopenharmony_ci struct seq_file *m, u32 sel) 279962306a36Sopenharmony_ci{ 280062306a36Sopenharmony_ci const struct rtw89_mac_dbg_port_info *info; 280162306a36Sopenharmony_ci u8 val8; 280262306a36Sopenharmony_ci u16 val16; 280362306a36Sopenharmony_ci u32 val32; 280462306a36Sopenharmony_ci u32 i; 280562306a36Sopenharmony_ci 280662306a36Sopenharmony_ci info = rtw89_debug_mac_dbg_port_sel(m, rtwdev, sel); 280762306a36Sopenharmony_ci if (!info) { 280862306a36Sopenharmony_ci rtw89_err(rtwdev, "failed to select debug port %d\n", sel); 280962306a36Sopenharmony_ci return -EINVAL; 281062306a36Sopenharmony_ci } 281162306a36Sopenharmony_ci 281262306a36Sopenharmony_ci#define case_DBG_SEL(__sel) \ 281362306a36Sopenharmony_ci case RTW89_DBG_PORT_SEL_##__sel: \ 281462306a36Sopenharmony_ci seq_puts(m, "Dump debug port " #__sel ":\n"); \ 281562306a36Sopenharmony_ci break 281662306a36Sopenharmony_ci 281762306a36Sopenharmony_ci switch (sel) { 281862306a36Sopenharmony_ci case_DBG_SEL(PTCL_C0); 281962306a36Sopenharmony_ci case_DBG_SEL(PTCL_C1); 282062306a36Sopenharmony_ci case_DBG_SEL(SCH_C0); 282162306a36Sopenharmony_ci case_DBG_SEL(SCH_C1); 282262306a36Sopenharmony_ci case_DBG_SEL(TMAC_C0); 282362306a36Sopenharmony_ci case_DBG_SEL(TMAC_C1); 282462306a36Sopenharmony_ci case_DBG_SEL(RMAC_C0); 282562306a36Sopenharmony_ci case_DBG_SEL(RMAC_C1); 282662306a36Sopenharmony_ci case_DBG_SEL(RMACST_C0); 282762306a36Sopenharmony_ci case_DBG_SEL(RMACST_C1); 282862306a36Sopenharmony_ci case_DBG_SEL(TRXPTCL_C0); 282962306a36Sopenharmony_ci case_DBG_SEL(TRXPTCL_C1); 283062306a36Sopenharmony_ci case_DBG_SEL(TX_INFOL_C0); 283162306a36Sopenharmony_ci case_DBG_SEL(TX_INFOH_C0); 283262306a36Sopenharmony_ci case_DBG_SEL(TX_INFOL_C1); 283362306a36Sopenharmony_ci case_DBG_SEL(TX_INFOH_C1); 283462306a36Sopenharmony_ci case_DBG_SEL(TXTF_INFOL_C0); 283562306a36Sopenharmony_ci case_DBG_SEL(TXTF_INFOH_C0); 283662306a36Sopenharmony_ci case_DBG_SEL(TXTF_INFOL_C1); 283762306a36Sopenharmony_ci case_DBG_SEL(TXTF_INFOH_C1); 283862306a36Sopenharmony_ci case_DBG_SEL(WDE_BUFMGN_FREEPG); 283962306a36Sopenharmony_ci case_DBG_SEL(WDE_BUFMGN_QUOTA); 284062306a36Sopenharmony_ci case_DBG_SEL(WDE_BUFMGN_PAGELLT); 284162306a36Sopenharmony_ci case_DBG_SEL(WDE_BUFMGN_PKTINFO); 284262306a36Sopenharmony_ci case_DBG_SEL(WDE_QUEMGN_PREPKT); 284362306a36Sopenharmony_ci case_DBG_SEL(WDE_QUEMGN_NXTPKT); 284462306a36Sopenharmony_ci case_DBG_SEL(WDE_QUEMGN_QLNKTBL); 284562306a36Sopenharmony_ci case_DBG_SEL(WDE_QUEMGN_QEMPTY); 284662306a36Sopenharmony_ci case_DBG_SEL(PLE_BUFMGN_FREEPG); 284762306a36Sopenharmony_ci case_DBG_SEL(PLE_BUFMGN_QUOTA); 284862306a36Sopenharmony_ci case_DBG_SEL(PLE_BUFMGN_PAGELLT); 284962306a36Sopenharmony_ci case_DBG_SEL(PLE_BUFMGN_PKTINFO); 285062306a36Sopenharmony_ci case_DBG_SEL(PLE_QUEMGN_PREPKT); 285162306a36Sopenharmony_ci case_DBG_SEL(PLE_QUEMGN_NXTPKT); 285262306a36Sopenharmony_ci case_DBG_SEL(PLE_QUEMGN_QLNKTBL); 285362306a36Sopenharmony_ci case_DBG_SEL(PLE_QUEMGN_QEMPTY); 285462306a36Sopenharmony_ci case_DBG_SEL(PKTINFO); 285562306a36Sopenharmony_ci case_DBG_SEL(DSPT_HDT_TX0); 285662306a36Sopenharmony_ci case_DBG_SEL(DSPT_HDT_TX1); 285762306a36Sopenharmony_ci case_DBG_SEL(DSPT_HDT_TX2); 285862306a36Sopenharmony_ci case_DBG_SEL(DSPT_HDT_TX3); 285962306a36Sopenharmony_ci case_DBG_SEL(DSPT_HDT_TX4); 286062306a36Sopenharmony_ci case_DBG_SEL(DSPT_HDT_TX5); 286162306a36Sopenharmony_ci case_DBG_SEL(DSPT_HDT_TX6); 286262306a36Sopenharmony_ci case_DBG_SEL(DSPT_HDT_TX7); 286362306a36Sopenharmony_ci case_DBG_SEL(DSPT_HDT_TX8); 286462306a36Sopenharmony_ci case_DBG_SEL(DSPT_HDT_TX9); 286562306a36Sopenharmony_ci case_DBG_SEL(DSPT_HDT_TXA); 286662306a36Sopenharmony_ci case_DBG_SEL(DSPT_HDT_TXB); 286762306a36Sopenharmony_ci case_DBG_SEL(DSPT_HDT_TXC); 286862306a36Sopenharmony_ci case_DBG_SEL(DSPT_HDT_TXD); 286962306a36Sopenharmony_ci case_DBG_SEL(DSPT_HDT_TXE); 287062306a36Sopenharmony_ci case_DBG_SEL(DSPT_HDT_TXF); 287162306a36Sopenharmony_ci case_DBG_SEL(DSPT_CDT_TX0); 287262306a36Sopenharmony_ci case_DBG_SEL(DSPT_CDT_TX1); 287362306a36Sopenharmony_ci case_DBG_SEL(DSPT_CDT_TX3); 287462306a36Sopenharmony_ci case_DBG_SEL(DSPT_CDT_TX4); 287562306a36Sopenharmony_ci case_DBG_SEL(DSPT_CDT_TX5); 287662306a36Sopenharmony_ci case_DBG_SEL(DSPT_CDT_TX6); 287762306a36Sopenharmony_ci case_DBG_SEL(DSPT_CDT_TX7); 287862306a36Sopenharmony_ci case_DBG_SEL(DSPT_CDT_TX8); 287962306a36Sopenharmony_ci case_DBG_SEL(DSPT_CDT_TX9); 288062306a36Sopenharmony_ci case_DBG_SEL(DSPT_CDT_TXA); 288162306a36Sopenharmony_ci case_DBG_SEL(DSPT_CDT_TXB); 288262306a36Sopenharmony_ci case_DBG_SEL(DSPT_CDT_TXC); 288362306a36Sopenharmony_ci case_DBG_SEL(DSPT_HDT_RX0); 288462306a36Sopenharmony_ci case_DBG_SEL(DSPT_HDT_RX1); 288562306a36Sopenharmony_ci case_DBG_SEL(DSPT_HDT_RX2); 288662306a36Sopenharmony_ci case_DBG_SEL(DSPT_HDT_RX3); 288762306a36Sopenharmony_ci case_DBG_SEL(DSPT_HDT_RX4); 288862306a36Sopenharmony_ci case_DBG_SEL(DSPT_HDT_RX5); 288962306a36Sopenharmony_ci case_DBG_SEL(DSPT_CDT_RX_P0); 289062306a36Sopenharmony_ci case_DBG_SEL(DSPT_CDT_RX_P0_0); 289162306a36Sopenharmony_ci case_DBG_SEL(DSPT_CDT_RX_P0_1); 289262306a36Sopenharmony_ci case_DBG_SEL(DSPT_CDT_RX_P0_2); 289362306a36Sopenharmony_ci case_DBG_SEL(DSPT_CDT_RX_P1); 289462306a36Sopenharmony_ci case_DBG_SEL(DSPT_STF_CTRL); 289562306a36Sopenharmony_ci case_DBG_SEL(DSPT_ADDR_CTRL); 289662306a36Sopenharmony_ci case_DBG_SEL(DSPT_WDE_INTF); 289762306a36Sopenharmony_ci case_DBG_SEL(DSPT_PLE_INTF); 289862306a36Sopenharmony_ci case_DBG_SEL(DSPT_FLOW_CTRL); 289962306a36Sopenharmony_ci case_DBG_SEL(PCIE_TXDMA); 290062306a36Sopenharmony_ci case_DBG_SEL(PCIE_RXDMA); 290162306a36Sopenharmony_ci case_DBG_SEL(PCIE_CVT); 290262306a36Sopenharmony_ci case_DBG_SEL(PCIE_CXPL); 290362306a36Sopenharmony_ci case_DBG_SEL(PCIE_IO); 290462306a36Sopenharmony_ci case_DBG_SEL(PCIE_MISC); 290562306a36Sopenharmony_ci case_DBG_SEL(PCIE_MISC2); 290662306a36Sopenharmony_ci } 290762306a36Sopenharmony_ci 290862306a36Sopenharmony_ci#undef case_DBG_SEL 290962306a36Sopenharmony_ci 291062306a36Sopenharmony_ci seq_printf(m, "Sel addr = 0x%X\n", info->sel_addr); 291162306a36Sopenharmony_ci seq_printf(m, "Read addr = 0x%X\n", info->rd_addr); 291262306a36Sopenharmony_ci 291362306a36Sopenharmony_ci for (i = info->srt; i <= info->end; i++) { 291462306a36Sopenharmony_ci switch (info->sel_byte) { 291562306a36Sopenharmony_ci case 1: 291662306a36Sopenharmony_ci default: 291762306a36Sopenharmony_ci rtw89_write8_mask(rtwdev, info->sel_addr, 291862306a36Sopenharmony_ci info->sel_msk, i); 291962306a36Sopenharmony_ci seq_printf(m, "0x%02X: ", i); 292062306a36Sopenharmony_ci break; 292162306a36Sopenharmony_ci case 2: 292262306a36Sopenharmony_ci rtw89_write16_mask(rtwdev, info->sel_addr, 292362306a36Sopenharmony_ci info->sel_msk, i); 292462306a36Sopenharmony_ci seq_printf(m, "0x%04X: ", i); 292562306a36Sopenharmony_ci break; 292662306a36Sopenharmony_ci case 4: 292762306a36Sopenharmony_ci rtw89_write32_mask(rtwdev, info->sel_addr, 292862306a36Sopenharmony_ci info->sel_msk, i); 292962306a36Sopenharmony_ci seq_printf(m, "0x%04X: ", i); 293062306a36Sopenharmony_ci break; 293162306a36Sopenharmony_ci } 293262306a36Sopenharmony_ci 293362306a36Sopenharmony_ci udelay(10); 293462306a36Sopenharmony_ci 293562306a36Sopenharmony_ci switch (info->rd_byte) { 293662306a36Sopenharmony_ci case 1: 293762306a36Sopenharmony_ci default: 293862306a36Sopenharmony_ci val8 = rtw89_read8_mask(rtwdev, 293962306a36Sopenharmony_ci info->rd_addr, info->rd_msk); 294062306a36Sopenharmony_ci seq_printf(m, "0x%02X\n", val8); 294162306a36Sopenharmony_ci break; 294262306a36Sopenharmony_ci case 2: 294362306a36Sopenharmony_ci val16 = rtw89_read16_mask(rtwdev, 294462306a36Sopenharmony_ci info->rd_addr, info->rd_msk); 294562306a36Sopenharmony_ci seq_printf(m, "0x%04X\n", val16); 294662306a36Sopenharmony_ci break; 294762306a36Sopenharmony_ci case 4: 294862306a36Sopenharmony_ci val32 = rtw89_read32_mask(rtwdev, 294962306a36Sopenharmony_ci info->rd_addr, info->rd_msk); 295062306a36Sopenharmony_ci seq_printf(m, "0x%08X\n", val32); 295162306a36Sopenharmony_ci break; 295262306a36Sopenharmony_ci } 295362306a36Sopenharmony_ci } 295462306a36Sopenharmony_ci 295562306a36Sopenharmony_ci return 0; 295662306a36Sopenharmony_ci} 295762306a36Sopenharmony_ci 295862306a36Sopenharmony_cistatic int rtw89_debug_mac_dump_dbg_port(struct rtw89_dev *rtwdev, 295962306a36Sopenharmony_ci struct seq_file *m) 296062306a36Sopenharmony_ci{ 296162306a36Sopenharmony_ci u32 sel; 296262306a36Sopenharmony_ci int ret = 0; 296362306a36Sopenharmony_ci 296462306a36Sopenharmony_ci for (sel = RTW89_DBG_PORT_SEL_PTCL_C0; 296562306a36Sopenharmony_ci sel < RTW89_DBG_PORT_SEL_LAST; sel++) { 296662306a36Sopenharmony_ci if (!is_dbg_port_valid(rtwdev, sel)) 296762306a36Sopenharmony_ci continue; 296862306a36Sopenharmony_ci ret = rtw89_debug_mac_dbg_port_dump(rtwdev, m, sel); 296962306a36Sopenharmony_ci if (ret) { 297062306a36Sopenharmony_ci rtw89_err(rtwdev, 297162306a36Sopenharmony_ci "failed to dump debug port %d\n", sel); 297262306a36Sopenharmony_ci break; 297362306a36Sopenharmony_ci } 297462306a36Sopenharmony_ci } 297562306a36Sopenharmony_ci 297662306a36Sopenharmony_ci return ret; 297762306a36Sopenharmony_ci} 297862306a36Sopenharmony_ci 297962306a36Sopenharmony_cistatic int 298062306a36Sopenharmony_cirtw89_debug_priv_mac_dbg_port_dump_get(struct seq_file *m, void *v) 298162306a36Sopenharmony_ci{ 298262306a36Sopenharmony_ci struct rtw89_debugfs_priv *debugfs_priv = m->private; 298362306a36Sopenharmony_ci struct rtw89_dev *rtwdev = debugfs_priv->rtwdev; 298462306a36Sopenharmony_ci 298562306a36Sopenharmony_ci if (debugfs_priv->dbgpkg_en.ss_dbg) 298662306a36Sopenharmony_ci rtw89_debug_mac_dump_ss_dbg(rtwdev, m); 298762306a36Sopenharmony_ci if (debugfs_priv->dbgpkg_en.dle_dbg) 298862306a36Sopenharmony_ci rtw89_debug_mac_dump_dle_dbg(rtwdev, m); 298962306a36Sopenharmony_ci if (debugfs_priv->dbgpkg_en.dmac_dbg) 299062306a36Sopenharmony_ci rtw89_debug_mac_dump_dmac_dbg(rtwdev, m); 299162306a36Sopenharmony_ci if (debugfs_priv->dbgpkg_en.cmac_dbg) 299262306a36Sopenharmony_ci rtw89_debug_mac_dump_cmac_dbg(rtwdev, m); 299362306a36Sopenharmony_ci if (debugfs_priv->dbgpkg_en.dbg_port) 299462306a36Sopenharmony_ci rtw89_debug_mac_dump_dbg_port(rtwdev, m); 299562306a36Sopenharmony_ci 299662306a36Sopenharmony_ci return 0; 299762306a36Sopenharmony_ci}; 299862306a36Sopenharmony_ci 299962306a36Sopenharmony_cistatic u8 *rtw89_hex2bin_user(struct rtw89_dev *rtwdev, 300062306a36Sopenharmony_ci const char __user *user_buf, size_t count) 300162306a36Sopenharmony_ci{ 300262306a36Sopenharmony_ci char *buf; 300362306a36Sopenharmony_ci u8 *bin; 300462306a36Sopenharmony_ci int num; 300562306a36Sopenharmony_ci int err = 0; 300662306a36Sopenharmony_ci 300762306a36Sopenharmony_ci buf = memdup_user(user_buf, count); 300862306a36Sopenharmony_ci if (IS_ERR(buf)) 300962306a36Sopenharmony_ci return buf; 301062306a36Sopenharmony_ci 301162306a36Sopenharmony_ci num = count / 2; 301262306a36Sopenharmony_ci bin = kmalloc(num, GFP_KERNEL); 301362306a36Sopenharmony_ci if (!bin) { 301462306a36Sopenharmony_ci err = -EFAULT; 301562306a36Sopenharmony_ci goto out; 301662306a36Sopenharmony_ci } 301762306a36Sopenharmony_ci 301862306a36Sopenharmony_ci if (hex2bin(bin, buf, num)) { 301962306a36Sopenharmony_ci rtw89_info(rtwdev, "valid format: H1H2H3...\n"); 302062306a36Sopenharmony_ci kfree(bin); 302162306a36Sopenharmony_ci err = -EINVAL; 302262306a36Sopenharmony_ci } 302362306a36Sopenharmony_ci 302462306a36Sopenharmony_ciout: 302562306a36Sopenharmony_ci kfree(buf); 302662306a36Sopenharmony_ci 302762306a36Sopenharmony_ci return err ? ERR_PTR(err) : bin; 302862306a36Sopenharmony_ci} 302962306a36Sopenharmony_ci 303062306a36Sopenharmony_cistatic ssize_t rtw89_debug_priv_send_h2c_set(struct file *filp, 303162306a36Sopenharmony_ci const char __user *user_buf, 303262306a36Sopenharmony_ci size_t count, loff_t *loff) 303362306a36Sopenharmony_ci{ 303462306a36Sopenharmony_ci struct rtw89_debugfs_priv *debugfs_priv = filp->private_data; 303562306a36Sopenharmony_ci struct rtw89_dev *rtwdev = debugfs_priv->rtwdev; 303662306a36Sopenharmony_ci u8 *h2c; 303762306a36Sopenharmony_ci int ret; 303862306a36Sopenharmony_ci u16 h2c_len = count / 2; 303962306a36Sopenharmony_ci 304062306a36Sopenharmony_ci h2c = rtw89_hex2bin_user(rtwdev, user_buf, count); 304162306a36Sopenharmony_ci if (IS_ERR(h2c)) 304262306a36Sopenharmony_ci return -EFAULT; 304362306a36Sopenharmony_ci 304462306a36Sopenharmony_ci ret = rtw89_fw_h2c_raw(rtwdev, h2c, h2c_len); 304562306a36Sopenharmony_ci 304662306a36Sopenharmony_ci kfree(h2c); 304762306a36Sopenharmony_ci 304862306a36Sopenharmony_ci return ret ? ret : count; 304962306a36Sopenharmony_ci} 305062306a36Sopenharmony_ci 305162306a36Sopenharmony_cistatic int 305262306a36Sopenharmony_cirtw89_debug_priv_early_h2c_get(struct seq_file *m, void *v) 305362306a36Sopenharmony_ci{ 305462306a36Sopenharmony_ci struct rtw89_debugfs_priv *debugfs_priv = m->private; 305562306a36Sopenharmony_ci struct rtw89_dev *rtwdev = debugfs_priv->rtwdev; 305662306a36Sopenharmony_ci struct rtw89_early_h2c *early_h2c; 305762306a36Sopenharmony_ci int seq = 0; 305862306a36Sopenharmony_ci 305962306a36Sopenharmony_ci mutex_lock(&rtwdev->mutex); 306062306a36Sopenharmony_ci list_for_each_entry(early_h2c, &rtwdev->early_h2c_list, list) 306162306a36Sopenharmony_ci seq_printf(m, "%d: %*ph\n", ++seq, early_h2c->h2c_len, early_h2c->h2c); 306262306a36Sopenharmony_ci mutex_unlock(&rtwdev->mutex); 306362306a36Sopenharmony_ci 306462306a36Sopenharmony_ci return 0; 306562306a36Sopenharmony_ci} 306662306a36Sopenharmony_ci 306762306a36Sopenharmony_cistatic ssize_t 306862306a36Sopenharmony_cirtw89_debug_priv_early_h2c_set(struct file *filp, const char __user *user_buf, 306962306a36Sopenharmony_ci size_t count, loff_t *loff) 307062306a36Sopenharmony_ci{ 307162306a36Sopenharmony_ci struct seq_file *m = (struct seq_file *)filp->private_data; 307262306a36Sopenharmony_ci struct rtw89_debugfs_priv *debugfs_priv = m->private; 307362306a36Sopenharmony_ci struct rtw89_dev *rtwdev = debugfs_priv->rtwdev; 307462306a36Sopenharmony_ci struct rtw89_early_h2c *early_h2c; 307562306a36Sopenharmony_ci u8 *h2c; 307662306a36Sopenharmony_ci u16 h2c_len = count / 2; 307762306a36Sopenharmony_ci 307862306a36Sopenharmony_ci h2c = rtw89_hex2bin_user(rtwdev, user_buf, count); 307962306a36Sopenharmony_ci if (IS_ERR(h2c)) 308062306a36Sopenharmony_ci return -EFAULT; 308162306a36Sopenharmony_ci 308262306a36Sopenharmony_ci if (h2c_len >= 2 && h2c[0] == 0x00 && h2c[1] == 0x00) { 308362306a36Sopenharmony_ci kfree(h2c); 308462306a36Sopenharmony_ci rtw89_fw_free_all_early_h2c(rtwdev); 308562306a36Sopenharmony_ci goto out; 308662306a36Sopenharmony_ci } 308762306a36Sopenharmony_ci 308862306a36Sopenharmony_ci early_h2c = kmalloc(sizeof(*early_h2c), GFP_KERNEL); 308962306a36Sopenharmony_ci if (!early_h2c) { 309062306a36Sopenharmony_ci kfree(h2c); 309162306a36Sopenharmony_ci return -EFAULT; 309262306a36Sopenharmony_ci } 309362306a36Sopenharmony_ci 309462306a36Sopenharmony_ci early_h2c->h2c = h2c; 309562306a36Sopenharmony_ci early_h2c->h2c_len = h2c_len; 309662306a36Sopenharmony_ci 309762306a36Sopenharmony_ci mutex_lock(&rtwdev->mutex); 309862306a36Sopenharmony_ci list_add_tail(&early_h2c->list, &rtwdev->early_h2c_list); 309962306a36Sopenharmony_ci mutex_unlock(&rtwdev->mutex); 310062306a36Sopenharmony_ci 310162306a36Sopenharmony_ciout: 310262306a36Sopenharmony_ci return count; 310362306a36Sopenharmony_ci} 310462306a36Sopenharmony_ci 310562306a36Sopenharmony_cistatic int rtw89_dbg_trigger_ctrl_error(struct rtw89_dev *rtwdev) 310662306a36Sopenharmony_ci{ 310762306a36Sopenharmony_ci struct rtw89_cpuio_ctrl ctrl_para = {0}; 310862306a36Sopenharmony_ci u16 pkt_id; 310962306a36Sopenharmony_ci int ret; 311062306a36Sopenharmony_ci 311162306a36Sopenharmony_ci rtw89_leave_ps_mode(rtwdev); 311262306a36Sopenharmony_ci 311362306a36Sopenharmony_ci ret = rtw89_mac_dle_buf_req(rtwdev, 0x20, true, &pkt_id); 311462306a36Sopenharmony_ci if (ret) 311562306a36Sopenharmony_ci return ret; 311662306a36Sopenharmony_ci 311762306a36Sopenharmony_ci /* intentionally, enqueue two pkt, but has only one pkt id */ 311862306a36Sopenharmony_ci ctrl_para.cmd_type = CPUIO_OP_CMD_ENQ_TO_HEAD; 311962306a36Sopenharmony_ci ctrl_para.start_pktid = pkt_id; 312062306a36Sopenharmony_ci ctrl_para.end_pktid = pkt_id; 312162306a36Sopenharmony_ci ctrl_para.pkt_num = 1; /* start from 0 */ 312262306a36Sopenharmony_ci ctrl_para.dst_pid = WDE_DLE_PORT_ID_WDRLS; 312362306a36Sopenharmony_ci ctrl_para.dst_qid = WDE_DLE_QUEID_NO_REPORT; 312462306a36Sopenharmony_ci 312562306a36Sopenharmony_ci if (rtw89_mac_set_cpuio(rtwdev, &ctrl_para, true)) 312662306a36Sopenharmony_ci return -EFAULT; 312762306a36Sopenharmony_ci 312862306a36Sopenharmony_ci return 0; 312962306a36Sopenharmony_ci} 313062306a36Sopenharmony_ci 313162306a36Sopenharmony_cistatic int 313262306a36Sopenharmony_cirtw89_debug_priv_fw_crash_get(struct seq_file *m, void *v) 313362306a36Sopenharmony_ci{ 313462306a36Sopenharmony_ci struct rtw89_debugfs_priv *debugfs_priv = m->private; 313562306a36Sopenharmony_ci struct rtw89_dev *rtwdev = debugfs_priv->rtwdev; 313662306a36Sopenharmony_ci 313762306a36Sopenharmony_ci seq_printf(m, "%d\n", 313862306a36Sopenharmony_ci test_bit(RTW89_FLAG_CRASH_SIMULATING, rtwdev->flags)); 313962306a36Sopenharmony_ci return 0; 314062306a36Sopenharmony_ci} 314162306a36Sopenharmony_ci 314262306a36Sopenharmony_cienum rtw89_dbg_crash_simulation_type { 314362306a36Sopenharmony_ci RTW89_DBG_SIM_CPU_EXCEPTION = 1, 314462306a36Sopenharmony_ci RTW89_DBG_SIM_CTRL_ERROR = 2, 314562306a36Sopenharmony_ci}; 314662306a36Sopenharmony_ci 314762306a36Sopenharmony_cistatic ssize_t 314862306a36Sopenharmony_cirtw89_debug_priv_fw_crash_set(struct file *filp, const char __user *user_buf, 314962306a36Sopenharmony_ci size_t count, loff_t *loff) 315062306a36Sopenharmony_ci{ 315162306a36Sopenharmony_ci struct seq_file *m = (struct seq_file *)filp->private_data; 315262306a36Sopenharmony_ci struct rtw89_debugfs_priv *debugfs_priv = m->private; 315362306a36Sopenharmony_ci struct rtw89_dev *rtwdev = debugfs_priv->rtwdev; 315462306a36Sopenharmony_ci int (*sim)(struct rtw89_dev *rtwdev); 315562306a36Sopenharmony_ci u8 crash_type; 315662306a36Sopenharmony_ci int ret; 315762306a36Sopenharmony_ci 315862306a36Sopenharmony_ci ret = kstrtou8_from_user(user_buf, count, 0, &crash_type); 315962306a36Sopenharmony_ci if (ret) 316062306a36Sopenharmony_ci return -EINVAL; 316162306a36Sopenharmony_ci 316262306a36Sopenharmony_ci switch (crash_type) { 316362306a36Sopenharmony_ci case RTW89_DBG_SIM_CPU_EXCEPTION: 316462306a36Sopenharmony_ci if (!RTW89_CHK_FW_FEATURE(CRASH_TRIGGER, &rtwdev->fw)) 316562306a36Sopenharmony_ci return -EOPNOTSUPP; 316662306a36Sopenharmony_ci sim = rtw89_fw_h2c_trigger_cpu_exception; 316762306a36Sopenharmony_ci break; 316862306a36Sopenharmony_ci case RTW89_DBG_SIM_CTRL_ERROR: 316962306a36Sopenharmony_ci sim = rtw89_dbg_trigger_ctrl_error; 317062306a36Sopenharmony_ci break; 317162306a36Sopenharmony_ci default: 317262306a36Sopenharmony_ci return -EINVAL; 317362306a36Sopenharmony_ci } 317462306a36Sopenharmony_ci 317562306a36Sopenharmony_ci mutex_lock(&rtwdev->mutex); 317662306a36Sopenharmony_ci set_bit(RTW89_FLAG_CRASH_SIMULATING, rtwdev->flags); 317762306a36Sopenharmony_ci ret = sim(rtwdev); 317862306a36Sopenharmony_ci mutex_unlock(&rtwdev->mutex); 317962306a36Sopenharmony_ci 318062306a36Sopenharmony_ci if (ret) 318162306a36Sopenharmony_ci return ret; 318262306a36Sopenharmony_ci 318362306a36Sopenharmony_ci return count; 318462306a36Sopenharmony_ci} 318562306a36Sopenharmony_ci 318662306a36Sopenharmony_cistatic int rtw89_debug_priv_btc_info_get(struct seq_file *m, void *v) 318762306a36Sopenharmony_ci{ 318862306a36Sopenharmony_ci struct rtw89_debugfs_priv *debugfs_priv = m->private; 318962306a36Sopenharmony_ci struct rtw89_dev *rtwdev = debugfs_priv->rtwdev; 319062306a36Sopenharmony_ci 319162306a36Sopenharmony_ci rtw89_btc_dump_info(rtwdev, m); 319262306a36Sopenharmony_ci 319362306a36Sopenharmony_ci return 0; 319462306a36Sopenharmony_ci} 319562306a36Sopenharmony_ci 319662306a36Sopenharmony_cistatic ssize_t rtw89_debug_priv_btc_manual_set(struct file *filp, 319762306a36Sopenharmony_ci const char __user *user_buf, 319862306a36Sopenharmony_ci size_t count, loff_t *loff) 319962306a36Sopenharmony_ci{ 320062306a36Sopenharmony_ci struct rtw89_debugfs_priv *debugfs_priv = filp->private_data; 320162306a36Sopenharmony_ci struct rtw89_dev *rtwdev = debugfs_priv->rtwdev; 320262306a36Sopenharmony_ci struct rtw89_btc *btc = &rtwdev->btc; 320362306a36Sopenharmony_ci bool btc_manual; 320462306a36Sopenharmony_ci int ret; 320562306a36Sopenharmony_ci 320662306a36Sopenharmony_ci ret = kstrtobool_from_user(user_buf, count, &btc_manual); 320762306a36Sopenharmony_ci if (ret) 320862306a36Sopenharmony_ci return ret; 320962306a36Sopenharmony_ci 321062306a36Sopenharmony_ci btc->ctrl.manual = btc_manual; 321162306a36Sopenharmony_ci 321262306a36Sopenharmony_ci return count; 321362306a36Sopenharmony_ci} 321462306a36Sopenharmony_ci 321562306a36Sopenharmony_cistatic ssize_t rtw89_debug_fw_log_manual_set(struct file *filp, 321662306a36Sopenharmony_ci const char __user *user_buf, 321762306a36Sopenharmony_ci size_t count, loff_t *loff) 321862306a36Sopenharmony_ci{ 321962306a36Sopenharmony_ci struct rtw89_debugfs_priv *debugfs_priv = filp->private_data; 322062306a36Sopenharmony_ci struct rtw89_dev *rtwdev = debugfs_priv->rtwdev; 322162306a36Sopenharmony_ci struct rtw89_fw_log *log = &rtwdev->fw.log; 322262306a36Sopenharmony_ci bool fw_log_manual; 322362306a36Sopenharmony_ci 322462306a36Sopenharmony_ci if (kstrtobool_from_user(user_buf, count, &fw_log_manual)) 322562306a36Sopenharmony_ci goto out; 322662306a36Sopenharmony_ci 322762306a36Sopenharmony_ci mutex_lock(&rtwdev->mutex); 322862306a36Sopenharmony_ci log->enable = fw_log_manual; 322962306a36Sopenharmony_ci if (log->enable) 323062306a36Sopenharmony_ci rtw89_fw_log_prepare(rtwdev); 323162306a36Sopenharmony_ci rtw89_fw_h2c_fw_log(rtwdev, fw_log_manual); 323262306a36Sopenharmony_ci mutex_unlock(&rtwdev->mutex); 323362306a36Sopenharmony_ciout: 323462306a36Sopenharmony_ci return count; 323562306a36Sopenharmony_ci} 323662306a36Sopenharmony_ci 323762306a36Sopenharmony_cistatic void rtw89_sta_info_get_iter(void *data, struct ieee80211_sta *sta) 323862306a36Sopenharmony_ci{ 323962306a36Sopenharmony_ci static const char * const he_gi_str[] = { 324062306a36Sopenharmony_ci [NL80211_RATE_INFO_HE_GI_0_8] = "0.8", 324162306a36Sopenharmony_ci [NL80211_RATE_INFO_HE_GI_1_6] = "1.6", 324262306a36Sopenharmony_ci [NL80211_RATE_INFO_HE_GI_3_2] = "3.2", 324362306a36Sopenharmony_ci }; 324462306a36Sopenharmony_ci struct rtw89_sta *rtwsta = (struct rtw89_sta *)sta->drv_priv; 324562306a36Sopenharmony_ci struct rate_info *rate = &rtwsta->ra_report.txrate; 324662306a36Sopenharmony_ci struct ieee80211_rx_status *status = &rtwsta->rx_status; 324762306a36Sopenharmony_ci struct seq_file *m = (struct seq_file *)data; 324862306a36Sopenharmony_ci struct rtw89_dev *rtwdev = rtwsta->rtwdev; 324962306a36Sopenharmony_ci struct rtw89_hal *hal = &rtwdev->hal; 325062306a36Sopenharmony_ci u8 ant_num = hal->ant_diversity ? 2 : rtwdev->chip->rf_path_num; 325162306a36Sopenharmony_ci bool ant_asterisk = hal->tx_path_diversity || hal->ant_diversity; 325262306a36Sopenharmony_ci u8 evm_min, evm_max; 325362306a36Sopenharmony_ci u8 rssi; 325462306a36Sopenharmony_ci u8 snr; 325562306a36Sopenharmony_ci int i; 325662306a36Sopenharmony_ci 325762306a36Sopenharmony_ci seq_printf(m, "TX rate [%d]: ", rtwsta->mac_id); 325862306a36Sopenharmony_ci 325962306a36Sopenharmony_ci if (rate->flags & RATE_INFO_FLAGS_MCS) 326062306a36Sopenharmony_ci seq_printf(m, "HT MCS-%d%s", rate->mcs, 326162306a36Sopenharmony_ci rate->flags & RATE_INFO_FLAGS_SHORT_GI ? " SGI" : ""); 326262306a36Sopenharmony_ci else if (rate->flags & RATE_INFO_FLAGS_VHT_MCS) 326362306a36Sopenharmony_ci seq_printf(m, "VHT %dSS MCS-%d%s", rate->nss, rate->mcs, 326462306a36Sopenharmony_ci rate->flags & RATE_INFO_FLAGS_SHORT_GI ? " SGI" : ""); 326562306a36Sopenharmony_ci else if (rate->flags & RATE_INFO_FLAGS_HE_MCS) 326662306a36Sopenharmony_ci seq_printf(m, "HE %dSS MCS-%d GI:%s", rate->nss, rate->mcs, 326762306a36Sopenharmony_ci rate->he_gi <= NL80211_RATE_INFO_HE_GI_3_2 ? 326862306a36Sopenharmony_ci he_gi_str[rate->he_gi] : "N/A"); 326962306a36Sopenharmony_ci else 327062306a36Sopenharmony_ci seq_printf(m, "Legacy %d", rate->legacy); 327162306a36Sopenharmony_ci seq_printf(m, "%s", rtwsta->ra_report.might_fallback_legacy ? " FB_G" : ""); 327262306a36Sopenharmony_ci seq_printf(m, " BW:%u", rtw89_rate_info_bw_to_mhz(rate->bw)); 327362306a36Sopenharmony_ci seq_printf(m, "\t(hw_rate=0x%x)", rtwsta->ra_report.hw_rate); 327462306a36Sopenharmony_ci seq_printf(m, "\t==> agg_wait=%d (%d)\n", rtwsta->max_agg_wait, 327562306a36Sopenharmony_ci sta->deflink.agg.max_rc_amsdu_len); 327662306a36Sopenharmony_ci 327762306a36Sopenharmony_ci seq_printf(m, "RX rate [%d]: ", rtwsta->mac_id); 327862306a36Sopenharmony_ci 327962306a36Sopenharmony_ci switch (status->encoding) { 328062306a36Sopenharmony_ci case RX_ENC_LEGACY: 328162306a36Sopenharmony_ci seq_printf(m, "Legacy %d", status->rate_idx + 328262306a36Sopenharmony_ci (status->band != NL80211_BAND_2GHZ ? 4 : 0)); 328362306a36Sopenharmony_ci break; 328462306a36Sopenharmony_ci case RX_ENC_HT: 328562306a36Sopenharmony_ci seq_printf(m, "HT MCS-%d%s", status->rate_idx, 328662306a36Sopenharmony_ci status->enc_flags & RX_ENC_FLAG_SHORT_GI ? " SGI" : ""); 328762306a36Sopenharmony_ci break; 328862306a36Sopenharmony_ci case RX_ENC_VHT: 328962306a36Sopenharmony_ci seq_printf(m, "VHT %dSS MCS-%d%s", status->nss, status->rate_idx, 329062306a36Sopenharmony_ci status->enc_flags & RX_ENC_FLAG_SHORT_GI ? " SGI" : ""); 329162306a36Sopenharmony_ci break; 329262306a36Sopenharmony_ci case RX_ENC_HE: 329362306a36Sopenharmony_ci seq_printf(m, "HE %dSS MCS-%d GI:%s", status->nss, status->rate_idx, 329462306a36Sopenharmony_ci status->he_gi <= NL80211_RATE_INFO_HE_GI_3_2 ? 329562306a36Sopenharmony_ci he_gi_str[rate->he_gi] : "N/A"); 329662306a36Sopenharmony_ci break; 329762306a36Sopenharmony_ci } 329862306a36Sopenharmony_ci seq_printf(m, " BW:%u", rtw89_rate_info_bw_to_mhz(status->bw)); 329962306a36Sopenharmony_ci seq_printf(m, "\t(hw_rate=0x%x)\n", rtwsta->rx_hw_rate); 330062306a36Sopenharmony_ci 330162306a36Sopenharmony_ci rssi = ewma_rssi_read(&rtwsta->avg_rssi); 330262306a36Sopenharmony_ci seq_printf(m, "RSSI: %d dBm (raw=%d, prev=%d) [", 330362306a36Sopenharmony_ci RTW89_RSSI_RAW_TO_DBM(rssi), rssi, rtwsta->prev_rssi); 330462306a36Sopenharmony_ci for (i = 0; i < ant_num; i++) { 330562306a36Sopenharmony_ci rssi = ewma_rssi_read(&rtwsta->rssi[i]); 330662306a36Sopenharmony_ci seq_printf(m, "%d%s%s", RTW89_RSSI_RAW_TO_DBM(rssi), 330762306a36Sopenharmony_ci ant_asterisk && (hal->antenna_tx & BIT(i)) ? "*" : "", 330862306a36Sopenharmony_ci i + 1 == ant_num ? "" : ", "); 330962306a36Sopenharmony_ci } 331062306a36Sopenharmony_ci seq_puts(m, "]\n"); 331162306a36Sopenharmony_ci 331262306a36Sopenharmony_ci seq_puts(m, "EVM: ["); 331362306a36Sopenharmony_ci for (i = 0; i < (hal->ant_diversity ? 2 : 1); i++) { 331462306a36Sopenharmony_ci evm_min = ewma_evm_read(&rtwsta->evm_min[i]); 331562306a36Sopenharmony_ci evm_max = ewma_evm_read(&rtwsta->evm_max[i]); 331662306a36Sopenharmony_ci 331762306a36Sopenharmony_ci seq_printf(m, "%s(%2u.%02u, %2u.%02u)", i == 0 ? "" : " ", 331862306a36Sopenharmony_ci evm_min >> 2, (evm_min & 0x3) * 25, 331962306a36Sopenharmony_ci evm_max >> 2, (evm_max & 0x3) * 25); 332062306a36Sopenharmony_ci } 332162306a36Sopenharmony_ci seq_puts(m, "]\t"); 332262306a36Sopenharmony_ci 332362306a36Sopenharmony_ci snr = ewma_snr_read(&rtwsta->avg_snr); 332462306a36Sopenharmony_ci seq_printf(m, "SNR: %u\n", snr); 332562306a36Sopenharmony_ci} 332662306a36Sopenharmony_ci 332762306a36Sopenharmony_cistatic void 332862306a36Sopenharmony_cirtw89_debug_append_rx_rate(struct seq_file *m, struct rtw89_pkt_stat *pkt_stat, 332962306a36Sopenharmony_ci enum rtw89_hw_rate first_rate, int len) 333062306a36Sopenharmony_ci{ 333162306a36Sopenharmony_ci int i; 333262306a36Sopenharmony_ci 333362306a36Sopenharmony_ci for (i = 0; i < len; i++) 333462306a36Sopenharmony_ci seq_printf(m, "%s%u", i == 0 ? "" : ", ", 333562306a36Sopenharmony_ci pkt_stat->rx_rate_cnt[first_rate + i]); 333662306a36Sopenharmony_ci} 333762306a36Sopenharmony_ci 333862306a36Sopenharmony_ci#define FIRST_RATE_SAME(rate) {RTW89_HW_RATE_ ## rate, RTW89_HW_RATE_ ## rate} 333962306a36Sopenharmony_ci#define FIRST_RATE_ENUM(rate) {RTW89_HW_RATE_ ## rate, RTW89_HW_RATE_V1_ ## rate} 334062306a36Sopenharmony_ci#define FIRST_RATE_GEV1(rate) {RTW89_HW_RATE_INVAL, RTW89_HW_RATE_V1_ ## rate} 334162306a36Sopenharmony_ci 334262306a36Sopenharmony_cistatic const struct rtw89_rx_rate_cnt_info { 334362306a36Sopenharmony_ci enum rtw89_hw_rate first_rate[RTW89_CHIP_GEN_NUM]; 334462306a36Sopenharmony_ci int len; 334562306a36Sopenharmony_ci int ext; 334662306a36Sopenharmony_ci const char *rate_mode; 334762306a36Sopenharmony_ci} rtw89_rx_rate_cnt_infos[] = { 334862306a36Sopenharmony_ci {FIRST_RATE_SAME(CCK1), 4, 0, "Legacy:"}, 334962306a36Sopenharmony_ci {FIRST_RATE_SAME(OFDM6), 8, 0, "OFDM:"}, 335062306a36Sopenharmony_ci {FIRST_RATE_ENUM(MCS0), 8, 0, "HT 0:"}, 335162306a36Sopenharmony_ci {FIRST_RATE_ENUM(MCS8), 8, 0, "HT 1:"}, 335262306a36Sopenharmony_ci {FIRST_RATE_ENUM(VHT_NSS1_MCS0), 10, 2, "VHT 1SS:"}, 335362306a36Sopenharmony_ci {FIRST_RATE_ENUM(VHT_NSS2_MCS0), 10, 2, "VHT 2SS:"}, 335462306a36Sopenharmony_ci {FIRST_RATE_ENUM(HE_NSS1_MCS0), 12, 0, "HE 1SS:"}, 335562306a36Sopenharmony_ci {FIRST_RATE_ENUM(HE_NSS2_MCS0), 12, 0, "HE 2SS:"}, 335662306a36Sopenharmony_ci {FIRST_RATE_GEV1(EHT_NSS1_MCS0), 14, 2, "EHT 1SS:"}, 335762306a36Sopenharmony_ci {FIRST_RATE_GEV1(EHT_NSS2_MCS0), 14, 0, "EHT 2SS:"}, 335862306a36Sopenharmony_ci}; 335962306a36Sopenharmony_ci 336062306a36Sopenharmony_cistatic int rtw89_debug_priv_phy_info_get(struct seq_file *m, void *v) 336162306a36Sopenharmony_ci{ 336262306a36Sopenharmony_ci struct rtw89_debugfs_priv *debugfs_priv = m->private; 336362306a36Sopenharmony_ci struct rtw89_dev *rtwdev = debugfs_priv->rtwdev; 336462306a36Sopenharmony_ci struct rtw89_traffic_stats *stats = &rtwdev->stats; 336562306a36Sopenharmony_ci struct rtw89_pkt_stat *pkt_stat = &rtwdev->phystat.last_pkt_stat; 336662306a36Sopenharmony_ci const struct rtw89_chip_info *chip = rtwdev->chip; 336762306a36Sopenharmony_ci const struct rtw89_rx_rate_cnt_info *info; 336862306a36Sopenharmony_ci enum rtw89_hw_rate first_rate; 336962306a36Sopenharmony_ci int i; 337062306a36Sopenharmony_ci 337162306a36Sopenharmony_ci seq_printf(m, "TP TX: %u [%u] Mbps (lv: %d), RX: %u [%u] Mbps (lv: %d)\n", 337262306a36Sopenharmony_ci stats->tx_throughput, stats->tx_throughput_raw, stats->tx_tfc_lv, 337362306a36Sopenharmony_ci stats->rx_throughput, stats->rx_throughput_raw, stats->rx_tfc_lv); 337462306a36Sopenharmony_ci seq_printf(m, "Beacon: %u, TF: %u\n", pkt_stat->beacon_nr, 337562306a36Sopenharmony_ci stats->rx_tf_periodic); 337662306a36Sopenharmony_ci seq_printf(m, "Avg packet length: TX=%u, RX=%u\n", stats->tx_avg_len, 337762306a36Sopenharmony_ci stats->rx_avg_len); 337862306a36Sopenharmony_ci 337962306a36Sopenharmony_ci seq_puts(m, "RX count:\n"); 338062306a36Sopenharmony_ci 338162306a36Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(rtw89_rx_rate_cnt_infos); i++) { 338262306a36Sopenharmony_ci info = &rtw89_rx_rate_cnt_infos[i]; 338362306a36Sopenharmony_ci first_rate = info->first_rate[chip->chip_gen]; 338462306a36Sopenharmony_ci if (first_rate >= RTW89_HW_RATE_NR) 338562306a36Sopenharmony_ci continue; 338662306a36Sopenharmony_ci 338762306a36Sopenharmony_ci seq_printf(m, "%10s [", info->rate_mode); 338862306a36Sopenharmony_ci rtw89_debug_append_rx_rate(m, pkt_stat, 338962306a36Sopenharmony_ci first_rate, info->len); 339062306a36Sopenharmony_ci if (info->ext) { 339162306a36Sopenharmony_ci seq_puts(m, "]["); 339262306a36Sopenharmony_ci rtw89_debug_append_rx_rate(m, pkt_stat, 339362306a36Sopenharmony_ci first_rate + info->len, info->ext); 339462306a36Sopenharmony_ci } 339562306a36Sopenharmony_ci seq_puts(m, "]\n"); 339662306a36Sopenharmony_ci } 339762306a36Sopenharmony_ci 339862306a36Sopenharmony_ci ieee80211_iterate_stations_atomic(rtwdev->hw, rtw89_sta_info_get_iter, m); 339962306a36Sopenharmony_ci 340062306a36Sopenharmony_ci return 0; 340162306a36Sopenharmony_ci} 340262306a36Sopenharmony_ci 340362306a36Sopenharmony_cistatic void rtw89_dump_addr_cam(struct seq_file *m, 340462306a36Sopenharmony_ci struct rtw89_addr_cam_entry *addr_cam) 340562306a36Sopenharmony_ci{ 340662306a36Sopenharmony_ci struct rtw89_sec_cam_entry *sec_entry; 340762306a36Sopenharmony_ci int i; 340862306a36Sopenharmony_ci 340962306a36Sopenharmony_ci seq_printf(m, "\taddr_cam_idx=%u\n", addr_cam->addr_cam_idx); 341062306a36Sopenharmony_ci seq_printf(m, "\t-> bssid_cam_idx=%u\n", addr_cam->bssid_cam_idx); 341162306a36Sopenharmony_ci seq_printf(m, "\tsec_cam_bitmap=%*ph\n", (int)sizeof(addr_cam->sec_cam_map), 341262306a36Sopenharmony_ci addr_cam->sec_cam_map); 341362306a36Sopenharmony_ci for (i = 0; i < RTW89_SEC_CAM_IN_ADDR_CAM; i++) { 341462306a36Sopenharmony_ci sec_entry = addr_cam->sec_entries[i]; 341562306a36Sopenharmony_ci if (!sec_entry) 341662306a36Sopenharmony_ci continue; 341762306a36Sopenharmony_ci seq_printf(m, "\tsec[%d]: sec_cam_idx %u", i, sec_entry->sec_cam_idx); 341862306a36Sopenharmony_ci if (sec_entry->ext_key) 341962306a36Sopenharmony_ci seq_printf(m, ", %u", sec_entry->sec_cam_idx + 1); 342062306a36Sopenharmony_ci seq_puts(m, "\n"); 342162306a36Sopenharmony_ci } 342262306a36Sopenharmony_ci} 342362306a36Sopenharmony_ci 342462306a36Sopenharmony_ci__printf(3, 4) 342562306a36Sopenharmony_cistatic void rtw89_dump_pkt_offload(struct seq_file *m, struct list_head *pkt_list, 342662306a36Sopenharmony_ci const char *fmt, ...) 342762306a36Sopenharmony_ci{ 342862306a36Sopenharmony_ci struct rtw89_pktofld_info *info; 342962306a36Sopenharmony_ci struct va_format vaf; 343062306a36Sopenharmony_ci va_list args; 343162306a36Sopenharmony_ci 343262306a36Sopenharmony_ci if (list_empty(pkt_list)) 343362306a36Sopenharmony_ci return; 343462306a36Sopenharmony_ci 343562306a36Sopenharmony_ci va_start(args, fmt); 343662306a36Sopenharmony_ci vaf.va = &args; 343762306a36Sopenharmony_ci vaf.fmt = fmt; 343862306a36Sopenharmony_ci 343962306a36Sopenharmony_ci seq_printf(m, "%pV", &vaf); 344062306a36Sopenharmony_ci 344162306a36Sopenharmony_ci va_end(args); 344262306a36Sopenharmony_ci 344362306a36Sopenharmony_ci list_for_each_entry(info, pkt_list, list) 344462306a36Sopenharmony_ci seq_printf(m, "%d ", info->id); 344562306a36Sopenharmony_ci 344662306a36Sopenharmony_ci seq_puts(m, "\n"); 344762306a36Sopenharmony_ci} 344862306a36Sopenharmony_ci 344962306a36Sopenharmony_cistatic 345062306a36Sopenharmony_civoid rtw89_vif_ids_get_iter(void *data, u8 *mac, struct ieee80211_vif *vif) 345162306a36Sopenharmony_ci{ 345262306a36Sopenharmony_ci struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv; 345362306a36Sopenharmony_ci struct seq_file *m = (struct seq_file *)data; 345462306a36Sopenharmony_ci struct rtw89_bssid_cam_entry *bssid_cam = &rtwvif->bssid_cam; 345562306a36Sopenharmony_ci 345662306a36Sopenharmony_ci seq_printf(m, "VIF [%d] %pM\n", rtwvif->mac_id, rtwvif->mac_addr); 345762306a36Sopenharmony_ci seq_printf(m, "\tbssid_cam_idx=%u\n", bssid_cam->bssid_cam_idx); 345862306a36Sopenharmony_ci rtw89_dump_addr_cam(m, &rtwvif->addr_cam); 345962306a36Sopenharmony_ci rtw89_dump_pkt_offload(m, &rtwvif->general_pkt_list, "\tpkt_ofld[GENERAL]: "); 346062306a36Sopenharmony_ci} 346162306a36Sopenharmony_ci 346262306a36Sopenharmony_cistatic void rtw89_dump_ba_cam(struct seq_file *m, struct rtw89_sta *rtwsta) 346362306a36Sopenharmony_ci{ 346462306a36Sopenharmony_ci struct rtw89_vif *rtwvif = rtwsta->rtwvif; 346562306a36Sopenharmony_ci struct rtw89_dev *rtwdev = rtwvif->rtwdev; 346662306a36Sopenharmony_ci struct rtw89_ba_cam_entry *entry; 346762306a36Sopenharmony_ci bool first = true; 346862306a36Sopenharmony_ci 346962306a36Sopenharmony_ci list_for_each_entry(entry, &rtwsta->ba_cam_list, list) { 347062306a36Sopenharmony_ci if (first) { 347162306a36Sopenharmony_ci seq_puts(m, "\tba_cam "); 347262306a36Sopenharmony_ci first = false; 347362306a36Sopenharmony_ci } else { 347462306a36Sopenharmony_ci seq_puts(m, ", "); 347562306a36Sopenharmony_ci } 347662306a36Sopenharmony_ci seq_printf(m, "tid[%u]=%d", entry->tid, 347762306a36Sopenharmony_ci (int)(entry - rtwdev->cam_info.ba_cam_entry)); 347862306a36Sopenharmony_ci } 347962306a36Sopenharmony_ci seq_puts(m, "\n"); 348062306a36Sopenharmony_ci} 348162306a36Sopenharmony_ci 348262306a36Sopenharmony_cistatic void rtw89_sta_ids_get_iter(void *data, struct ieee80211_sta *sta) 348362306a36Sopenharmony_ci{ 348462306a36Sopenharmony_ci struct rtw89_sta *rtwsta = (struct rtw89_sta *)sta->drv_priv; 348562306a36Sopenharmony_ci struct seq_file *m = (struct seq_file *)data; 348662306a36Sopenharmony_ci 348762306a36Sopenharmony_ci seq_printf(m, "STA [%d] %pM %s\n", rtwsta->mac_id, sta->addr, 348862306a36Sopenharmony_ci sta->tdls ? "(TDLS)" : ""); 348962306a36Sopenharmony_ci rtw89_dump_addr_cam(m, &rtwsta->addr_cam); 349062306a36Sopenharmony_ci rtw89_dump_ba_cam(m, rtwsta); 349162306a36Sopenharmony_ci} 349262306a36Sopenharmony_ci 349362306a36Sopenharmony_cistatic int rtw89_debug_priv_stations_get(struct seq_file *m, void *v) 349462306a36Sopenharmony_ci{ 349562306a36Sopenharmony_ci struct rtw89_debugfs_priv *debugfs_priv = m->private; 349662306a36Sopenharmony_ci struct rtw89_dev *rtwdev = debugfs_priv->rtwdev; 349762306a36Sopenharmony_ci struct rtw89_cam_info *cam_info = &rtwdev->cam_info; 349862306a36Sopenharmony_ci u8 idx; 349962306a36Sopenharmony_ci 350062306a36Sopenharmony_ci mutex_lock(&rtwdev->mutex); 350162306a36Sopenharmony_ci 350262306a36Sopenharmony_ci seq_puts(m, "map:\n"); 350362306a36Sopenharmony_ci seq_printf(m, "\tmac_id: %*ph\n", (int)sizeof(rtwdev->mac_id_map), 350462306a36Sopenharmony_ci rtwdev->mac_id_map); 350562306a36Sopenharmony_ci seq_printf(m, "\taddr_cam: %*ph\n", (int)sizeof(cam_info->addr_cam_map), 350662306a36Sopenharmony_ci cam_info->addr_cam_map); 350762306a36Sopenharmony_ci seq_printf(m, "\tbssid_cam: %*ph\n", (int)sizeof(cam_info->bssid_cam_map), 350862306a36Sopenharmony_ci cam_info->bssid_cam_map); 350962306a36Sopenharmony_ci seq_printf(m, "\tsec_cam: %*ph\n", (int)sizeof(cam_info->sec_cam_map), 351062306a36Sopenharmony_ci cam_info->sec_cam_map); 351162306a36Sopenharmony_ci seq_printf(m, "\tba_cam: %*ph\n", (int)sizeof(cam_info->ba_cam_map), 351262306a36Sopenharmony_ci cam_info->ba_cam_map); 351362306a36Sopenharmony_ci seq_printf(m, "\tpkt_ofld: %*ph\n", (int)sizeof(rtwdev->pkt_offload), 351462306a36Sopenharmony_ci rtwdev->pkt_offload); 351562306a36Sopenharmony_ci 351662306a36Sopenharmony_ci for (idx = NL80211_BAND_2GHZ; idx < NUM_NL80211_BANDS; idx++) { 351762306a36Sopenharmony_ci if (!(rtwdev->chip->support_bands & BIT(idx))) 351862306a36Sopenharmony_ci continue; 351962306a36Sopenharmony_ci rtw89_dump_pkt_offload(m, &rtwdev->scan_info.pkt_list[idx], 352062306a36Sopenharmony_ci "\t\t[SCAN %u]: ", idx); 352162306a36Sopenharmony_ci } 352262306a36Sopenharmony_ci 352362306a36Sopenharmony_ci ieee80211_iterate_active_interfaces_atomic(rtwdev->hw, 352462306a36Sopenharmony_ci IEEE80211_IFACE_ITER_NORMAL, rtw89_vif_ids_get_iter, m); 352562306a36Sopenharmony_ci 352662306a36Sopenharmony_ci ieee80211_iterate_stations_atomic(rtwdev->hw, rtw89_sta_ids_get_iter, m); 352762306a36Sopenharmony_ci 352862306a36Sopenharmony_ci mutex_unlock(&rtwdev->mutex); 352962306a36Sopenharmony_ci 353062306a36Sopenharmony_ci return 0; 353162306a36Sopenharmony_ci} 353262306a36Sopenharmony_ci 353362306a36Sopenharmony_cistatic struct rtw89_debugfs_priv rtw89_debug_priv_read_reg = { 353462306a36Sopenharmony_ci .cb_read = rtw89_debug_priv_read_reg_get, 353562306a36Sopenharmony_ci .cb_write = rtw89_debug_priv_read_reg_select, 353662306a36Sopenharmony_ci}; 353762306a36Sopenharmony_ci 353862306a36Sopenharmony_cistatic struct rtw89_debugfs_priv rtw89_debug_priv_write_reg = { 353962306a36Sopenharmony_ci .cb_write = rtw89_debug_priv_write_reg_set, 354062306a36Sopenharmony_ci}; 354162306a36Sopenharmony_ci 354262306a36Sopenharmony_cistatic struct rtw89_debugfs_priv rtw89_debug_priv_read_rf = { 354362306a36Sopenharmony_ci .cb_read = rtw89_debug_priv_read_rf_get, 354462306a36Sopenharmony_ci .cb_write = rtw89_debug_priv_read_rf_select, 354562306a36Sopenharmony_ci}; 354662306a36Sopenharmony_ci 354762306a36Sopenharmony_cistatic struct rtw89_debugfs_priv rtw89_debug_priv_write_rf = { 354862306a36Sopenharmony_ci .cb_write = rtw89_debug_priv_write_rf_set, 354962306a36Sopenharmony_ci}; 355062306a36Sopenharmony_ci 355162306a36Sopenharmony_cistatic struct rtw89_debugfs_priv rtw89_debug_priv_rf_reg_dump = { 355262306a36Sopenharmony_ci .cb_read = rtw89_debug_priv_rf_reg_dump_get, 355362306a36Sopenharmony_ci}; 355462306a36Sopenharmony_ci 355562306a36Sopenharmony_cistatic struct rtw89_debugfs_priv rtw89_debug_priv_txpwr_table = { 355662306a36Sopenharmony_ci .cb_read = rtw89_debug_priv_txpwr_table_get, 355762306a36Sopenharmony_ci}; 355862306a36Sopenharmony_ci 355962306a36Sopenharmony_cistatic struct rtw89_debugfs_priv rtw89_debug_priv_mac_reg_dump = { 356062306a36Sopenharmony_ci .cb_read = rtw89_debug_priv_mac_reg_dump_get, 356162306a36Sopenharmony_ci .cb_write = rtw89_debug_priv_mac_reg_dump_select, 356262306a36Sopenharmony_ci}; 356362306a36Sopenharmony_ci 356462306a36Sopenharmony_cistatic struct rtw89_debugfs_priv rtw89_debug_priv_mac_mem_dump = { 356562306a36Sopenharmony_ci .cb_read = rtw89_debug_priv_mac_mem_dump_get, 356662306a36Sopenharmony_ci .cb_write = rtw89_debug_priv_mac_mem_dump_select, 356762306a36Sopenharmony_ci}; 356862306a36Sopenharmony_ci 356962306a36Sopenharmony_cistatic struct rtw89_debugfs_priv rtw89_debug_priv_mac_dbg_port_dump = { 357062306a36Sopenharmony_ci .cb_read = rtw89_debug_priv_mac_dbg_port_dump_get, 357162306a36Sopenharmony_ci .cb_write = rtw89_debug_priv_mac_dbg_port_dump_select, 357262306a36Sopenharmony_ci}; 357362306a36Sopenharmony_ci 357462306a36Sopenharmony_cistatic struct rtw89_debugfs_priv rtw89_debug_priv_send_h2c = { 357562306a36Sopenharmony_ci .cb_write = rtw89_debug_priv_send_h2c_set, 357662306a36Sopenharmony_ci}; 357762306a36Sopenharmony_ci 357862306a36Sopenharmony_cistatic struct rtw89_debugfs_priv rtw89_debug_priv_early_h2c = { 357962306a36Sopenharmony_ci .cb_read = rtw89_debug_priv_early_h2c_get, 358062306a36Sopenharmony_ci .cb_write = rtw89_debug_priv_early_h2c_set, 358162306a36Sopenharmony_ci}; 358262306a36Sopenharmony_ci 358362306a36Sopenharmony_cistatic struct rtw89_debugfs_priv rtw89_debug_priv_fw_crash = { 358462306a36Sopenharmony_ci .cb_read = rtw89_debug_priv_fw_crash_get, 358562306a36Sopenharmony_ci .cb_write = rtw89_debug_priv_fw_crash_set, 358662306a36Sopenharmony_ci}; 358762306a36Sopenharmony_ci 358862306a36Sopenharmony_cistatic struct rtw89_debugfs_priv rtw89_debug_priv_btc_info = { 358962306a36Sopenharmony_ci .cb_read = rtw89_debug_priv_btc_info_get, 359062306a36Sopenharmony_ci}; 359162306a36Sopenharmony_ci 359262306a36Sopenharmony_cistatic struct rtw89_debugfs_priv rtw89_debug_priv_btc_manual = { 359362306a36Sopenharmony_ci .cb_write = rtw89_debug_priv_btc_manual_set, 359462306a36Sopenharmony_ci}; 359562306a36Sopenharmony_ci 359662306a36Sopenharmony_cistatic struct rtw89_debugfs_priv rtw89_debug_priv_fw_log_manual = { 359762306a36Sopenharmony_ci .cb_write = rtw89_debug_fw_log_manual_set, 359862306a36Sopenharmony_ci}; 359962306a36Sopenharmony_ci 360062306a36Sopenharmony_cistatic struct rtw89_debugfs_priv rtw89_debug_priv_phy_info = { 360162306a36Sopenharmony_ci .cb_read = rtw89_debug_priv_phy_info_get, 360262306a36Sopenharmony_ci}; 360362306a36Sopenharmony_ci 360462306a36Sopenharmony_cistatic struct rtw89_debugfs_priv rtw89_debug_priv_stations = { 360562306a36Sopenharmony_ci .cb_read = rtw89_debug_priv_stations_get, 360662306a36Sopenharmony_ci}; 360762306a36Sopenharmony_ci 360862306a36Sopenharmony_ci#define rtw89_debugfs_add(name, mode, fopname, parent) \ 360962306a36Sopenharmony_ci do { \ 361062306a36Sopenharmony_ci rtw89_debug_priv_ ##name.rtwdev = rtwdev; \ 361162306a36Sopenharmony_ci if (!debugfs_create_file(#name, mode, \ 361262306a36Sopenharmony_ci parent, &rtw89_debug_priv_ ##name, \ 361362306a36Sopenharmony_ci &file_ops_ ##fopname)) \ 361462306a36Sopenharmony_ci pr_debug("Unable to initialize debugfs:%s\n", #name); \ 361562306a36Sopenharmony_ci } while (0) 361662306a36Sopenharmony_ci 361762306a36Sopenharmony_ci#define rtw89_debugfs_add_w(name) \ 361862306a36Sopenharmony_ci rtw89_debugfs_add(name, S_IFREG | 0222, single_w, debugfs_topdir) 361962306a36Sopenharmony_ci#define rtw89_debugfs_add_rw(name) \ 362062306a36Sopenharmony_ci rtw89_debugfs_add(name, S_IFREG | 0666, common_rw, debugfs_topdir) 362162306a36Sopenharmony_ci#define rtw89_debugfs_add_r(name) \ 362262306a36Sopenharmony_ci rtw89_debugfs_add(name, S_IFREG | 0444, single_r, debugfs_topdir) 362362306a36Sopenharmony_ci 362462306a36Sopenharmony_civoid rtw89_debugfs_init(struct rtw89_dev *rtwdev) 362562306a36Sopenharmony_ci{ 362662306a36Sopenharmony_ci struct dentry *debugfs_topdir; 362762306a36Sopenharmony_ci 362862306a36Sopenharmony_ci debugfs_topdir = debugfs_create_dir("rtw89", 362962306a36Sopenharmony_ci rtwdev->hw->wiphy->debugfsdir); 363062306a36Sopenharmony_ci 363162306a36Sopenharmony_ci rtw89_debugfs_add_rw(read_reg); 363262306a36Sopenharmony_ci rtw89_debugfs_add_w(write_reg); 363362306a36Sopenharmony_ci rtw89_debugfs_add_rw(read_rf); 363462306a36Sopenharmony_ci rtw89_debugfs_add_w(write_rf); 363562306a36Sopenharmony_ci rtw89_debugfs_add_r(rf_reg_dump); 363662306a36Sopenharmony_ci rtw89_debugfs_add_r(txpwr_table); 363762306a36Sopenharmony_ci rtw89_debugfs_add_rw(mac_reg_dump); 363862306a36Sopenharmony_ci rtw89_debugfs_add_rw(mac_mem_dump); 363962306a36Sopenharmony_ci rtw89_debugfs_add_rw(mac_dbg_port_dump); 364062306a36Sopenharmony_ci rtw89_debugfs_add_w(send_h2c); 364162306a36Sopenharmony_ci rtw89_debugfs_add_rw(early_h2c); 364262306a36Sopenharmony_ci rtw89_debugfs_add_rw(fw_crash); 364362306a36Sopenharmony_ci rtw89_debugfs_add_r(btc_info); 364462306a36Sopenharmony_ci rtw89_debugfs_add_w(btc_manual); 364562306a36Sopenharmony_ci rtw89_debugfs_add_w(fw_log_manual); 364662306a36Sopenharmony_ci rtw89_debugfs_add_r(phy_info); 364762306a36Sopenharmony_ci rtw89_debugfs_add_r(stations); 364862306a36Sopenharmony_ci} 364962306a36Sopenharmony_ci#endif 365062306a36Sopenharmony_ci 365162306a36Sopenharmony_ci#ifdef CONFIG_RTW89_DEBUGMSG 365262306a36Sopenharmony_civoid __rtw89_debug(struct rtw89_dev *rtwdev, 365362306a36Sopenharmony_ci enum rtw89_debug_mask mask, 365462306a36Sopenharmony_ci const char *fmt, ...) 365562306a36Sopenharmony_ci{ 365662306a36Sopenharmony_ci struct va_format vaf = { 365762306a36Sopenharmony_ci .fmt = fmt, 365862306a36Sopenharmony_ci }; 365962306a36Sopenharmony_ci 366062306a36Sopenharmony_ci va_list args; 366162306a36Sopenharmony_ci 366262306a36Sopenharmony_ci va_start(args, fmt); 366362306a36Sopenharmony_ci vaf.va = &args; 366462306a36Sopenharmony_ci 366562306a36Sopenharmony_ci if (rtw89_debug_mask & mask) 366662306a36Sopenharmony_ci dev_printk(KERN_DEBUG, rtwdev->dev, "%pV", &vaf); 366762306a36Sopenharmony_ci 366862306a36Sopenharmony_ci va_end(args); 366962306a36Sopenharmony_ci} 367062306a36Sopenharmony_ciEXPORT_SYMBOL(__rtw89_debug); 367162306a36Sopenharmony_ci#endif 3672