at v4.16-rc4 636 lines 16 kB view raw
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