18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * This file is part of wl12xx 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright (C) 2009 Nokia Corporation 68c2ecf20Sopenharmony_ci * Copyright (C) 2011-2012 Texas Instruments 78c2ecf20Sopenharmony_ci */ 88c2ecf20Sopenharmony_ci 98c2ecf20Sopenharmony_ci#include "../wlcore/debugfs.h" 108c2ecf20Sopenharmony_ci#include "../wlcore/wlcore.h" 118c2ecf20Sopenharmony_ci 128c2ecf20Sopenharmony_ci#include "wl12xx.h" 138c2ecf20Sopenharmony_ci#include "acx.h" 148c2ecf20Sopenharmony_ci#include "debugfs.h" 158c2ecf20Sopenharmony_ci 168c2ecf20Sopenharmony_ci#define WL12XX_DEBUGFS_FWSTATS_FILE(a, b, c) \ 178c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_FILE(a, b, c, wl12xx_acx_statistics) 188c2ecf20Sopenharmony_ci 198c2ecf20Sopenharmony_ciWL12XX_DEBUGFS_FWSTATS_FILE(tx, internal_desc_overflow, "%u"); 208c2ecf20Sopenharmony_ci 218c2ecf20Sopenharmony_ciWL12XX_DEBUGFS_FWSTATS_FILE(rx, out_of_mem, "%u"); 228c2ecf20Sopenharmony_ciWL12XX_DEBUGFS_FWSTATS_FILE(rx, hdr_overflow, "%u"); 238c2ecf20Sopenharmony_ciWL12XX_DEBUGFS_FWSTATS_FILE(rx, hw_stuck, "%u"); 248c2ecf20Sopenharmony_ciWL12XX_DEBUGFS_FWSTATS_FILE(rx, dropped, "%u"); 258c2ecf20Sopenharmony_ciWL12XX_DEBUGFS_FWSTATS_FILE(rx, fcs_err, "%u"); 268c2ecf20Sopenharmony_ciWL12XX_DEBUGFS_FWSTATS_FILE(rx, xfr_hint_trig, "%u"); 278c2ecf20Sopenharmony_ciWL12XX_DEBUGFS_FWSTATS_FILE(rx, path_reset, "%u"); 288c2ecf20Sopenharmony_ciWL12XX_DEBUGFS_FWSTATS_FILE(rx, reset_counter, "%u"); 298c2ecf20Sopenharmony_ci 308c2ecf20Sopenharmony_ciWL12XX_DEBUGFS_FWSTATS_FILE(dma, rx_requested, "%u"); 318c2ecf20Sopenharmony_ciWL12XX_DEBUGFS_FWSTATS_FILE(dma, rx_errors, "%u"); 328c2ecf20Sopenharmony_ciWL12XX_DEBUGFS_FWSTATS_FILE(dma, tx_requested, "%u"); 338c2ecf20Sopenharmony_ciWL12XX_DEBUGFS_FWSTATS_FILE(dma, tx_errors, "%u"); 348c2ecf20Sopenharmony_ci 358c2ecf20Sopenharmony_ciWL12XX_DEBUGFS_FWSTATS_FILE(isr, cmd_cmplt, "%u"); 368c2ecf20Sopenharmony_ciWL12XX_DEBUGFS_FWSTATS_FILE(isr, fiqs, "%u"); 378c2ecf20Sopenharmony_ciWL12XX_DEBUGFS_FWSTATS_FILE(isr, rx_headers, "%u"); 388c2ecf20Sopenharmony_ciWL12XX_DEBUGFS_FWSTATS_FILE(isr, rx_mem_overflow, "%u"); 398c2ecf20Sopenharmony_ciWL12XX_DEBUGFS_FWSTATS_FILE(isr, rx_rdys, "%u"); 408c2ecf20Sopenharmony_ciWL12XX_DEBUGFS_FWSTATS_FILE(isr, irqs, "%u"); 418c2ecf20Sopenharmony_ciWL12XX_DEBUGFS_FWSTATS_FILE(isr, tx_procs, "%u"); 428c2ecf20Sopenharmony_ciWL12XX_DEBUGFS_FWSTATS_FILE(isr, decrypt_done, "%u"); 438c2ecf20Sopenharmony_ciWL12XX_DEBUGFS_FWSTATS_FILE(isr, dma0_done, "%u"); 448c2ecf20Sopenharmony_ciWL12XX_DEBUGFS_FWSTATS_FILE(isr, dma1_done, "%u"); 458c2ecf20Sopenharmony_ciWL12XX_DEBUGFS_FWSTATS_FILE(isr, tx_exch_complete, "%u"); 468c2ecf20Sopenharmony_ciWL12XX_DEBUGFS_FWSTATS_FILE(isr, commands, "%u"); 478c2ecf20Sopenharmony_ciWL12XX_DEBUGFS_FWSTATS_FILE(isr, rx_procs, "%u"); 488c2ecf20Sopenharmony_ciWL12XX_DEBUGFS_FWSTATS_FILE(isr, hw_pm_mode_changes, "%u"); 498c2ecf20Sopenharmony_ciWL12XX_DEBUGFS_FWSTATS_FILE(isr, host_acknowledges, "%u"); 508c2ecf20Sopenharmony_ciWL12XX_DEBUGFS_FWSTATS_FILE(isr, pci_pm, "%u"); 518c2ecf20Sopenharmony_ciWL12XX_DEBUGFS_FWSTATS_FILE(isr, wakeups, "%u"); 528c2ecf20Sopenharmony_ciWL12XX_DEBUGFS_FWSTATS_FILE(isr, low_rssi, "%u"); 538c2ecf20Sopenharmony_ci 548c2ecf20Sopenharmony_ciWL12XX_DEBUGFS_FWSTATS_FILE(wep, addr_key_count, "%u"); 558c2ecf20Sopenharmony_ciWL12XX_DEBUGFS_FWSTATS_FILE(wep, default_key_count, "%u"); 568c2ecf20Sopenharmony_ci/* skipping wep.reserved */ 578c2ecf20Sopenharmony_ciWL12XX_DEBUGFS_FWSTATS_FILE(wep, key_not_found, "%u"); 588c2ecf20Sopenharmony_ciWL12XX_DEBUGFS_FWSTATS_FILE(wep, decrypt_fail, "%u"); 598c2ecf20Sopenharmony_ciWL12XX_DEBUGFS_FWSTATS_FILE(wep, packets, "%u"); 608c2ecf20Sopenharmony_ciWL12XX_DEBUGFS_FWSTATS_FILE(wep, interrupt, "%u"); 618c2ecf20Sopenharmony_ci 628c2ecf20Sopenharmony_ciWL12XX_DEBUGFS_FWSTATS_FILE(pwr, ps_enter, "%u"); 638c2ecf20Sopenharmony_ciWL12XX_DEBUGFS_FWSTATS_FILE(pwr, elp_enter, "%u"); 648c2ecf20Sopenharmony_ciWL12XX_DEBUGFS_FWSTATS_FILE(pwr, missing_bcns, "%u"); 658c2ecf20Sopenharmony_ciWL12XX_DEBUGFS_FWSTATS_FILE(pwr, wake_on_host, "%u"); 668c2ecf20Sopenharmony_ciWL12XX_DEBUGFS_FWSTATS_FILE(pwr, wake_on_timer_exp, "%u"); 678c2ecf20Sopenharmony_ciWL12XX_DEBUGFS_FWSTATS_FILE(pwr, tx_with_ps, "%u"); 688c2ecf20Sopenharmony_ciWL12XX_DEBUGFS_FWSTATS_FILE(pwr, tx_without_ps, "%u"); 698c2ecf20Sopenharmony_ciWL12XX_DEBUGFS_FWSTATS_FILE(pwr, rcvd_beacons, "%u"); 708c2ecf20Sopenharmony_ciWL12XX_DEBUGFS_FWSTATS_FILE(pwr, power_save_off, "%u"); 718c2ecf20Sopenharmony_ciWL12XX_DEBUGFS_FWSTATS_FILE(pwr, enable_ps, "%u"); 728c2ecf20Sopenharmony_ciWL12XX_DEBUGFS_FWSTATS_FILE(pwr, disable_ps, "%u"); 738c2ecf20Sopenharmony_ciWL12XX_DEBUGFS_FWSTATS_FILE(pwr, fix_tsf_ps, "%u"); 748c2ecf20Sopenharmony_ci/* skipping cont_miss_bcns_spread for now */ 758c2ecf20Sopenharmony_ciWL12XX_DEBUGFS_FWSTATS_FILE(pwr, rcvd_awake_beacons, "%u"); 768c2ecf20Sopenharmony_ci 778c2ecf20Sopenharmony_ciWL12XX_DEBUGFS_FWSTATS_FILE(mic, rx_pkts, "%u"); 788c2ecf20Sopenharmony_ciWL12XX_DEBUGFS_FWSTATS_FILE(mic, calc_failure, "%u"); 798c2ecf20Sopenharmony_ci 808c2ecf20Sopenharmony_ciWL12XX_DEBUGFS_FWSTATS_FILE(aes, encrypt_fail, "%u"); 818c2ecf20Sopenharmony_ciWL12XX_DEBUGFS_FWSTATS_FILE(aes, decrypt_fail, "%u"); 828c2ecf20Sopenharmony_ciWL12XX_DEBUGFS_FWSTATS_FILE(aes, encrypt_packets, "%u"); 838c2ecf20Sopenharmony_ciWL12XX_DEBUGFS_FWSTATS_FILE(aes, decrypt_packets, "%u"); 848c2ecf20Sopenharmony_ciWL12XX_DEBUGFS_FWSTATS_FILE(aes, encrypt_interrupt, "%u"); 858c2ecf20Sopenharmony_ciWL12XX_DEBUGFS_FWSTATS_FILE(aes, decrypt_interrupt, "%u"); 868c2ecf20Sopenharmony_ci 878c2ecf20Sopenharmony_ciWL12XX_DEBUGFS_FWSTATS_FILE(event, heart_beat, "%u"); 888c2ecf20Sopenharmony_ciWL12XX_DEBUGFS_FWSTATS_FILE(event, calibration, "%u"); 898c2ecf20Sopenharmony_ciWL12XX_DEBUGFS_FWSTATS_FILE(event, rx_mismatch, "%u"); 908c2ecf20Sopenharmony_ciWL12XX_DEBUGFS_FWSTATS_FILE(event, rx_mem_empty, "%u"); 918c2ecf20Sopenharmony_ciWL12XX_DEBUGFS_FWSTATS_FILE(event, rx_pool, "%u"); 928c2ecf20Sopenharmony_ciWL12XX_DEBUGFS_FWSTATS_FILE(event, oom_late, "%u"); 938c2ecf20Sopenharmony_ciWL12XX_DEBUGFS_FWSTATS_FILE(event, phy_transmit_error, "%u"); 948c2ecf20Sopenharmony_ciWL12XX_DEBUGFS_FWSTATS_FILE(event, tx_stuck, "%u"); 958c2ecf20Sopenharmony_ci 968c2ecf20Sopenharmony_ciWL12XX_DEBUGFS_FWSTATS_FILE(ps, pspoll_timeouts, "%u"); 978c2ecf20Sopenharmony_ciWL12XX_DEBUGFS_FWSTATS_FILE(ps, upsd_timeouts, "%u"); 988c2ecf20Sopenharmony_ciWL12XX_DEBUGFS_FWSTATS_FILE(ps, upsd_max_sptime, "%u"); 998c2ecf20Sopenharmony_ciWL12XX_DEBUGFS_FWSTATS_FILE(ps, upsd_max_apturn, "%u"); 1008c2ecf20Sopenharmony_ciWL12XX_DEBUGFS_FWSTATS_FILE(ps, pspoll_max_apturn, "%u"); 1018c2ecf20Sopenharmony_ciWL12XX_DEBUGFS_FWSTATS_FILE(ps, pspoll_utilization, "%u"); 1028c2ecf20Sopenharmony_ciWL12XX_DEBUGFS_FWSTATS_FILE(ps, upsd_utilization, "%u"); 1038c2ecf20Sopenharmony_ci 1048c2ecf20Sopenharmony_ciWL12XX_DEBUGFS_FWSTATS_FILE(rxpipe, rx_prep_beacon_drop, "%u"); 1058c2ecf20Sopenharmony_ciWL12XX_DEBUGFS_FWSTATS_FILE(rxpipe, descr_host_int_trig_rx_data, "%u"); 1068c2ecf20Sopenharmony_ciWL12XX_DEBUGFS_FWSTATS_FILE(rxpipe, beacon_buffer_thres_host_int_trig_rx_data, 1078c2ecf20Sopenharmony_ci "%u"); 1088c2ecf20Sopenharmony_ciWL12XX_DEBUGFS_FWSTATS_FILE(rxpipe, missed_beacon_host_int_trig_rx_data, "%u"); 1098c2ecf20Sopenharmony_ciWL12XX_DEBUGFS_FWSTATS_FILE(rxpipe, tx_xfr_host_int_trig_rx_data, "%u"); 1108c2ecf20Sopenharmony_ci 1118c2ecf20Sopenharmony_ciint wl12xx_debugfs_add_files(struct wl1271 *wl, 1128c2ecf20Sopenharmony_ci struct dentry *rootdir) 1138c2ecf20Sopenharmony_ci{ 1148c2ecf20Sopenharmony_ci struct dentry *stats, *moddir; 1158c2ecf20Sopenharmony_ci 1168c2ecf20Sopenharmony_ci moddir = debugfs_create_dir(KBUILD_MODNAME, rootdir); 1178c2ecf20Sopenharmony_ci stats = debugfs_create_dir("fw_stats", moddir); 1188c2ecf20Sopenharmony_ci 1198c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(tx, internal_desc_overflow); 1208c2ecf20Sopenharmony_ci 1218c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(rx, out_of_mem); 1228c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(rx, hdr_overflow); 1238c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(rx, hw_stuck); 1248c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(rx, dropped); 1258c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(rx, fcs_err); 1268c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(rx, xfr_hint_trig); 1278c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(rx, path_reset); 1288c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(rx, reset_counter); 1298c2ecf20Sopenharmony_ci 1308c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(dma, rx_requested); 1318c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(dma, rx_errors); 1328c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(dma, tx_requested); 1338c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(dma, tx_errors); 1348c2ecf20Sopenharmony_ci 1358c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(isr, cmd_cmplt); 1368c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(isr, fiqs); 1378c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(isr, rx_headers); 1388c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(isr, rx_mem_overflow); 1398c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(isr, rx_rdys); 1408c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(isr, irqs); 1418c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(isr, tx_procs); 1428c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(isr, decrypt_done); 1438c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(isr, dma0_done); 1448c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(isr, dma1_done); 1458c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(isr, tx_exch_complete); 1468c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(isr, commands); 1478c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(isr, rx_procs); 1488c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(isr, hw_pm_mode_changes); 1498c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(isr, host_acknowledges); 1508c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(isr, pci_pm); 1518c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(isr, wakeups); 1528c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(isr, low_rssi); 1538c2ecf20Sopenharmony_ci 1548c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(wep, addr_key_count); 1558c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(wep, default_key_count); 1568c2ecf20Sopenharmony_ci /* skipping wep.reserved */ 1578c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(wep, key_not_found); 1588c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(wep, decrypt_fail); 1598c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(wep, packets); 1608c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(wep, interrupt); 1618c2ecf20Sopenharmony_ci 1628c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(pwr, ps_enter); 1638c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(pwr, elp_enter); 1648c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(pwr, missing_bcns); 1658c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(pwr, wake_on_host); 1668c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(pwr, wake_on_timer_exp); 1678c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(pwr, tx_with_ps); 1688c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(pwr, tx_without_ps); 1698c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(pwr, rcvd_beacons); 1708c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(pwr, power_save_off); 1718c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(pwr, enable_ps); 1728c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(pwr, disable_ps); 1738c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(pwr, fix_tsf_ps); 1748c2ecf20Sopenharmony_ci /* skipping cont_miss_bcns_spread for now */ 1758c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(pwr, rcvd_awake_beacons); 1768c2ecf20Sopenharmony_ci 1778c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(mic, rx_pkts); 1788c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(mic, calc_failure); 1798c2ecf20Sopenharmony_ci 1808c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(aes, encrypt_fail); 1818c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(aes, decrypt_fail); 1828c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(aes, encrypt_packets); 1838c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(aes, decrypt_packets); 1848c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(aes, encrypt_interrupt); 1858c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(aes, decrypt_interrupt); 1868c2ecf20Sopenharmony_ci 1878c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(event, heart_beat); 1888c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(event, calibration); 1898c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(event, rx_mismatch); 1908c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(event, rx_mem_empty); 1918c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(event, rx_pool); 1928c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(event, oom_late); 1938c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(event, phy_transmit_error); 1948c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(event, tx_stuck); 1958c2ecf20Sopenharmony_ci 1968c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(ps, pspoll_timeouts); 1978c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(ps, upsd_timeouts); 1988c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(ps, upsd_max_sptime); 1998c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(ps, upsd_max_apturn); 2008c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(ps, pspoll_max_apturn); 2018c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(ps, pspoll_utilization); 2028c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(ps, upsd_utilization); 2038c2ecf20Sopenharmony_ci 2048c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(rxpipe, rx_prep_beacon_drop); 2058c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(rxpipe, descr_host_int_trig_rx_data); 2068c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(rxpipe, beacon_buffer_thres_host_int_trig_rx_data); 2078c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(rxpipe, missed_beacon_host_int_trig_rx_data); 2088c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(rxpipe, tx_xfr_host_int_trig_rx_data); 2098c2ecf20Sopenharmony_ci 2108c2ecf20Sopenharmony_ci return 0; 2118c2ecf20Sopenharmony_ci} 212