at v3.14-rc3 988 lines 26 kB view raw
1/****************************************************************************** 2 * 3 * Copyright(c) 2009-2010 Realtek Corporation. 4 * 5 * Tmis 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 * Tmis 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 * You should have received a copy of the GNU General Public License along with 15 * tmis program; if not, write to the Free Software Foundation, Inc., 16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA 17 * 18 * Tme full GNU General Public License is included in this distribution in the 19 * file called LICENSE. 20 * 21 * Contact Information: 22 * wlanfae <wlanfae@realtek.com> 23 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park, 24 * Hsinchu 300, Taiwan. 25 * 26 * Larry Finger <Larry.Finger@lwfinger.net> 27 * 28 *****************************************************************************/ 29 30#include "wifi.h" 31#include "cam.h" 32 33#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0)) 34#define GET_INODE_DATA(__node) PDE_DATA(__node) 35#else 36#define GET_INODE_DATA(__node) PDE(__node)->data 37#endif 38 39 40void rtl_dbgp_flag_init(struct ieee80211_hw *hw) 41{ 42 struct rtl_priv *rtlpriv = rtl_priv(hw); 43 u8 i; 44 45 rtlpriv->dbg.global_debuglevel = DBG_DMESG; 46 47 rtlpriv->dbg.global_debugcomponents = 48 COMP_ERR | 49 COMP_FW | 50 COMP_INIT | 51 COMP_RECV | 52 COMP_SEND | 53 COMP_MLME | 54 COMP_SCAN | 55 COMP_INTR | 56 COMP_LED | 57 COMP_SEC | 58 COMP_BEACON | 59 COMP_RATE | 60 COMP_RXDESC | 61 COMP_DIG | 62 COMP_TXAGC | 63 COMP_POWER | 64 COMP_POWER_TRACKING | 65 COMP_BB_POWERSAVING | 66 COMP_SWAS | 67 COMP_RF | 68 COMP_TURBO | 69 COMP_RATR | 70 COMP_CMD | 71 COMP_EASY_CONCURRENT | 72 COMP_EFUSE | 73 COMP_QOS | COMP_MAC80211 | COMP_REGD | 74 COMP_CHAN | 75 COMP_BT_COEXIST | 76 COMP_IQK | 77 0; 78 79 for (i = 0; i < DBGP_TYPE_MAX; i++) 80 rtlpriv->dbg.dbgp_type[i] = 0; 81 82 /*Init Debug flag enable condition */ 83} 84 85struct proc_dir_entry *proc_topdir; 86static int rtl_proc_get_mac_0(struct seq_file *m, void *v) 87{ 88 struct ieee80211_hw *hw = m->private; 89 struct rtl_priv *rtlpriv = rtl_priv(hw); 90 int i, n, page; 91 int max = 0xff; 92 page = 0x000; 93 94 for (n = 0; n <= max; ) { 95 seq_printf(m, "\n%8.8x ", n + page); 96 for (i = 0; i < 4 && n <= max; i++, n += 4) 97 seq_printf(m, "%8.8x ", 98 rtl_read_dword(rtlpriv, (page | n))); 99 } 100 seq_puts(m, "\n"); 101 return 0; 102} 103 104static int dl_proc_open_mac_0(struct inode *inode, struct file *file) 105{ 106 return single_open(file, rtl_proc_get_mac_0, GET_INODE_DATA(inode)); 107} 108 109static const struct file_operations file_ops_mac_0 = { 110 .open = dl_proc_open_mac_0, 111 .read = seq_read, 112 .llseek = seq_lseek, 113 .release = seq_release, 114}; 115 116static int rtl_proc_get_mac_1(struct seq_file *m, void *v) 117{ 118 struct ieee80211_hw *hw = m->private; 119 struct rtl_priv *rtlpriv = rtl_priv(hw); 120 int i, n, page; 121 int max = 0xff; 122 page = 0x100; 123 124 for (n = 0; n <= max; ) { 125 seq_printf(m, "\n%8.8x ", n + page); 126 for (i = 0; i < 4 && n <= max; i++, n += 4) 127 seq_printf(m, "%8.8x ", 128 rtl_read_dword(rtlpriv, (page | n))); 129 } 130 seq_puts(m, "\n"); 131 return 0; 132} 133 134static int dl_proc_open_mac_1(struct inode *inode, struct file *file) 135{ 136 return single_open(file, rtl_proc_get_mac_1, GET_INODE_DATA(inode)); 137} 138 139static const struct file_operations file_ops_mac_1 = { 140 .open = dl_proc_open_mac_1, 141 .read = seq_read, 142 .llseek = seq_lseek, 143 .release = seq_release, 144}; 145 146static int rtl_proc_get_mac_2(struct seq_file *m, void *v) 147{ 148 struct ieee80211_hw *hw = m->private; 149 struct rtl_priv *rtlpriv = rtl_priv(hw); 150 int i, n, page; 151 int max = 0xff; 152 page = 0x200; 153 154 for (n = 0; n <= max; ) { 155 seq_printf(m, "\n%8.8x ", n + page); 156 for (i = 0; i < 4 && n <= max; i++, n += 4) 157 seq_printf(m, "%8.8x ", 158 rtl_read_dword(rtlpriv, (page | n))); 159 } 160 seq_puts(m, "\n"); 161 return 0; 162} 163 164static int dl_proc_open_mac_2(struct inode *inode, struct file *file) 165{ 166 return single_open(file, rtl_proc_get_mac_2, GET_INODE_DATA(inode)); 167} 168 169static const struct file_operations file_ops_mac_2 = { 170 .open = dl_proc_open_mac_2, 171 .read = seq_read, 172 .llseek = seq_lseek, 173 .release = seq_release, 174}; 175 176static int rtl_proc_get_mac_3(struct seq_file *m, void *v) 177{ 178 struct ieee80211_hw *hw = m->private; 179 struct rtl_priv *rtlpriv = rtl_priv(hw); 180 int i, n, page; 181 int max = 0xff; 182 page = 0x300; 183 184 for (n = 0; n <= max; ) { 185 seq_printf(m, "\n%8.8x ", n + page); 186 for (i = 0; i < 4 && n <= max; i++, n += 4) 187 seq_printf(m, "%8.8x ", 188 rtl_read_dword(rtlpriv, (page | n))); 189 } 190 seq_puts(m, "\n"); 191 return 0; 192} 193 194static int dl_proc_open_mac_3(struct inode *inode, struct file *file) 195{ 196 return single_open(file, rtl_proc_get_mac_3, GET_INODE_DATA(inode)); 197} 198 199static const struct file_operations file_ops_mac_3 = { 200 .open = dl_proc_open_mac_3, 201 .read = seq_read, 202 .llseek = seq_lseek, 203 .release = seq_release, 204}; 205 206static int rtl_proc_get_mac_4(struct seq_file *m, void *v) 207{ 208 struct ieee80211_hw *hw = m->private; 209 struct rtl_priv *rtlpriv = rtl_priv(hw); 210 int i, n, page; 211 int max = 0xff; 212 page = 0x400; 213 214 for (n = 0; n <= max; ) { 215 seq_printf(m, "\n%8.8x ", n + page); 216 for (i = 0; i < 4 && n <= max; i++, n += 4) 217 seq_printf(m, "%8.8x ", 218 rtl_read_dword(rtlpriv, (page | n))); 219 } 220 seq_puts(m, "\n"); 221 return 0; 222} 223 224static int dl_proc_open_mac_4(struct inode *inode, struct file *file) 225{ 226 return single_open(file, rtl_proc_get_mac_4, GET_INODE_DATA(inode)); 227} 228 229static const struct file_operations file_ops_mac_4 = { 230 .open = dl_proc_open_mac_4, 231 .read = seq_read, 232 .llseek = seq_lseek, 233 .release = seq_release, 234}; 235 236static int rtl_proc_get_mac_5(struct seq_file *m, void *v) 237{ 238 struct ieee80211_hw *hw = m->private; 239 struct rtl_priv *rtlpriv = rtl_priv(hw); 240 int i, n, page; 241 int max = 0xff; 242 page = 0x500; 243 244 for (n = 0; n <= max; ) { 245 seq_printf(m, "\n%8.8x ", n + page); 246 for (i = 0; i < 4 && n <= max; i++, n += 4) 247 seq_printf(m, "%8.8x ", 248 rtl_read_dword(rtlpriv, (page | n))); 249 } 250 seq_puts(m, "\n"); 251 return 0; 252} 253 254static int dl_proc_open_mac_5(struct inode *inode, struct file *file) 255{ 256 return single_open(file, rtl_proc_get_mac_5, GET_INODE_DATA(inode)); 257} 258 259static const struct file_operations file_ops_mac_5 = { 260 .open = dl_proc_open_mac_5, 261 .read = seq_read, 262 .llseek = seq_lseek, 263 .release = seq_release, 264}; 265 266static int rtl_proc_get_mac_6(struct seq_file *m, void *v) 267{ 268 struct ieee80211_hw *hw = m->private; 269 struct rtl_priv *rtlpriv = rtl_priv(hw); 270 int i, n, page; 271 int max = 0xff; 272 page = 0x600; 273 274 for (n = 0; n <= max; ) { 275 seq_printf(m, "\n%8.8x ", n + page); 276 for (i = 0; i < 4 && n <= max; i++, n += 4) 277 seq_printf(m, "%8.8x ", 278 rtl_read_dword(rtlpriv, (page | n))); 279 } 280 seq_puts(m, "\n"); 281 return 0; 282} 283 284static int dl_proc_open_mac_6(struct inode *inode, struct file *file) 285{ 286 return single_open(file, rtl_proc_get_mac_6, GET_INODE_DATA(inode)); 287} 288 289static const struct file_operations file_ops_mac_6 = { 290 .open = dl_proc_open_mac_6, 291 .read = seq_read, 292 .llseek = seq_lseek, 293 .release = seq_release, 294}; 295 296static int rtl_proc_get_mac_7(struct seq_file *m, void *v) 297{ 298 struct ieee80211_hw *hw = m->private; 299 struct rtl_priv *rtlpriv = rtl_priv(hw); 300 int i, n, page; 301 int max = 0xff; 302 page = 0x700; 303 304 for (n = 0; n <= max; ) { 305 seq_printf(m, "\n%8.8x ", n + page); 306 for (i = 0; i < 4 && n <= max; i++, n += 4) 307 seq_printf(m, "%8.8x ", 308 rtl_read_dword(rtlpriv, (page | n))); 309 } 310 seq_puts(m, "\n"); 311 return 0; 312} 313 314static int dl_proc_open_mac_7(struct inode *inode, struct file *file) 315{ 316 return single_open(file, rtl_proc_get_mac_7, GET_INODE_DATA(inode)); 317} 318 319static const struct file_operations file_ops_mac_7 = { 320 .open = dl_proc_open_mac_7, 321 .read = seq_read, 322 .llseek = seq_lseek, 323 .release = seq_release, 324}; 325 326static int rtl_proc_get_bb_8(struct seq_file *m, void *v) 327{ 328 struct ieee80211_hw *hw = m->private; 329 int i, n, page; 330 int max = 0xff; 331 page = 0x800; 332 333 for (n = 0; n <= max; ) { 334 seq_printf(m, "\n%8.8x ", n + page); 335 for (i = 0; i < 4 && n <= max; i++, n += 4) 336 seq_printf(m, "%8.8x ", 337 rtl_get_bbreg(hw, (page | n), 0xffffffff)); 338 } 339 seq_puts(m, "\n"); 340 return 0; 341} 342 343static int dl_proc_open_bb_8(struct inode *inode, struct file *file) 344{ 345 return single_open(file, rtl_proc_get_bb_8, GET_INODE_DATA(inode)); 346} 347 348static const struct file_operations file_ops_bb_8 = { 349 .open = dl_proc_open_bb_8, 350 .read = seq_read, 351 .llseek = seq_lseek, 352 .release = seq_release, 353}; 354 355static int rtl_proc_get_bb_9(struct seq_file *m, void *v) 356{ 357 struct ieee80211_hw *hw = m->private; 358 int i, n, page; 359 int max = 0xff; 360 page = 0x900; 361 362 for (n = 0; n <= max; ) { 363 seq_printf(m, "\n%8.8x ", n + page); 364 for (i = 0; i < 4 && n <= max; i++, n += 4) 365 seq_printf(m, "%8.8x ", 366 rtl_get_bbreg(hw, (page | n), 0xffffffff)); 367 } 368 seq_puts(m, "\n"); 369 return 0; 370} 371 372static int dl_proc_open_bb_9(struct inode *inode, struct file *file) 373{ 374 return single_open(file, rtl_proc_get_bb_9, GET_INODE_DATA(inode)); 375} 376 377static const struct file_operations file_ops_bb_9 = { 378 .open = dl_proc_open_bb_9, 379 .read = seq_read, 380 .llseek = seq_lseek, 381 .release = seq_release, 382}; 383 384static int rtl_proc_get_bb_a(struct seq_file *m, void *v) 385{ 386 struct ieee80211_hw *hw = m->private; 387 int i, n, page; 388 int max = 0xff; 389 page = 0xa00; 390 391 for (n = 0; n <= max; ) { 392 seq_printf(m, "\n%8.8x ", n + page); 393 for (i = 0; i < 4 && n <= max; i++, n += 4) 394 seq_printf(m, "%8.8x ", 395 rtl_get_bbreg(hw, (page | n), 0xffffffff)); 396 } 397 seq_puts(m, "\n"); 398 return 0; 399} 400 401static int dl_proc_open_bb_a(struct inode *inode, struct file *file) 402{ 403 return single_open(file, rtl_proc_get_bb_a, GET_INODE_DATA(inode)); 404} 405 406static const struct file_operations file_ops_bb_a = { 407 .open = dl_proc_open_bb_a, 408 .read = seq_read, 409 .llseek = seq_lseek, 410 .release = seq_release, 411}; 412 413static int rtl_proc_get_bb_b(struct seq_file *m, void *v) 414{ 415 struct ieee80211_hw *hw = m->private; 416 int i, n, page; 417 int max = 0xff; 418 page = 0xb00; 419 420 for (n = 0; n <= max; ) { 421 seq_printf(m, "\n%8.8x ", n + page); 422 for (i = 0; i < 4 && n <= max; i++, n += 4) 423 seq_printf(m, "%8.8x ", 424 rtl_get_bbreg(hw, (page | n), 0xffffffff)); 425 } 426 seq_puts(m, "\n"); 427 return 0; 428} 429 430static int dl_proc_open_bb_b(struct inode *inode, struct file *file) 431{ 432 return single_open(file, rtl_proc_get_bb_b, GET_INODE_DATA(inode)); 433} 434 435static const struct file_operations file_ops_bb_b = { 436 .open = dl_proc_open_bb_b, 437 .read = seq_read, 438 .llseek = seq_lseek, 439 .release = seq_release, 440}; 441 442static int rtl_proc_get_bb_c(struct seq_file *m, void *v) 443{ 444 struct ieee80211_hw *hw = m->private; 445 int i, n, page; 446 int max = 0xff; 447 page = 0xc00; 448 449 for (n = 0; n <= max; ) { 450 seq_printf(m, "\n%8.8x ", n + page); 451 for (i = 0; i < 4 && n <= max; i++, n += 4) 452 seq_printf(m, "%8.8x ", 453 rtl_get_bbreg(hw, (page | n), 0xffffffff)); 454 } 455 seq_puts(m, "\n"); 456 return 0; 457} 458 459static int dl_proc_open_bb_c(struct inode *inode, struct file *file) 460{ 461 return single_open(file, rtl_proc_get_bb_c, GET_INODE_DATA(inode)); 462} 463 464static const struct file_operations file_ops_bb_c = { 465 .open = dl_proc_open_bb_c, 466 .read = seq_read, 467 .llseek = seq_lseek, 468 .release = seq_release, 469}; 470 471static int rtl_proc_get_bb_d(struct seq_file *m, void *v) 472{ 473 struct ieee80211_hw *hw = m->private; 474 int i, n, page; 475 int max = 0xff; 476 page = 0xd00; 477 478 for (n = 0; n <= max; ) { 479 seq_printf(m, "\n%8.8x ", n + page); 480 for (i = 0; i < 4 && n <= max; i++, n += 4) 481 seq_printf(m, "%8.8x ", 482 rtl_get_bbreg(hw, (page | n), 0xffffffff)); 483 } 484 seq_puts(m, "\n"); 485 return 0; 486} 487 488static int dl_proc_open_bb_d(struct inode *inode, struct file *file) 489{ 490 return single_open(file, rtl_proc_get_bb_d, GET_INODE_DATA(inode)); 491} 492 493static const struct file_operations file_ops_bb_d = { 494 .open = dl_proc_open_bb_d, 495 .read = seq_read, 496 .llseek = seq_lseek, 497 .release = seq_release, 498}; 499 500static int rtl_proc_get_bb_e(struct seq_file *m, void *v) 501{ 502 struct ieee80211_hw *hw = m->private; 503 int i, n, page; 504 int max = 0xff; 505 page = 0xe00; 506 507 for (n = 0; n <= max; ) { 508 seq_printf(m, "\n%8.8x ", n + page); 509 for (i = 0; i < 4 && n <= max; i++, n += 4) 510 seq_printf(m, "%8.8x ", 511 rtl_get_bbreg(hw, (page | n), 0xffffffff)); 512 } 513 seq_puts(m, "\n"); 514 return 0; 515} 516 517static int dl_proc_open_bb_e(struct inode *inode, struct file *file) 518{ 519 return single_open(file, rtl_proc_get_bb_e, GET_INODE_DATA(inode)); 520} 521 522static const struct file_operations file_ops_bb_e = { 523 .open = dl_proc_open_bb_e, 524 .read = seq_read, 525 .llseek = seq_lseek, 526 .release = seq_release, 527}; 528 529static int rtl_proc_get_bb_f(struct seq_file *m, void *v) 530{ 531 struct ieee80211_hw *hw = m->private; 532 int i, n, page; 533 int max = 0xff; 534 page = 0xf00; 535 536 for (n = 0; n <= max; ) { 537 seq_printf(m, "\n%8.8x ", n + page); 538 for (i = 0; i < 4 && n <= max; i++, n += 4) 539 seq_printf(m, "%8.8x ", 540 rtl_get_bbreg(hw, (page | n), 0xffffffff)); 541 } 542 seq_puts(m, "\n"); 543 return 0; 544} 545 546static int dl_proc_open_bb_f(struct inode *inode, struct file *file) 547{ 548 return single_open(file, rtl_proc_get_bb_f, GET_INODE_DATA(inode)); 549} 550 551static const struct file_operations file_ops_bb_f = { 552 .open = dl_proc_open_bb_f, 553 .read = seq_read, 554 .llseek = seq_lseek, 555 .release = seq_release, 556}; 557 558static int rtl_proc_get_reg_rf_a(struct seq_file *m, void *v) 559{ 560 struct ieee80211_hw *hw = m->private; 561 int i, n; 562 int max = 0x40; 563 564 for (n = 0; n <= max; ) { 565 seq_printf(m, "\n%8.8x ", n); 566 for (i = 0; i < 4 && n <= max; n += 1, i++) 567 seq_printf(m, "%8.8x ", 568 rtl_get_rfreg(hw, RF90_PATH_A, n, 0xffffffff)); 569 } 570 seq_puts(m, "\n"); 571 return 0; 572} 573 574static int dl_proc_open_rf_a(struct inode *inode, struct file *file) 575{ 576 return single_open(file, rtl_proc_get_reg_rf_a, GET_INODE_DATA(inode)); 577} 578 579static const struct file_operations file_ops_rf_a = { 580 .open = dl_proc_open_rf_a, 581 .read = seq_read, 582 .llseek = seq_lseek, 583 .release = seq_release, 584}; 585 586static int rtl_proc_get_reg_rf_b(struct seq_file *m, void *v) 587{ 588 struct ieee80211_hw *hw = m->private; 589 int i, n; 590 int max = 0x40; 591 592 for (n = 0; n <= max; ) { 593 seq_printf(m, "\n%8.8x ", n); 594 for (i = 0; i < 4 && n <= max; n += 1, i++) 595 seq_printf(m, "%8.8x ", 596 rtl_get_rfreg(hw, RF90_PATH_B, n, 597 0xffffffff)); 598 } 599 seq_puts(m, "\n"); 600 return 0; 601} 602 603static int dl_proc_open_rf_b(struct inode *inode, struct file *file) 604{ 605 return single_open(file, rtl_proc_get_reg_rf_b, GET_INODE_DATA(inode)); 606} 607 608static const struct file_operations file_ops_rf_b = { 609 .open = dl_proc_open_rf_b, 610 .read = seq_read, 611 .llseek = seq_lseek, 612 .release = seq_release, 613}; 614 615static int rtl_proc_get_cam_register_1(struct seq_file *m, void *v) 616{ 617 struct ieee80211_hw *hw = m->private; 618 struct rtl_priv *rtlpriv = rtl_priv(hw); 619 u32 target_cmd = 0; 620 u32 target_val=0; 621 u8 entry_i=0; 622 u32 ulstatus; 623 int i = 100, j = 0; 624 625 /* This dump the current register page */ 626 seq_puts(m, 627 "\n#################### SECURITY CAM (0-10) ##################\n "); 628 629 for (j = 0; j < 11; j++) { 630 seq_printf(m, "\nD: %2x > ", j); 631 for (entry_i = 0; entry_i < CAM_CONTENT_COUNT; entry_i++) { 632 /* polling bit, and No Write enable, and address */ 633 target_cmd = entry_i + CAM_CONTENT_COUNT * j; 634 target_cmd = target_cmd | BIT(31); 635 636 /* Check polling bit is clear */ 637 while ((i--) >= 0) { 638 ulstatus = rtl_read_dword(rtlpriv, 639 rtlpriv->cfg->maps[RWCAM]); 640 if (ulstatus & BIT(31)) { 641 continue; 642 } else { 643 break; 644 } 645 } 646 647 rtl_write_dword(rtlpriv, rtlpriv->cfg->maps[RWCAM], 648 target_cmd); 649 target_val = rtl_read_dword(rtlpriv, 650 rtlpriv->cfg->maps[RCAMO]); 651 seq_printf(m, "%8.8x ", target_val); 652 } 653 } 654 seq_puts(m, "\n"); 655 return 0; 656} 657 658static int dl_proc_open_cam_1(struct inode *inode, struct file *file) 659{ 660 return single_open(file, rtl_proc_get_cam_register_1, 661 GET_INODE_DATA(inode)); 662} 663 664static const struct file_operations file_ops_cam_1 = { 665 .open = dl_proc_open_cam_1, 666 .read = seq_read, 667 .llseek = seq_lseek, 668 .release = seq_release, 669}; 670 671static int rtl_proc_get_cam_register_2(struct seq_file *m, void *v) 672{ 673 struct ieee80211_hw *hw = m->private; 674 struct rtl_priv *rtlpriv = rtl_priv(hw); 675 u32 target_cmd = 0; 676 u32 target_val = 0; 677 u8 entry_i = 0; 678 u32 ulstatus; 679 int i = 100, j = 0; 680 681 /* This dump the current register page */ 682 seq_puts(m, 683 "\n################### SECURITY CAM (11-21) ##################\n "); 684 685 for (j = 11; j < 22; j++) { 686 seq_printf(m, "\nD: %2x > ", j); 687 for (entry_i = 0; entry_i < CAM_CONTENT_COUNT; entry_i++) { 688 target_cmd = entry_i + CAM_CONTENT_COUNT * j; 689 target_cmd = target_cmd | BIT(31); 690 691 while ((i--) >= 0) { 692 ulstatus = rtl_read_dword(rtlpriv, 693 rtlpriv->cfg->maps[RWCAM]); 694 if (ulstatus & BIT(31)) { 695 continue; 696 } else { 697 break; 698 } 699 } 700 701 rtl_write_dword(rtlpriv, rtlpriv->cfg->maps[RWCAM], 702 target_cmd); 703 target_val = rtl_read_dword(rtlpriv, 704 rtlpriv->cfg->maps[RCAMO]); 705 seq_printf(m, "%8.8x ", target_val); 706 } 707 } 708 seq_puts(m, "\n"); 709 return 0; 710} 711 712static int dl_proc_open_cam_2(struct inode *inode, struct file *file) 713{ 714 return single_open(file, rtl_proc_get_cam_register_2, 715 GET_INODE_DATA(inode)); 716} 717 718static const struct file_operations file_ops_cam_2 = { 719 .open = dl_proc_open_cam_2, 720 .read = seq_read, 721 .llseek = seq_lseek, 722 .release = seq_release, 723}; 724 725static int rtl_proc_get_cam_register_3(struct seq_file *m, void *v) 726{ 727 struct ieee80211_hw *hw = m->private; 728 struct rtl_priv *rtlpriv = rtl_priv(hw); 729 u32 target_cmd = 0; 730 u32 target_val = 0; 731 u8 entry_i = 0; 732 u32 ulstatus; 733 int i = 100, j = 0; 734 735 /* This dump the current register page */ 736 seq_puts(m, 737 "\n################### SECURITY CAM (22-31) ##################\n "); 738 739 for (j = 22; j < TOTAL_CAM_ENTRY; j++) { 740 seq_printf(m, "\nD: %2x > ", j); 741 for (entry_i = 0; entry_i < CAM_CONTENT_COUNT; entry_i++) { 742 target_cmd = entry_i+CAM_CONTENT_COUNT*j; 743 target_cmd = target_cmd | BIT(31); 744 745 while ((i--) >= 0) { 746 ulstatus = rtl_read_dword(rtlpriv, 747 rtlpriv->cfg->maps[RWCAM]); 748 if (ulstatus & BIT(31)) { 749 continue; 750 } else { 751 break; 752 } 753 } 754 755 rtl_write_dword(rtlpriv, rtlpriv->cfg->maps[RWCAM], 756 target_cmd); 757 target_val = rtl_read_dword(rtlpriv, 758 rtlpriv->cfg->maps[RCAMO]); 759 seq_printf(m, "%8.8x ", target_val); 760 } 761 } 762 seq_puts(m, "\n"); 763 return 0; 764} 765 766static int dl_proc_open_cam_3(struct inode *inode, struct file *file) 767{ 768 return single_open(file, rtl_proc_get_cam_register_3, 769 GET_INODE_DATA(inode)); 770} 771 772static const struct file_operations file_ops_cam_3 = { 773 .open = dl_proc_open_cam_3, 774 .read = seq_read, 775 .llseek = seq_lseek, 776 .release = seq_release, 777}; 778 779void rtl_proc_add_one(struct ieee80211_hw *hw) 780{ 781 struct rtl_priv *rtlpriv = rtl_priv(hw); 782 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw)); 783 struct proc_dir_entry *entry; 784 785 snprintf(rtlpriv->dbg.proc_name, 18, "%x-%x-%x-%x-%x-%x", 786 rtlefuse->dev_addr[0], rtlefuse->dev_addr[1], 787 rtlefuse->dev_addr[2], rtlefuse->dev_addr[3], 788 rtlefuse->dev_addr[4], rtlefuse->dev_addr[5]); 789 790 rtlpriv->dbg.proc_dir = proc_mkdir(rtlpriv->dbg.proc_name, proc_topdir); 791 if (!rtlpriv->dbg.proc_dir) { 792 RT_TRACE(COMP_INIT, DBG_EMERG, ("Unable to init " 793 "/proc/net/%s/%s\n", rtlpriv->cfg->name, 794 rtlpriv->dbg.proc_name)); 795 return; 796 } 797 798 entry = proc_create_data("mac-0", S_IFREG | S_IRUGO, 799 rtlpriv->dbg.proc_dir, &file_ops_mac_0, hw); 800 if (!entry) 801 RT_TRACE(COMP_INIT, DBG_EMERG, 802 ("Unable to initialize /proc/net/%s/%s/mac-0\n", 803 rtlpriv->cfg->name, rtlpriv->dbg.proc_name)); 804 805 entry = proc_create_data("mac-1", S_IFREG | S_IRUGO, 806 rtlpriv->dbg.proc_dir, &file_ops_mac_1, hw); 807 if (!entry) 808 RT_TRACE(COMP_INIT, COMP_ERR, 809 ("Unable to initialize /proc/net/%s/%s/mac-1\n", 810 rtlpriv->cfg->name, rtlpriv->dbg.proc_name)); 811 812 entry = proc_create_data("mac-2", S_IFREG | S_IRUGO, 813 rtlpriv->dbg.proc_dir, &file_ops_mac_2, hw); 814 if (!entry) 815 RT_TRACE(COMP_INIT, COMP_ERR, 816 ("Unable to initialize /proc/net/%s/%s/mac-2\n", 817 rtlpriv->cfg->name, rtlpriv->dbg.proc_name)); 818 819 entry = proc_create_data("mac-3", S_IFREG | S_IRUGO, 820 rtlpriv->dbg.proc_dir, &file_ops_mac_3, hw); 821 if (!entry) 822 RT_TRACE(COMP_INIT, COMP_ERR, 823 ("Unable to initialize /proc/net/%s/%s/mac-3\n", 824 rtlpriv->cfg->name, rtlpriv->dbg.proc_name)); 825 826 entry = proc_create_data("mac-4", S_IFREG | S_IRUGO, 827 rtlpriv->dbg.proc_dir, &file_ops_mac_4, hw); 828 if (!entry) 829 RT_TRACE(COMP_INIT, COMP_ERR, 830 ("Unable to initialize /proc/net/%s/%s/mac-4\n", 831 rtlpriv->cfg->name, rtlpriv->dbg.proc_name)); 832 833 entry = proc_create_data("mac-5", S_IFREG | S_IRUGO, 834 rtlpriv->dbg.proc_dir, &file_ops_mac_5, hw); 835 if (!entry) 836 RT_TRACE(COMP_INIT, COMP_ERR, 837 ("Unable to initialize /proc/net/%s/%s/mac-5\n", 838 rtlpriv->cfg->name, rtlpriv->dbg.proc_name)); 839 840 entry = proc_create_data("mac-6", S_IFREG | S_IRUGO, 841 rtlpriv->dbg.proc_dir, &file_ops_mac_6, hw); 842 if (!entry) 843 RT_TRACE(COMP_INIT, COMP_ERR, 844 ("Unable to initialize /proc/net/%s/%s/mac-6\n", 845 rtlpriv->cfg->name, rtlpriv->dbg.proc_name)); 846 847 entry = proc_create_data("mac-7", S_IFREG | S_IRUGO, 848 rtlpriv->dbg.proc_dir, &file_ops_mac_7, hw); 849 if (!entry) 850 RT_TRACE(COMP_INIT, COMP_ERR, 851 ("Unable to initialize /proc/net/%s/%s/mac-7\n", 852 rtlpriv->cfg->name, rtlpriv->dbg.proc_name)); 853 854 entry = proc_create_data("bb-8", S_IFREG | S_IRUGO, 855 rtlpriv->dbg.proc_dir, &file_ops_bb_8, hw); 856 if (!entry) 857 RT_TRACE(COMP_INIT, COMP_ERR, 858 ("Unable to initialize /proc/net/%s/%s/bb-8\n", 859 rtlpriv->cfg->name, rtlpriv->dbg.proc_name)); 860 861 entry = proc_create_data("bb-9", S_IFREG | S_IRUGO, 862 rtlpriv->dbg.proc_dir, &file_ops_bb_9, hw); 863 if (!entry) 864 RT_TRACE(COMP_INIT, COMP_ERR, 865 ("Unable to initialize /proc/net/%s/%s/bb-9\n", 866 rtlpriv->cfg->name, rtlpriv->dbg.proc_name)); 867 868 entry = proc_create_data("bb-a", S_IFREG | S_IRUGO, 869 rtlpriv->dbg.proc_dir, &file_ops_bb_a, hw); 870 if (!entry) 871 RT_TRACE(COMP_INIT, COMP_ERR, 872 ("Unable to initialize /proc/net/%s/%s/bb-a\n", 873 rtlpriv->cfg->name, rtlpriv->dbg.proc_name)); 874 875 entry = proc_create_data("bb-b", S_IFREG | S_IRUGO, 876 rtlpriv->dbg.proc_dir, &file_ops_bb_b, hw); 877 if (!entry) 878 RT_TRACE(COMP_INIT, COMP_ERR, 879 ("Unable to initialize /proc/net/%s/%s/bb-b\n", 880 rtlpriv->cfg->name, rtlpriv->dbg.proc_name)); 881 882 entry = proc_create_data("bb-c", S_IFREG | S_IRUGO, 883 rtlpriv->dbg.proc_dir, &file_ops_bb_c, hw); 884 if (!entry) 885 RT_TRACE(COMP_INIT, COMP_ERR, 886 ("Unable to initialize /proc/net/%s/%s/bb-c\n", 887 rtlpriv->cfg->name, rtlpriv->dbg.proc_name)); 888 889 entry = proc_create_data("bb-d", S_IFREG | S_IRUGO, 890 rtlpriv->dbg.proc_dir, &file_ops_bb_d, hw); 891 if (!entry) 892 RT_TRACE(COMP_INIT, COMP_ERR, 893 ("Unable to initialize /proc/net/%s/%s/bb-d\n", 894 rtlpriv->cfg->name, rtlpriv->dbg.proc_name)); 895 896 entry = proc_create_data("bb-e", S_IFREG | S_IRUGO, 897 rtlpriv->dbg.proc_dir, &file_ops_bb_e, hw); 898 if (!entry) 899 RT_TRACE(COMP_INIT, COMP_ERR, 900 ("Unable to initialize /proc/net/%s/%s/bb-e\n", 901 rtlpriv->cfg->name, rtlpriv->dbg.proc_name)); 902 903 entry = proc_create_data("bb-f", S_IFREG | S_IRUGO, 904 rtlpriv->dbg.proc_dir, &file_ops_bb_f, hw); 905 if (!entry) 906 RT_TRACE(COMP_INIT, COMP_ERR, 907 ("Unable to initialize /proc/net/%s/%s/bb-f\n", 908 rtlpriv->cfg->name, rtlpriv->dbg.proc_name)); 909 910 entry = proc_create_data("rf-a", S_IFREG | S_IRUGO, 911 rtlpriv->dbg.proc_dir, &file_ops_rf_a, hw); 912 if (!entry) 913 RT_TRACE(COMP_INIT, COMP_ERR, 914 ("Unable to initialize /proc/net/%s/%s/rf-a\n", 915 rtlpriv->cfg->name, rtlpriv->dbg.proc_name)); 916 917 entry = proc_create_data("rf-b", S_IFREG | S_IRUGO, 918 rtlpriv->dbg.proc_dir, &file_ops_rf_b, hw); 919 if (!entry) 920 RT_TRACE(COMP_INIT, COMP_ERR, 921 ("Unable to initialize /proc/net/%s/%s/rf-b\n", 922 rtlpriv->cfg->name, rtlpriv->dbg.proc_name)); 923 924 entry = proc_create_data("cam-1", S_IFREG | S_IRUGO, 925 rtlpriv->dbg.proc_dir, &file_ops_cam_1, hw); 926 if (!entry) 927 RT_TRACE(COMP_INIT, COMP_ERR, 928 ("Unable to initialize /proc/net/%s/%s/cam-1\n", 929 rtlpriv->cfg->name, rtlpriv->dbg.proc_name)); 930 931 entry = proc_create_data("cam-2", S_IFREG | S_IRUGO, 932 rtlpriv->dbg.proc_dir, &file_ops_cam_2, hw); 933 if (!entry) 934 RT_TRACE(COMP_INIT, COMP_ERR, 935 ("Unable to initialize /proc/net/%s/%s/cam-2\n", 936 rtlpriv->cfg->name, rtlpriv->dbg.proc_name)); 937 938 entry = proc_create_data("cam-3", S_IFREG | S_IRUGO, 939 rtlpriv->dbg.proc_dir, &file_ops_cam_3, hw); 940 if (!entry) 941 RT_TRACE(COMP_INIT, COMP_ERR, 942 ("Unable to initialize /proc/net/%s/%s/cam-3\n", 943 rtlpriv->cfg->name, rtlpriv->dbg.proc_name)); 944} 945 946void rtl_proc_remove_one(struct ieee80211_hw *hw) 947{ 948 struct rtl_priv *rtlpriv = rtl_priv(hw); 949 950 if (rtlpriv->dbg.proc_dir) { 951 remove_proc_entry("mac-0", rtlpriv->dbg.proc_dir); 952 remove_proc_entry("mac-1", rtlpriv->dbg.proc_dir); 953 remove_proc_entry("mac-2", rtlpriv->dbg.proc_dir); 954 remove_proc_entry("mac-3", rtlpriv->dbg.proc_dir); 955 remove_proc_entry("mac-4", rtlpriv->dbg.proc_dir); 956 remove_proc_entry("mac-5", rtlpriv->dbg.proc_dir); 957 remove_proc_entry("mac-6", rtlpriv->dbg.proc_dir); 958 remove_proc_entry("mac-7", rtlpriv->dbg.proc_dir); 959 remove_proc_entry("bb-8", rtlpriv->dbg.proc_dir); 960 remove_proc_entry("bb-9", rtlpriv->dbg.proc_dir); 961 remove_proc_entry("bb-a", rtlpriv->dbg.proc_dir); 962 remove_proc_entry("bb-b", rtlpriv->dbg.proc_dir); 963 remove_proc_entry("bb-c", rtlpriv->dbg.proc_dir); 964 remove_proc_entry("bb-d", rtlpriv->dbg.proc_dir); 965 remove_proc_entry("bb-e", rtlpriv->dbg.proc_dir); 966 remove_proc_entry("bb-f", rtlpriv->dbg.proc_dir); 967 remove_proc_entry("rf-a", rtlpriv->dbg.proc_dir); 968 remove_proc_entry("rf-b", rtlpriv->dbg.proc_dir); 969 remove_proc_entry("cam-1", rtlpriv->dbg.proc_dir); 970 remove_proc_entry("cam-2", rtlpriv->dbg.proc_dir); 971 remove_proc_entry("cam-3", rtlpriv->dbg.proc_dir); 972 973 remove_proc_entry(rtlpriv->dbg.proc_name, proc_topdir); 974 975 rtlpriv->dbg.proc_dir = NULL; 976 } 977} 978 979void rtl_proc_add_topdir(void) 980{ 981 proc_topdir = proc_mkdir("rtlwifi", init_net.proc_net); 982} 983 984void rtl_proc_remove_topdir(void) 985{ 986 if (proc_topdir) 987 remove_proc_entry("rtlwifi", init_net.proc_net); 988}