diff options
Diffstat (limited to 'drivers/net/wireless/ath/ath5k/debug.c')
-rw-r--r-- | drivers/net/wireless/ath/ath5k/debug.c | 382 |
1 files changed, 382 insertions, 0 deletions
diff --git a/drivers/net/wireless/ath/ath5k/debug.c b/drivers/net/wireless/ath/ath5k/debug.c index 747508c15d34..6fb5c5ffa5b1 100644 --- a/drivers/net/wireless/ath/ath5k/debug.c +++ b/drivers/net/wireless/ath/ath5k/debug.c | |||
@@ -69,6 +69,7 @@ module_param_named(debug, ath5k_debug, uint, 0); | |||
69 | 69 | ||
70 | #include <linux/seq_file.h> | 70 | #include <linux/seq_file.h> |
71 | #include "reg.h" | 71 | #include "reg.h" |
72 | #include "ani.h" | ||
72 | 73 | ||
73 | static struct dentry *ath5k_global_debugfs; | 74 | static struct dentry *ath5k_global_debugfs; |
74 | 75 | ||
@@ -307,6 +308,7 @@ static const struct { | |||
307 | { ATH5K_DEBUG_DUMP_TX, "dumptx", "print transmit skb content" }, | 308 | { ATH5K_DEBUG_DUMP_TX, "dumptx", "print transmit skb content" }, |
308 | { ATH5K_DEBUG_DUMPBANDS, "dumpbands", "dump bands" }, | 309 | { ATH5K_DEBUG_DUMPBANDS, "dumpbands", "dump bands" }, |
309 | { ATH5K_DEBUG_TRACE, "trace", "trace function calls" }, | 310 | { ATH5K_DEBUG_TRACE, "trace", "trace function calls" }, |
311 | { ATH5K_DEBUG_ANI, "ani", "adaptive noise immunity" }, | ||
310 | { ATH5K_DEBUG_ANY, "all", "show all debug levels" }, | 312 | { ATH5K_DEBUG_ANY, "all", "show all debug levels" }, |
311 | }; | 313 | }; |
312 | 314 | ||
@@ -364,6 +366,369 @@ static const struct file_operations fops_debug = { | |||
364 | }; | 366 | }; |
365 | 367 | ||
366 | 368 | ||
369 | /* debugfs: antenna */ | ||
370 | |||
371 | static ssize_t read_file_antenna(struct file *file, char __user *user_buf, | ||
372 | size_t count, loff_t *ppos) | ||
373 | { | ||
374 | struct ath5k_softc *sc = file->private_data; | ||
375 | char buf[700]; | ||
376 | unsigned int len = 0; | ||
377 | unsigned int i; | ||
378 | unsigned int v; | ||
379 | |||
380 | len += snprintf(buf+len, sizeof(buf)-len, "antenna mode\t%d\n", | ||
381 | sc->ah->ah_ant_mode); | ||
382 | len += snprintf(buf+len, sizeof(buf)-len, "default antenna\t%d\n", | ||
383 | sc->ah->ah_def_ant); | ||
384 | len += snprintf(buf+len, sizeof(buf)-len, "tx antenna\t%d\n", | ||
385 | sc->ah->ah_tx_ant); | ||
386 | |||
387 | len += snprintf(buf+len, sizeof(buf)-len, "\nANTENNA\t\tRX\tTX\n"); | ||
388 | for (i = 1; i < ARRAY_SIZE(sc->stats.antenna_rx); i++) { | ||
389 | len += snprintf(buf+len, sizeof(buf)-len, | ||
390 | "[antenna %d]\t%d\t%d\n", | ||
391 | i, sc->stats.antenna_rx[i], sc->stats.antenna_tx[i]); | ||
392 | } | ||
393 | len += snprintf(buf+len, sizeof(buf)-len, "[invalid]\t%d\t%d\n", | ||
394 | sc->stats.antenna_rx[0], sc->stats.antenna_tx[0]); | ||
395 | |||
396 | v = ath5k_hw_reg_read(sc->ah, AR5K_DEFAULT_ANTENNA); | ||
397 | len += snprintf(buf+len, sizeof(buf)-len, | ||
398 | "\nAR5K_DEFAULT_ANTENNA\t0x%08x\n", v); | ||
399 | |||
400 | v = ath5k_hw_reg_read(sc->ah, AR5K_STA_ID1); | ||
401 | len += snprintf(buf+len, sizeof(buf)-len, | ||
402 | "AR5K_STA_ID1_DEFAULT_ANTENNA\t%d\n", | ||
403 | (v & AR5K_STA_ID1_DEFAULT_ANTENNA) != 0); | ||
404 | len += snprintf(buf+len, sizeof(buf)-len, | ||
405 | "AR5K_STA_ID1_DESC_ANTENNA\t%d\n", | ||
406 | (v & AR5K_STA_ID1_DESC_ANTENNA) != 0); | ||
407 | len += snprintf(buf+len, sizeof(buf)-len, | ||
408 | "AR5K_STA_ID1_RTS_DEF_ANTENNA\t%d\n", | ||
409 | (v & AR5K_STA_ID1_RTS_DEF_ANTENNA) != 0); | ||
410 | len += snprintf(buf+len, sizeof(buf)-len, | ||
411 | "AR5K_STA_ID1_SELFGEN_DEF_ANT\t%d\n", | ||
412 | (v & AR5K_STA_ID1_SELFGEN_DEF_ANT) != 0); | ||
413 | |||
414 | v = ath5k_hw_reg_read(sc->ah, AR5K_PHY_AGCCTL); | ||
415 | len += snprintf(buf+len, sizeof(buf)-len, | ||
416 | "\nAR5K_PHY_AGCCTL_OFDM_DIV_DIS\t%d\n", | ||
417 | (v & AR5K_PHY_AGCCTL_OFDM_DIV_DIS) != 0); | ||
418 | |||
419 | v = ath5k_hw_reg_read(sc->ah, AR5K_PHY_RESTART); | ||
420 | len += snprintf(buf+len, sizeof(buf)-len, | ||
421 | "AR5K_PHY_RESTART_DIV_GC\t\t%x\n", | ||
422 | (v & AR5K_PHY_RESTART_DIV_GC) >> AR5K_PHY_RESTART_DIV_GC_S); | ||
423 | |||
424 | v = ath5k_hw_reg_read(sc->ah, AR5K_PHY_FAST_ANT_DIV); | ||
425 | len += snprintf(buf+len, sizeof(buf)-len, | ||
426 | "AR5K_PHY_FAST_ANT_DIV_EN\t%d\n", | ||
427 | (v & AR5K_PHY_FAST_ANT_DIV_EN) != 0); | ||
428 | |||
429 | return simple_read_from_buffer(user_buf, count, ppos, buf, len); | ||
430 | } | ||
431 | |||
432 | static ssize_t write_file_antenna(struct file *file, | ||
433 | const char __user *userbuf, | ||
434 | size_t count, loff_t *ppos) | ||
435 | { | ||
436 | struct ath5k_softc *sc = file->private_data; | ||
437 | unsigned int i; | ||
438 | char buf[20]; | ||
439 | |||
440 | if (copy_from_user(buf, userbuf, min(count, sizeof(buf)))) | ||
441 | return -EFAULT; | ||
442 | |||
443 | if (strncmp(buf, "diversity", 9) == 0) { | ||
444 | ath5k_hw_set_antenna_mode(sc->ah, AR5K_ANTMODE_DEFAULT); | ||
445 | printk(KERN_INFO "ath5k debug: enable diversity\n"); | ||
446 | } else if (strncmp(buf, "fixed-a", 7) == 0) { | ||
447 | ath5k_hw_set_antenna_mode(sc->ah, AR5K_ANTMODE_FIXED_A); | ||
448 | printk(KERN_INFO "ath5k debugfs: fixed antenna A\n"); | ||
449 | } else if (strncmp(buf, "fixed-b", 7) == 0) { | ||
450 | ath5k_hw_set_antenna_mode(sc->ah, AR5K_ANTMODE_FIXED_B); | ||
451 | printk(KERN_INFO "ath5k debug: fixed antenna B\n"); | ||
452 | } else if (strncmp(buf, "clear", 5) == 0) { | ||
453 | for (i = 0; i < ARRAY_SIZE(sc->stats.antenna_rx); i++) { | ||
454 | sc->stats.antenna_rx[i] = 0; | ||
455 | sc->stats.antenna_tx[i] = 0; | ||
456 | } | ||
457 | printk(KERN_INFO "ath5k debug: cleared antenna stats\n"); | ||
458 | } | ||
459 | return count; | ||
460 | } | ||
461 | |||
462 | static const struct file_operations fops_antenna = { | ||
463 | .read = read_file_antenna, | ||
464 | .write = write_file_antenna, | ||
465 | .open = ath5k_debugfs_open, | ||
466 | .owner = THIS_MODULE, | ||
467 | }; | ||
468 | |||
469 | |||
470 | /* debugfs: frameerrors */ | ||
471 | |||
472 | static ssize_t read_file_frameerrors(struct file *file, char __user *user_buf, | ||
473 | size_t count, loff_t *ppos) | ||
474 | { | ||
475 | struct ath5k_softc *sc = file->private_data; | ||
476 | struct ath5k_statistics *st = &sc->stats; | ||
477 | char buf[700]; | ||
478 | unsigned int len = 0; | ||
479 | int i; | ||
480 | |||
481 | len += snprintf(buf+len, sizeof(buf)-len, | ||
482 | "RX\n---------------------\n"); | ||
483 | len += snprintf(buf+len, sizeof(buf)-len, "CRC\t%d\t(%d%%)\n", | ||
484 | st->rxerr_crc, | ||
485 | st->rx_all_count > 0 ? | ||
486 | st->rxerr_crc*100/st->rx_all_count : 0); | ||
487 | len += snprintf(buf+len, sizeof(buf)-len, "PHY\t%d\t(%d%%)\n", | ||
488 | st->rxerr_phy, | ||
489 | st->rx_all_count > 0 ? | ||
490 | st->rxerr_phy*100/st->rx_all_count : 0); | ||
491 | for (i = 0; i < 32; i++) { | ||
492 | if (st->rxerr_phy_code[i]) | ||
493 | len += snprintf(buf+len, sizeof(buf)-len, | ||
494 | " phy_err[%d]\t%d\n", | ||
495 | i, st->rxerr_phy_code[i]); | ||
496 | } | ||
497 | |||
498 | len += snprintf(buf+len, sizeof(buf)-len, "FIFO\t%d\t(%d%%)\n", | ||
499 | st->rxerr_fifo, | ||
500 | st->rx_all_count > 0 ? | ||
501 | st->rxerr_fifo*100/st->rx_all_count : 0); | ||
502 | len += snprintf(buf+len, sizeof(buf)-len, "decrypt\t%d\t(%d%%)\n", | ||
503 | st->rxerr_decrypt, | ||
504 | st->rx_all_count > 0 ? | ||
505 | st->rxerr_decrypt*100/st->rx_all_count : 0); | ||
506 | len += snprintf(buf+len, sizeof(buf)-len, "MIC\t%d\t(%d%%)\n", | ||
507 | st->rxerr_mic, | ||
508 | st->rx_all_count > 0 ? | ||
509 | st->rxerr_mic*100/st->rx_all_count : 0); | ||
510 | len += snprintf(buf+len, sizeof(buf)-len, "process\t%d\t(%d%%)\n", | ||
511 | st->rxerr_proc, | ||
512 | st->rx_all_count > 0 ? | ||
513 | st->rxerr_proc*100/st->rx_all_count : 0); | ||
514 | len += snprintf(buf+len, sizeof(buf)-len, "jumbo\t%d\t(%d%%)\n", | ||
515 | st->rxerr_jumbo, | ||
516 | st->rx_all_count > 0 ? | ||
517 | st->rxerr_jumbo*100/st->rx_all_count : 0); | ||
518 | len += snprintf(buf+len, sizeof(buf)-len, "[RX all\t%d]\n", | ||
519 | st->rx_all_count); | ||
520 | |||
521 | len += snprintf(buf+len, sizeof(buf)-len, | ||
522 | "\nTX\n---------------------\n"); | ||
523 | len += snprintf(buf+len, sizeof(buf)-len, "retry\t%d\t(%d%%)\n", | ||
524 | st->txerr_retry, | ||
525 | st->tx_all_count > 0 ? | ||
526 | st->txerr_retry*100/st->tx_all_count : 0); | ||
527 | len += snprintf(buf+len, sizeof(buf)-len, "FIFO\t%d\t(%d%%)\n", | ||
528 | st->txerr_fifo, | ||
529 | st->tx_all_count > 0 ? | ||
530 | st->txerr_fifo*100/st->tx_all_count : 0); | ||
531 | len += snprintf(buf+len, sizeof(buf)-len, "filter\t%d\t(%d%%)\n", | ||
532 | st->txerr_filt, | ||
533 | st->tx_all_count > 0 ? | ||
534 | st->txerr_filt*100/st->tx_all_count : 0); | ||
535 | len += snprintf(buf+len, sizeof(buf)-len, "[TX all\t%d]\n", | ||
536 | st->tx_all_count); | ||
537 | |||
538 | return simple_read_from_buffer(user_buf, count, ppos, buf, len); | ||
539 | } | ||
540 | |||
541 | static ssize_t write_file_frameerrors(struct file *file, | ||
542 | const char __user *userbuf, | ||
543 | size_t count, loff_t *ppos) | ||
544 | { | ||
545 | struct ath5k_softc *sc = file->private_data; | ||
546 | struct ath5k_statistics *st = &sc->stats; | ||
547 | char buf[20]; | ||
548 | |||
549 | if (copy_from_user(buf, userbuf, min(count, sizeof(buf)))) | ||
550 | return -EFAULT; | ||
551 | |||
552 | if (strncmp(buf, "clear", 5) == 0) { | ||
553 | st->rxerr_crc = 0; | ||
554 | st->rxerr_phy = 0; | ||
555 | st->rxerr_fifo = 0; | ||
556 | st->rxerr_decrypt = 0; | ||
557 | st->rxerr_mic = 0; | ||
558 | st->rxerr_proc = 0; | ||
559 | st->rxerr_jumbo = 0; | ||
560 | st->rx_all_count = 0; | ||
561 | st->txerr_retry = 0; | ||
562 | st->txerr_fifo = 0; | ||
563 | st->txerr_filt = 0; | ||
564 | st->tx_all_count = 0; | ||
565 | printk(KERN_INFO "ath5k debug: cleared frameerrors stats\n"); | ||
566 | } | ||
567 | return count; | ||
568 | } | ||
569 | |||
570 | static const struct file_operations fops_frameerrors = { | ||
571 | .read = read_file_frameerrors, | ||
572 | .write = write_file_frameerrors, | ||
573 | .open = ath5k_debugfs_open, | ||
574 | .owner = THIS_MODULE, | ||
575 | }; | ||
576 | |||
577 | |||
578 | /* debugfs: ani */ | ||
579 | |||
580 | static ssize_t read_file_ani(struct file *file, char __user *user_buf, | ||
581 | size_t count, loff_t *ppos) | ||
582 | { | ||
583 | struct ath5k_softc *sc = file->private_data; | ||
584 | struct ath5k_statistics *st = &sc->stats; | ||
585 | struct ath5k_ani_state *as = &sc->ani_state; | ||
586 | |||
587 | char buf[700]; | ||
588 | unsigned int len = 0; | ||
589 | |||
590 | len += snprintf(buf+len, sizeof(buf)-len, | ||
591 | "HW has PHY error counters:\t%s\n", | ||
592 | sc->ah->ah_capabilities.cap_has_phyerr_counters ? | ||
593 | "yes" : "no"); | ||
594 | len += snprintf(buf+len, sizeof(buf)-len, | ||
595 | "HW max spur immunity level:\t%d\n", | ||
596 | as->max_spur_level); | ||
597 | len += snprintf(buf+len, sizeof(buf)-len, | ||
598 | "\nANI state\n--------------------------------------------\n"); | ||
599 | len += snprintf(buf+len, sizeof(buf)-len, "operating mode:\t\t\t"); | ||
600 | switch (as->ani_mode) { | ||
601 | case ATH5K_ANI_MODE_OFF: | ||
602 | len += snprintf(buf+len, sizeof(buf)-len, "OFF\n"); | ||
603 | break; | ||
604 | case ATH5K_ANI_MODE_MANUAL_LOW: | ||
605 | len += snprintf(buf+len, sizeof(buf)-len, | ||
606 | "MANUAL LOW\n"); | ||
607 | break; | ||
608 | case ATH5K_ANI_MODE_MANUAL_HIGH: | ||
609 | len += snprintf(buf+len, sizeof(buf)-len, | ||
610 | "MANUAL HIGH\n"); | ||
611 | break; | ||
612 | case ATH5K_ANI_MODE_AUTO: | ||
613 | len += snprintf(buf+len, sizeof(buf)-len, "AUTO\n"); | ||
614 | break; | ||
615 | default: | ||
616 | len += snprintf(buf+len, sizeof(buf)-len, | ||
617 | "??? (not good)\n"); | ||
618 | break; | ||
619 | } | ||
620 | len += snprintf(buf+len, sizeof(buf)-len, | ||
621 | "noise immunity level:\t\t%d\n", | ||
622 | as->noise_imm_level); | ||
623 | len += snprintf(buf+len, sizeof(buf)-len, | ||
624 | "spur immunity level:\t\t%d\n", | ||
625 | as->spur_level); | ||
626 | len += snprintf(buf+len, sizeof(buf)-len, "firstep level:\t\t\t%d\n", | ||
627 | as->firstep_level); | ||
628 | len += snprintf(buf+len, sizeof(buf)-len, | ||
629 | "OFDM weak signal detection:\t%s\n", | ||
630 | as->ofdm_weak_sig ? "on" : "off"); | ||
631 | len += snprintf(buf+len, sizeof(buf)-len, | ||
632 | "CCK weak signal detection:\t%s\n", | ||
633 | as->cck_weak_sig ? "on" : "off"); | ||
634 | |||
635 | len += snprintf(buf+len, sizeof(buf)-len, | ||
636 | "\nMIB INTERRUPTS:\t\t%u\n", | ||
637 | st->mib_intr); | ||
638 | len += snprintf(buf+len, sizeof(buf)-len, | ||
639 | "beacon RSSI average:\t%d\n", | ||
640 | sc->ah->ah_beacon_rssi_avg.avg); | ||
641 | len += snprintf(buf+len, sizeof(buf)-len, "profcnt tx\t\t%u\t(%d%%)\n", | ||
642 | as->pfc_tx, | ||
643 | as->pfc_cycles > 0 ? | ||
644 | as->pfc_tx*100/as->pfc_cycles : 0); | ||
645 | len += snprintf(buf+len, sizeof(buf)-len, "profcnt rx\t\t%u\t(%d%%)\n", | ||
646 | as->pfc_rx, | ||
647 | as->pfc_cycles > 0 ? | ||
648 | as->pfc_rx*100/as->pfc_cycles : 0); | ||
649 | len += snprintf(buf+len, sizeof(buf)-len, "profcnt busy\t\t%u\t(%d%%)\n", | ||
650 | as->pfc_busy, | ||
651 | as->pfc_cycles > 0 ? | ||
652 | as->pfc_busy*100/as->pfc_cycles : 0); | ||
653 | len += snprintf(buf+len, sizeof(buf)-len, "profcnt cycles\t\t%u\n", | ||
654 | as->pfc_cycles); | ||
655 | len += snprintf(buf+len, sizeof(buf)-len, | ||
656 | "listen time\t\t%d\tlast: %d\n", | ||
657 | as->listen_time, as->last_listen); | ||
658 | len += snprintf(buf+len, sizeof(buf)-len, | ||
659 | "OFDM errors\t\t%u\tlast: %u\tsum: %u\n", | ||
660 | as->ofdm_errors, as->last_ofdm_errors, | ||
661 | as->sum_ofdm_errors); | ||
662 | len += snprintf(buf+len, sizeof(buf)-len, | ||
663 | "CCK errors\t\t%u\tlast: %u\tsum: %u\n", | ||
664 | as->cck_errors, as->last_cck_errors, | ||
665 | as->sum_cck_errors); | ||
666 | len += snprintf(buf+len, sizeof(buf)-len, | ||
667 | "AR5K_PHYERR_CNT1\t%x\t(=%d)\n", | ||
668 | ath5k_hw_reg_read(sc->ah, AR5K_PHYERR_CNT1), | ||
669 | ATH5K_ANI_OFDM_TRIG_HIGH - (ATH5K_PHYERR_CNT_MAX - | ||
670 | ath5k_hw_reg_read(sc->ah, AR5K_PHYERR_CNT1))); | ||
671 | len += snprintf(buf+len, sizeof(buf)-len, | ||
672 | "AR5K_PHYERR_CNT2\t%x\t(=%d)\n", | ||
673 | ath5k_hw_reg_read(sc->ah, AR5K_PHYERR_CNT2), | ||
674 | ATH5K_ANI_CCK_TRIG_HIGH - (ATH5K_PHYERR_CNT_MAX - | ||
675 | ath5k_hw_reg_read(sc->ah, AR5K_PHYERR_CNT2))); | ||
676 | |||
677 | return simple_read_from_buffer(user_buf, count, ppos, buf, len); | ||
678 | } | ||
679 | |||
680 | static ssize_t write_file_ani(struct file *file, | ||
681 | const char __user *userbuf, | ||
682 | size_t count, loff_t *ppos) | ||
683 | { | ||
684 | struct ath5k_softc *sc = file->private_data; | ||
685 | char buf[20]; | ||
686 | |||
687 | if (copy_from_user(buf, userbuf, min(count, sizeof(buf)))) | ||
688 | return -EFAULT; | ||
689 | |||
690 | if (strncmp(buf, "sens-low", 8) == 0) { | ||
691 | ath5k_ani_init(sc->ah, ATH5K_ANI_MODE_MANUAL_HIGH); | ||
692 | } else if (strncmp(buf, "sens-high", 9) == 0) { | ||
693 | ath5k_ani_init(sc->ah, ATH5K_ANI_MODE_MANUAL_LOW); | ||
694 | } else if (strncmp(buf, "ani-off", 7) == 0) { | ||
695 | ath5k_ani_init(sc->ah, ATH5K_ANI_MODE_OFF); | ||
696 | } else if (strncmp(buf, "ani-on", 6) == 0) { | ||
697 | ath5k_ani_init(sc->ah, ATH5K_ANI_MODE_AUTO); | ||
698 | } else if (strncmp(buf, "noise-low", 9) == 0) { | ||
699 | ath5k_ani_set_noise_immunity_level(sc->ah, 0); | ||
700 | } else if (strncmp(buf, "noise-high", 10) == 0) { | ||
701 | ath5k_ani_set_noise_immunity_level(sc->ah, | ||
702 | ATH5K_ANI_MAX_NOISE_IMM_LVL); | ||
703 | } else if (strncmp(buf, "spur-low", 8) == 0) { | ||
704 | ath5k_ani_set_spur_immunity_level(sc->ah, 0); | ||
705 | } else if (strncmp(buf, "spur-high", 9) == 0) { | ||
706 | ath5k_ani_set_spur_immunity_level(sc->ah, | ||
707 | sc->ani_state.max_spur_level); | ||
708 | } else if (strncmp(buf, "fir-low", 7) == 0) { | ||
709 | ath5k_ani_set_firstep_level(sc->ah, 0); | ||
710 | } else if (strncmp(buf, "fir-high", 8) == 0) { | ||
711 | ath5k_ani_set_firstep_level(sc->ah, ATH5K_ANI_MAX_FIRSTEP_LVL); | ||
712 | } else if (strncmp(buf, "ofdm-off", 8) == 0) { | ||
713 | ath5k_ani_set_ofdm_weak_signal_detection(sc->ah, false); | ||
714 | } else if (strncmp(buf, "ofdm-on", 7) == 0) { | ||
715 | ath5k_ani_set_ofdm_weak_signal_detection(sc->ah, true); | ||
716 | } else if (strncmp(buf, "cck-off", 7) == 0) { | ||
717 | ath5k_ani_set_cck_weak_signal_detection(sc->ah, false); | ||
718 | } else if (strncmp(buf, "cck-on", 6) == 0) { | ||
719 | ath5k_ani_set_cck_weak_signal_detection(sc->ah, true); | ||
720 | } | ||
721 | return count; | ||
722 | } | ||
723 | |||
724 | static const struct file_operations fops_ani = { | ||
725 | .read = read_file_ani, | ||
726 | .write = write_file_ani, | ||
727 | .open = ath5k_debugfs_open, | ||
728 | .owner = THIS_MODULE, | ||
729 | }; | ||
730 | |||
731 | |||
367 | /* init */ | 732 | /* init */ |
368 | 733 | ||
369 | void | 734 | void |
@@ -393,6 +758,20 @@ ath5k_debug_init_device(struct ath5k_softc *sc) | |||
393 | 758 | ||
394 | sc->debug.debugfs_reset = debugfs_create_file("reset", S_IWUSR, | 759 | sc->debug.debugfs_reset = debugfs_create_file("reset", S_IWUSR, |
395 | sc->debug.debugfs_phydir, sc, &fops_reset); | 760 | sc->debug.debugfs_phydir, sc, &fops_reset); |
761 | |||
762 | sc->debug.debugfs_antenna = debugfs_create_file("antenna", | ||
763 | S_IWUSR | S_IRUSR, | ||
764 | sc->debug.debugfs_phydir, sc, &fops_antenna); | ||
765 | |||
766 | sc->debug.debugfs_frameerrors = debugfs_create_file("frameerrors", | ||
767 | S_IWUSR | S_IRUSR, | ||
768 | sc->debug.debugfs_phydir, sc, | ||
769 | &fops_frameerrors); | ||
770 | |||
771 | sc->debug.debugfs_ani = debugfs_create_file("ani", | ||
772 | S_IWUSR | S_IRUSR, | ||
773 | sc->debug.debugfs_phydir, sc, | ||
774 | &fops_ani); | ||
396 | } | 775 | } |
397 | 776 | ||
398 | void | 777 | void |
@@ -408,6 +787,9 @@ ath5k_debug_finish_device(struct ath5k_softc *sc) | |||
408 | debugfs_remove(sc->debug.debugfs_registers); | 787 | debugfs_remove(sc->debug.debugfs_registers); |
409 | debugfs_remove(sc->debug.debugfs_beacon); | 788 | debugfs_remove(sc->debug.debugfs_beacon); |
410 | debugfs_remove(sc->debug.debugfs_reset); | 789 | debugfs_remove(sc->debug.debugfs_reset); |
790 | debugfs_remove(sc->debug.debugfs_antenna); | ||
791 | debugfs_remove(sc->debug.debugfs_frameerrors); | ||
792 | debugfs_remove(sc->debug.debugfs_ani); | ||
411 | debugfs_remove(sc->debug.debugfs_phydir); | 793 | debugfs_remove(sc->debug.debugfs_phydir); |
412 | } | 794 | } |
413 | 795 | ||