Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ath: use seq_file api for ath9k debugfs files

The debugfs files that are defined in debug.c which are read-only
and using a simple_open as .open file operation have been modified
to use the single_open seq_file API. This simplifies the read
functions defining the file contents.

Signed-off-by: Arend van Spriel <arend@broadcom.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

authored by

Arend van Spriel and committed by
Greg Kroah-Hartman
631bee25 98210b7f

+189 -271
+184 -265
drivers/net/wireless/ath/ath9k/debug.c
··· 401 401 .llseek = default_llseek, 402 402 }; 403 403 404 - static ssize_t read_file_dma(struct file *file, char __user *user_buf, 405 - size_t count, loff_t *ppos) 404 + static int read_file_dma(struct seq_file *file, void *data) 406 405 { 407 - struct ath_softc *sc = file->private_data; 406 + struct ath_softc *sc = file->private; 408 407 struct ath_hw *ah = sc->sc_ah; 409 - char *buf; 410 - int retval; 411 - unsigned int len = 0; 412 408 u32 val[ATH9K_NUM_DMA_DEBUG_REGS]; 413 409 int i, qcuOffset = 0, dcuOffset = 0; 414 410 u32 *qcuBase = &val[0], *dcuBase = &val[4]; 415 - 416 - buf = kmalloc(DMA_BUF_LEN, GFP_KERNEL); 417 - if (!buf) 418 - return -ENOMEM; 419 411 420 412 ath9k_ps_wakeup(sc); 421 413 ··· 416 424 (AR_MACMISC_MISC_OBS_BUS_1 << 417 425 AR_MACMISC_MISC_OBS_BUS_MSB_S))); 418 426 419 - len += scnprintf(buf + len, DMA_BUF_LEN - len, 420 - "Raw DMA Debug values:\n"); 427 + seq_puts(file, "Raw DMA Debug values:\n"); 421 428 422 429 for (i = 0; i < ATH9K_NUM_DMA_DEBUG_REGS; i++) { 423 430 if (i % 4 == 0) 424 - len += scnprintf(buf + len, DMA_BUF_LEN - len, "\n"); 431 + seq_puts(file, "\n"); 425 432 426 433 val[i] = REG_READ_D(ah, AR_DMADBG_0 + (i * sizeof(u32))); 427 - len += scnprintf(buf + len, DMA_BUF_LEN - len, "%d: %08x ", 428 - i, val[i]); 434 + seq_printf(file, "%d: %08x ", i, val[i]); 429 435 } 430 436 431 - len += scnprintf(buf + len, DMA_BUF_LEN - len, "\n\n"); 432 - len += scnprintf(buf + len, DMA_BUF_LEN - len, 433 - "Num QCU: chain_st fsp_ok fsp_st DCU: chain_st\n"); 437 + seq_puts(file, "\n\n"); 438 + seq_puts(file, "Num QCU: chain_st fsp_ok fsp_st DCU: chain_st\n"); 434 439 435 440 for (i = 0; i < ATH9K_NUM_QUEUES; i++, qcuOffset += 4, dcuOffset += 5) { 436 441 if (i == 8) { ··· 440 451 dcuBase++; 441 452 } 442 453 443 - len += scnprintf(buf + len, DMA_BUF_LEN - len, 444 - "%2d %2x %1x %2x %2x\n", 445 - i, (*qcuBase & (0x7 << qcuOffset)) >> qcuOffset, 446 - (*qcuBase & (0x8 << qcuOffset)) >> (qcuOffset + 3), 447 - (val[2] & (0x7 << (i * 3))) >> (i * 3), 448 - (*dcuBase & (0x1f << dcuOffset)) >> dcuOffset); 454 + seq_printf(file, "%2d %2x %1x %2x %2x\n", 455 + i, (*qcuBase & (0x7 << qcuOffset)) >> qcuOffset, 456 + (*qcuBase & (0x8 << qcuOffset)) >> (qcuOffset + 3), 457 + (val[2] & (0x7 << (i * 3))) >> (i * 3), 458 + (*dcuBase & (0x1f << dcuOffset)) >> dcuOffset); 449 459 } 450 460 451 - len += scnprintf(buf + len, DMA_BUF_LEN - len, "\n"); 461 + seq_puts(file, "\n"); 452 462 453 - len += scnprintf(buf + len, DMA_BUF_LEN - len, 454 - "qcu_stitch state: %2x qcu_fetch state: %2x\n", 455 - (val[3] & 0x003c0000) >> 18, (val[3] & 0x03c00000) >> 22); 456 - len += scnprintf(buf + len, DMA_BUF_LEN - len, 457 - "qcu_complete state: %2x dcu_complete state: %2x\n", 458 - (val[3] & 0x1c000000) >> 26, (val[6] & 0x3)); 459 - len += scnprintf(buf + len, DMA_BUF_LEN - len, 460 - "dcu_arb state: %2x dcu_fp state: %2x\n", 461 - (val[5] & 0x06000000) >> 25, (val[5] & 0x38000000) >> 27); 462 - len += scnprintf(buf + len, DMA_BUF_LEN - len, 463 - "chan_idle_dur: %3d chan_idle_dur_valid: %1d\n", 464 - (val[6] & 0x000003fc) >> 2, (val[6] & 0x00000400) >> 10); 465 - len += scnprintf(buf + len, DMA_BUF_LEN - len, 466 - "txfifo_valid_0: %1d txfifo_valid_1: %1d\n", 467 - (val[6] & 0x00000800) >> 11, (val[6] & 0x00001000) >> 12); 468 - len += scnprintf(buf + len, DMA_BUF_LEN - len, 469 - "txfifo_dcu_num_0: %2d txfifo_dcu_num_1: %2d\n", 470 - (val[6] & 0x0001e000) >> 13, (val[6] & 0x001e0000) >> 17); 463 + seq_printf(file, "qcu_stitch state: %2x qcu_fetch state: %2x\n", 464 + (val[3] & 0x003c0000) >> 18, (val[3] & 0x03c00000) >> 22); 465 + seq_printf(file, "qcu_complete state: %2x dcu_complete state: %2x\n", 466 + (val[3] & 0x1c000000) >> 26, (val[6] & 0x3)); 467 + seq_printf(file, "dcu_arb state: %2x dcu_fp state: %2x\n", 468 + (val[5] & 0x06000000) >> 25, (val[5] & 0x38000000) >> 27); 469 + seq_printf(file, "chan_idle_dur: %3d chan_idle_dur_valid: %1d\n", 470 + (val[6] & 0x000003fc) >> 2, (val[6] & 0x00000400) >> 10); 471 + seq_printf(file, "txfifo_valid_0: %1d txfifo_valid_1: %1d\n", 472 + (val[6] & 0x00000800) >> 11, (val[6] & 0x00001000) >> 12); 473 + seq_printf(file, "txfifo_dcu_num_0: %2d txfifo_dcu_num_1: %2d\n", 474 + (val[6] & 0x0001e000) >> 13, (val[6] & 0x001e0000) >> 17); 471 475 472 - len += scnprintf(buf + len, DMA_BUF_LEN - len, "pcu observe: 0x%x\n", 473 - REG_READ_D(ah, AR_OBS_BUS_1)); 474 - len += scnprintf(buf + len, DMA_BUF_LEN - len, 475 - "AR_CR: 0x%x\n", REG_READ_D(ah, AR_CR)); 476 + seq_printf(file, "pcu observe: 0x%x\n", REG_READ_D(ah, AR_OBS_BUS_1)); 477 + seq_printf(file, "AR_CR: 0x%x\n", REG_READ_D(ah, AR_CR)); 476 478 477 479 ath9k_ps_restore(sc); 478 480 479 - if (len > DMA_BUF_LEN) 480 - len = DMA_BUF_LEN; 481 + return 0; 482 + } 481 483 482 - retval = simple_read_from_buffer(user_buf, count, ppos, buf, len); 483 - kfree(buf); 484 - return retval; 484 + static int open_file_dma(struct inode *inode, struct file *f) 485 + { 486 + return single_open(f, read_file_dma, inode->i_private); 485 487 } 486 488 487 489 static const struct file_operations fops_dma = { 488 - .read = read_file_dma, 489 - .open = simple_open, 490 + .open = open_file_dma, 491 + .read = seq_read, 490 492 .owner = THIS_MODULE, 491 - .llseek = default_llseek, 493 + .llseek = seq_lseek, 494 + .release = single_release, 492 495 }; 493 496 494 497 ··· 537 556 sc->debug.stats.istats.gen_timer++; 538 557 } 539 558 540 - static ssize_t read_file_interrupt(struct file *file, char __user *user_buf, 541 - size_t count, loff_t *ppos) 559 + static int read_file_interrupt(struct seq_file *file, void *data) 542 560 { 543 - struct ath_softc *sc = file->private_data; 544 - unsigned int len = 0; 545 - int rv; 546 - int mxlen = 4000; 547 - char *buf = kmalloc(mxlen, GFP_KERNEL); 548 - if (!buf) 549 - return -ENOMEM; 561 + struct ath_softc *sc = file->private; 550 562 551 563 #define PR_IS(a, s) \ 552 564 do { \ 553 - len += scnprintf(buf + len, mxlen - len, \ 554 - "%21s: %10u\n", a, \ 555 - sc->debug.stats.istats.s); \ 565 + seq_printf(file, "%21s: %10u\n", a, \ 566 + sc->debug.stats.istats.s); \ 556 567 } while (0) 557 568 558 569 if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) { ··· 575 602 PR_IS("GENTIMER", gen_timer); 576 603 PR_IS("TOTAL", total); 577 604 578 - len += scnprintf(buf + len, mxlen - len, 579 - "SYNC_CAUSE stats:\n"); 605 + seq_puts(file, "SYNC_CAUSE stats:\n"); 580 606 581 607 PR_IS("Sync-All", sync_cause_all); 582 608 PR_IS("RTC-IRQ", sync_rtc_irq); ··· 597 625 PR_IS("MAC-Asleep", mac_asleep); 598 626 PR_IS("MAC-Sleep-Access", mac_sleep_access); 599 627 600 - if (len > mxlen) 601 - len = mxlen; 628 + return 0; 629 + } 602 630 603 - rv = simple_read_from_buffer(user_buf, count, ppos, buf, len); 604 - kfree(buf); 605 - return rv; 631 + static int open_file_interrupt(struct inode *inode, struct file *f) 632 + { 633 + return single_open(f, read_file_interrupt, inode->i_private); 606 634 } 607 635 608 636 static const struct file_operations fops_interrupt = { 609 - .read = read_file_interrupt, 610 - .open = simple_open, 637 + .read = seq_read, 638 + .open = open_file_interrupt, 611 639 .owner = THIS_MODULE, 612 - .llseek = default_llseek, 640 + .llseek = seq_lseek, 641 + .release = single_release, 613 642 }; 614 643 615 - static ssize_t read_file_xmit(struct file *file, char __user *user_buf, 616 - size_t count, loff_t *ppos) 644 + static int read_file_xmit(struct seq_file *file, void *data) 617 645 { 618 - struct ath_softc *sc = file->private_data; 619 - char *buf; 620 - unsigned int len = 0, size = 2048; 621 - ssize_t retval = 0; 646 + struct ath_softc *sc = file->private; 622 647 623 - buf = kzalloc(size, GFP_KERNEL); 624 - if (buf == NULL) 625 - return -ENOMEM; 626 - 627 - len += sprintf(buf, "%30s %10s%10s%10s\n\n", 628 - "BE", "BK", "VI", "VO"); 648 + seq_printf(file, "%30s %10s%10s%10s\n\n", "BE", "BK", "VI", "VO"); 629 649 630 650 PR("MPDUs Queued: ", queued); 631 651 PR("MPDUs Completed: ", completed); ··· 642 678 PR("HW-tx-proc-desc: ", txprocdesc); 643 679 PR("TX-Failed: ", txfailed); 644 680 645 - if (len > size) 646 - len = size; 647 - 648 - retval = simple_read_from_buffer(user_buf, count, ppos, buf, len); 649 - kfree(buf); 650 - 651 - return retval; 681 + return 0; 652 682 } 653 683 654 - static ssize_t print_queue(struct ath_softc *sc, struct ath_txq *txq, 655 - char *buf, ssize_t size) 684 + static void print_queue(struct ath_softc *sc, struct ath_txq *txq, 685 + struct seq_file *file) 656 686 { 657 - ssize_t len = 0; 658 - 659 687 ath_txq_lock(sc, txq); 660 688 661 - len += scnprintf(buf + len, size - len, "%s: %d ", 662 - "qnum", txq->axq_qnum); 663 - len += scnprintf(buf + len, size - len, "%s: %2d ", 664 - "qdepth", txq->axq_depth); 665 - len += scnprintf(buf + len, size - len, "%s: %2d ", 666 - "ampdu-depth", txq->axq_ampdu_depth); 667 - len += scnprintf(buf + len, size - len, "%s: %3d ", 668 - "pending", txq->pending_frames); 669 - len += scnprintf(buf + len, size - len, "%s: %d\n", 670 - "stopped", txq->stopped); 689 + seq_printf(file, "%s: %d ", "qnum", txq->axq_qnum); 690 + seq_printf(file, "%s: %2d ", "qdepth", txq->axq_depth); 691 + seq_printf(file, "%s: %2d ", "ampdu-depth", txq->axq_ampdu_depth); 692 + seq_printf(file, "%s: %3d ", "pending", txq->pending_frames); 693 + seq_printf(file, "%s: %d\n", "stopped", txq->stopped); 671 694 672 695 ath_txq_unlock(sc, txq); 673 - return len; 674 696 } 675 697 676 - static ssize_t read_file_queues(struct file *file, char __user *user_buf, 677 - size_t count, loff_t *ppos) 698 + static int read_file_queues(struct seq_file *file, void *data) 678 699 { 679 - struct ath_softc *sc = file->private_data; 700 + struct ath_softc *sc = file->private; 680 701 struct ath_txq *txq; 681 - char *buf; 682 - unsigned int len = 0; 683 - const unsigned int size = 1024; 684 - ssize_t retval = 0; 685 702 int i; 686 703 static const char *qname[4] = { 687 704 "VO", "VI", "BE", "BK" 688 705 }; 689 706 690 - buf = kzalloc(size, GFP_KERNEL); 691 - if (buf == NULL) 692 - return -ENOMEM; 693 - 694 707 for (i = 0; i < IEEE80211_NUM_ACS; i++) { 695 708 txq = sc->tx.txq_map[i]; 696 - len += scnprintf(buf + len, size - len, "(%s): ", qname[i]); 697 - len += print_queue(sc, txq, buf + len, size - len); 709 + seq_printf(file, "(%s): ", qname[i]); 710 + print_queue(sc, txq, file); 698 711 } 699 712 700 - len += scnprintf(buf + len, size - len, "(CAB): "); 701 - len += print_queue(sc, sc->beacon.cabq, buf + len, size - len); 713 + seq_puts(file, "(CAB): "); 714 + print_queue(sc, sc->beacon.cabq, file); 702 715 703 - if (len > size) 704 - len = size; 705 - 706 - retval = simple_read_from_buffer(user_buf, count, ppos, buf, len); 707 - kfree(buf); 708 - 709 - return retval; 716 + return 0; 710 717 } 711 718 712 - static ssize_t read_file_misc(struct file *file, char __user *user_buf, 713 - size_t count, loff_t *ppos) 719 + static int read_file_misc(struct seq_file *file, void *data) 714 720 { 715 - struct ath_softc *sc = file->private_data; 721 + struct ath_softc *sc = file->private; 716 722 struct ath_common *common = ath9k_hw_common(sc->sc_ah); 717 723 struct ath9k_vif_iter_data iter_data; 718 724 struct ath_chanctx *ctx; 719 - char buf[512]; 720 - unsigned int len = 0; 721 - ssize_t retval = 0; 722 725 unsigned int reg; 723 726 u32 rxfilter, i; 724 727 725 - len += scnprintf(buf + len, sizeof(buf) - len, 726 - "BSSID: %pM\n", common->curbssid); 727 - len += scnprintf(buf + len, sizeof(buf) - len, 728 - "BSSID-MASK: %pM\n", common->bssidmask); 729 - len += scnprintf(buf + len, sizeof(buf) - len, 730 - "OPMODE: %s\n", 731 - ath_opmode_to_string(sc->sc_ah->opmode)); 728 + seq_printf(file, "BSSID: %pM\n", common->curbssid); 729 + seq_printf(file, "BSSID-MASK: %pM\n", common->bssidmask); 730 + seq_printf(file, "OPMODE: %s\n", 731 + ath_opmode_to_string(sc->sc_ah->opmode)); 732 732 733 733 ath9k_ps_wakeup(sc); 734 734 rxfilter = ath9k_hw_getrxfilter(sc->sc_ah); 735 735 ath9k_ps_restore(sc); 736 736 737 - len += scnprintf(buf + len, sizeof(buf) - len, 738 - "RXFILTER: 0x%x", rxfilter); 737 + seq_printf(file, "RXFILTER: 0x%x", rxfilter); 739 738 740 739 if (rxfilter & ATH9K_RX_FILTER_UCAST) 741 - len += scnprintf(buf + len, sizeof(buf) - len, " UCAST"); 740 + seq_puts(file, " UCAST"); 742 741 if (rxfilter & ATH9K_RX_FILTER_MCAST) 743 - len += scnprintf(buf + len, sizeof(buf) - len, " MCAST"); 742 + seq_puts(file, " MCAST"); 744 743 if (rxfilter & ATH9K_RX_FILTER_BCAST) 745 - len += scnprintf(buf + len, sizeof(buf) - len, " BCAST"); 744 + seq_puts(file, " BCAST"); 746 745 if (rxfilter & ATH9K_RX_FILTER_CONTROL) 747 - len += scnprintf(buf + len, sizeof(buf) - len, " CONTROL"); 746 + seq_puts(file, " CONTROL"); 748 747 if (rxfilter & ATH9K_RX_FILTER_BEACON) 749 - len += scnprintf(buf + len, sizeof(buf) - len, " BEACON"); 748 + seq_puts(file, " BEACON"); 750 749 if (rxfilter & ATH9K_RX_FILTER_PROM) 751 - len += scnprintf(buf + len, sizeof(buf) - len, " PROM"); 750 + seq_puts(file, " PROM"); 752 751 if (rxfilter & ATH9K_RX_FILTER_PROBEREQ) 753 - len += scnprintf(buf + len, sizeof(buf) - len, " PROBEREQ"); 752 + seq_puts(file, " PROBEREQ"); 754 753 if (rxfilter & ATH9K_RX_FILTER_PHYERR) 755 - len += scnprintf(buf + len, sizeof(buf) - len, " PHYERR"); 754 + seq_puts(file, " PHYERR"); 756 755 if (rxfilter & ATH9K_RX_FILTER_MYBEACON) 757 - len += scnprintf(buf + len, sizeof(buf) - len, " MYBEACON"); 756 + seq_puts(file, " MYBEACON"); 758 757 if (rxfilter & ATH9K_RX_FILTER_COMP_BAR) 759 - len += scnprintf(buf + len, sizeof(buf) - len, " COMP_BAR"); 758 + seq_puts(file, " COMP_BAR"); 760 759 if (rxfilter & ATH9K_RX_FILTER_PSPOLL) 761 - len += scnprintf(buf + len, sizeof(buf) - len, " PSPOLL"); 760 + seq_puts(file, " PSPOLL"); 762 761 if (rxfilter & ATH9K_RX_FILTER_PHYRADAR) 763 - len += scnprintf(buf + len, sizeof(buf) - len, " PHYRADAR"); 762 + seq_puts(file, " PHYRADAR"); 764 763 if (rxfilter & ATH9K_RX_FILTER_MCAST_BCAST_ALL) 765 - len += scnprintf(buf + len, sizeof(buf) - len, " MCAST_BCAST_ALL"); 764 + seq_puts(file, " MCAST_BCAST_ALL"); 766 765 if (rxfilter & ATH9K_RX_FILTER_CONTROL_WRAPPER) 767 - len += scnprintf(buf + len, sizeof(buf) - len, " CONTROL_WRAPPER"); 766 + seq_puts(file, " CONTROL_WRAPPER"); 768 767 769 - len += scnprintf(buf + len, sizeof(buf) - len, "\n"); 768 + seq_puts(file, "\n"); 770 769 771 770 reg = sc->sc_ah->imask; 772 771 773 - len += scnprintf(buf + len, sizeof(buf) - len, 774 - "INTERRUPT-MASK: 0x%x", reg); 772 + seq_printf(file, "INTERRUPT-MASK: 0x%x", reg); 775 773 776 774 if (reg & ATH9K_INT_SWBA) 777 - len += scnprintf(buf + len, sizeof(buf) - len, " SWBA"); 775 + seq_puts(file, " SWBA"); 778 776 if (reg & ATH9K_INT_BMISS) 779 - len += scnprintf(buf + len, sizeof(buf) - len, " BMISS"); 777 + seq_puts(file, " BMISS"); 780 778 if (reg & ATH9K_INT_CST) 781 - len += scnprintf(buf + len, sizeof(buf) - len, " CST"); 779 + seq_puts(file, " CST"); 782 780 if (reg & ATH9K_INT_RX) 783 - len += scnprintf(buf + len, sizeof(buf) - len, " RX"); 781 + seq_puts(file, " RX"); 784 782 if (reg & ATH9K_INT_RXHP) 785 - len += scnprintf(buf + len, sizeof(buf) - len, " RXHP"); 783 + seq_puts(file, " RXHP"); 786 784 if (reg & ATH9K_INT_RXLP) 787 - len += scnprintf(buf + len, sizeof(buf) - len, " RXLP"); 785 + seq_puts(file, " RXLP"); 788 786 if (reg & ATH9K_INT_BB_WATCHDOG) 789 - len += scnprintf(buf + len, sizeof(buf) - len, " BB_WATCHDOG"); 787 + seq_puts(file, " BB_WATCHDOG"); 790 788 791 - len += scnprintf(buf + len, sizeof(buf) - len, "\n"); 789 + seq_puts(file, "\n"); 792 790 793 791 i = 0; 794 792 ath_for_each_chanctx(sc, ctx) { ··· 758 832 continue; 759 833 ath9k_calculate_iter_data(sc, ctx, &iter_data); 760 834 761 - len += scnprintf(buf + len, sizeof(buf) - len, 762 - "VIF-COUNTS: CTX %i AP: %i STA: %i MESH: %i WDS: %i", 763 - i++, iter_data.naps, iter_data.nstations, 764 - iter_data.nmeshes, iter_data.nwds); 765 - len += scnprintf(buf + len, sizeof(buf) - len, 766 - " ADHOC: %i TOTAL: %hi BEACON-VIF: %hi\n", 767 - iter_data.nadhocs, sc->cur_chan->nvifs, sc->nbcnvifs); 835 + seq_printf(file, 836 + "VIF-COUNTS: CTX %i AP: %i STA: %i MESH: %i WDS: %i", 837 + i++, iter_data.naps, iter_data.nstations, 838 + iter_data.nmeshes, iter_data.nwds); 839 + seq_printf(file, " ADHOC: %i TOTAL: %hi BEACON-VIF: %hi\n", 840 + iter_data.nadhocs, sc->cur_chan->nvifs, 841 + sc->nbcnvifs); 768 842 } 769 843 770 - if (len > sizeof(buf)) 771 - len = sizeof(buf); 772 - 773 - retval = simple_read_from_buffer(user_buf, count, ppos, buf, len); 774 - return retval; 844 + return 0; 775 845 } 776 846 777 - static ssize_t read_file_reset(struct file *file, char __user *user_buf, 778 - size_t count, loff_t *ppos) 847 + static int read_file_reset(struct seq_file *file, void *data) 779 848 { 780 - struct ath_softc *sc = file->private_data; 781 - char buf[512]; 782 - unsigned int len = 0; 849 + struct ath_softc *sc = file->private; 783 850 784 - len += scnprintf(buf + len, sizeof(buf) - len, 785 - "%17s: %2d\n", "Baseband Hang", 786 - sc->debug.stats.reset[RESET_TYPE_BB_HANG]); 787 - len += scnprintf(buf + len, sizeof(buf) - len, 788 - "%17s: %2d\n", "Baseband Watchdog", 789 - sc->debug.stats.reset[RESET_TYPE_BB_WATCHDOG]); 790 - len += scnprintf(buf + len, sizeof(buf) - len, 791 - "%17s: %2d\n", "Fatal HW Error", 792 - sc->debug.stats.reset[RESET_TYPE_FATAL_INT]); 793 - len += scnprintf(buf + len, sizeof(buf) - len, 794 - "%17s: %2d\n", "TX HW error", 795 - sc->debug.stats.reset[RESET_TYPE_TX_ERROR]); 796 - len += scnprintf(buf + len, sizeof(buf) - len, 797 - "%17s: %2d\n", "TX Path Hang", 798 - sc->debug.stats.reset[RESET_TYPE_TX_HANG]); 799 - len += scnprintf(buf + len, sizeof(buf) - len, 800 - "%17s: %2d\n", "PLL RX Hang", 801 - sc->debug.stats.reset[RESET_TYPE_PLL_HANG]); 802 - len += scnprintf(buf + len, sizeof(buf) - len, 803 - "%17s: %2d\n", "MAC Hang", 804 - sc->debug.stats.reset[RESET_TYPE_MAC_HANG]); 805 - len += scnprintf(buf + len, sizeof(buf) - len, 806 - "%17s: %2d\n", "Stuck Beacon", 807 - sc->debug.stats.reset[RESET_TYPE_BEACON_STUCK]); 808 - len += scnprintf(buf + len, sizeof(buf) - len, 809 - "%17s: %2d\n", "MCI Reset", 810 - sc->debug.stats.reset[RESET_TYPE_MCI]); 851 + seq_printf(file, "%17s: %2d\n", "Baseband Hang", 852 + sc->debug.stats.reset[RESET_TYPE_BB_HANG]); 853 + seq_printf(file, "%17s: %2d\n", "Baseband Watchdog", 854 + sc->debug.stats.reset[RESET_TYPE_BB_WATCHDOG]); 855 + seq_printf(file, "%17s: %2d\n", "Fatal HW Error", 856 + sc->debug.stats.reset[RESET_TYPE_FATAL_INT]); 857 + seq_printf(file, "%17s: %2d\n", "TX HW error", 858 + sc->debug.stats.reset[RESET_TYPE_TX_ERROR]); 859 + seq_printf(file, "%17s: %2d\n", "TX Path Hang", 860 + sc->debug.stats.reset[RESET_TYPE_TX_HANG]); 861 + seq_printf(file, "%17s: %2d\n", "PLL RX Hang", 862 + sc->debug.stats.reset[RESET_TYPE_PLL_HANG]); 863 + seq_printf(file, "%17s: %2d\n", "MAC Hang", 864 + sc->debug.stats.reset[RESET_TYPE_MAC_HANG]); 865 + seq_printf(file, "%17s: %2d\n", "Stuck Beacon", 866 + sc->debug.stats.reset[RESET_TYPE_BEACON_STUCK]); 867 + seq_printf(file, "%17s: %2d\n", "MCI Reset", 868 + sc->debug.stats.reset[RESET_TYPE_MCI]); 811 869 812 - if (len > sizeof(buf)) 813 - len = sizeof(buf); 814 - 815 - return simple_read_from_buffer(user_buf, count, ppos, buf, len); 870 + return 0; 816 871 } 817 872 818 873 void ath_debug_stat_tx(struct ath_softc *sc, struct ath_buf *bf, ··· 833 926 TX_STAT_INC(qnum, delim_underrun); 834 927 } 835 928 929 + static int open_file_xmit(struct inode *inode, struct file *f) 930 + { 931 + return single_open(f, read_file_xmit, inode->i_private); 932 + } 933 + 836 934 static const struct file_operations fops_xmit = { 837 - .read = read_file_xmit, 838 - .open = simple_open, 935 + .read = seq_read, 936 + .open = open_file_xmit, 839 937 .owner = THIS_MODULE, 840 - .llseek = default_llseek, 938 + .llseek = seq_lseek, 939 + .release = single_release, 841 940 }; 941 + 942 + static int open_file_queues(struct inode *inode, struct file *f) 943 + { 944 + return single_open(f, read_file_queues, inode->i_private); 945 + } 842 946 843 947 static const struct file_operations fops_queues = { 844 - .read = read_file_queues, 845 - .open = simple_open, 948 + .read = seq_read, 949 + .open = open_file_queues, 846 950 .owner = THIS_MODULE, 847 - .llseek = default_llseek, 951 + .llseek = seq_lseek, 952 + .release = single_release, 848 953 }; 954 + 955 + static int open_file_misc(struct inode *inode, struct file *f) 956 + { 957 + return single_open(f, read_file_misc, inode->i_private); 958 + } 849 959 850 960 static const struct file_operations fops_misc = { 851 - .read = read_file_misc, 852 - .open = simple_open, 961 + .read = seq_read, 962 + .open = open_file_misc, 853 963 .owner = THIS_MODULE, 854 - .llseek = default_llseek, 964 + .llseek = seq_lseek, 965 + .release = single_release, 855 966 }; 856 967 968 + static int open_file_reset(struct inode *inode, struct file *f) 969 + { 970 + return single_open(f, read_file_reset, inode->i_private); 971 + } 972 + 857 973 static const struct file_operations fops_reset = { 858 - .read = read_file_reset, 859 - .open = simple_open, 974 + .read = seq_read, 975 + .open = open_file_reset, 860 976 .owner = THIS_MODULE, 861 - .llseek = default_llseek, 977 + .llseek = seq_lseek, 978 + .release = single_release, 862 979 }; 863 980 864 981 void ath_debug_stat_rx(struct ath_softc *sc, struct ath_rx_status *rs) ··· 891 960 } 892 961 893 962 static ssize_t read_file_regidx(struct file *file, char __user *user_buf, 894 - size_t count, loff_t *ppos) 963 + size_t count, loff_t *ppos) 895 964 { 896 965 struct ath_softc *sc = file->private_data; 897 966 char buf[32]; ··· 902 971 } 903 972 904 973 static ssize_t write_file_regidx(struct file *file, const char __user *user_buf, 905 - size_t count, loff_t *ppos) 974 + size_t count, loff_t *ppos) 906 975 { 907 976 struct ath_softc *sc = file->private_data; 908 977 unsigned long regidx; ··· 930 999 }; 931 1000 932 1001 static ssize_t read_file_regval(struct file *file, char __user *user_buf, 933 - size_t count, loff_t *ppos) 1002 + size_t count, loff_t *ppos) 934 1003 { 935 1004 struct ath_softc *sc = file->private_data; 936 1005 struct ath_hw *ah = sc->sc_ah; ··· 946 1015 } 947 1016 948 1017 static ssize_t write_file_regval(struct file *file, const char __user *user_buf, 949 - size_t count, loff_t *ppos) 1018 + size_t count, loff_t *ppos) 950 1019 { 951 1020 struct ath_softc *sc = file->private_data; 952 1021 struct ath_hw *ah = sc->sc_ah; ··· 1012 1081 .llseek = default_llseek,/* read accesses f_pos */ 1013 1082 }; 1014 1083 1015 - static ssize_t read_file_dump_nfcal(struct file *file, char __user *user_buf, 1016 - size_t count, loff_t *ppos) 1084 + static int read_file_dump_nfcal(struct seq_file *file, void *data) 1017 1085 { 1018 - struct ath_softc *sc = file->private_data; 1086 + struct ath_softc *sc = file->private; 1019 1087 struct ath_hw *ah = sc->sc_ah; 1020 1088 struct ath9k_nfcal_hist *h = sc->cur_chan->caldata.nfCalHist; 1021 1089 struct ath_common *common = ath9k_hw_common(ah); 1022 1090 struct ieee80211_conf *conf = &common->hw->conf; 1023 - u32 len = 0, size = 1500; 1024 1091 u32 i, j; 1025 - ssize_t retval = 0; 1026 - char *buf; 1027 1092 u8 chainmask = (ah->rxchainmask << 3) | ah->rxchainmask; 1028 1093 u8 nread; 1029 1094 1030 - buf = kzalloc(size, GFP_KERNEL); 1031 - if (!buf) 1032 - return -ENOMEM; 1033 - 1034 - len += scnprintf(buf + len, size - len, 1035 - "Channel Noise Floor : %d\n", ah->noise); 1036 - len += scnprintf(buf + len, size - len, 1037 - "Chain | privNF | # Readings | NF Readings\n"); 1095 + seq_printf(file, "Channel Noise Floor : %d\n", ah->noise); 1096 + seq_puts(file, "Chain | privNF | # Readings | NF Readings\n"); 1038 1097 for (i = 0; i < NUM_NF_READINGS; i++) { 1039 1098 if (!(chainmask & (1 << i)) || 1040 1099 ((i >= AR5416_MAX_CHAINS) && !conf_is_ht40(conf))) 1041 1100 continue; 1042 1101 1043 1102 nread = AR_PHY_CCA_FILTERWINDOW_LENGTH - h[i].invalidNFcount; 1044 - len += scnprintf(buf + len, size - len, " %d\t %d\t %d\t\t", 1045 - i, h[i].privNF, nread); 1103 + seq_printf(file, " %d\t %d\t %d\t\t", i, h[i].privNF, nread); 1046 1104 for (j = 0; j < nread; j++) 1047 - len += scnprintf(buf + len, size - len, 1048 - " %d", h[i].nfCalBuffer[j]); 1049 - len += scnprintf(buf + len, size - len, "\n"); 1105 + seq_printf(file, " %d", h[i].nfCalBuffer[j]); 1106 + seq_puts(file, "\n"); 1050 1107 } 1051 1108 1052 - if (len > size) 1053 - len = size; 1109 + return 0; 1110 + } 1054 1111 1055 - retval = simple_read_from_buffer(user_buf, count, ppos, buf, len); 1056 - kfree(buf); 1057 - 1058 - return retval; 1112 + static int open_file_dump_nfcal(struct inode *inode, struct file *f) 1113 + { 1114 + return single_open(f, read_file_dump_nfcal, inode->i_private); 1059 1115 } 1060 1116 1061 1117 static const struct file_operations fops_dump_nfcal = { 1062 - .read = read_file_dump_nfcal, 1063 - .open = simple_open, 1118 + .read = seq_read, 1119 + .open = open_file_dump_nfcal, 1064 1120 .owner = THIS_MODULE, 1065 - .llseek = default_llseek, 1121 + .llseek = seq_lseek, 1122 + .release = single_release, 1066 1123 }; 1067 1124 1068 1125 #ifdef CONFIG_ATH9K_BTCOEX_SUPPORT
+5 -6
drivers/net/wireless/ath/ath9k/debug.h
··· 195 195 #define TXSTATS sc->debug.stats.txstats 196 196 #define PR(str, elem) \ 197 197 do { \ 198 - len += scnprintf(buf + len, size - len, \ 199 - "%s%13u%11u%10u%10u\n", str, \ 200 - TXSTATS[PR_QNUM(IEEE80211_AC_BE)].elem,\ 201 - TXSTATS[PR_QNUM(IEEE80211_AC_BK)].elem,\ 202 - TXSTATS[PR_QNUM(IEEE80211_AC_VI)].elem,\ 203 - TXSTATS[PR_QNUM(IEEE80211_AC_VO)].elem); \ 198 + seq_printf(file, "%s%13u%11u%10u%10u\n", str, \ 199 + TXSTATS[PR_QNUM(IEEE80211_AC_BE)].elem,\ 200 + TXSTATS[PR_QNUM(IEEE80211_AC_BK)].elem,\ 201 + TXSTATS[PR_QNUM(IEEE80211_AC_VI)].elem,\ 202 + TXSTATS[PR_QNUM(IEEE80211_AC_VO)].elem); \ 204 203 } while(0) 205 204 206 205 struct ath_rx_rate_stats {