diff options
Diffstat (limited to 'drivers/net/wireless')
-rw-r--r-- | drivers/net/wireless/ath/ath9k/debug.c | 224 |
1 files changed, 64 insertions, 160 deletions
diff --git a/drivers/net/wireless/ath/ath9k/debug.c b/drivers/net/wireless/ath/ath9k/debug.c index dc45cf91aba2..b2c60690255a 100644 --- a/drivers/net/wireless/ath/ath9k/debug.c +++ b/drivers/net/wireless/ath/ath9k/debug.c | |||
@@ -451,109 +451,6 @@ static const struct file_operations fops_interrupt = { | |||
451 | .llseek = default_llseek, | 451 | .llseek = default_llseek, |
452 | }; | 452 | }; |
453 | 453 | ||
454 | static const char *channel_type_str(enum nl80211_channel_type t) | ||
455 | { | ||
456 | switch (t) { | ||
457 | case NL80211_CHAN_NO_HT: | ||
458 | return "no ht"; | ||
459 | case NL80211_CHAN_HT20: | ||
460 | return "ht20"; | ||
461 | case NL80211_CHAN_HT40MINUS: | ||
462 | return "ht40-"; | ||
463 | case NL80211_CHAN_HT40PLUS: | ||
464 | return "ht40+"; | ||
465 | default: | ||
466 | return "???"; | ||
467 | } | ||
468 | } | ||
469 | |||
470 | static ssize_t read_file_wiphy(struct file *file, char __user *user_buf, | ||
471 | size_t count, loff_t *ppos) | ||
472 | { | ||
473 | struct ath_softc *sc = file->private_data; | ||
474 | struct ieee80211_channel *chan = sc->hw->conf.channel; | ||
475 | struct ieee80211_conf *conf = &(sc->hw->conf); | ||
476 | char buf[512]; | ||
477 | unsigned int len = 0; | ||
478 | u8 addr[ETH_ALEN]; | ||
479 | u32 tmp; | ||
480 | |||
481 | len += snprintf(buf + len, sizeof(buf) - len, | ||
482 | "%s (chan=%d center-freq: %d MHz channel-type: %d (%s))\n", | ||
483 | wiphy_name(sc->hw->wiphy), | ||
484 | ieee80211_frequency_to_channel(chan->center_freq), | ||
485 | chan->center_freq, | ||
486 | conf->channel_type, | ||
487 | channel_type_str(conf->channel_type)); | ||
488 | |||
489 | ath9k_ps_wakeup(sc); | ||
490 | put_unaligned_le32(REG_READ_D(sc->sc_ah, AR_STA_ID0), addr); | ||
491 | put_unaligned_le16(REG_READ_D(sc->sc_ah, AR_STA_ID1) & 0xffff, addr + 4); | ||
492 | len += snprintf(buf + len, sizeof(buf) - len, | ||
493 | "addr: %pM\n", addr); | ||
494 | put_unaligned_le32(REG_READ_D(sc->sc_ah, AR_BSSMSKL), addr); | ||
495 | put_unaligned_le16(REG_READ_D(sc->sc_ah, AR_BSSMSKU) & 0xffff, addr + 4); | ||
496 | len += snprintf(buf + len, sizeof(buf) - len, | ||
497 | "addrmask: %pM\n", addr); | ||
498 | tmp = ath9k_hw_getrxfilter(sc->sc_ah); | ||
499 | ath9k_ps_restore(sc); | ||
500 | len += snprintf(buf + len, sizeof(buf) - len, | ||
501 | "rfilt: 0x%x", tmp); | ||
502 | if (tmp & ATH9K_RX_FILTER_UCAST) | ||
503 | len += snprintf(buf + len, sizeof(buf) - len, " UCAST"); | ||
504 | if (tmp & ATH9K_RX_FILTER_MCAST) | ||
505 | len += snprintf(buf + len, sizeof(buf) - len, " MCAST"); | ||
506 | if (tmp & ATH9K_RX_FILTER_BCAST) | ||
507 | len += snprintf(buf + len, sizeof(buf) - len, " BCAST"); | ||
508 | if (tmp & ATH9K_RX_FILTER_CONTROL) | ||
509 | len += snprintf(buf + len, sizeof(buf) - len, " CONTROL"); | ||
510 | if (tmp & ATH9K_RX_FILTER_BEACON) | ||
511 | len += snprintf(buf + len, sizeof(buf) - len, " BEACON"); | ||
512 | if (tmp & ATH9K_RX_FILTER_PROM) | ||
513 | len += snprintf(buf + len, sizeof(buf) - len, " PROM"); | ||
514 | if (tmp & ATH9K_RX_FILTER_PROBEREQ) | ||
515 | len += snprintf(buf + len, sizeof(buf) - len, " PROBEREQ"); | ||
516 | if (tmp & ATH9K_RX_FILTER_PHYERR) | ||
517 | len += snprintf(buf + len, sizeof(buf) - len, " PHYERR"); | ||
518 | if (tmp & ATH9K_RX_FILTER_MYBEACON) | ||
519 | len += snprintf(buf + len, sizeof(buf) - len, " MYBEACON"); | ||
520 | if (tmp & ATH9K_RX_FILTER_COMP_BAR) | ||
521 | len += snprintf(buf + len, sizeof(buf) - len, " COMP_BAR"); | ||
522 | if (tmp & ATH9K_RX_FILTER_PSPOLL) | ||
523 | len += snprintf(buf + len, sizeof(buf) - len, " PSPOLL"); | ||
524 | if (tmp & ATH9K_RX_FILTER_PHYRADAR) | ||
525 | len += snprintf(buf + len, sizeof(buf) - len, " PHYRADAR"); | ||
526 | if (tmp & ATH9K_RX_FILTER_MCAST_BCAST_ALL) | ||
527 | len += snprintf(buf + len, sizeof(buf) - len, " MCAST_BCAST_ALL"); | ||
528 | |||
529 | len += snprintf(buf + len, sizeof(buf) - len, | ||
530 | "\n\nReset causes:\n" | ||
531 | " baseband hang: %d\n" | ||
532 | " baseband watchdog: %d\n" | ||
533 | " fatal hardware error interrupt: %d\n" | ||
534 | " tx hardware error: %d\n" | ||
535 | " tx path hang: %d\n" | ||
536 | " pll rx hang: %d\n", | ||
537 | sc->debug.stats.reset[RESET_TYPE_BB_HANG], | ||
538 | sc->debug.stats.reset[RESET_TYPE_BB_WATCHDOG], | ||
539 | sc->debug.stats.reset[RESET_TYPE_FATAL_INT], | ||
540 | sc->debug.stats.reset[RESET_TYPE_TX_ERROR], | ||
541 | sc->debug.stats.reset[RESET_TYPE_TX_HANG], | ||
542 | sc->debug.stats.reset[RESET_TYPE_PLL_HANG]); | ||
543 | |||
544 | if (len > sizeof(buf)) | ||
545 | len = sizeof(buf); | ||
546 | |||
547 | return simple_read_from_buffer(user_buf, count, ppos, buf, len); | ||
548 | } | ||
549 | |||
550 | static const struct file_operations fops_wiphy = { | ||
551 | .read = read_file_wiphy, | ||
552 | .open = ath9k_debugfs_open, | ||
553 | .owner = THIS_MODULE, | ||
554 | .llseek = default_llseek, | ||
555 | }; | ||
556 | |||
557 | #define PR_QNUM(_n) sc->tx.txq_map[_n]->axq_qnum | 454 | #define PR_QNUM(_n) sc->tx.txq_map[_n]->axq_qnum |
558 | #define PR(str, elem) \ | 455 | #define PR(str, elem) \ |
559 | do { \ | 456 | do { \ |
@@ -763,84 +660,93 @@ static ssize_t read_file_misc(struct file *file, char __user *user_buf, | |||
763 | { | 660 | { |
764 | struct ath_softc *sc = file->private_data; | 661 | struct ath_softc *sc = file->private_data; |
765 | struct ath_common *common = ath9k_hw_common(sc->sc_ah); | 662 | struct ath_common *common = ath9k_hw_common(sc->sc_ah); |
766 | struct ath_hw *ah = sc->sc_ah; | ||
767 | struct ieee80211_hw *hw = sc->hw; | 663 | struct ieee80211_hw *hw = sc->hw; |
768 | char *buf; | 664 | struct ath9k_vif_iter_data iter_data; |
769 | unsigned int len = 0, size = 8000; | 665 | char buf[512]; |
666 | unsigned int len = 0; | ||
770 | ssize_t retval = 0; | 667 | ssize_t retval = 0; |
771 | unsigned int reg; | 668 | unsigned int reg; |
772 | struct ath9k_vif_iter_data iter_data; | 669 | u32 rxfilter; |
773 | 670 | ||
774 | ath9k_calculate_iter_data(hw, NULL, &iter_data); | 671 | len += snprintf(buf + len, sizeof(buf) - len, |
775 | 672 | "BSSID: %pM\n", common->curbssid); | |
776 | buf = kzalloc(size, GFP_KERNEL); | 673 | len += snprintf(buf + len, sizeof(buf) - len, |
777 | if (buf == NULL) | 674 | "BSSID-MASK: %pM\n", common->bssidmask); |
778 | return -ENOMEM; | 675 | len += snprintf(buf + len, sizeof(buf) - len, |
676 | "OPMODE: %s\n", ath_opmode_to_string(sc->sc_ah->opmode)); | ||
779 | 677 | ||
780 | ath9k_ps_wakeup(sc); | 678 | ath9k_ps_wakeup(sc); |
781 | len += snprintf(buf + len, size - len, | 679 | rxfilter = ath9k_hw_getrxfilter(sc->sc_ah); |
782 | "curbssid: %pM\n" | ||
783 | "OP-Mode: %s(%i)\n" | ||
784 | "Beacon-Timer-Register: 0x%x\n", | ||
785 | common->curbssid, | ||
786 | ath_opmode_to_string(sc->sc_ah->opmode), | ||
787 | (int)(sc->sc_ah->opmode), | ||
788 | REG_READ(ah, AR_BEACON_PERIOD)); | ||
789 | |||
790 | reg = REG_READ(ah, AR_TIMER_MODE); | ||
791 | ath9k_ps_restore(sc); | 680 | ath9k_ps_restore(sc); |
792 | len += snprintf(buf + len, size - len, "Timer-Mode-Register: 0x%x (", | 681 | |
793 | reg); | 682 | len += snprintf(buf + len, sizeof(buf) - len, |
794 | if (reg & AR_TBTT_TIMER_EN) | 683 | "RXFILTER: 0x%x", rxfilter); |
795 | len += snprintf(buf + len, size - len, "TBTT "); | 684 | |
796 | if (reg & AR_DBA_TIMER_EN) | 685 | if (rxfilter & ATH9K_RX_FILTER_UCAST) |
797 | len += snprintf(buf + len, size - len, "DBA "); | 686 | len += snprintf(buf + len, sizeof(buf) - len, " UCAST"); |
798 | if (reg & AR_SWBA_TIMER_EN) | 687 | if (rxfilter & ATH9K_RX_FILTER_MCAST) |
799 | len += snprintf(buf + len, size - len, "SWBA "); | 688 | len += snprintf(buf + len, sizeof(buf) - len, " MCAST"); |
800 | if (reg & AR_HCF_TIMER_EN) | 689 | if (rxfilter & ATH9K_RX_FILTER_BCAST) |
801 | len += snprintf(buf + len, size - len, "HCF "); | 690 | len += snprintf(buf + len, sizeof(buf) - len, " BCAST"); |
802 | if (reg & AR_TIM_TIMER_EN) | 691 | if (rxfilter & ATH9K_RX_FILTER_CONTROL) |
803 | len += snprintf(buf + len, size - len, "TIM "); | 692 | len += snprintf(buf + len, sizeof(buf) - len, " CONTROL"); |
804 | if (reg & AR_DTIM_TIMER_EN) | 693 | if (rxfilter & ATH9K_RX_FILTER_BEACON) |
805 | len += snprintf(buf + len, size - len, "DTIM "); | 694 | len += snprintf(buf + len, sizeof(buf) - len, " BEACON"); |
806 | len += snprintf(buf + len, size - len, ")\n"); | 695 | if (rxfilter & ATH9K_RX_FILTER_PROM) |
696 | len += snprintf(buf + len, sizeof(buf) - len, " PROM"); | ||
697 | if (rxfilter & ATH9K_RX_FILTER_PROBEREQ) | ||
698 | len += snprintf(buf + len, sizeof(buf) - len, " PROBEREQ"); | ||
699 | if (rxfilter & ATH9K_RX_FILTER_PHYERR) | ||
700 | len += snprintf(buf + len, sizeof(buf) - len, " PHYERR"); | ||
701 | if (rxfilter & ATH9K_RX_FILTER_MYBEACON) | ||
702 | len += snprintf(buf + len, sizeof(buf) - len, " MYBEACON"); | ||
703 | if (rxfilter & ATH9K_RX_FILTER_COMP_BAR) | ||
704 | len += snprintf(buf + len, sizeof(buf) - len, " COMP_BAR"); | ||
705 | if (rxfilter & ATH9K_RX_FILTER_PSPOLL) | ||
706 | len += snprintf(buf + len, sizeof(buf) - len, " PSPOLL"); | ||
707 | if (rxfilter & ATH9K_RX_FILTER_PHYRADAR) | ||
708 | len += snprintf(buf + len, sizeof(buf) - len, " PHYRADAR"); | ||
709 | if (rxfilter & ATH9K_RX_FILTER_MCAST_BCAST_ALL) | ||
710 | len += snprintf(buf + len, sizeof(buf) - len, " MCAST_BCAST_ALL"); | ||
711 | if (rxfilter & ATH9K_RX_FILTER_CONTROL_WRAPPER) | ||
712 | len += snprintf(buf + len, sizeof(buf) - len, " CONTROL_WRAPPER"); | ||
713 | |||
714 | len += snprintf(buf + len, sizeof(buf) - len, "\n"); | ||
807 | 715 | ||
808 | reg = sc->sc_ah->imask; | 716 | reg = sc->sc_ah->imask; |
809 | len += snprintf(buf + len, size - len, "imask: 0x%x (", reg); | 717 | |
718 | len += snprintf(buf + len, sizeof(buf) - len, "INTERRUPT-MASK: 0x%x", reg); | ||
719 | |||
810 | if (reg & ATH9K_INT_SWBA) | 720 | if (reg & ATH9K_INT_SWBA) |
811 | len += snprintf(buf + len, size - len, "SWBA "); | 721 | len += snprintf(buf + len, sizeof(buf) - len, " SWBA"); |
812 | if (reg & ATH9K_INT_BMISS) | 722 | if (reg & ATH9K_INT_BMISS) |
813 | len += snprintf(buf + len, size - len, "BMISS "); | 723 | len += snprintf(buf + len, sizeof(buf) - len, " BMISS"); |
814 | if (reg & ATH9K_INT_CST) | 724 | if (reg & ATH9K_INT_CST) |
815 | len += snprintf(buf + len, size - len, "CST "); | 725 | len += snprintf(buf + len, sizeof(buf) - len, " CST"); |
816 | if (reg & ATH9K_INT_RX) | 726 | if (reg & ATH9K_INT_RX) |
817 | len += snprintf(buf + len, size - len, "RX "); | 727 | len += snprintf(buf + len, sizeof(buf) - len, " RX"); |
818 | if (reg & ATH9K_INT_RXHP) | 728 | if (reg & ATH9K_INT_RXHP) |
819 | len += snprintf(buf + len, size - len, "RXHP "); | 729 | len += snprintf(buf + len, sizeof(buf) - len, " RXHP"); |
820 | if (reg & ATH9K_INT_RXLP) | 730 | if (reg & ATH9K_INT_RXLP) |
821 | len += snprintf(buf + len, size - len, "RXLP "); | 731 | len += snprintf(buf + len, sizeof(buf) - len, " RXLP"); |
822 | if (reg & ATH9K_INT_BB_WATCHDOG) | 732 | if (reg & ATH9K_INT_BB_WATCHDOG) |
823 | len += snprintf(buf + len, size - len, "BB_WATCHDOG "); | 733 | len += snprintf(buf + len, sizeof(buf) - len, " BB_WATCHDOG"); |
824 | /* there are other IRQs if one wanted to add them. */ | ||
825 | len += snprintf(buf + len, size - len, ")\n"); | ||
826 | 734 | ||
827 | len += snprintf(buf + len, size - len, | 735 | len += snprintf(buf + len, sizeof(buf) - len, "\n"); |
828 | "VIF Counts: AP: %i STA: %i MESH: %i WDS: %i" | 736 | |
829 | " ADHOC: %i OTHER: %i nvifs: %hi beacon-vifs: %hi\n", | 737 | ath9k_calculate_iter_data(hw, NULL, &iter_data); |
738 | |||
739 | len += snprintf(buf + len, sizeof(buf) - len, | ||
740 | "VIF-COUNTS: AP: %i STA: %i MESH: %i WDS: %i" | ||
741 | " ADHOC: %i OTHER: %i TOTAL: %hi BEACON-VIF: %hi\n", | ||
830 | iter_data.naps, iter_data.nstations, iter_data.nmeshes, | 742 | iter_data.naps, iter_data.nstations, iter_data.nmeshes, |
831 | iter_data.nwds, iter_data.nadhocs, iter_data.nothers, | 743 | iter_data.nwds, iter_data.nadhocs, iter_data.nothers, |
832 | sc->nvifs, sc->nbcnvifs); | 744 | sc->nvifs, sc->nbcnvifs); |
833 | 745 | ||
834 | len += snprintf(buf + len, size - len, | 746 | if (len > sizeof(buf)) |
835 | "Calculated-BSSID-Mask: %pM\n", | 747 | len = sizeof(buf); |
836 | iter_data.mask); | ||
837 | |||
838 | if (len > size) | ||
839 | len = size; | ||
840 | 748 | ||
841 | retval = simple_read_from_buffer(user_buf, count, ppos, buf, len); | 749 | retval = simple_read_from_buffer(user_buf, count, ppos, buf, len); |
842 | kfree(buf); | ||
843 | |||
844 | return retval; | 750 | return retval; |
845 | } | 751 | } |
846 | 752 | ||
@@ -1637,8 +1543,6 @@ int ath9k_init_debug(struct ath_hw *ah) | |||
1637 | &fops_dma); | 1543 | &fops_dma); |
1638 | debugfs_create_file("interrupt", S_IRUSR, sc->debug.debugfs_phy, sc, | 1544 | debugfs_create_file("interrupt", S_IRUSR, sc->debug.debugfs_phy, sc, |
1639 | &fops_interrupt); | 1545 | &fops_interrupt); |
1640 | debugfs_create_file("wiphy", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy, | ||
1641 | sc, &fops_wiphy); | ||
1642 | debugfs_create_file("xmit", S_IRUSR, sc->debug.debugfs_phy, sc, | 1546 | debugfs_create_file("xmit", S_IRUSR, sc->debug.debugfs_phy, sc, |
1643 | &fops_xmit); | 1547 | &fops_xmit); |
1644 | debugfs_create_file("stations", S_IRUSR, sc->debug.debugfs_phy, sc, | 1548 | debugfs_create_file("stations", S_IRUSR, sc->debug.debugfs_phy, sc, |