linux/drivers/staging/rtlwifi/debug.c
<<
>>
Prefs
   1/******************************************************************************
   2 *
   3 * Copyright(c) 2009-2012  Realtek Corporation.
   4 *
   5 * This program is free software; you can redistribute it and/or modify it
   6 * under the terms of version 2 of the GNU General Public License as
   7 * published by the Free Software Foundation.
   8 *
   9 * This program is distributed in the hope that it will be useful, but WITHOUT
  10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
  12 * more details.
  13 *
  14 * The full GNU General Public License is included in this distribution in the
  15 * file called LICENSE.
  16 *
  17 * Contact Information:
  18 * wlanfae <wlanfae@realtek.com>
  19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
  20 * Hsinchu 300, Taiwan.
  21 *
  22 * Larry Finger <Larry.Finger@lwfinger.net>
  23 *****************************************************************************/
  24
  25#include "wifi.h"
  26#include "cam.h"
  27
  28#include <linux/moduleparam.h>
  29#include <linux/vmalloc.h>
  30
  31#ifdef CONFIG_RTLWIFI_DEBUG_ST
  32void _rtl_dbg_trace(struct rtl_priv *rtlpriv, u64 comp, int level,
  33                    const char *fmt, ...)
  34{
  35        if (unlikely((comp & rtlpriv->cfg->mod_params->debug_mask) &&
  36                     level <= rtlpriv->cfg->mod_params->debug_level)) {
  37                struct va_format vaf;
  38                va_list args;
  39
  40                va_start(args, fmt);
  41
  42                vaf.fmt = fmt;
  43                vaf.va = &args;
  44
  45                pr_info(":<%lx> %pV", in_interrupt(), &vaf);
  46
  47                va_end(args);
  48        }
  49}
  50
  51void _rtl_dbg_print(struct rtl_priv *rtlpriv, u64 comp, int level,
  52                    const char *fmt, ...)
  53{
  54        if (unlikely((comp & rtlpriv->cfg->mod_params->debug_mask) &&
  55                     level <= rtlpriv->cfg->mod_params->debug_level)) {
  56                struct va_format vaf;
  57                va_list args;
  58
  59                va_start(args, fmt);
  60
  61                vaf.fmt = fmt;
  62                vaf.va = &args;
  63
  64                pr_info("%pV", &vaf);
  65
  66                va_end(args);
  67        }
  68}
  69
  70void _rtl_dbg_print_data(struct rtl_priv *rtlpriv, u64 comp, int level,
  71                         const char *titlestring,
  72                         const void *hexdata, int hexdatalen)
  73{
  74        if (unlikely(((comp) & rtlpriv->cfg->mod_params->debug_mask) &&
  75                     ((level) <= rtlpriv->cfg->mod_params->debug_level))) {
  76                pr_info("In process \"%s\" (pid %i): %s\n",
  77                        current->comm, current->pid, titlestring);
  78                print_hex_dump_bytes("", DUMP_PREFIX_NONE,
  79                                     hexdata, hexdatalen);
  80        }
  81}
  82
  83struct rtl_debugfs_priv {
  84        struct rtl_priv *rtlpriv;
  85        int (*cb_read)(struct seq_file *m, void *v);
  86        ssize_t (*cb_write)(struct file *filp, const char __user *buffer,
  87                            size_t count, loff_t *loff);
  88        u32 cb_data;
  89};
  90
  91static struct dentry *debugfs_topdir;
  92
  93static int rtl_debug_get_common(struct seq_file *m, void *v)
  94{
  95        struct rtl_debugfs_priv *debugfs_priv = m->private;
  96
  97        return debugfs_priv->cb_read(m, v);
  98}
  99
 100static int dl_debug_open_common(struct inode *inode, struct file *file)
 101{
 102        return single_open(file, rtl_debug_get_common, inode->i_private);
 103}
 104
 105static const struct file_operations file_ops_common = {
 106        .open = dl_debug_open_common,
 107        .read = seq_read,
 108        .llseek = seq_lseek,
 109        .release = seq_release,
 110};
 111
 112static int rtl_debug_get_mac_page(struct seq_file *m, void *v)
 113{
 114        struct rtl_debugfs_priv *debugfs_priv = m->private;
 115        struct rtl_priv *rtlpriv = debugfs_priv->rtlpriv;
 116        u32 page = debugfs_priv->cb_data;
 117        int i, n;
 118        int max = 0xff;
 119
 120        for (n = 0; n <= max; ) {
 121                seq_printf(m, "\n%8.8x  ", n + page);
 122                for (i = 0; i < 4 && n <= max; i++, n += 4)
 123                        seq_printf(m, "%8.8x    ",
 124                                   rtl_read_dword(rtlpriv, (page | n)));
 125        }
 126        seq_puts(m, "\n");
 127        return 0;
 128}
 129
 130#define RTL_DEBUG_IMPL_MAC_SERIES(page, addr)                   \
 131static struct rtl_debugfs_priv rtl_debug_priv_mac_ ##page = {   \
 132        .cb_read = rtl_debug_get_mac_page,                      \
 133        .cb_data = addr,                                        \
 134}
 135
 136RTL_DEBUG_IMPL_MAC_SERIES(0, 0x0000);
 137RTL_DEBUG_IMPL_MAC_SERIES(1, 0x0100);
 138RTL_DEBUG_IMPL_MAC_SERIES(2, 0x0200);
 139RTL_DEBUG_IMPL_MAC_SERIES(3, 0x0300);
 140RTL_DEBUG_IMPL_MAC_SERIES(4, 0x0400);
 141RTL_DEBUG_IMPL_MAC_SERIES(5, 0x0500);
 142RTL_DEBUG_IMPL_MAC_SERIES(6, 0x0600);
 143RTL_DEBUG_IMPL_MAC_SERIES(7, 0x0700);
 144RTL_DEBUG_IMPL_MAC_SERIES(10, 0x1000);
 145RTL_DEBUG_IMPL_MAC_SERIES(11, 0x1100);
 146RTL_DEBUG_IMPL_MAC_SERIES(12, 0x1200);
 147RTL_DEBUG_IMPL_MAC_SERIES(13, 0x1300);
 148RTL_DEBUG_IMPL_MAC_SERIES(14, 0x1400);
 149RTL_DEBUG_IMPL_MAC_SERIES(15, 0x1500);
 150RTL_DEBUG_IMPL_MAC_SERIES(16, 0x1600);
 151RTL_DEBUG_IMPL_MAC_SERIES(17, 0x1700);
 152
 153static int rtl_debug_get_bb_page(struct seq_file *m, void *v)
 154{
 155        struct rtl_debugfs_priv *debugfs_priv = m->private;
 156        struct rtl_priv *rtlpriv = debugfs_priv->rtlpriv;
 157        struct ieee80211_hw *hw = rtlpriv->hw;
 158        u32 page = debugfs_priv->cb_data;
 159        int i, n;
 160        int max = 0xff;
 161
 162        for (n = 0; n <= max; ) {
 163                seq_printf(m, "\n%8.8x  ", n + page);
 164                for (i = 0; i < 4 && n <= max; i++, n += 4)
 165                        seq_printf(m, "%8.8x    ",
 166                                   rtl_get_bbreg(hw, (page | n), 0xffffffff));
 167        }
 168        seq_puts(m, "\n");
 169        return 0;
 170}
 171
 172#define RTL_DEBUG_IMPL_BB_SERIES(page, addr)                    \
 173static struct rtl_debugfs_priv rtl_debug_priv_bb_ ##page = {    \
 174        .cb_read = rtl_debug_get_bb_page,                       \
 175        .cb_data = addr,                                        \
 176}
 177
 178RTL_DEBUG_IMPL_BB_SERIES(8, 0x0800);
 179RTL_DEBUG_IMPL_BB_SERIES(9, 0x0900);
 180RTL_DEBUG_IMPL_BB_SERIES(a, 0x0a00);
 181RTL_DEBUG_IMPL_BB_SERIES(b, 0x0b00);
 182RTL_DEBUG_IMPL_BB_SERIES(c, 0x0c00);
 183RTL_DEBUG_IMPL_BB_SERIES(d, 0x0d00);
 184RTL_DEBUG_IMPL_BB_SERIES(e, 0x0e00);
 185RTL_DEBUG_IMPL_BB_SERIES(f, 0x0f00);
 186RTL_DEBUG_IMPL_BB_SERIES(18, 0x1800);
 187RTL_DEBUG_IMPL_BB_SERIES(19, 0x1900);
 188RTL_DEBUG_IMPL_BB_SERIES(1a, 0x1a00);
 189RTL_DEBUG_IMPL_BB_SERIES(1b, 0x1b00);
 190RTL_DEBUG_IMPL_BB_SERIES(1c, 0x1c00);
 191RTL_DEBUG_IMPL_BB_SERIES(1d, 0x1d00);
 192RTL_DEBUG_IMPL_BB_SERIES(1e, 0x1e00);
 193RTL_DEBUG_IMPL_BB_SERIES(1f, 0x1f00);
 194
 195static int rtl_debug_get_reg_rf(struct seq_file *m, void *v)
 196{
 197        struct rtl_debugfs_priv *debugfs_priv = m->private;
 198        struct rtl_priv *rtlpriv = debugfs_priv->rtlpriv;
 199        struct ieee80211_hw *hw = rtlpriv->hw;
 200        enum radio_path rfpath = debugfs_priv->cb_data;
 201        int i, n;
 202        int max = 0x40;
 203
 204        if (IS_HARDWARE_TYPE_8822B(rtlpriv))
 205                max = 0xff;
 206
 207        seq_printf(m, "\nPATH(%d)", rfpath);
 208
 209        for (n = 0; n <= max; ) {
 210                seq_printf(m, "\n%8.8x  ", n);
 211                for (i = 0; i < 4 && n <= max; n += 1, i++)
 212                        seq_printf(m, "%8.8x    ",
 213                                   rtl_get_rfreg(hw, rfpath, n, 0xffffffff));
 214        }
 215        seq_puts(m, "\n");
 216        return 0;
 217}
 218
 219#define RTL_DEBUG_IMPL_RF_SERIES(page, addr)                    \
 220static struct rtl_debugfs_priv rtl_debug_priv_rf_ ##page = {    \
 221        .cb_read = rtl_debug_get_reg_rf,                        \
 222        .cb_data = addr,                                        \
 223}
 224
 225RTL_DEBUG_IMPL_RF_SERIES(a, RF90_PATH_A);
 226RTL_DEBUG_IMPL_RF_SERIES(b, RF90_PATH_B);
 227
 228static int rtl_debug_get_cam_register(struct seq_file *m, void *v)
 229{
 230        struct rtl_debugfs_priv *debugfs_priv = m->private;
 231        struct rtl_priv *rtlpriv = debugfs_priv->rtlpriv;
 232        int start = debugfs_priv->cb_data;
 233        u32 target_cmd = 0;
 234        u32 target_val = 0;
 235        u8 entry_i = 0;
 236        u32 ulstatus;
 237        int i = 100, j = 0;
 238        int end = (start + 11 > TOTAL_CAM_ENTRY ? TOTAL_CAM_ENTRY : start + 11);
 239
 240        /* This dump the current register page */
 241        seq_printf(m,
 242                   "\n#################### SECURITY CAM (%d-%d) ##################\n",
 243                   start, end - 1);
 244
 245        for (j = start; j < end; j++) {
 246                seq_printf(m, "\nD:  %2x > ", j);
 247                for (entry_i = 0; entry_i < CAM_CONTENT_COUNT; entry_i++) {
 248                        /* polling bit, and No Write enable, and address  */
 249                        target_cmd = entry_i + CAM_CONTENT_COUNT * j;
 250                        target_cmd = target_cmd | BIT(31);
 251
 252                        /* Check polling bit is clear */
 253                        while ((i--) >= 0) {
 254                                ulstatus = rtl_read_dword(
 255                                                rtlpriv,
 256                                                rtlpriv->cfg->maps[RWCAM]);
 257                                if (ulstatus & BIT(31))
 258                                        continue;
 259                                else
 260                                        break;
 261                        }
 262
 263                        rtl_write_dword(rtlpriv, rtlpriv->cfg->maps[RWCAM],
 264                                        target_cmd);
 265                        target_val = rtl_read_dword(rtlpriv,
 266                                                    rtlpriv->cfg->maps[RCAMO]);
 267                        seq_printf(m, "%8.8x ", target_val);
 268                }
 269        }
 270        seq_puts(m, "\n");
 271        return 0;
 272}
 273
 274#define RTL_DEBUG_IMPL_CAM_SERIES(page, addr)                   \
 275static struct rtl_debugfs_priv rtl_debug_priv_cam_ ##page = {   \
 276        .cb_read = rtl_debug_get_cam_register,                  \
 277        .cb_data = addr,                                        \
 278}
 279
 280RTL_DEBUG_IMPL_CAM_SERIES(1, 0);
 281RTL_DEBUG_IMPL_CAM_SERIES(2, 11);
 282RTL_DEBUG_IMPL_CAM_SERIES(3, 22);
 283
 284static int rtl_debug_get_btcoex(struct seq_file *m, void *v)
 285{
 286        struct rtl_debugfs_priv *debugfs_priv = m->private;
 287        struct rtl_priv *rtlpriv = debugfs_priv->rtlpriv;
 288
 289        if (rtlpriv->cfg->ops->get_btc_status())
 290                rtlpriv->btcoexist.btc_ops->btc_display_bt_coex_info(rtlpriv,
 291                                                                     m);
 292
 293        seq_puts(m, "\n");
 294
 295        return 0;
 296}
 297
 298static struct rtl_debugfs_priv rtl_debug_priv_btcoex = {
 299        .cb_read = rtl_debug_get_btcoex,
 300        .cb_data = 0,
 301};
 302
 303static ssize_t rtl_debugfs_set_write_reg(struct file *filp,
 304                                         const char __user *buffer,
 305                                         size_t count, loff_t *loff)
 306{
 307        struct rtl_debugfs_priv *debugfs_priv = filp->private_data;
 308        struct rtl_priv *rtlpriv = debugfs_priv->rtlpriv;
 309        char tmp[32 + 1];
 310        int tmp_len;
 311        u32 addr, val, len;
 312        int num;
 313
 314        if (count < 3)
 315                return -EFAULT;
 316
 317        tmp_len = (count > sizeof(tmp) - 1 ? sizeof(tmp) - 1 : count);
 318
 319        if (!buffer || copy_from_user(tmp, buffer, tmp_len))
 320                return count;
 321
 322        tmp[tmp_len] = '\0';
 323
 324        /* write BB/MAC register */
 325        num = sscanf(tmp, "%x %x %x", &addr, &val, &len);
 326
 327        if (num !=  3)
 328                return count;
 329
 330        switch (len) {
 331        case 1:
 332                rtl_write_byte(rtlpriv, addr, (u8)val);
 333                break;
 334        case 2:
 335                rtl_write_word(rtlpriv, addr, (u16)val);
 336                break;
 337        case 4:
 338                rtl_write_dword(rtlpriv, addr, val);
 339                break;
 340        default:
 341                /*printk("error write length=%d", len);*/
 342                break;
 343        }
 344
 345        return count;
 346}
 347
 348static struct rtl_debugfs_priv rtl_debug_priv_write_reg = {
 349        .cb_write = rtl_debugfs_set_write_reg,
 350};
 351
 352static ssize_t rtl_debugfs_set_write_h2c(struct file *filp,
 353                                         const char __user *buffer,
 354                                         size_t count, loff_t *loff)
 355{
 356        struct rtl_debugfs_priv *debugfs_priv = filp->private_data;
 357        struct rtl_priv *rtlpriv = debugfs_priv->rtlpriv;
 358        struct ieee80211_hw *hw = rtlpriv->hw;
 359        char tmp[32 + 1];
 360        int tmp_len;
 361        u8 h2c_len, h2c_data_packed[8];
 362        int h2c_data[8];        /* idx 0: cmd */
 363        int i;
 364
 365        if (count < 3)
 366                return -EFAULT;
 367
 368        tmp_len = (count > sizeof(tmp) - 1 ? sizeof(tmp) - 1 : count);
 369
 370        if (!buffer || copy_from_user(tmp, buffer, tmp_len))
 371                return count;
 372
 373        tmp[tmp_len] = '\0';
 374
 375        h2c_len = sscanf(tmp, "%X %X %X %X %X %X %X %X",
 376                         &h2c_data[0], &h2c_data[1],
 377                         &h2c_data[2], &h2c_data[3],
 378                         &h2c_data[4], &h2c_data[5],
 379                         &h2c_data[6], &h2c_data[7]);
 380
 381        if (h2c_len <= 0)
 382                return count;
 383
 384        for (i = 0; i < h2c_len; i++)
 385                h2c_data_packed[i] = (u8)h2c_data[i];
 386
 387        rtlpriv->cfg->ops->fill_h2c_cmd(hw, h2c_data_packed[0],
 388                                        h2c_len - 1,
 389                                        &h2c_data_packed[1]);
 390
 391        return count;
 392}
 393
 394static struct rtl_debugfs_priv rtl_debug_priv_write_h2c = {
 395        .cb_write = rtl_debugfs_set_write_h2c,
 396};
 397
 398static ssize_t rtl_debugfs_set_write_rfreg(struct file *filp,
 399                                           const char __user *buffer,
 400                                            size_t count, loff_t *loff)
 401{
 402        struct rtl_debugfs_priv *debugfs_priv = filp->private_data;
 403        struct rtl_priv *rtlpriv = debugfs_priv->rtlpriv;
 404        struct ieee80211_hw *hw = rtlpriv->hw;
 405        char tmp[32 + 1];
 406        int tmp_len;
 407        int num;
 408        int path;
 409        u32 addr, bitmask, data;
 410
 411        if (count < 3)
 412                return -EFAULT;
 413
 414        tmp_len = (count > sizeof(tmp) - 1 ? sizeof(tmp) - 1 : count);
 415
 416        if (!buffer || copy_from_user(tmp, buffer, tmp_len))
 417                return count;
 418
 419        tmp[tmp_len] = '\0';
 420
 421        num = sscanf(tmp, "%X %X %X %X",
 422                     &path, &addr, &bitmask, &data);
 423
 424        if (num != 4) {
 425                RT_TRACE(rtlpriv, COMP_ERR, DBG_DMESG,
 426                         "Format is <path> <addr> <mask> <data>\n");
 427                return count;
 428        }
 429
 430        rtl_set_rfreg(hw, path, addr, bitmask, data);
 431
 432        return count;
 433}
 434
 435static struct rtl_debugfs_priv rtl_debug_priv_write_rfreg = {
 436        .cb_write = rtl_debugfs_set_write_rfreg,
 437};
 438
 439static int rtl_debugfs_close(struct inode *inode, struct file *filp)
 440{
 441        return 0;
 442}
 443
 444static ssize_t rtl_debugfs_common_write(struct file *filp,
 445                                        const char __user *buffer,
 446                                        size_t count, loff_t *loff)
 447{
 448        struct rtl_debugfs_priv *debugfs_priv = filp->private_data;
 449
 450        return debugfs_priv->cb_write(filp, buffer, count, loff);
 451}
 452
 453static const struct file_operations file_ops_common_write = {
 454        .owner = THIS_MODULE,
 455        .write = rtl_debugfs_common_write,
 456        .open = simple_open,
 457        .release = rtl_debugfs_close,
 458};
 459
 460static ssize_t rtl_debugfs_phydm_cmd(struct file *filp,
 461                                     const char __user *buffer,
 462                                     size_t count, loff_t *loff)
 463{
 464        struct rtl_debugfs_priv *debugfs_priv = filp->private_data;
 465        struct rtl_priv *rtlpriv = debugfs_priv->rtlpriv;
 466
 467        char tmp[64];
 468
 469        if (!rtlpriv->dbg.msg_buf)
 470                return -ENOMEM;
 471
 472        if (!rtlpriv->phydm.ops)
 473                return -EFAULT;
 474
 475        if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) {
 476                tmp[count] = '\0';
 477
 478                rtlpriv->phydm.ops->phydm_debug_cmd(rtlpriv, tmp, count,
 479                                                    rtlpriv->dbg.msg_buf,
 480                                                    80 * 25);
 481        }
 482
 483        return count;
 484}
 485
 486static int rtl_debug_get_phydm_cmd(struct seq_file *m, void *v)
 487{
 488        struct rtl_debugfs_priv *debugfs_priv = m->private;
 489        struct rtl_priv *rtlpriv = debugfs_priv->rtlpriv;
 490
 491        if (rtlpriv->dbg.msg_buf)
 492                seq_puts(m, rtlpriv->dbg.msg_buf);
 493
 494        return 0;
 495}
 496
 497static int rtl_debugfs_open_rw(struct inode *inode, struct file *filp)
 498{
 499        if (filp->f_mode & FMODE_READ)
 500                single_open(filp, rtl_debug_get_common, inode->i_private);
 501        else
 502                filp->private_data = inode->i_private;
 503
 504        return 0;
 505}
 506
 507static int rtl_debugfs_close_rw(struct inode *inode, struct file *filp)
 508{
 509        if (filp->f_mode == FMODE_READ)
 510                seq_release(inode, filp);
 511
 512        return 0;
 513}
 514
 515static struct rtl_debugfs_priv rtl_debug_priv_phydm_cmd = {
 516        .cb_read = rtl_debug_get_phydm_cmd,
 517        .cb_write = rtl_debugfs_phydm_cmd,
 518        .cb_data = 0,
 519};
 520
 521static const struct file_operations file_ops_common_rw = {
 522        .owner = THIS_MODULE,
 523        .open = rtl_debugfs_open_rw,
 524        .release = rtl_debugfs_close_rw,
 525        .read = seq_read,
 526        .llseek = seq_lseek,
 527        .write = rtl_debugfs_common_write,
 528};
 529
 530#define RTL_DEBUGFS_ADD_CORE(name, mode, fopname)                          \
 531        do {                                                               \
 532                rtl_debug_priv_ ##name.rtlpriv = rtlpriv;                  \
 533                if (!debugfs_create_file(#name, mode,                      \
 534                                         parent, &rtl_debug_priv_ ##name,  \
 535                                         &file_ops_ ##fopname))            \
 536                        pr_err("Unable to initialize debugfs:%s/%s\n",     \
 537                               rtlpriv->dbg.debugfs_name,                  \
 538                               #name);                                     \
 539        } while (0)
 540
 541#define RTL_DEBUGFS_ADD(name)                                              \
 542                RTL_DEBUGFS_ADD_CORE(name, S_IFREG | 0444, common)
 543#define RTL_DEBUGFS_ADD_W(name)                                            \
 544                RTL_DEBUGFS_ADD_CORE(name, S_IFREG | 0222, common_write)
 545#define RTL_DEBUGFS_ADD_RW(name)                                           \
 546                RTL_DEBUGFS_ADD_CORE(name, S_IFREG | 0666, common_rw)
 547
 548void rtl_debug_add_one(struct ieee80211_hw *hw)
 549{
 550        struct rtl_priv *rtlpriv = rtl_priv(hw);
 551        struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
 552        struct dentry *parent;
 553
 554        rtlpriv->dbg.msg_buf = vzalloc(80 * 25);
 555
 556        snprintf(rtlpriv->dbg.debugfs_name, 18, "%pMF", rtlefuse->dev_addr);
 557
 558        rtlpriv->dbg.debugfs_dir =
 559                debugfs_create_dir(rtlpriv->dbg.debugfs_name, debugfs_topdir);
 560        if (!rtlpriv->dbg.debugfs_dir) {
 561                pr_err("Unable to init debugfs:/%s/%s\n", rtlpriv->cfg->name,
 562                       rtlpriv->dbg.debugfs_name);
 563                return;
 564        }
 565
 566        parent = rtlpriv->dbg.debugfs_dir;
 567
 568        RTL_DEBUGFS_ADD(mac_0);
 569        RTL_DEBUGFS_ADD(mac_1);
 570        RTL_DEBUGFS_ADD(mac_2);
 571        RTL_DEBUGFS_ADD(mac_3);
 572        RTL_DEBUGFS_ADD(mac_4);
 573        RTL_DEBUGFS_ADD(mac_5);
 574        RTL_DEBUGFS_ADD(mac_6);
 575        RTL_DEBUGFS_ADD(mac_7);
 576        RTL_DEBUGFS_ADD(bb_8);
 577        RTL_DEBUGFS_ADD(bb_9);
 578        RTL_DEBUGFS_ADD(bb_a);
 579        RTL_DEBUGFS_ADD(bb_b);
 580        RTL_DEBUGFS_ADD(bb_c);
 581        RTL_DEBUGFS_ADD(bb_d);
 582        RTL_DEBUGFS_ADD(bb_e);
 583        RTL_DEBUGFS_ADD(bb_f);
 584        RTL_DEBUGFS_ADD(mac_10);
 585        RTL_DEBUGFS_ADD(mac_11);
 586        RTL_DEBUGFS_ADD(mac_12);
 587        RTL_DEBUGFS_ADD(mac_13);
 588        RTL_DEBUGFS_ADD(mac_14);
 589        RTL_DEBUGFS_ADD(mac_15);
 590        RTL_DEBUGFS_ADD(mac_16);
 591        RTL_DEBUGFS_ADD(mac_17);
 592        RTL_DEBUGFS_ADD(bb_18);
 593        RTL_DEBUGFS_ADD(bb_19);
 594        RTL_DEBUGFS_ADD(bb_1a);
 595        RTL_DEBUGFS_ADD(bb_1b);
 596        RTL_DEBUGFS_ADD(bb_1c);
 597        RTL_DEBUGFS_ADD(bb_1d);
 598        RTL_DEBUGFS_ADD(bb_1e);
 599        RTL_DEBUGFS_ADD(bb_1f);
 600        RTL_DEBUGFS_ADD(rf_a);
 601        RTL_DEBUGFS_ADD(rf_b);
 602
 603        RTL_DEBUGFS_ADD(cam_1);
 604        RTL_DEBUGFS_ADD(cam_2);
 605        RTL_DEBUGFS_ADD(cam_3);
 606
 607        RTL_DEBUGFS_ADD(btcoex);
 608
 609        RTL_DEBUGFS_ADD_W(write_reg);
 610        RTL_DEBUGFS_ADD_W(write_h2c);
 611        RTL_DEBUGFS_ADD_W(write_rfreg);
 612
 613        RTL_DEBUGFS_ADD_RW(phydm_cmd);
 614}
 615
 616void rtl_debug_remove_one(struct ieee80211_hw *hw)
 617{
 618        struct rtl_priv *rtlpriv = rtl_priv(hw);
 619
 620        debugfs_remove_recursive(rtlpriv->dbg.debugfs_dir);
 621        rtlpriv->dbg.debugfs_dir = NULL;
 622
 623        vfree(rtlpriv->dbg.msg_buf);
 624}
 625
 626void rtl_debugfs_add_topdir(void)
 627{
 628        debugfs_topdir = debugfs_create_dir("rtlwifi", NULL);
 629}
 630
 631void rtl_debugfs_remove_topdir(void)
 632{
 633        debugfs_remove_recursive(debugfs_topdir);
 634}
 635
 636#endif
 637