aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless')
-rw-r--r--drivers/net/wireless/ath/ath9k/debug.c224
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
454static 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
470static 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
550static 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,