18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * This file is part of wl18xx 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright (C) 2009 Nokia Corporation 68c2ecf20Sopenharmony_ci * Copyright (C) 2011-2012 Texas Instruments 78c2ecf20Sopenharmony_ci */ 88c2ecf20Sopenharmony_ci 98c2ecf20Sopenharmony_ci#include <linux/pm_runtime.h> 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_ci#include "../wlcore/debugfs.h" 128c2ecf20Sopenharmony_ci#include "../wlcore/wlcore.h" 138c2ecf20Sopenharmony_ci#include "../wlcore/debug.h" 148c2ecf20Sopenharmony_ci#include "../wlcore/ps.h" 158c2ecf20Sopenharmony_ci 168c2ecf20Sopenharmony_ci#include "wl18xx.h" 178c2ecf20Sopenharmony_ci#include "acx.h" 188c2ecf20Sopenharmony_ci#include "cmd.h" 198c2ecf20Sopenharmony_ci#include "debugfs.h" 208c2ecf20Sopenharmony_ci 218c2ecf20Sopenharmony_ci#define WL18XX_DEBUGFS_FWSTATS_FILE(a, b, c) \ 228c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_FILE(a, b, c, wl18xx_acx_statistics) 238c2ecf20Sopenharmony_ci#define WL18XX_DEBUGFS_FWSTATS_FILE_ARRAY(a, b, c) \ 248c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_FILE_ARRAY(a, b, c, wl18xx_acx_statistics) 258c2ecf20Sopenharmony_ci 268c2ecf20Sopenharmony_ci 278c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(error, error_frame_non_ctrl, "%u"); 288c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(error, error_frame_ctrl, "%u"); 298c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(error, error_frame_during_protection, "%u"); 308c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(error, null_frame_tx_start, "%u"); 318c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(error, null_frame_cts_start, "%u"); 328c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(error, bar_retry, "%u"); 338c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(error, num_frame_cts_nul_flid, "%u"); 348c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(error, tx_abort_failure, "%u"); 358c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(error, tx_resume_failure, "%u"); 368c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(error, rx_cmplt_db_overflow_cnt, "%u"); 378c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(error, elp_while_rx_exch, "%u"); 388c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(error, elp_while_tx_exch, "%u"); 398c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(error, elp_while_tx, "%u"); 408c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(error, elp_while_nvic_pending, "%u"); 418c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(error, rx_excessive_frame_len, "%u"); 428c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(error, burst_mismatch, "%u"); 438c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(error, tbc_exch_mismatch, "%u"); 448c2ecf20Sopenharmony_ci 458c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(tx, tx_prepared_descs, "%u"); 468c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(tx, tx_cmplt, "%u"); 478c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(tx, tx_template_prepared, "%u"); 488c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(tx, tx_data_prepared, "%u"); 498c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(tx, tx_template_programmed, "%u"); 508c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(tx, tx_data_programmed, "%u"); 518c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(tx, tx_burst_programmed, "%u"); 528c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(tx, tx_starts, "%u"); 538c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(tx, tx_stop, "%u"); 548c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(tx, tx_start_templates, "%u"); 558c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(tx, tx_start_int_templates, "%u"); 568c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(tx, tx_start_fw_gen, "%u"); 578c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(tx, tx_start_data, "%u"); 588c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(tx, tx_start_null_frame, "%u"); 598c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(tx, tx_exch, "%u"); 608c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(tx, tx_retry_template, "%u"); 618c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(tx, tx_retry_data, "%u"); 628c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE_ARRAY(tx, tx_retry_per_rate, 638c2ecf20Sopenharmony_ci NUM_OF_RATES_INDEXES); 648c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(tx, tx_exch_pending, "%u"); 658c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(tx, tx_exch_expiry, "%u"); 668c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(tx, tx_done_template, "%u"); 678c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(tx, tx_done_data, "%u"); 688c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(tx, tx_done_int_template, "%u"); 698c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(tx, tx_cfe1, "%u"); 708c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(tx, tx_cfe2, "%u"); 718c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(tx, frag_called, "%u"); 728c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(tx, frag_mpdu_alloc_failed, "%u"); 738c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(tx, frag_init_called, "%u"); 748c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(tx, frag_in_process_called, "%u"); 758c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(tx, frag_tkip_called, "%u"); 768c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(tx, frag_key_not_found, "%u"); 778c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(tx, frag_need_fragmentation, "%u"); 788c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(tx, frag_bad_mblk_num, "%u"); 798c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(tx, frag_failed, "%u"); 808c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(tx, frag_cache_hit, "%u"); 818c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(tx, frag_cache_miss, "%u"); 828c2ecf20Sopenharmony_ci 838c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(rx, rx_beacon_early_term, "%u"); 848c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(rx, rx_out_of_mpdu_nodes, "%u"); 858c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(rx, rx_hdr_overflow, "%u"); 868c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(rx, rx_dropped_frame, "%u"); 878c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(rx, rx_done, "%u"); 888c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(rx, rx_defrag, "%u"); 898c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(rx, rx_defrag_end, "%u"); 908c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(rx, rx_cmplt, "%u"); 918c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(rx, rx_pre_complt, "%u"); 928c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(rx, rx_cmplt_task, "%u"); 938c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(rx, rx_phy_hdr, "%u"); 948c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(rx, rx_timeout, "%u"); 958c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(rx, rx_rts_timeout, "%u"); 968c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(rx, rx_timeout_wa, "%u"); 978c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(rx, defrag_called, "%u"); 988c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(rx, defrag_init_called, "%u"); 998c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(rx, defrag_in_process_called, "%u"); 1008c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(rx, defrag_tkip_called, "%u"); 1018c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(rx, defrag_need_defrag, "%u"); 1028c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(rx, defrag_decrypt_failed, "%u"); 1038c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(rx, decrypt_key_not_found, "%u"); 1048c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(rx, defrag_need_decrypt, "%u"); 1058c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(rx, rx_tkip_replays, "%u"); 1068c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(rx, rx_xfr, "%u"); 1078c2ecf20Sopenharmony_ci 1088c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(isr, irqs, "%u"); 1098c2ecf20Sopenharmony_ci 1108c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(pwr, missing_bcns_cnt, "%u"); 1118c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(pwr, rcvd_bcns_cnt, "%u"); 1128c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(pwr, connection_out_of_sync, "%u"); 1138c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE_ARRAY(pwr, cont_miss_bcns_spread, 1148c2ecf20Sopenharmony_ci PWR_STAT_MAX_CONT_MISSED_BCNS_SPREAD); 1158c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(pwr, rcvd_awake_bcns_cnt, "%u"); 1168c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(pwr, sleep_time_count, "%u"); 1178c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(pwr, sleep_time_avg, "%u"); 1188c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(pwr, sleep_cycle_avg, "%u"); 1198c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(pwr, sleep_percent, "%u"); 1208c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(pwr, ap_sleep_active_conf, "%u"); 1218c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(pwr, ap_sleep_user_conf, "%u"); 1228c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(pwr, ap_sleep_counter, "%u"); 1238c2ecf20Sopenharmony_ci 1248c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(rx_filter, beacon_filter, "%u"); 1258c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(rx_filter, arp_filter, "%u"); 1268c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(rx_filter, mc_filter, "%u"); 1278c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(rx_filter, dup_filter, "%u"); 1288c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(rx_filter, data_filter, "%u"); 1298c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(rx_filter, ibss_filter, "%u"); 1308c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(rx_filter, protection_filter, "%u"); 1318c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(rx_filter, accum_arp_pend_requests, "%u"); 1328c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(rx_filter, max_arp_queue_dep, "%u"); 1338c2ecf20Sopenharmony_ci 1348c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE_ARRAY(rx_rate, rx_frames_per_rates, 50); 1358c2ecf20Sopenharmony_ci 1368c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE_ARRAY(aggr_size, tx_agg_rate, 1378c2ecf20Sopenharmony_ci AGGR_STATS_TX_AGG); 1388c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE_ARRAY(aggr_size, tx_agg_len, 1398c2ecf20Sopenharmony_ci AGGR_STATS_TX_AGG); 1408c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE_ARRAY(aggr_size, rx_size, 1418c2ecf20Sopenharmony_ci AGGR_STATS_RX_SIZE_LEN); 1428c2ecf20Sopenharmony_ci 1438c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(pipeline, hs_tx_stat_fifo_int, "%u"); 1448c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(pipeline, enc_tx_stat_fifo_int, "%u"); 1458c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(pipeline, enc_rx_stat_fifo_int, "%u"); 1468c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(pipeline, rx_complete_stat_fifo_int, "%u"); 1478c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(pipeline, pre_proc_swi, "%u"); 1488c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(pipeline, post_proc_swi, "%u"); 1498c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(pipeline, sec_frag_swi, "%u"); 1508c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(pipeline, pre_to_defrag_swi, "%u"); 1518c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(pipeline, defrag_to_rx_xfer_swi, "%u"); 1528c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(pipeline, dec_packet_in, "%u"); 1538c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(pipeline, dec_packet_in_fifo_full, "%u"); 1548c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(pipeline, dec_packet_out, "%u"); 1558c2ecf20Sopenharmony_ci 1568c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE_ARRAY(pipeline, pipeline_fifo_full, 1578c2ecf20Sopenharmony_ci PIPE_STATS_HW_FIFO); 1588c2ecf20Sopenharmony_ci 1598c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE_ARRAY(diversity, num_of_packets_per_ant, 1608c2ecf20Sopenharmony_ci DIVERSITY_STATS_NUM_OF_ANT); 1618c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(diversity, total_num_of_toggles, "%u"); 1628c2ecf20Sopenharmony_ci 1638c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(thermal, irq_thr_low, "%u"); 1648c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(thermal, irq_thr_high, "%u"); 1658c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(thermal, tx_stop, "%u"); 1668c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(thermal, tx_resume, "%u"); 1678c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(thermal, false_irq, "%u"); 1688c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(thermal, adc_source_unexpected, "%u"); 1698c2ecf20Sopenharmony_ci 1708c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE_ARRAY(calib, fail_count, 1718c2ecf20Sopenharmony_ci WL18XX_NUM_OF_CALIBRATIONS_ERRORS); 1728c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(calib, calib_count, "%u"); 1738c2ecf20Sopenharmony_ci 1748c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(roaming, rssi_level, "%d"); 1758c2ecf20Sopenharmony_ci 1768c2ecf20Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(dfs, num_of_radar_detections, "%d"); 1778c2ecf20Sopenharmony_ci 1788c2ecf20Sopenharmony_cistatic ssize_t conf_read(struct file *file, char __user *user_buf, 1798c2ecf20Sopenharmony_ci size_t count, loff_t *ppos) 1808c2ecf20Sopenharmony_ci{ 1818c2ecf20Sopenharmony_ci struct wl1271 *wl = file->private_data; 1828c2ecf20Sopenharmony_ci struct wl18xx_priv *priv = wl->priv; 1838c2ecf20Sopenharmony_ci struct wlcore_conf_header header; 1848c2ecf20Sopenharmony_ci char *buf, *pos; 1858c2ecf20Sopenharmony_ci size_t len; 1868c2ecf20Sopenharmony_ci int ret; 1878c2ecf20Sopenharmony_ci 1888c2ecf20Sopenharmony_ci len = WL18XX_CONF_SIZE; 1898c2ecf20Sopenharmony_ci buf = kmalloc(len, GFP_KERNEL); 1908c2ecf20Sopenharmony_ci if (!buf) 1918c2ecf20Sopenharmony_ci return -ENOMEM; 1928c2ecf20Sopenharmony_ci 1938c2ecf20Sopenharmony_ci header.magic = cpu_to_le32(WL18XX_CONF_MAGIC); 1948c2ecf20Sopenharmony_ci header.version = cpu_to_le32(WL18XX_CONF_VERSION); 1958c2ecf20Sopenharmony_ci header.checksum = 0; 1968c2ecf20Sopenharmony_ci 1978c2ecf20Sopenharmony_ci mutex_lock(&wl->mutex); 1988c2ecf20Sopenharmony_ci 1998c2ecf20Sopenharmony_ci pos = buf; 2008c2ecf20Sopenharmony_ci memcpy(pos, &header, sizeof(header)); 2018c2ecf20Sopenharmony_ci pos += sizeof(header); 2028c2ecf20Sopenharmony_ci memcpy(pos, &wl->conf, sizeof(wl->conf)); 2038c2ecf20Sopenharmony_ci pos += sizeof(wl->conf); 2048c2ecf20Sopenharmony_ci memcpy(pos, &priv->conf, sizeof(priv->conf)); 2058c2ecf20Sopenharmony_ci 2068c2ecf20Sopenharmony_ci mutex_unlock(&wl->mutex); 2078c2ecf20Sopenharmony_ci 2088c2ecf20Sopenharmony_ci ret = simple_read_from_buffer(user_buf, count, ppos, buf, len); 2098c2ecf20Sopenharmony_ci 2108c2ecf20Sopenharmony_ci kfree(buf); 2118c2ecf20Sopenharmony_ci return ret; 2128c2ecf20Sopenharmony_ci} 2138c2ecf20Sopenharmony_ci 2148c2ecf20Sopenharmony_cistatic const struct file_operations conf_ops = { 2158c2ecf20Sopenharmony_ci .read = conf_read, 2168c2ecf20Sopenharmony_ci .open = simple_open, 2178c2ecf20Sopenharmony_ci .llseek = default_llseek, 2188c2ecf20Sopenharmony_ci}; 2198c2ecf20Sopenharmony_ci 2208c2ecf20Sopenharmony_cistatic ssize_t clear_fw_stats_write(struct file *file, 2218c2ecf20Sopenharmony_ci const char __user *user_buf, 2228c2ecf20Sopenharmony_ci size_t count, loff_t *ppos) 2238c2ecf20Sopenharmony_ci{ 2248c2ecf20Sopenharmony_ci struct wl1271 *wl = file->private_data; 2258c2ecf20Sopenharmony_ci int ret; 2268c2ecf20Sopenharmony_ci 2278c2ecf20Sopenharmony_ci mutex_lock(&wl->mutex); 2288c2ecf20Sopenharmony_ci 2298c2ecf20Sopenharmony_ci if (unlikely(wl->state != WLCORE_STATE_ON)) 2308c2ecf20Sopenharmony_ci goto out; 2318c2ecf20Sopenharmony_ci 2328c2ecf20Sopenharmony_ci ret = wl18xx_acx_clear_statistics(wl); 2338c2ecf20Sopenharmony_ci if (ret < 0) { 2348c2ecf20Sopenharmony_ci count = ret; 2358c2ecf20Sopenharmony_ci goto out; 2368c2ecf20Sopenharmony_ci } 2378c2ecf20Sopenharmony_ciout: 2388c2ecf20Sopenharmony_ci mutex_unlock(&wl->mutex); 2398c2ecf20Sopenharmony_ci return count; 2408c2ecf20Sopenharmony_ci} 2418c2ecf20Sopenharmony_ci 2428c2ecf20Sopenharmony_cistatic const struct file_operations clear_fw_stats_ops = { 2438c2ecf20Sopenharmony_ci .write = clear_fw_stats_write, 2448c2ecf20Sopenharmony_ci .open = simple_open, 2458c2ecf20Sopenharmony_ci .llseek = default_llseek, 2468c2ecf20Sopenharmony_ci}; 2478c2ecf20Sopenharmony_ci 2488c2ecf20Sopenharmony_cistatic ssize_t radar_detection_write(struct file *file, 2498c2ecf20Sopenharmony_ci const char __user *user_buf, 2508c2ecf20Sopenharmony_ci size_t count, loff_t *ppos) 2518c2ecf20Sopenharmony_ci{ 2528c2ecf20Sopenharmony_ci struct wl1271 *wl = file->private_data; 2538c2ecf20Sopenharmony_ci int ret; 2548c2ecf20Sopenharmony_ci u8 channel; 2558c2ecf20Sopenharmony_ci 2568c2ecf20Sopenharmony_ci ret = kstrtou8_from_user(user_buf, count, 10, &channel); 2578c2ecf20Sopenharmony_ci if (ret < 0) { 2588c2ecf20Sopenharmony_ci wl1271_warning("illegal channel"); 2598c2ecf20Sopenharmony_ci return -EINVAL; 2608c2ecf20Sopenharmony_ci } 2618c2ecf20Sopenharmony_ci 2628c2ecf20Sopenharmony_ci mutex_lock(&wl->mutex); 2638c2ecf20Sopenharmony_ci 2648c2ecf20Sopenharmony_ci if (unlikely(wl->state != WLCORE_STATE_ON)) 2658c2ecf20Sopenharmony_ci goto out; 2668c2ecf20Sopenharmony_ci 2678c2ecf20Sopenharmony_ci ret = pm_runtime_get_sync(wl->dev); 2688c2ecf20Sopenharmony_ci if (ret < 0) { 2698c2ecf20Sopenharmony_ci pm_runtime_put_noidle(wl->dev); 2708c2ecf20Sopenharmony_ci goto out; 2718c2ecf20Sopenharmony_ci } 2728c2ecf20Sopenharmony_ci 2738c2ecf20Sopenharmony_ci ret = wl18xx_cmd_radar_detection_debug(wl, channel); 2748c2ecf20Sopenharmony_ci if (ret < 0) 2758c2ecf20Sopenharmony_ci count = ret; 2768c2ecf20Sopenharmony_ci 2778c2ecf20Sopenharmony_ci pm_runtime_mark_last_busy(wl->dev); 2788c2ecf20Sopenharmony_ci pm_runtime_put_autosuspend(wl->dev); 2798c2ecf20Sopenharmony_ciout: 2808c2ecf20Sopenharmony_ci mutex_unlock(&wl->mutex); 2818c2ecf20Sopenharmony_ci return count; 2828c2ecf20Sopenharmony_ci} 2838c2ecf20Sopenharmony_ci 2848c2ecf20Sopenharmony_cistatic const struct file_operations radar_detection_ops = { 2858c2ecf20Sopenharmony_ci .write = radar_detection_write, 2868c2ecf20Sopenharmony_ci .open = simple_open, 2878c2ecf20Sopenharmony_ci .llseek = default_llseek, 2888c2ecf20Sopenharmony_ci}; 2898c2ecf20Sopenharmony_ci 2908c2ecf20Sopenharmony_cistatic ssize_t dynamic_fw_traces_write(struct file *file, 2918c2ecf20Sopenharmony_ci const char __user *user_buf, 2928c2ecf20Sopenharmony_ci size_t count, loff_t *ppos) 2938c2ecf20Sopenharmony_ci{ 2948c2ecf20Sopenharmony_ci struct wl1271 *wl = file->private_data; 2958c2ecf20Sopenharmony_ci unsigned long value; 2968c2ecf20Sopenharmony_ci int ret; 2978c2ecf20Sopenharmony_ci 2988c2ecf20Sopenharmony_ci ret = kstrtoul_from_user(user_buf, count, 0, &value); 2998c2ecf20Sopenharmony_ci if (ret < 0) 3008c2ecf20Sopenharmony_ci return ret; 3018c2ecf20Sopenharmony_ci 3028c2ecf20Sopenharmony_ci mutex_lock(&wl->mutex); 3038c2ecf20Sopenharmony_ci 3048c2ecf20Sopenharmony_ci wl->dynamic_fw_traces = value; 3058c2ecf20Sopenharmony_ci 3068c2ecf20Sopenharmony_ci if (unlikely(wl->state != WLCORE_STATE_ON)) 3078c2ecf20Sopenharmony_ci goto out; 3088c2ecf20Sopenharmony_ci 3098c2ecf20Sopenharmony_ci ret = pm_runtime_get_sync(wl->dev); 3108c2ecf20Sopenharmony_ci if (ret < 0) { 3118c2ecf20Sopenharmony_ci pm_runtime_put_noidle(wl->dev); 3128c2ecf20Sopenharmony_ci goto out; 3138c2ecf20Sopenharmony_ci } 3148c2ecf20Sopenharmony_ci 3158c2ecf20Sopenharmony_ci ret = wl18xx_acx_dynamic_fw_traces(wl); 3168c2ecf20Sopenharmony_ci if (ret < 0) 3178c2ecf20Sopenharmony_ci count = ret; 3188c2ecf20Sopenharmony_ci 3198c2ecf20Sopenharmony_ci pm_runtime_mark_last_busy(wl->dev); 3208c2ecf20Sopenharmony_ci pm_runtime_put_autosuspend(wl->dev); 3218c2ecf20Sopenharmony_ciout: 3228c2ecf20Sopenharmony_ci mutex_unlock(&wl->mutex); 3238c2ecf20Sopenharmony_ci return count; 3248c2ecf20Sopenharmony_ci} 3258c2ecf20Sopenharmony_ci 3268c2ecf20Sopenharmony_cistatic ssize_t dynamic_fw_traces_read(struct file *file, 3278c2ecf20Sopenharmony_ci char __user *userbuf, 3288c2ecf20Sopenharmony_ci size_t count, loff_t *ppos) 3298c2ecf20Sopenharmony_ci{ 3308c2ecf20Sopenharmony_ci struct wl1271 *wl = file->private_data; 3318c2ecf20Sopenharmony_ci return wl1271_format_buffer(userbuf, count, ppos, 3328c2ecf20Sopenharmony_ci "%d\n", wl->dynamic_fw_traces); 3338c2ecf20Sopenharmony_ci} 3348c2ecf20Sopenharmony_ci 3358c2ecf20Sopenharmony_cistatic const struct file_operations dynamic_fw_traces_ops = { 3368c2ecf20Sopenharmony_ci .read = dynamic_fw_traces_read, 3378c2ecf20Sopenharmony_ci .write = dynamic_fw_traces_write, 3388c2ecf20Sopenharmony_ci .open = simple_open, 3398c2ecf20Sopenharmony_ci .llseek = default_llseek, 3408c2ecf20Sopenharmony_ci}; 3418c2ecf20Sopenharmony_ci 3428c2ecf20Sopenharmony_ci#ifdef CONFIG_CFG80211_CERTIFICATION_ONUS 3438c2ecf20Sopenharmony_cistatic ssize_t radar_debug_mode_write(struct file *file, 3448c2ecf20Sopenharmony_ci const char __user *user_buf, 3458c2ecf20Sopenharmony_ci size_t count, loff_t *ppos) 3468c2ecf20Sopenharmony_ci{ 3478c2ecf20Sopenharmony_ci struct wl1271 *wl = file->private_data; 3488c2ecf20Sopenharmony_ci struct wl12xx_vif *wlvif; 3498c2ecf20Sopenharmony_ci unsigned long value; 3508c2ecf20Sopenharmony_ci int ret; 3518c2ecf20Sopenharmony_ci 3528c2ecf20Sopenharmony_ci ret = kstrtoul_from_user(user_buf, count, 10, &value); 3538c2ecf20Sopenharmony_ci if (ret < 0) { 3548c2ecf20Sopenharmony_ci wl1271_warning("illegal radar_debug_mode value!"); 3558c2ecf20Sopenharmony_ci return -EINVAL; 3568c2ecf20Sopenharmony_ci } 3578c2ecf20Sopenharmony_ci 3588c2ecf20Sopenharmony_ci /* valid values: 0/1 */ 3598c2ecf20Sopenharmony_ci if (!(value == 0 || value == 1)) { 3608c2ecf20Sopenharmony_ci wl1271_warning("value is not in valid!"); 3618c2ecf20Sopenharmony_ci return -EINVAL; 3628c2ecf20Sopenharmony_ci } 3638c2ecf20Sopenharmony_ci 3648c2ecf20Sopenharmony_ci mutex_lock(&wl->mutex); 3658c2ecf20Sopenharmony_ci 3668c2ecf20Sopenharmony_ci wl->radar_debug_mode = value; 3678c2ecf20Sopenharmony_ci 3688c2ecf20Sopenharmony_ci if (unlikely(wl->state != WLCORE_STATE_ON)) 3698c2ecf20Sopenharmony_ci goto out; 3708c2ecf20Sopenharmony_ci 3718c2ecf20Sopenharmony_ci ret = pm_runtime_get_sync(wl->dev); 3728c2ecf20Sopenharmony_ci if (ret < 0) { 3738c2ecf20Sopenharmony_ci pm_runtime_put_noidle(wl->dev); 3748c2ecf20Sopenharmony_ci goto out; 3758c2ecf20Sopenharmony_ci } 3768c2ecf20Sopenharmony_ci 3778c2ecf20Sopenharmony_ci wl12xx_for_each_wlvif_ap(wl, wlvif) { 3788c2ecf20Sopenharmony_ci wlcore_cmd_generic_cfg(wl, wlvif, 3798c2ecf20Sopenharmony_ci WLCORE_CFG_FEATURE_RADAR_DEBUG, 3808c2ecf20Sopenharmony_ci wl->radar_debug_mode, 0); 3818c2ecf20Sopenharmony_ci } 3828c2ecf20Sopenharmony_ci 3838c2ecf20Sopenharmony_ci pm_runtime_mark_last_busy(wl->dev); 3848c2ecf20Sopenharmony_ci pm_runtime_put_autosuspend(wl->dev); 3858c2ecf20Sopenharmony_ciout: 3868c2ecf20Sopenharmony_ci mutex_unlock(&wl->mutex); 3878c2ecf20Sopenharmony_ci return count; 3888c2ecf20Sopenharmony_ci} 3898c2ecf20Sopenharmony_ci 3908c2ecf20Sopenharmony_cistatic ssize_t radar_debug_mode_read(struct file *file, 3918c2ecf20Sopenharmony_ci char __user *userbuf, 3928c2ecf20Sopenharmony_ci size_t count, loff_t *ppos) 3938c2ecf20Sopenharmony_ci{ 3948c2ecf20Sopenharmony_ci struct wl1271 *wl = file->private_data; 3958c2ecf20Sopenharmony_ci 3968c2ecf20Sopenharmony_ci return wl1271_format_buffer(userbuf, count, ppos, 3978c2ecf20Sopenharmony_ci "%d\n", wl->radar_debug_mode); 3988c2ecf20Sopenharmony_ci} 3998c2ecf20Sopenharmony_ci 4008c2ecf20Sopenharmony_cistatic const struct file_operations radar_debug_mode_ops = { 4018c2ecf20Sopenharmony_ci .write = radar_debug_mode_write, 4028c2ecf20Sopenharmony_ci .read = radar_debug_mode_read, 4038c2ecf20Sopenharmony_ci .open = simple_open, 4048c2ecf20Sopenharmony_ci .llseek = default_llseek, 4058c2ecf20Sopenharmony_ci}; 4068c2ecf20Sopenharmony_ci#endif /* CFG80211_CERTIFICATION_ONUS */ 4078c2ecf20Sopenharmony_ci 4088c2ecf20Sopenharmony_ciint wl18xx_debugfs_add_files(struct wl1271 *wl, 4098c2ecf20Sopenharmony_ci struct dentry *rootdir) 4108c2ecf20Sopenharmony_ci{ 4118c2ecf20Sopenharmony_ci struct dentry *stats, *moddir; 4128c2ecf20Sopenharmony_ci 4138c2ecf20Sopenharmony_ci moddir = debugfs_create_dir(KBUILD_MODNAME, rootdir); 4148c2ecf20Sopenharmony_ci stats = debugfs_create_dir("fw_stats", moddir); 4158c2ecf20Sopenharmony_ci 4168c2ecf20Sopenharmony_ci DEBUGFS_ADD(clear_fw_stats, stats); 4178c2ecf20Sopenharmony_ci 4188c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(error, error_frame_non_ctrl); 4198c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(error, error_frame_ctrl); 4208c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(error, error_frame_during_protection); 4218c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(error, null_frame_tx_start); 4228c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(error, null_frame_cts_start); 4238c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(error, bar_retry); 4248c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(error, num_frame_cts_nul_flid); 4258c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(error, tx_abort_failure); 4268c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(error, tx_resume_failure); 4278c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(error, rx_cmplt_db_overflow_cnt); 4288c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(error, elp_while_rx_exch); 4298c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(error, elp_while_tx_exch); 4308c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(error, elp_while_tx); 4318c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(error, elp_while_nvic_pending); 4328c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(error, rx_excessive_frame_len); 4338c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(error, burst_mismatch); 4348c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(error, tbc_exch_mismatch); 4358c2ecf20Sopenharmony_ci 4368c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(tx, tx_prepared_descs); 4378c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(tx, tx_cmplt); 4388c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(tx, tx_template_prepared); 4398c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(tx, tx_data_prepared); 4408c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(tx, tx_template_programmed); 4418c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(tx, tx_data_programmed); 4428c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(tx, tx_burst_programmed); 4438c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(tx, tx_starts); 4448c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(tx, tx_stop); 4458c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(tx, tx_start_templates); 4468c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(tx, tx_start_int_templates); 4478c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(tx, tx_start_fw_gen); 4488c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(tx, tx_start_data); 4498c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(tx, tx_start_null_frame); 4508c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(tx, tx_exch); 4518c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(tx, tx_retry_template); 4528c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(tx, tx_retry_data); 4538c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(tx, tx_retry_per_rate); 4548c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(tx, tx_exch_pending); 4558c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(tx, tx_exch_expiry); 4568c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(tx, tx_done_template); 4578c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(tx, tx_done_data); 4588c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(tx, tx_done_int_template); 4598c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(tx, tx_cfe1); 4608c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(tx, tx_cfe2); 4618c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(tx, frag_called); 4628c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(tx, frag_mpdu_alloc_failed); 4638c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(tx, frag_init_called); 4648c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(tx, frag_in_process_called); 4658c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(tx, frag_tkip_called); 4668c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(tx, frag_key_not_found); 4678c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(tx, frag_need_fragmentation); 4688c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(tx, frag_bad_mblk_num); 4698c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(tx, frag_failed); 4708c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(tx, frag_cache_hit); 4718c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(tx, frag_cache_miss); 4728c2ecf20Sopenharmony_ci 4738c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(rx, rx_beacon_early_term); 4748c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(rx, rx_out_of_mpdu_nodes); 4758c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(rx, rx_hdr_overflow); 4768c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(rx, rx_dropped_frame); 4778c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(rx, rx_done); 4788c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(rx, rx_defrag); 4798c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(rx, rx_defrag_end); 4808c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(rx, rx_cmplt); 4818c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(rx, rx_pre_complt); 4828c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(rx, rx_cmplt_task); 4838c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(rx, rx_phy_hdr); 4848c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(rx, rx_timeout); 4858c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(rx, rx_rts_timeout); 4868c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(rx, rx_timeout_wa); 4878c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(rx, defrag_called); 4888c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(rx, defrag_init_called); 4898c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(rx, defrag_in_process_called); 4908c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(rx, defrag_tkip_called); 4918c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(rx, defrag_need_defrag); 4928c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(rx, defrag_decrypt_failed); 4938c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(rx, decrypt_key_not_found); 4948c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(rx, defrag_need_decrypt); 4958c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(rx, rx_tkip_replays); 4968c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(rx, rx_xfr); 4978c2ecf20Sopenharmony_ci 4988c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(isr, irqs); 4998c2ecf20Sopenharmony_ci 5008c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(pwr, missing_bcns_cnt); 5018c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(pwr, rcvd_bcns_cnt); 5028c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(pwr, connection_out_of_sync); 5038c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(pwr, cont_miss_bcns_spread); 5048c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(pwr, rcvd_awake_bcns_cnt); 5058c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(pwr, sleep_time_count); 5068c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(pwr, sleep_time_avg); 5078c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(pwr, sleep_cycle_avg); 5088c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(pwr, sleep_percent); 5098c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(pwr, ap_sleep_active_conf); 5108c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(pwr, ap_sleep_user_conf); 5118c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(pwr, ap_sleep_counter); 5128c2ecf20Sopenharmony_ci 5138c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(rx_filter, beacon_filter); 5148c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(rx_filter, arp_filter); 5158c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(rx_filter, mc_filter); 5168c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(rx_filter, dup_filter); 5178c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(rx_filter, data_filter); 5188c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(rx_filter, ibss_filter); 5198c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(rx_filter, protection_filter); 5208c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(rx_filter, accum_arp_pend_requests); 5218c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(rx_filter, max_arp_queue_dep); 5228c2ecf20Sopenharmony_ci 5238c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(rx_rate, rx_frames_per_rates); 5248c2ecf20Sopenharmony_ci 5258c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(aggr_size, tx_agg_rate); 5268c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(aggr_size, tx_agg_len); 5278c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(aggr_size, rx_size); 5288c2ecf20Sopenharmony_ci 5298c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(pipeline, hs_tx_stat_fifo_int); 5308c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(pipeline, enc_tx_stat_fifo_int); 5318c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(pipeline, enc_rx_stat_fifo_int); 5328c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(pipeline, rx_complete_stat_fifo_int); 5338c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(pipeline, pre_proc_swi); 5348c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(pipeline, post_proc_swi); 5358c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(pipeline, sec_frag_swi); 5368c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(pipeline, pre_to_defrag_swi); 5378c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(pipeline, defrag_to_rx_xfer_swi); 5388c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(pipeline, dec_packet_in); 5398c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(pipeline, dec_packet_in_fifo_full); 5408c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(pipeline, dec_packet_out); 5418c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(pipeline, pipeline_fifo_full); 5428c2ecf20Sopenharmony_ci 5438c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(diversity, num_of_packets_per_ant); 5448c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(diversity, total_num_of_toggles); 5458c2ecf20Sopenharmony_ci 5468c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(thermal, irq_thr_low); 5478c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(thermal, irq_thr_high); 5488c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(thermal, tx_stop); 5498c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(thermal, tx_resume); 5508c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(thermal, false_irq); 5518c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(thermal, adc_source_unexpected); 5528c2ecf20Sopenharmony_ci 5538c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(calib, fail_count); 5548c2ecf20Sopenharmony_ci 5558c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(calib, calib_count); 5568c2ecf20Sopenharmony_ci 5578c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(roaming, rssi_level); 5588c2ecf20Sopenharmony_ci 5598c2ecf20Sopenharmony_ci DEBUGFS_FWSTATS_ADD(dfs, num_of_radar_detections); 5608c2ecf20Sopenharmony_ci 5618c2ecf20Sopenharmony_ci DEBUGFS_ADD(conf, moddir); 5628c2ecf20Sopenharmony_ci DEBUGFS_ADD(radar_detection, moddir); 5638c2ecf20Sopenharmony_ci#ifdef CONFIG_CFG80211_CERTIFICATION_ONUS 5648c2ecf20Sopenharmony_ci DEBUGFS_ADD(radar_debug_mode, moddir); 5658c2ecf20Sopenharmony_ci#endif 5668c2ecf20Sopenharmony_ci DEBUGFS_ADD(dynamic_fw_traces, moddir); 5678c2ecf20Sopenharmony_ci 5688c2ecf20Sopenharmony_ci return 0; 5698c2ecf20Sopenharmony_ci} 570