Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
0002 /* Copyright(c) 2018-2019  Realtek Corporation
0003  */
0004 
0005 #include <linux/debugfs.h>
0006 #include <linux/seq_file.h>
0007 #include "main.h"
0008 #include "coex.h"
0009 #include "sec.h"
0010 #include "fw.h"
0011 #include "debug.h"
0012 #include "phy.h"
0013 #include "reg.h"
0014 #include "ps.h"
0015 #include "regd.h"
0016 
0017 #ifdef CONFIG_RTW88_DEBUGFS
0018 
0019 struct rtw_debugfs_priv {
0020     struct rtw_dev *rtwdev;
0021     int (*cb_read)(struct seq_file *m, void *v);
0022     ssize_t (*cb_write)(struct file *filp, const char __user *buffer,
0023                 size_t count, loff_t *loff);
0024     union {
0025         u32 cb_data;
0026         u8 *buf;
0027         struct {
0028             u32 page_offset;
0029             u32 page_num;
0030         } rsvd_page;
0031         struct {
0032             u8 rf_path;
0033             u32 rf_addr;
0034             u32 rf_mask;
0035         };
0036         struct {
0037             u32 addr;
0038             u32 len;
0039         } read_reg;
0040         struct {
0041             u8 bit;
0042         } dm_cap;
0043     };
0044 };
0045 
0046 static const char * const rtw_dm_cap_strs[] = {
0047     [RTW_DM_CAP_NA] = "NA",
0048     [RTW_DM_CAP_TXGAPK] = "TXGAPK",
0049 };
0050 
0051 static int rtw_debugfs_single_show(struct seq_file *m, void *v)
0052 {
0053     struct rtw_debugfs_priv *debugfs_priv = m->private;
0054 
0055     return debugfs_priv->cb_read(m, v);
0056 }
0057 
0058 static ssize_t rtw_debugfs_common_write(struct file *filp,
0059                     const char __user *buffer,
0060                     size_t count, loff_t *loff)
0061 {
0062     struct rtw_debugfs_priv *debugfs_priv = filp->private_data;
0063 
0064     return debugfs_priv->cb_write(filp, buffer, count, loff);
0065 }
0066 
0067 static ssize_t rtw_debugfs_single_write(struct file *filp,
0068                     const char __user *buffer,
0069                     size_t count, loff_t *loff)
0070 {
0071     struct seq_file *seqpriv = (struct seq_file *)filp->private_data;
0072     struct rtw_debugfs_priv *debugfs_priv = seqpriv->private;
0073 
0074     return debugfs_priv->cb_write(filp, buffer, count, loff);
0075 }
0076 
0077 static int rtw_debugfs_single_open_rw(struct inode *inode, struct file *filp)
0078 {
0079     return single_open(filp, rtw_debugfs_single_show, inode->i_private);
0080 }
0081 
0082 static int rtw_debugfs_close(struct inode *inode, struct file *filp)
0083 {
0084     return 0;
0085 }
0086 
0087 static const struct file_operations file_ops_single_r = {
0088     .owner = THIS_MODULE,
0089     .open = rtw_debugfs_single_open_rw,
0090     .read = seq_read,
0091     .llseek = seq_lseek,
0092     .release = single_release,
0093 };
0094 
0095 static const struct file_operations file_ops_single_rw = {
0096     .owner = THIS_MODULE,
0097     .open = rtw_debugfs_single_open_rw,
0098     .release = single_release,
0099     .read = seq_read,
0100     .llseek = seq_lseek,
0101     .write = rtw_debugfs_single_write,
0102 };
0103 
0104 static const struct file_operations file_ops_common_write = {
0105     .owner = THIS_MODULE,
0106     .write = rtw_debugfs_common_write,
0107     .open = simple_open,
0108     .release = rtw_debugfs_close,
0109 };
0110 
0111 static int rtw_debugfs_get_read_reg(struct seq_file *m, void *v)
0112 {
0113     struct rtw_debugfs_priv *debugfs_priv = m->private;
0114     struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
0115     u32 val, len, addr;
0116 
0117     len = debugfs_priv->read_reg.len;
0118     addr = debugfs_priv->read_reg.addr;
0119     switch (len) {
0120     case 1:
0121         val = rtw_read8(rtwdev, addr);
0122         seq_printf(m, "reg 0x%03x: 0x%02x\n", addr, val);
0123         break;
0124     case 2:
0125         val = rtw_read16(rtwdev, addr);
0126         seq_printf(m, "reg 0x%03x: 0x%04x\n", addr, val);
0127         break;
0128     case 4:
0129         val = rtw_read32(rtwdev, addr);
0130         seq_printf(m, "reg 0x%03x: 0x%08x\n", addr, val);
0131         break;
0132     }
0133     return 0;
0134 }
0135 
0136 static int rtw_debugfs_get_rf_read(struct seq_file *m, void *v)
0137 {
0138     struct rtw_debugfs_priv *debugfs_priv = m->private;
0139     struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
0140     u32 val, addr, mask;
0141     u8 path;
0142 
0143     path = debugfs_priv->rf_path;
0144     addr = debugfs_priv->rf_addr;
0145     mask = debugfs_priv->rf_mask;
0146 
0147     val = rtw_read_rf(rtwdev, path, addr, mask);
0148 
0149     seq_printf(m, "rf_read path:%d addr:0x%08x mask:0x%08x val=0x%08x\n",
0150            path, addr, mask, val);
0151 
0152     return 0;
0153 }
0154 
0155 static int rtw_debugfs_get_fix_rate(struct seq_file *m, void *v)
0156 {
0157     struct rtw_debugfs_priv *debugfs_priv = m->private;
0158     struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
0159     struct rtw_dm_info *dm_info = &rtwdev->dm_info;
0160     u8 fix_rate = dm_info->fix_rate;
0161 
0162     if (fix_rate >= DESC_RATE_MAX) {
0163         seq_printf(m, "Fix rate disabled, fix_rate = %u\n", fix_rate);
0164         return 0;
0165     }
0166 
0167     seq_printf(m, "Data frames fixed at desc rate %u\n", fix_rate);
0168     return 0;
0169 }
0170 
0171 static int rtw_debugfs_copy_from_user(char tmp[], int size,
0172                       const char __user *buffer, size_t count,
0173                       int num)
0174 {
0175     int tmp_len;
0176 
0177     memset(tmp, 0, size);
0178 
0179     if (count < num)
0180         return -EFAULT;
0181 
0182     tmp_len = (count > size - 1 ? size - 1 : count);
0183 
0184     if (!buffer || copy_from_user(tmp, buffer, tmp_len))
0185         return count;
0186 
0187     tmp[tmp_len] = '\0';
0188 
0189     return 0;
0190 }
0191 
0192 static ssize_t rtw_debugfs_set_read_reg(struct file *filp,
0193                     const char __user *buffer,
0194                     size_t count, loff_t *loff)
0195 {
0196     struct seq_file *seqpriv = (struct seq_file *)filp->private_data;
0197     struct rtw_debugfs_priv *debugfs_priv = seqpriv->private;
0198     struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
0199     char tmp[32 + 1];
0200     u32 addr, len;
0201     int num;
0202 
0203     rtw_debugfs_copy_from_user(tmp, sizeof(tmp), buffer, count, 2);
0204 
0205     num = sscanf(tmp, "%x %x", &addr, &len);
0206 
0207     if (num !=  2)
0208         return count;
0209 
0210     if (len != 1 && len != 2 && len != 4) {
0211         rtw_warn(rtwdev, "read reg setting wrong len\n");
0212         return -EINVAL;
0213     }
0214     debugfs_priv->read_reg.addr = addr;
0215     debugfs_priv->read_reg.len = len;
0216 
0217     return count;
0218 }
0219 
0220 static int rtw_debugfs_get_dump_cam(struct seq_file *m, void *v)
0221 {
0222     struct rtw_debugfs_priv *debugfs_priv = m->private;
0223     struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
0224     u32 val, command;
0225     u32 hw_key_idx = debugfs_priv->cb_data << RTW_SEC_CAM_ENTRY_SHIFT;
0226     u32 read_cmd = RTW_SEC_CMD_POLLING;
0227     int i;
0228 
0229     seq_printf(m, "cam entry%d\n", debugfs_priv->cb_data);
0230     seq_puts(m, "0x0      0x1      0x2     0x3     ");
0231     seq_puts(m, "0x4     0x5\n");
0232     mutex_lock(&rtwdev->mutex);
0233     for (i = 0; i <= 5; i++) {
0234         command = read_cmd | (hw_key_idx + i);
0235         rtw_write32(rtwdev, RTW_SEC_CMD_REG, command);
0236         val = rtw_read32(rtwdev, RTW_SEC_READ_REG);
0237         seq_printf(m, "%8.8x", val);
0238         if (i < 2)
0239             seq_puts(m, " ");
0240     }
0241     seq_puts(m, "\n");
0242     mutex_unlock(&rtwdev->mutex);
0243     return 0;
0244 }
0245 
0246 static int rtw_debugfs_get_rsvd_page(struct seq_file *m, void *v)
0247 {
0248     struct rtw_debugfs_priv *debugfs_priv = m->private;
0249     struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
0250     u8 page_size = rtwdev->chip->page_size;
0251     u32 buf_size = debugfs_priv->rsvd_page.page_num * page_size;
0252     u32 offset = debugfs_priv->rsvd_page.page_offset * page_size;
0253     u8 *buf;
0254     int i;
0255     int ret;
0256 
0257     buf = vzalloc(buf_size);
0258     if (!buf)
0259         return -ENOMEM;
0260 
0261     ret = rtw_fw_dump_fifo(rtwdev, RTW_FW_FIFO_SEL_RSVD_PAGE, offset,
0262                    buf_size, (u32 *)buf);
0263     if (ret) {
0264         rtw_err(rtwdev, "failed to dump rsvd page\n");
0265         vfree(buf);
0266         return ret;
0267     }
0268 
0269     for (i = 0 ; i < buf_size ; i += 8) {
0270         if (i % page_size == 0)
0271             seq_printf(m, "PAGE %d\n", (i + offset) / page_size);
0272         seq_printf(m, "%8ph\n", buf + i);
0273     }
0274     vfree(buf);
0275 
0276     return 0;
0277 }
0278 
0279 static ssize_t rtw_debugfs_set_rsvd_page(struct file *filp,
0280                      const char __user *buffer,
0281                      size_t count, loff_t *loff)
0282 {
0283     struct seq_file *seqpriv = (struct seq_file *)filp->private_data;
0284     struct rtw_debugfs_priv *debugfs_priv = seqpriv->private;
0285     struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
0286     char tmp[32 + 1];
0287     u32 offset, page_num;
0288     int num;
0289 
0290     rtw_debugfs_copy_from_user(tmp, sizeof(tmp), buffer, count, 2);
0291 
0292     num = sscanf(tmp, "%d %d", &offset, &page_num);
0293 
0294     if (num != 2) {
0295         rtw_warn(rtwdev, "invalid arguments\n");
0296         return -EINVAL;
0297     }
0298 
0299     debugfs_priv->rsvd_page.page_offset = offset;
0300     debugfs_priv->rsvd_page.page_num = page_num;
0301 
0302     return count;
0303 }
0304 
0305 static ssize_t rtw_debugfs_set_single_input(struct file *filp,
0306                         const char __user *buffer,
0307                         size_t count, loff_t *loff)
0308 {
0309     struct seq_file *seqpriv = (struct seq_file *)filp->private_data;
0310     struct rtw_debugfs_priv *debugfs_priv = seqpriv->private;
0311     struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
0312     char tmp[32 + 1];
0313     u32 input;
0314     int num;
0315 
0316     rtw_debugfs_copy_from_user(tmp, sizeof(tmp), buffer, count, 1);
0317 
0318     num = kstrtoint(tmp, 0, &input);
0319 
0320     if (num) {
0321         rtw_warn(rtwdev, "kstrtoint failed\n");
0322         return num;
0323     }
0324 
0325     debugfs_priv->cb_data = input;
0326 
0327     return count;
0328 }
0329 
0330 static ssize_t rtw_debugfs_set_write_reg(struct file *filp,
0331                      const char __user *buffer,
0332                      size_t count, loff_t *loff)
0333 {
0334     struct rtw_debugfs_priv *debugfs_priv = filp->private_data;
0335     struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
0336     char tmp[32 + 1];
0337     u32 addr, val, len;
0338     int num;
0339 
0340     rtw_debugfs_copy_from_user(tmp, sizeof(tmp), buffer, count, 3);
0341 
0342     /* write BB/MAC register */
0343     num = sscanf(tmp, "%x %x %x", &addr, &val, &len);
0344 
0345     if (num !=  3)
0346         return count;
0347 
0348     switch (len) {
0349     case 1:
0350         rtw_dbg(rtwdev, RTW_DBG_DEBUGFS,
0351             "reg write8 0x%03x: 0x%08x\n", addr, val);
0352         rtw_write8(rtwdev, addr, (u8)val);
0353         break;
0354     case 2:
0355         rtw_dbg(rtwdev, RTW_DBG_DEBUGFS,
0356             "reg write16 0x%03x: 0x%08x\n", addr, val);
0357         rtw_write16(rtwdev, addr, (u16)val);
0358         break;
0359     case 4:
0360         rtw_dbg(rtwdev, RTW_DBG_DEBUGFS,
0361             "reg write32 0x%03x: 0x%08x\n", addr, val);
0362         rtw_write32(rtwdev, addr, (u32)val);
0363         break;
0364     default:
0365         rtw_dbg(rtwdev, RTW_DBG_DEBUGFS,
0366             "error write length = %d\n", len);
0367         break;
0368     }
0369 
0370     return count;
0371 }
0372 
0373 static ssize_t rtw_debugfs_set_h2c(struct file *filp,
0374                    const char __user *buffer,
0375                    size_t count, loff_t *loff)
0376 {
0377     struct rtw_debugfs_priv *debugfs_priv = filp->private_data;
0378     struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
0379     char tmp[32 + 1];
0380     u8 param[8];
0381     int num;
0382 
0383     rtw_debugfs_copy_from_user(tmp, sizeof(tmp), buffer, count, 3);
0384 
0385     num = sscanf(tmp, "%hhx,%hhx,%hhx,%hhx,%hhx,%hhx,%hhx,%hhx",
0386              &param[0], &param[1], &param[2], &param[3],
0387              &param[4], &param[5], &param[6], &param[7]);
0388     if (num != 8) {
0389         rtw_warn(rtwdev, "invalid H2C command format for debug\n");
0390         return -EINVAL;
0391     }
0392 
0393     rtw_fw_h2c_cmd_dbg(rtwdev, param);
0394 
0395     return count;
0396 }
0397 
0398 static ssize_t rtw_debugfs_set_rf_write(struct file *filp,
0399                     const char __user *buffer,
0400                     size_t count, loff_t *loff)
0401 {
0402     struct rtw_debugfs_priv *debugfs_priv = filp->private_data;
0403     struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
0404     char tmp[32 + 1];
0405     u32 path, addr, mask, val;
0406     int num;
0407 
0408     rtw_debugfs_copy_from_user(tmp, sizeof(tmp), buffer, count, 4);
0409 
0410     num = sscanf(tmp, "%x %x %x %x", &path, &addr, &mask, &val);
0411 
0412     if (num !=  4) {
0413         rtw_warn(rtwdev, "invalid args, [path] [addr] [mask] [val]\n");
0414         return count;
0415     }
0416 
0417     rtw_write_rf(rtwdev, path, addr, mask, val);
0418     rtw_dbg(rtwdev, RTW_DBG_DEBUGFS,
0419         "write_rf path:%d addr:0x%08x mask:0x%08x, val:0x%08x\n",
0420         path, addr, mask, val);
0421 
0422     return count;
0423 }
0424 
0425 static ssize_t rtw_debugfs_set_rf_read(struct file *filp,
0426                        const char __user *buffer,
0427                        size_t count, loff_t *loff)
0428 {
0429     struct seq_file *seqpriv = (struct seq_file *)filp->private_data;
0430     struct rtw_debugfs_priv *debugfs_priv = seqpriv->private;
0431     struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
0432     char tmp[32 + 1];
0433     u32 path, addr, mask;
0434     int num;
0435 
0436     rtw_debugfs_copy_from_user(tmp, sizeof(tmp), buffer, count, 3);
0437 
0438     num = sscanf(tmp, "%x %x %x", &path, &addr, &mask);
0439 
0440     if (num !=  3) {
0441         rtw_warn(rtwdev, "invalid args, [path] [addr] [mask] [val]\n");
0442         return count;
0443     }
0444 
0445     debugfs_priv->rf_path = path;
0446     debugfs_priv->rf_addr = addr;
0447     debugfs_priv->rf_mask = mask;
0448 
0449     return count;
0450 }
0451 
0452 static ssize_t rtw_debugfs_set_fix_rate(struct file *filp,
0453                     const char __user *buffer,
0454                     size_t count, loff_t *loff)
0455 {
0456     struct seq_file *seqpriv = (struct seq_file *)filp->private_data;
0457     struct rtw_debugfs_priv *debugfs_priv = seqpriv->private;
0458     struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
0459     struct rtw_dm_info *dm_info = &rtwdev->dm_info;
0460     u8 fix_rate;
0461     char tmp[32 + 1];
0462     int ret;
0463 
0464     rtw_debugfs_copy_from_user(tmp, sizeof(tmp), buffer, count, 1);
0465 
0466     ret = kstrtou8(tmp, 0, &fix_rate);
0467     if (ret) {
0468         rtw_warn(rtwdev, "invalid args, [rate]\n");
0469         return ret;
0470     }
0471 
0472     dm_info->fix_rate = fix_rate;
0473 
0474     return count;
0475 }
0476 
0477 static int rtw_debug_get_mac_page(struct seq_file *m, void *v)
0478 {
0479     struct rtw_debugfs_priv *debugfs_priv = m->private;
0480     struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
0481     u32 page = debugfs_priv->cb_data;
0482     int i, n;
0483     int max = 0xff;
0484 
0485     rtw_read32(rtwdev, debugfs_priv->cb_data);
0486     for (n = 0; n <= max; ) {
0487         seq_printf(m, "\n%8.8x  ", n + page);
0488         for (i = 0; i < 4 && n <= max; i++, n += 4)
0489             seq_printf(m, "%8.8x    ",
0490                    rtw_read32(rtwdev, (page | n)));
0491     }
0492     seq_puts(m, "\n");
0493     return 0;
0494 }
0495 
0496 static int rtw_debug_get_bb_page(struct seq_file *m, void *v)
0497 {
0498     struct rtw_debugfs_priv *debugfs_priv = m->private;
0499     struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
0500     u32 page = debugfs_priv->cb_data;
0501     int i, n;
0502     int max = 0xff;
0503 
0504     rtw_read32(rtwdev, debugfs_priv->cb_data);
0505     for (n = 0; n <= max; ) {
0506         seq_printf(m, "\n%8.8x  ", n + page);
0507         for (i = 0; i < 4 && n <= max; i++, n += 4)
0508             seq_printf(m, "%8.8x    ",
0509                    rtw_read32(rtwdev, (page | n)));
0510     }
0511     seq_puts(m, "\n");
0512     return 0;
0513 }
0514 
0515 static int rtw_debug_get_rf_dump(struct seq_file *m, void *v)
0516 {
0517     struct rtw_debugfs_priv *debugfs_priv = m->private;
0518     struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
0519     u32 addr, offset, data;
0520     u8 path;
0521 
0522     for (path = 0; path < rtwdev->hal.rf_path_num; path++) {
0523         seq_printf(m, "RF path:%d\n", path);
0524         for (addr = 0; addr < 0x100; addr += 4) {
0525             seq_printf(m, "%8.8x  ", addr);
0526             for (offset = 0; offset < 4; offset++) {
0527                 data = rtw_read_rf(rtwdev, path, addr + offset,
0528                            0xffffffff);
0529                 seq_printf(m, "%8.8x    ", data);
0530             }
0531             seq_puts(m, "\n");
0532         }
0533         seq_puts(m, "\n");
0534     }
0535 
0536     return 0;
0537 }
0538 
0539 static void rtw_print_cck_rate_txt(struct seq_file *m, u8 rate)
0540 {
0541     static const char * const
0542     cck_rate[] = {"1M", "2M", "5.5M", "11M"};
0543     u8 idx = rate - DESC_RATE1M;
0544 
0545     seq_printf(m, " CCK_%-5s", cck_rate[idx]);
0546 }
0547 
0548 static void rtw_print_ofdm_rate_txt(struct seq_file *m, u8 rate)
0549 {
0550     static const char * const
0551     ofdm_rate[] = {"6M", "9M", "12M", "18M", "24M", "36M", "48M", "54M"};
0552     u8 idx = rate - DESC_RATE6M;
0553 
0554     seq_printf(m, " OFDM_%-4s", ofdm_rate[idx]);
0555 }
0556 
0557 static void rtw_print_ht_rate_txt(struct seq_file *m, u8 rate)
0558 {
0559     u8 mcs_n = rate - DESC_RATEMCS0;
0560 
0561     seq_printf(m, " MCS%-6u", mcs_n);
0562 }
0563 
0564 static void rtw_print_vht_rate_txt(struct seq_file *m, u8 rate)
0565 {
0566     u8 idx = rate - DESC_RATEVHT1SS_MCS0;
0567     u8 n_ss, mcs_n;
0568 
0569     /* n spatial stream */
0570     n_ss = 1 + idx / 10;
0571     /* MCS n */
0572     mcs_n = idx % 10;
0573     seq_printf(m, " VHT%uSMCS%u", n_ss, mcs_n);
0574 }
0575 
0576 static void rtw_print_rate(struct seq_file *m, u8 rate)
0577 {
0578     switch (rate) {
0579     case DESC_RATE1M...DESC_RATE11M:
0580         rtw_print_cck_rate_txt(m, rate);
0581         break;
0582     case DESC_RATE6M...DESC_RATE54M:
0583         rtw_print_ofdm_rate_txt(m, rate);
0584         break;
0585     case DESC_RATEMCS0...DESC_RATEMCS15:
0586         rtw_print_ht_rate_txt(m, rate);
0587         break;
0588     case DESC_RATEVHT1SS_MCS0...DESC_RATEVHT2SS_MCS9:
0589         rtw_print_vht_rate_txt(m, rate);
0590         break;
0591     default:
0592         seq_printf(m, " Unknown rate=0x%x\n", rate);
0593         break;
0594     }
0595 }
0596 
0597 #define case_REGD(src) \
0598     case RTW_REGD_##src: return #src
0599 
0600 static const char *rtw_get_regd_string(u8 regd)
0601 {
0602     switch (regd) {
0603     case_REGD(FCC);
0604     case_REGD(MKK);
0605     case_REGD(ETSI);
0606     case_REGD(IC);
0607     case_REGD(KCC);
0608     case_REGD(ACMA);
0609     case_REGD(CHILE);
0610     case_REGD(UKRAINE);
0611     case_REGD(MEXICO);
0612     case_REGD(CN);
0613     case_REGD(WW);
0614     default:
0615         return "Unknown";
0616     }
0617 }
0618 
0619 static int rtw_debugfs_get_tx_pwr_tbl(struct seq_file *m, void *v)
0620 {
0621     struct rtw_debugfs_priv *debugfs_priv = m->private;
0622     struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
0623     struct rtw_hal *hal = &rtwdev->hal;
0624     u8 path, rate;
0625     struct rtw_power_params pwr_param = {0};
0626     u8 bw = hal->current_band_width;
0627     u8 ch = hal->current_channel;
0628     u8 regd = rtw_regd_get(rtwdev);
0629 
0630     seq_printf(m, "channel: %u\n", ch);
0631     seq_printf(m, "bandwidth: %u\n", bw);
0632     seq_printf(m, "regulatory: %s\n", rtw_get_regd_string(regd));
0633     seq_printf(m, "%-4s %-10s %-9s %-9s (%-4s %-4s %-4s) %-4s\n",
0634            "path", "rate", "pwr", "base", "byr", "lmt", "sar", "rem");
0635 
0636     mutex_lock(&hal->tx_power_mutex);
0637     for (path = RF_PATH_A; path <= RF_PATH_B; path++) {
0638         /* there is no CCK rates used in 5G */
0639         if (hal->current_band_type == RTW_BAND_5G)
0640             rate = DESC_RATE6M;
0641         else
0642             rate = DESC_RATE1M;
0643 
0644         /* now, not support vht 3ss and vht 4ss*/
0645         for (; rate <= DESC_RATEVHT2SS_MCS9; rate++) {
0646             /* now, not support ht 3ss and ht 4ss*/
0647             if (rate > DESC_RATEMCS15 &&
0648                 rate < DESC_RATEVHT1SS_MCS0)
0649                 continue;
0650 
0651             rtw_get_tx_power_params(rtwdev, path, rate, bw,
0652                         ch, regd, &pwr_param);
0653 
0654             seq_printf(m, "%4c ", path + 'A');
0655             rtw_print_rate(m, rate);
0656             seq_printf(m, " %3u(0x%02x) %4u %4d (%4d %4d %4d) %4d\n",
0657                    hal->tx_pwr_tbl[path][rate],
0658                    hal->tx_pwr_tbl[path][rate],
0659                    pwr_param.pwr_base,
0660                    min3(pwr_param.pwr_offset,
0661                     pwr_param.pwr_limit,
0662                     pwr_param.pwr_sar),
0663                    pwr_param.pwr_offset, pwr_param.pwr_limit,
0664                    pwr_param.pwr_sar,
0665                    pwr_param.pwr_remnant);
0666         }
0667     }
0668 
0669     mutex_unlock(&hal->tx_power_mutex);
0670 
0671     return 0;
0672 }
0673 
0674 void rtw_debugfs_get_simple_phy_info(struct seq_file *m)
0675 {
0676     struct rtw_debugfs_priv *debugfs_priv = m->private;
0677     struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
0678     struct rtw_hal *hal = &rtwdev->hal;
0679     struct rtw_dm_info *dm_info = &rtwdev->dm_info;
0680     struct rtw_traffic_stats *stats = &rtwdev->stats;
0681 
0682     seq_printf(m, "%-40s = %ddBm/ %d\n", "RSSI/ STA Channel",
0683            dm_info->rssi[RF_PATH_A] - 100, hal->current_channel);
0684 
0685     seq_printf(m, "TP {Tx, Rx} = {%u, %u}Mbps\n",
0686            stats->tx_throughput, stats->rx_throughput);
0687 
0688     seq_puts(m, "[Tx Rate] = ");
0689     rtw_print_rate(m, dm_info->tx_rate);
0690     seq_printf(m, "(0x%x)\n", dm_info->tx_rate);
0691 
0692     seq_puts(m, "[Rx Rate] = ");
0693     rtw_print_rate(m, dm_info->curr_rx_rate);
0694     seq_printf(m, "(0x%x)\n", dm_info->curr_rx_rate);
0695 }
0696 
0697 static int rtw_debugfs_get_phy_info(struct seq_file *m, void *v)
0698 {
0699     struct rtw_debugfs_priv *debugfs_priv = m->private;
0700     struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
0701     struct rtw_dm_info *dm_info = &rtwdev->dm_info;
0702     struct rtw_traffic_stats *stats = &rtwdev->stats;
0703     struct rtw_pkt_count *last_cnt = &dm_info->last_pkt_count;
0704     struct rtw_efuse *efuse = &rtwdev->efuse;
0705     struct ewma_evm *ewma_evm = dm_info->ewma_evm;
0706     struct ewma_snr *ewma_snr = dm_info->ewma_snr;
0707     u8 ss, rate_id;
0708 
0709     seq_puts(m, "==========[Common Info]========\n");
0710     seq_printf(m, "Is link = %c\n", rtw_is_assoc(rtwdev) ? 'Y' : 'N');
0711     seq_printf(m, "Current CH(fc) = %u\n", rtwdev->hal.current_channel);
0712     seq_printf(m, "Current BW = %u\n", rtwdev->hal.current_band_width);
0713     seq_printf(m, "Current IGI = 0x%x\n", dm_info->igi_history[0]);
0714     seq_printf(m, "TP {Tx, Rx} = {%u, %u}Mbps\n",
0715            stats->tx_throughput, stats->rx_throughput);
0716     seq_printf(m, "1SS for TX and RX = %c\n\n", rtwdev->hal.txrx_1ss ?
0717            'Y' : 'N');
0718 
0719     seq_puts(m, "==========[Tx Phy Info]========\n");
0720     seq_puts(m, "[Tx Rate] = ");
0721     rtw_print_rate(m, dm_info->tx_rate);
0722     seq_printf(m, "(0x%x)\n\n", dm_info->tx_rate);
0723 
0724     seq_puts(m, "==========[Rx Phy Info]========\n");
0725     seq_printf(m, "[Rx Beacon Count] = %u\n", last_cnt->num_bcn_pkt);
0726     seq_puts(m, "[Rx Rate] = ");
0727     rtw_print_rate(m, dm_info->curr_rx_rate);
0728     seq_printf(m, "(0x%x)\n", dm_info->curr_rx_rate);
0729 
0730     seq_puts(m, "[Rx Rate Count]:\n");
0731     seq_printf(m, " * CCK = {%u, %u, %u, %u}\n",
0732            last_cnt->num_qry_pkt[DESC_RATE1M],
0733            last_cnt->num_qry_pkt[DESC_RATE2M],
0734            last_cnt->num_qry_pkt[DESC_RATE5_5M],
0735            last_cnt->num_qry_pkt[DESC_RATE11M]);
0736 
0737     seq_printf(m, " * OFDM = {%u, %u, %u, %u, %u, %u, %u, %u}\n",
0738            last_cnt->num_qry_pkt[DESC_RATE6M],
0739            last_cnt->num_qry_pkt[DESC_RATE9M],
0740            last_cnt->num_qry_pkt[DESC_RATE12M],
0741            last_cnt->num_qry_pkt[DESC_RATE18M],
0742            last_cnt->num_qry_pkt[DESC_RATE24M],
0743            last_cnt->num_qry_pkt[DESC_RATE36M],
0744            last_cnt->num_qry_pkt[DESC_RATE48M],
0745            last_cnt->num_qry_pkt[DESC_RATE54M]);
0746 
0747     for (ss = 0; ss < efuse->hw_cap.nss; ss++) {
0748         rate_id = DESC_RATEMCS0 + ss * 8;
0749         seq_printf(m, " * HT_MCS[%u:%u] = {%u, %u, %u, %u, %u, %u, %u, %u}\n",
0750                ss * 8, ss * 8 + 7,
0751                last_cnt->num_qry_pkt[rate_id],
0752                last_cnt->num_qry_pkt[rate_id + 1],
0753                last_cnt->num_qry_pkt[rate_id + 2],
0754                last_cnt->num_qry_pkt[rate_id + 3],
0755                last_cnt->num_qry_pkt[rate_id + 4],
0756                last_cnt->num_qry_pkt[rate_id + 5],
0757                last_cnt->num_qry_pkt[rate_id + 6],
0758                last_cnt->num_qry_pkt[rate_id + 7]);
0759     }
0760 
0761     for (ss = 0; ss < efuse->hw_cap.nss; ss++) {
0762         rate_id = DESC_RATEVHT1SS_MCS0 + ss * 10;
0763         seq_printf(m, " * VHT_MCS-%uss MCS[0:9] = {%u, %u, %u, %u, %u, %u, %u, %u, %u, %u}\n",
0764                ss + 1,
0765                last_cnt->num_qry_pkt[rate_id],
0766                last_cnt->num_qry_pkt[rate_id + 1],
0767                last_cnt->num_qry_pkt[rate_id + 2],
0768                last_cnt->num_qry_pkt[rate_id + 3],
0769                last_cnt->num_qry_pkt[rate_id + 4],
0770                last_cnt->num_qry_pkt[rate_id + 5],
0771                last_cnt->num_qry_pkt[rate_id + 6],
0772                last_cnt->num_qry_pkt[rate_id + 7],
0773                last_cnt->num_qry_pkt[rate_id + 8],
0774                last_cnt->num_qry_pkt[rate_id + 9]);
0775     }
0776 
0777     seq_printf(m, "[RSSI(dBm)] = {%d, %d}\n",
0778            dm_info->rssi[RF_PATH_A] - 100,
0779            dm_info->rssi[RF_PATH_B] - 100);
0780     seq_printf(m, "[Rx EVM(dB)] = {-%d, -%d}\n",
0781            dm_info->rx_evm_dbm[RF_PATH_A],
0782            dm_info->rx_evm_dbm[RF_PATH_B]);
0783     seq_printf(m, "[Rx SNR] = {%d, %d}\n",
0784            dm_info->rx_snr[RF_PATH_A],
0785            dm_info->rx_snr[RF_PATH_B]);
0786     seq_printf(m, "[CFO_tail(KHz)] = {%d, %d}\n",
0787            dm_info->cfo_tail[RF_PATH_A],
0788            dm_info->cfo_tail[RF_PATH_B]);
0789 
0790     if (dm_info->curr_rx_rate >= DESC_RATE11M) {
0791         seq_puts(m, "[Rx Average Status]:\n");
0792         seq_printf(m, " * OFDM, EVM: {-%d}, SNR: {%d}\n",
0793                (u8)ewma_evm_read(&ewma_evm[RTW_EVM_OFDM]),
0794                (u8)ewma_snr_read(&ewma_snr[RTW_SNR_OFDM_A]));
0795         seq_printf(m, " * 1SS, EVM: {-%d}, SNR: {%d}\n",
0796                (u8)ewma_evm_read(&ewma_evm[RTW_EVM_1SS]),
0797                (u8)ewma_snr_read(&ewma_snr[RTW_SNR_1SS_A]));
0798         seq_printf(m, " * 2SS, EVM: {-%d, -%d}, SNR: {%d, %d}\n",
0799                (u8)ewma_evm_read(&ewma_evm[RTW_EVM_2SS_A]),
0800                (u8)ewma_evm_read(&ewma_evm[RTW_EVM_2SS_B]),
0801                (u8)ewma_snr_read(&ewma_snr[RTW_SNR_2SS_A]),
0802                (u8)ewma_snr_read(&ewma_snr[RTW_SNR_2SS_B]));
0803     }
0804 
0805     seq_puts(m, "[Rx Counter]:\n");
0806     seq_printf(m, " * CCA (CCK, OFDM, Total) = (%u, %u, %u)\n",
0807            dm_info->cck_cca_cnt,
0808            dm_info->ofdm_cca_cnt,
0809            dm_info->total_cca_cnt);
0810     seq_printf(m, " * False Alarm (CCK, OFDM, Total) = (%u, %u, %u)\n",
0811            dm_info->cck_fa_cnt,
0812            dm_info->ofdm_fa_cnt,
0813            dm_info->total_fa_cnt);
0814     seq_printf(m, " * CCK cnt (ok, err) = (%u, %u)\n",
0815            dm_info->cck_ok_cnt, dm_info->cck_err_cnt);
0816     seq_printf(m, " * OFDM cnt (ok, err) = (%u, %u)\n",
0817            dm_info->ofdm_ok_cnt, dm_info->ofdm_err_cnt);
0818     seq_printf(m, " * HT cnt (ok, err) = (%u, %u)\n",
0819            dm_info->ht_ok_cnt, dm_info->ht_err_cnt);
0820     seq_printf(m, " * VHT cnt (ok, err) = (%u, %u)\n",
0821            dm_info->vht_ok_cnt, dm_info->vht_err_cnt);
0822 
0823     return 0;
0824 }
0825 
0826 static int rtw_debugfs_get_coex_info(struct seq_file *m, void *v)
0827 {
0828     struct rtw_debugfs_priv *debugfs_priv = m->private;
0829     struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
0830 
0831     rtw_coex_display_coex_info(rtwdev, m);
0832 
0833     return 0;
0834 }
0835 
0836 static ssize_t rtw_debugfs_set_coex_enable(struct file *filp,
0837                        const char __user *buffer,
0838                        size_t count, loff_t *loff)
0839 {
0840     struct seq_file *seqpriv = (struct seq_file *)filp->private_data;
0841     struct rtw_debugfs_priv *debugfs_priv = seqpriv->private;
0842     struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
0843     struct rtw_coex *coex = &rtwdev->coex;
0844     char tmp[32 + 1];
0845     bool enable;
0846     int ret;
0847 
0848     rtw_debugfs_copy_from_user(tmp, sizeof(tmp), buffer, count, 1);
0849 
0850     ret = kstrtobool(tmp, &enable);
0851     if (ret) {
0852         rtw_warn(rtwdev, "invalid arguments\n");
0853         return ret;
0854     }
0855 
0856     mutex_lock(&rtwdev->mutex);
0857     coex->manual_control = !enable;
0858     mutex_unlock(&rtwdev->mutex);
0859 
0860     return count;
0861 }
0862 
0863 static int rtw_debugfs_get_coex_enable(struct seq_file *m, void *v)
0864 {
0865     struct rtw_debugfs_priv *debugfs_priv = m->private;
0866     struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
0867     struct rtw_coex *coex = &rtwdev->coex;
0868 
0869     seq_printf(m, "coex mechanism %s\n",
0870            coex->manual_control ? "disabled" : "enabled");
0871 
0872     return 0;
0873 }
0874 
0875 static ssize_t rtw_debugfs_set_edcca_enable(struct file *filp,
0876                         const char __user *buffer,
0877                         size_t count, loff_t *loff)
0878 {
0879     struct seq_file *seqpriv = (struct seq_file *)filp->private_data;
0880     struct rtw_debugfs_priv *debugfs_priv = seqpriv->private;
0881     struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
0882     bool input;
0883     int err;
0884 
0885     err = kstrtobool_from_user(buffer, count, &input);
0886     if (err)
0887         return err;
0888 
0889     rtw_edcca_enabled = input;
0890     rtw_phy_adaptivity_set_mode(rtwdev);
0891 
0892     return count;
0893 }
0894 
0895 static int rtw_debugfs_get_edcca_enable(struct seq_file *m, void *v)
0896 {
0897     struct rtw_debugfs_priv *debugfs_priv = m->private;
0898     struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
0899     struct rtw_dm_info *dm_info = &rtwdev->dm_info;
0900 
0901     seq_printf(m, "EDCCA %s: EDCCA mode %d\n",
0902            rtw_edcca_enabled ? "enabled" : "disabled",
0903            dm_info->edcca_mode);
0904     return 0;
0905 }
0906 
0907 static ssize_t rtw_debugfs_set_fw_crash(struct file *filp,
0908                     const char __user *buffer,
0909                     size_t count, loff_t *loff)
0910 {
0911     struct seq_file *seqpriv = (struct seq_file *)filp->private_data;
0912     struct rtw_debugfs_priv *debugfs_priv = seqpriv->private;
0913     struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
0914     char tmp[32 + 1];
0915     bool input;
0916     int ret;
0917 
0918     rtw_debugfs_copy_from_user(tmp, sizeof(tmp), buffer, count, 1);
0919 
0920     ret = kstrtobool(tmp, &input);
0921     if (ret)
0922         return -EINVAL;
0923 
0924     if (!input)
0925         return -EINVAL;
0926 
0927     if (test_bit(RTW_FLAG_RESTARTING, rtwdev->flags))
0928         return -EINPROGRESS;
0929 
0930     mutex_lock(&rtwdev->mutex);
0931     rtw_leave_lps_deep(rtwdev);
0932     set_bit(RTW_FLAG_RESTART_TRIGGERING, rtwdev->flags);
0933     rtw_write8(rtwdev, REG_HRCV_MSG, 1);
0934     mutex_unlock(&rtwdev->mutex);
0935 
0936     return count;
0937 }
0938 
0939 static int rtw_debugfs_get_fw_crash(struct seq_file *m, void *v)
0940 {
0941     struct rtw_debugfs_priv *debugfs_priv = m->private;
0942     struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
0943 
0944     seq_printf(m, "%d\n",
0945            test_bit(RTW_FLAG_RESTART_TRIGGERING, rtwdev->flags) ||
0946            test_bit(RTW_FLAG_RESTARTING, rtwdev->flags));
0947     return 0;
0948 }
0949 
0950 static ssize_t rtw_debugfs_set_force_lowest_basic_rate(struct file *filp,
0951                                const char __user *buffer,
0952                                size_t count, loff_t *loff)
0953 {
0954     struct seq_file *seqpriv = (struct seq_file *)filp->private_data;
0955     struct rtw_debugfs_priv *debugfs_priv = seqpriv->private;
0956     struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
0957     bool input;
0958     int err;
0959 
0960     err = kstrtobool_from_user(buffer, count, &input);
0961     if (err)
0962         return err;
0963 
0964     if (input)
0965         set_bit(RTW_FLAG_FORCE_LOWEST_RATE, rtwdev->flags);
0966     else
0967         clear_bit(RTW_FLAG_FORCE_LOWEST_RATE, rtwdev->flags);
0968 
0969     return count;
0970 }
0971 
0972 static int rtw_debugfs_get_force_lowest_basic_rate(struct seq_file *m, void *v)
0973 {
0974     struct rtw_debugfs_priv *debugfs_priv = m->private;
0975     struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
0976 
0977     seq_printf(m, "force lowest basic rate: %d\n",
0978            test_bit(RTW_FLAG_FORCE_LOWEST_RATE, rtwdev->flags));
0979 
0980     return 0;
0981 }
0982 
0983 static ssize_t rtw_debugfs_set_dm_cap(struct file *filp,
0984                       const char __user *buffer,
0985                       size_t count, loff_t *loff)
0986 {
0987     struct seq_file *seqpriv = (struct seq_file *)filp->private_data;
0988     struct rtw_debugfs_priv *debugfs_priv = seqpriv->private;
0989     struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
0990     struct rtw_dm_info *dm_info = &rtwdev->dm_info;
0991     int bit;
0992     bool en;
0993 
0994     if (kstrtoint_from_user(buffer, count, 10, &bit))
0995         return -EINVAL;
0996 
0997     en = bit > 0;
0998     bit = abs(bit);
0999 
1000     if (bit >= RTW_DM_CAP_NUM) {
1001         rtw_warn(rtwdev, "unknown DM CAP %d\n", bit);
1002         return -EINVAL;
1003     }
1004 
1005     if (en)
1006         dm_info->dm_flags &= ~BIT(bit);
1007     else
1008         dm_info->dm_flags |= BIT(bit);
1009 
1010     debugfs_priv->dm_cap.bit = bit;
1011 
1012     return count;
1013 }
1014 
1015 static void dump_gapk_status(struct rtw_dev *rtwdev, struct seq_file *m)
1016 {
1017     struct rtw_dm_info *dm_info = &rtwdev->dm_info;
1018     struct rtw_gapk_info *txgapk = &rtwdev->dm_info.gapk;
1019     int i, path;
1020     u32 val;
1021 
1022     seq_printf(m, "\n(%2d) %c%s\n\n", RTW_DM_CAP_TXGAPK,
1023            dm_info->dm_flags & BIT(RTW_DM_CAP_TXGAPK) ? '-' : '+',
1024            rtw_dm_cap_strs[RTW_DM_CAP_TXGAPK]);
1025 
1026     for (path = 0; path < rtwdev->hal.rf_path_num; path++) {
1027         val = rtw_read_rf(rtwdev, path, RF_GAINTX, RFREG_MASK);
1028         seq_printf(m, "path %d:\n0x%x = 0x%x\n", path, RF_GAINTX, val);
1029 
1030         for (i = 0; i < RF_HW_OFFSET_NUM; i++)
1031             seq_printf(m, "[TXGAPK] offset %d %d\n",
1032                    txgapk->rf3f_fs[path][i], i);
1033         seq_puts(m, "\n");
1034     }
1035 }
1036 
1037 static int rtw_debugfs_get_dm_cap(struct seq_file *m, void *v)
1038 {
1039     struct rtw_debugfs_priv *debugfs_priv = m->private;
1040     struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
1041     struct rtw_dm_info *dm_info = &rtwdev->dm_info;
1042     int i;
1043 
1044     switch (debugfs_priv->dm_cap.bit) {
1045     case RTW_DM_CAP_TXGAPK:
1046         dump_gapk_status(rtwdev, m);
1047         break;
1048     default:
1049         for (i = 1; i < RTW_DM_CAP_NUM; i++) {
1050             seq_printf(m, "(%2d) %c%s\n", i,
1051                    dm_info->dm_flags & BIT(i) ? '-' : '+',
1052                    rtw_dm_cap_strs[i]);
1053         }
1054         break;
1055     }
1056     debugfs_priv->dm_cap.bit = RTW_DM_CAP_NA;
1057     return 0;
1058 }
1059 
1060 #define rtw_debug_impl_mac(page, addr)              \
1061 static struct rtw_debugfs_priv rtw_debug_priv_mac_ ##page = {   \
1062     .cb_read = rtw_debug_get_mac_page,          \
1063     .cb_data = addr,                    \
1064 }
1065 
1066 rtw_debug_impl_mac(0, 0x0000);
1067 rtw_debug_impl_mac(1, 0x0100);
1068 rtw_debug_impl_mac(2, 0x0200);
1069 rtw_debug_impl_mac(3, 0x0300);
1070 rtw_debug_impl_mac(4, 0x0400);
1071 rtw_debug_impl_mac(5, 0x0500);
1072 rtw_debug_impl_mac(6, 0x0600);
1073 rtw_debug_impl_mac(7, 0x0700);
1074 rtw_debug_impl_mac(10, 0x1000);
1075 rtw_debug_impl_mac(11, 0x1100);
1076 rtw_debug_impl_mac(12, 0x1200);
1077 rtw_debug_impl_mac(13, 0x1300);
1078 rtw_debug_impl_mac(14, 0x1400);
1079 rtw_debug_impl_mac(15, 0x1500);
1080 rtw_debug_impl_mac(16, 0x1600);
1081 rtw_debug_impl_mac(17, 0x1700);
1082 
1083 #define rtw_debug_impl_bb(page, addr)           \
1084 static struct rtw_debugfs_priv rtw_debug_priv_bb_ ##page = {    \
1085     .cb_read = rtw_debug_get_bb_page,           \
1086     .cb_data = addr,                    \
1087 }
1088 
1089 rtw_debug_impl_bb(8, 0x0800);
1090 rtw_debug_impl_bb(9, 0x0900);
1091 rtw_debug_impl_bb(a, 0x0a00);
1092 rtw_debug_impl_bb(b, 0x0b00);
1093 rtw_debug_impl_bb(c, 0x0c00);
1094 rtw_debug_impl_bb(d, 0x0d00);
1095 rtw_debug_impl_bb(e, 0x0e00);
1096 rtw_debug_impl_bb(f, 0x0f00);
1097 rtw_debug_impl_bb(18, 0x1800);
1098 rtw_debug_impl_bb(19, 0x1900);
1099 rtw_debug_impl_bb(1a, 0x1a00);
1100 rtw_debug_impl_bb(1b, 0x1b00);
1101 rtw_debug_impl_bb(1c, 0x1c00);
1102 rtw_debug_impl_bb(1d, 0x1d00);
1103 rtw_debug_impl_bb(1e, 0x1e00);
1104 rtw_debug_impl_bb(1f, 0x1f00);
1105 rtw_debug_impl_bb(2c, 0x2c00);
1106 rtw_debug_impl_bb(2d, 0x2d00);
1107 rtw_debug_impl_bb(40, 0x4000);
1108 rtw_debug_impl_bb(41, 0x4100);
1109 
1110 static struct rtw_debugfs_priv rtw_debug_priv_rf_dump = {
1111     .cb_read = rtw_debug_get_rf_dump,
1112 };
1113 
1114 static struct rtw_debugfs_priv rtw_debug_priv_tx_pwr_tbl = {
1115     .cb_read = rtw_debugfs_get_tx_pwr_tbl,
1116 };
1117 
1118 static struct rtw_debugfs_priv rtw_debug_priv_write_reg = {
1119     .cb_write = rtw_debugfs_set_write_reg,
1120 };
1121 
1122 static struct rtw_debugfs_priv rtw_debug_priv_h2c = {
1123     .cb_write = rtw_debugfs_set_h2c,
1124 };
1125 
1126 static struct rtw_debugfs_priv rtw_debug_priv_rf_write = {
1127     .cb_write = rtw_debugfs_set_rf_write,
1128 };
1129 
1130 static struct rtw_debugfs_priv rtw_debug_priv_rf_read = {
1131     .cb_write = rtw_debugfs_set_rf_read,
1132     .cb_read = rtw_debugfs_get_rf_read,
1133 };
1134 
1135 static struct rtw_debugfs_priv rtw_debug_priv_read_reg = {
1136     .cb_write = rtw_debugfs_set_read_reg,
1137     .cb_read = rtw_debugfs_get_read_reg,
1138 };
1139 
1140 static struct rtw_debugfs_priv rtw_debug_priv_fix_rate = {
1141     .cb_write = rtw_debugfs_set_fix_rate,
1142     .cb_read = rtw_debugfs_get_fix_rate,
1143 };
1144 
1145 static struct rtw_debugfs_priv rtw_debug_priv_dump_cam = {
1146     .cb_write = rtw_debugfs_set_single_input,
1147     .cb_read = rtw_debugfs_get_dump_cam,
1148 };
1149 
1150 static struct rtw_debugfs_priv rtw_debug_priv_rsvd_page = {
1151     .cb_write = rtw_debugfs_set_rsvd_page,
1152     .cb_read = rtw_debugfs_get_rsvd_page,
1153 };
1154 
1155 static struct rtw_debugfs_priv rtw_debug_priv_phy_info = {
1156     .cb_read = rtw_debugfs_get_phy_info,
1157 };
1158 
1159 static struct rtw_debugfs_priv rtw_debug_priv_coex_enable = {
1160     .cb_write = rtw_debugfs_set_coex_enable,
1161     .cb_read = rtw_debugfs_get_coex_enable,
1162 };
1163 
1164 static struct rtw_debugfs_priv rtw_debug_priv_coex_info = {
1165     .cb_read = rtw_debugfs_get_coex_info,
1166 };
1167 
1168 static struct rtw_debugfs_priv rtw_debug_priv_edcca_enable = {
1169     .cb_write = rtw_debugfs_set_edcca_enable,
1170     .cb_read = rtw_debugfs_get_edcca_enable,
1171 };
1172 
1173 static struct rtw_debugfs_priv rtw_debug_priv_fw_crash = {
1174     .cb_write = rtw_debugfs_set_fw_crash,
1175     .cb_read = rtw_debugfs_get_fw_crash,
1176 };
1177 
1178 static struct rtw_debugfs_priv rtw_debug_priv_force_lowest_basic_rate = {
1179     .cb_write = rtw_debugfs_set_force_lowest_basic_rate,
1180     .cb_read = rtw_debugfs_get_force_lowest_basic_rate,
1181 };
1182 
1183 static struct rtw_debugfs_priv rtw_debug_priv_dm_cap = {
1184     .cb_write = rtw_debugfs_set_dm_cap,
1185     .cb_read = rtw_debugfs_get_dm_cap,
1186 };
1187 
1188 #define rtw_debugfs_add_core(name, mode, fopname, parent)       \
1189     do {                                \
1190         rtw_debug_priv_ ##name.rtwdev = rtwdev;         \
1191         if (!debugfs_create_file(#name, mode,           \
1192                      parent, &rtw_debug_priv_ ##name,\
1193                      &file_ops_ ##fopname))     \
1194             pr_debug("Unable to initialize debugfs:%s\n",   \
1195                    #name);                  \
1196     } while (0)
1197 
1198 #define rtw_debugfs_add_w(name)                     \
1199     rtw_debugfs_add_core(name, S_IFREG | 0222, common_write, debugfs_topdir)
1200 #define rtw_debugfs_add_rw(name)                    \
1201     rtw_debugfs_add_core(name, S_IFREG | 0666, single_rw, debugfs_topdir)
1202 #define rtw_debugfs_add_r(name)                     \
1203     rtw_debugfs_add_core(name, S_IFREG | 0444, single_r, debugfs_topdir)
1204 
1205 void rtw_debugfs_init(struct rtw_dev *rtwdev)
1206 {
1207     struct dentry *debugfs_topdir;
1208 
1209     debugfs_topdir = debugfs_create_dir("rtw88",
1210                         rtwdev->hw->wiphy->debugfsdir);
1211     rtw_debugfs_add_w(write_reg);
1212     rtw_debugfs_add_rw(read_reg);
1213     rtw_debugfs_add_w(rf_write);
1214     rtw_debugfs_add_rw(rf_read);
1215     rtw_debugfs_add_rw(fix_rate);
1216     rtw_debugfs_add_rw(dump_cam);
1217     rtw_debugfs_add_rw(rsvd_page);
1218     rtw_debugfs_add_r(phy_info);
1219     rtw_debugfs_add_r(coex_info);
1220     rtw_debugfs_add_rw(coex_enable);
1221     rtw_debugfs_add_w(h2c);
1222     rtw_debugfs_add_r(mac_0);
1223     rtw_debugfs_add_r(mac_1);
1224     rtw_debugfs_add_r(mac_2);
1225     rtw_debugfs_add_r(mac_3);
1226     rtw_debugfs_add_r(mac_4);
1227     rtw_debugfs_add_r(mac_5);
1228     rtw_debugfs_add_r(mac_6);
1229     rtw_debugfs_add_r(mac_7);
1230     rtw_debugfs_add_r(bb_8);
1231     rtw_debugfs_add_r(bb_9);
1232     rtw_debugfs_add_r(bb_a);
1233     rtw_debugfs_add_r(bb_b);
1234     rtw_debugfs_add_r(bb_c);
1235     rtw_debugfs_add_r(bb_d);
1236     rtw_debugfs_add_r(bb_e);
1237     rtw_debugfs_add_r(bb_f);
1238     rtw_debugfs_add_r(mac_10);
1239     rtw_debugfs_add_r(mac_11);
1240     rtw_debugfs_add_r(mac_12);
1241     rtw_debugfs_add_r(mac_13);
1242     rtw_debugfs_add_r(mac_14);
1243     rtw_debugfs_add_r(mac_15);
1244     rtw_debugfs_add_r(mac_16);
1245     rtw_debugfs_add_r(mac_17);
1246     rtw_debugfs_add_r(bb_18);
1247     rtw_debugfs_add_r(bb_19);
1248     rtw_debugfs_add_r(bb_1a);
1249     rtw_debugfs_add_r(bb_1b);
1250     rtw_debugfs_add_r(bb_1c);
1251     rtw_debugfs_add_r(bb_1d);
1252     rtw_debugfs_add_r(bb_1e);
1253     rtw_debugfs_add_r(bb_1f);
1254     if (rtwdev->chip->id == RTW_CHIP_TYPE_8822C) {
1255         rtw_debugfs_add_r(bb_2c);
1256         rtw_debugfs_add_r(bb_2d);
1257         rtw_debugfs_add_r(bb_40);
1258         rtw_debugfs_add_r(bb_41);
1259     }
1260     rtw_debugfs_add_r(rf_dump);
1261     rtw_debugfs_add_r(tx_pwr_tbl);
1262     rtw_debugfs_add_rw(edcca_enable);
1263     rtw_debugfs_add_rw(fw_crash);
1264     rtw_debugfs_add_rw(force_lowest_basic_rate);
1265     rtw_debugfs_add_rw(dm_cap);
1266 }
1267 
1268 #endif /* CONFIG_RTW88_DEBUGFS */
1269 
1270 #ifdef CONFIG_RTW88_DEBUG
1271 
1272 void __rtw_dbg(struct rtw_dev *rtwdev, enum rtw_debug_mask mask,
1273            const char *fmt, ...)
1274 {
1275     struct va_format vaf = {
1276         .fmt = fmt,
1277     };
1278     va_list args;
1279 
1280     va_start(args, fmt);
1281     vaf.va = &args;
1282 
1283     if (rtw_debug_mask & mask)
1284         dev_printk(KERN_DEBUG, rtwdev->dev, "%pV", &vaf);
1285 
1286     va_end(args);
1287 }
1288 EXPORT_SYMBOL(__rtw_dbg);
1289 
1290 #endif /* CONFIG_RTW88_DEBUG */