162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * This file is part of wl18xx 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 2009 Nokia Corporation 662306a36Sopenharmony_ci * Copyright (C) 2011-2012 Texas Instruments 762306a36Sopenharmony_ci */ 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include <linux/pm_runtime.h> 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#include "../wlcore/debugfs.h" 1262306a36Sopenharmony_ci#include "../wlcore/wlcore.h" 1362306a36Sopenharmony_ci#include "../wlcore/debug.h" 1462306a36Sopenharmony_ci#include "../wlcore/ps.h" 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci#include "wl18xx.h" 1762306a36Sopenharmony_ci#include "acx.h" 1862306a36Sopenharmony_ci#include "cmd.h" 1962306a36Sopenharmony_ci#include "debugfs.h" 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ci#define WL18XX_DEBUGFS_FWSTATS_FILE(a, b, c) \ 2262306a36Sopenharmony_ci DEBUGFS_FWSTATS_FILE(a, b, c, wl18xx_acx_statistics) 2362306a36Sopenharmony_ci#define WL18XX_DEBUGFS_FWSTATS_FILE_ARRAY(a, b, c) \ 2462306a36Sopenharmony_ci DEBUGFS_FWSTATS_FILE_ARRAY(a, b, c, wl18xx_acx_statistics) 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(error, error_frame_non_ctrl, "%u"); 2862306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(error, error_frame_ctrl, "%u"); 2962306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(error, error_frame_during_protection, "%u"); 3062306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(error, null_frame_tx_start, "%u"); 3162306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(error, null_frame_cts_start, "%u"); 3262306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(error, bar_retry, "%u"); 3362306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(error, num_frame_cts_nul_flid, "%u"); 3462306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(error, tx_abort_failure, "%u"); 3562306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(error, tx_resume_failure, "%u"); 3662306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(error, rx_cmplt_db_overflow_cnt, "%u"); 3762306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(error, elp_while_rx_exch, "%u"); 3862306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(error, elp_while_tx_exch, "%u"); 3962306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(error, elp_while_tx, "%u"); 4062306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(error, elp_while_nvic_pending, "%u"); 4162306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(error, rx_excessive_frame_len, "%u"); 4262306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(error, burst_mismatch, "%u"); 4362306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(error, tbc_exch_mismatch, "%u"); 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(tx, tx_prepared_descs, "%u"); 4662306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(tx, tx_cmplt, "%u"); 4762306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(tx, tx_template_prepared, "%u"); 4862306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(tx, tx_data_prepared, "%u"); 4962306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(tx, tx_template_programmed, "%u"); 5062306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(tx, tx_data_programmed, "%u"); 5162306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(tx, tx_burst_programmed, "%u"); 5262306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(tx, tx_starts, "%u"); 5362306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(tx, tx_stop, "%u"); 5462306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(tx, tx_start_templates, "%u"); 5562306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(tx, tx_start_int_templates, "%u"); 5662306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(tx, tx_start_fw_gen, "%u"); 5762306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(tx, tx_start_data, "%u"); 5862306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(tx, tx_start_null_frame, "%u"); 5962306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(tx, tx_exch, "%u"); 6062306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(tx, tx_retry_template, "%u"); 6162306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(tx, tx_retry_data, "%u"); 6262306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE_ARRAY(tx, tx_retry_per_rate, 6362306a36Sopenharmony_ci NUM_OF_RATES_INDEXES); 6462306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(tx, tx_exch_pending, "%u"); 6562306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(tx, tx_exch_expiry, "%u"); 6662306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(tx, tx_done_template, "%u"); 6762306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(tx, tx_done_data, "%u"); 6862306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(tx, tx_done_int_template, "%u"); 6962306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(tx, tx_cfe1, "%u"); 7062306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(tx, tx_cfe2, "%u"); 7162306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(tx, frag_called, "%u"); 7262306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(tx, frag_mpdu_alloc_failed, "%u"); 7362306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(tx, frag_init_called, "%u"); 7462306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(tx, frag_in_process_called, "%u"); 7562306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(tx, frag_tkip_called, "%u"); 7662306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(tx, frag_key_not_found, "%u"); 7762306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(tx, frag_need_fragmentation, "%u"); 7862306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(tx, frag_bad_mblk_num, "%u"); 7962306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(tx, frag_failed, "%u"); 8062306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(tx, frag_cache_hit, "%u"); 8162306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(tx, frag_cache_miss, "%u"); 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(rx, rx_beacon_early_term, "%u"); 8462306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(rx, rx_out_of_mpdu_nodes, "%u"); 8562306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(rx, rx_hdr_overflow, "%u"); 8662306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(rx, rx_dropped_frame, "%u"); 8762306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(rx, rx_done, "%u"); 8862306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(rx, rx_defrag, "%u"); 8962306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(rx, rx_defrag_end, "%u"); 9062306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(rx, rx_cmplt, "%u"); 9162306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(rx, rx_pre_complt, "%u"); 9262306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(rx, rx_cmplt_task, "%u"); 9362306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(rx, rx_phy_hdr, "%u"); 9462306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(rx, rx_timeout, "%u"); 9562306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(rx, rx_rts_timeout, "%u"); 9662306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(rx, rx_timeout_wa, "%u"); 9762306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(rx, defrag_called, "%u"); 9862306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(rx, defrag_init_called, "%u"); 9962306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(rx, defrag_in_process_called, "%u"); 10062306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(rx, defrag_tkip_called, "%u"); 10162306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(rx, defrag_need_defrag, "%u"); 10262306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(rx, defrag_decrypt_failed, "%u"); 10362306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(rx, decrypt_key_not_found, "%u"); 10462306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(rx, defrag_need_decrypt, "%u"); 10562306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(rx, rx_tkip_replays, "%u"); 10662306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(rx, rx_xfr, "%u"); 10762306a36Sopenharmony_ci 10862306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(isr, irqs, "%u"); 10962306a36Sopenharmony_ci 11062306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(pwr, missing_bcns_cnt, "%u"); 11162306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(pwr, rcvd_bcns_cnt, "%u"); 11262306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(pwr, connection_out_of_sync, "%u"); 11362306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE_ARRAY(pwr, cont_miss_bcns_spread, 11462306a36Sopenharmony_ci PWR_STAT_MAX_CONT_MISSED_BCNS_SPREAD); 11562306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(pwr, rcvd_awake_bcns_cnt, "%u"); 11662306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(pwr, sleep_time_count, "%u"); 11762306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(pwr, sleep_time_avg, "%u"); 11862306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(pwr, sleep_cycle_avg, "%u"); 11962306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(pwr, sleep_percent, "%u"); 12062306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(pwr, ap_sleep_active_conf, "%u"); 12162306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(pwr, ap_sleep_user_conf, "%u"); 12262306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(pwr, ap_sleep_counter, "%u"); 12362306a36Sopenharmony_ci 12462306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(rx_filter, beacon_filter, "%u"); 12562306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(rx_filter, arp_filter, "%u"); 12662306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(rx_filter, mc_filter, "%u"); 12762306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(rx_filter, dup_filter, "%u"); 12862306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(rx_filter, data_filter, "%u"); 12962306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(rx_filter, ibss_filter, "%u"); 13062306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(rx_filter, protection_filter, "%u"); 13162306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(rx_filter, accum_arp_pend_requests, "%u"); 13262306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(rx_filter, max_arp_queue_dep, "%u"); 13362306a36Sopenharmony_ci 13462306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE_ARRAY(rx_rate, rx_frames_per_rates, 50); 13562306a36Sopenharmony_ci 13662306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE_ARRAY(aggr_size, tx_agg_rate, 13762306a36Sopenharmony_ci AGGR_STATS_TX_AGG); 13862306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE_ARRAY(aggr_size, tx_agg_len, 13962306a36Sopenharmony_ci AGGR_STATS_TX_AGG); 14062306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE_ARRAY(aggr_size, rx_size, 14162306a36Sopenharmony_ci AGGR_STATS_RX_SIZE_LEN); 14262306a36Sopenharmony_ci 14362306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(pipeline, hs_tx_stat_fifo_int, "%u"); 14462306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(pipeline, enc_tx_stat_fifo_int, "%u"); 14562306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(pipeline, enc_rx_stat_fifo_int, "%u"); 14662306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(pipeline, rx_complete_stat_fifo_int, "%u"); 14762306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(pipeline, pre_proc_swi, "%u"); 14862306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(pipeline, post_proc_swi, "%u"); 14962306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(pipeline, sec_frag_swi, "%u"); 15062306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(pipeline, pre_to_defrag_swi, "%u"); 15162306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(pipeline, defrag_to_rx_xfer_swi, "%u"); 15262306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(pipeline, dec_packet_in, "%u"); 15362306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(pipeline, dec_packet_in_fifo_full, "%u"); 15462306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(pipeline, dec_packet_out, "%u"); 15562306a36Sopenharmony_ci 15662306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE_ARRAY(pipeline, pipeline_fifo_full, 15762306a36Sopenharmony_ci PIPE_STATS_HW_FIFO); 15862306a36Sopenharmony_ci 15962306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE_ARRAY(diversity, num_of_packets_per_ant, 16062306a36Sopenharmony_ci DIVERSITY_STATS_NUM_OF_ANT); 16162306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(diversity, total_num_of_toggles, "%u"); 16262306a36Sopenharmony_ci 16362306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(thermal, irq_thr_low, "%u"); 16462306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(thermal, irq_thr_high, "%u"); 16562306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(thermal, tx_stop, "%u"); 16662306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(thermal, tx_resume, "%u"); 16762306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(thermal, false_irq, "%u"); 16862306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(thermal, adc_source_unexpected, "%u"); 16962306a36Sopenharmony_ci 17062306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE_ARRAY(calib, fail_count, 17162306a36Sopenharmony_ci WL18XX_NUM_OF_CALIBRATIONS_ERRORS); 17262306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(calib, calib_count, "%u"); 17362306a36Sopenharmony_ci 17462306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(roaming, rssi_level, "%d"); 17562306a36Sopenharmony_ci 17662306a36Sopenharmony_ciWL18XX_DEBUGFS_FWSTATS_FILE(dfs, num_of_radar_detections, "%d"); 17762306a36Sopenharmony_ci 17862306a36Sopenharmony_cistatic ssize_t conf_read(struct file *file, char __user *user_buf, 17962306a36Sopenharmony_ci size_t count, loff_t *ppos) 18062306a36Sopenharmony_ci{ 18162306a36Sopenharmony_ci struct wl1271 *wl = file->private_data; 18262306a36Sopenharmony_ci struct wl18xx_priv *priv = wl->priv; 18362306a36Sopenharmony_ci struct wlcore_conf_header header; 18462306a36Sopenharmony_ci char *buf, *pos; 18562306a36Sopenharmony_ci size_t len; 18662306a36Sopenharmony_ci int ret; 18762306a36Sopenharmony_ci 18862306a36Sopenharmony_ci len = WL18XX_CONF_SIZE; 18962306a36Sopenharmony_ci buf = kmalloc(len, GFP_KERNEL); 19062306a36Sopenharmony_ci if (!buf) 19162306a36Sopenharmony_ci return -ENOMEM; 19262306a36Sopenharmony_ci 19362306a36Sopenharmony_ci header.magic = cpu_to_le32(WL18XX_CONF_MAGIC); 19462306a36Sopenharmony_ci header.version = cpu_to_le32(WL18XX_CONF_VERSION); 19562306a36Sopenharmony_ci header.checksum = 0; 19662306a36Sopenharmony_ci 19762306a36Sopenharmony_ci mutex_lock(&wl->mutex); 19862306a36Sopenharmony_ci 19962306a36Sopenharmony_ci pos = buf; 20062306a36Sopenharmony_ci memcpy(pos, &header, sizeof(header)); 20162306a36Sopenharmony_ci pos += sizeof(header); 20262306a36Sopenharmony_ci memcpy(pos, &wl->conf, sizeof(wl->conf)); 20362306a36Sopenharmony_ci pos += sizeof(wl->conf); 20462306a36Sopenharmony_ci memcpy(pos, &priv->conf, sizeof(priv->conf)); 20562306a36Sopenharmony_ci 20662306a36Sopenharmony_ci mutex_unlock(&wl->mutex); 20762306a36Sopenharmony_ci 20862306a36Sopenharmony_ci ret = simple_read_from_buffer(user_buf, count, ppos, buf, len); 20962306a36Sopenharmony_ci 21062306a36Sopenharmony_ci kfree(buf); 21162306a36Sopenharmony_ci return ret; 21262306a36Sopenharmony_ci} 21362306a36Sopenharmony_ci 21462306a36Sopenharmony_cistatic const struct file_operations conf_ops = { 21562306a36Sopenharmony_ci .read = conf_read, 21662306a36Sopenharmony_ci .open = simple_open, 21762306a36Sopenharmony_ci .llseek = default_llseek, 21862306a36Sopenharmony_ci}; 21962306a36Sopenharmony_ci 22062306a36Sopenharmony_cistatic ssize_t clear_fw_stats_write(struct file *file, 22162306a36Sopenharmony_ci const char __user *user_buf, 22262306a36Sopenharmony_ci size_t count, loff_t *ppos) 22362306a36Sopenharmony_ci{ 22462306a36Sopenharmony_ci struct wl1271 *wl = file->private_data; 22562306a36Sopenharmony_ci int ret; 22662306a36Sopenharmony_ci 22762306a36Sopenharmony_ci mutex_lock(&wl->mutex); 22862306a36Sopenharmony_ci 22962306a36Sopenharmony_ci if (unlikely(wl->state != WLCORE_STATE_ON)) 23062306a36Sopenharmony_ci goto out; 23162306a36Sopenharmony_ci 23262306a36Sopenharmony_ci ret = wl18xx_acx_clear_statistics(wl); 23362306a36Sopenharmony_ci if (ret < 0) { 23462306a36Sopenharmony_ci count = ret; 23562306a36Sopenharmony_ci goto out; 23662306a36Sopenharmony_ci } 23762306a36Sopenharmony_ciout: 23862306a36Sopenharmony_ci mutex_unlock(&wl->mutex); 23962306a36Sopenharmony_ci return count; 24062306a36Sopenharmony_ci} 24162306a36Sopenharmony_ci 24262306a36Sopenharmony_cistatic const struct file_operations clear_fw_stats_ops = { 24362306a36Sopenharmony_ci .write = clear_fw_stats_write, 24462306a36Sopenharmony_ci .open = simple_open, 24562306a36Sopenharmony_ci .llseek = default_llseek, 24662306a36Sopenharmony_ci}; 24762306a36Sopenharmony_ci 24862306a36Sopenharmony_cistatic ssize_t radar_detection_write(struct file *file, 24962306a36Sopenharmony_ci const char __user *user_buf, 25062306a36Sopenharmony_ci size_t count, loff_t *ppos) 25162306a36Sopenharmony_ci{ 25262306a36Sopenharmony_ci struct wl1271 *wl = file->private_data; 25362306a36Sopenharmony_ci int ret; 25462306a36Sopenharmony_ci u8 channel; 25562306a36Sopenharmony_ci 25662306a36Sopenharmony_ci ret = kstrtou8_from_user(user_buf, count, 10, &channel); 25762306a36Sopenharmony_ci if (ret < 0) { 25862306a36Sopenharmony_ci wl1271_warning("illegal channel"); 25962306a36Sopenharmony_ci return -EINVAL; 26062306a36Sopenharmony_ci } 26162306a36Sopenharmony_ci 26262306a36Sopenharmony_ci mutex_lock(&wl->mutex); 26362306a36Sopenharmony_ci 26462306a36Sopenharmony_ci if (unlikely(wl->state != WLCORE_STATE_ON)) 26562306a36Sopenharmony_ci goto out; 26662306a36Sopenharmony_ci 26762306a36Sopenharmony_ci ret = pm_runtime_resume_and_get(wl->dev); 26862306a36Sopenharmony_ci if (ret < 0) 26962306a36Sopenharmony_ci goto out; 27062306a36Sopenharmony_ci 27162306a36Sopenharmony_ci ret = wl18xx_cmd_radar_detection_debug(wl, channel); 27262306a36Sopenharmony_ci if (ret < 0) 27362306a36Sopenharmony_ci count = ret; 27462306a36Sopenharmony_ci 27562306a36Sopenharmony_ci pm_runtime_mark_last_busy(wl->dev); 27662306a36Sopenharmony_ci pm_runtime_put_autosuspend(wl->dev); 27762306a36Sopenharmony_ciout: 27862306a36Sopenharmony_ci mutex_unlock(&wl->mutex); 27962306a36Sopenharmony_ci return count; 28062306a36Sopenharmony_ci} 28162306a36Sopenharmony_ci 28262306a36Sopenharmony_cistatic const struct file_operations radar_detection_ops = { 28362306a36Sopenharmony_ci .write = radar_detection_write, 28462306a36Sopenharmony_ci .open = simple_open, 28562306a36Sopenharmony_ci .llseek = default_llseek, 28662306a36Sopenharmony_ci}; 28762306a36Sopenharmony_ci 28862306a36Sopenharmony_cistatic ssize_t dynamic_fw_traces_write(struct file *file, 28962306a36Sopenharmony_ci const char __user *user_buf, 29062306a36Sopenharmony_ci size_t count, loff_t *ppos) 29162306a36Sopenharmony_ci{ 29262306a36Sopenharmony_ci struct wl1271 *wl = file->private_data; 29362306a36Sopenharmony_ci unsigned long value; 29462306a36Sopenharmony_ci int ret; 29562306a36Sopenharmony_ci 29662306a36Sopenharmony_ci ret = kstrtoul_from_user(user_buf, count, 0, &value); 29762306a36Sopenharmony_ci if (ret < 0) 29862306a36Sopenharmony_ci return ret; 29962306a36Sopenharmony_ci 30062306a36Sopenharmony_ci mutex_lock(&wl->mutex); 30162306a36Sopenharmony_ci 30262306a36Sopenharmony_ci wl->dynamic_fw_traces = value; 30362306a36Sopenharmony_ci 30462306a36Sopenharmony_ci if (unlikely(wl->state != WLCORE_STATE_ON)) 30562306a36Sopenharmony_ci goto out; 30662306a36Sopenharmony_ci 30762306a36Sopenharmony_ci ret = pm_runtime_resume_and_get(wl->dev); 30862306a36Sopenharmony_ci if (ret < 0) 30962306a36Sopenharmony_ci goto out; 31062306a36Sopenharmony_ci 31162306a36Sopenharmony_ci ret = wl18xx_acx_dynamic_fw_traces(wl); 31262306a36Sopenharmony_ci if (ret < 0) 31362306a36Sopenharmony_ci count = ret; 31462306a36Sopenharmony_ci 31562306a36Sopenharmony_ci pm_runtime_mark_last_busy(wl->dev); 31662306a36Sopenharmony_ci pm_runtime_put_autosuspend(wl->dev); 31762306a36Sopenharmony_ciout: 31862306a36Sopenharmony_ci mutex_unlock(&wl->mutex); 31962306a36Sopenharmony_ci return count; 32062306a36Sopenharmony_ci} 32162306a36Sopenharmony_ci 32262306a36Sopenharmony_cistatic ssize_t dynamic_fw_traces_read(struct file *file, 32362306a36Sopenharmony_ci char __user *userbuf, 32462306a36Sopenharmony_ci size_t count, loff_t *ppos) 32562306a36Sopenharmony_ci{ 32662306a36Sopenharmony_ci struct wl1271 *wl = file->private_data; 32762306a36Sopenharmony_ci return wl1271_format_buffer(userbuf, count, ppos, 32862306a36Sopenharmony_ci "%d\n", wl->dynamic_fw_traces); 32962306a36Sopenharmony_ci} 33062306a36Sopenharmony_ci 33162306a36Sopenharmony_cistatic const struct file_operations dynamic_fw_traces_ops = { 33262306a36Sopenharmony_ci .read = dynamic_fw_traces_read, 33362306a36Sopenharmony_ci .write = dynamic_fw_traces_write, 33462306a36Sopenharmony_ci .open = simple_open, 33562306a36Sopenharmony_ci .llseek = default_llseek, 33662306a36Sopenharmony_ci}; 33762306a36Sopenharmony_ci 33862306a36Sopenharmony_ci#ifdef CONFIG_CFG80211_CERTIFICATION_ONUS 33962306a36Sopenharmony_cistatic ssize_t radar_debug_mode_write(struct file *file, 34062306a36Sopenharmony_ci const char __user *user_buf, 34162306a36Sopenharmony_ci size_t count, loff_t *ppos) 34262306a36Sopenharmony_ci{ 34362306a36Sopenharmony_ci struct wl1271 *wl = file->private_data; 34462306a36Sopenharmony_ci struct wl12xx_vif *wlvif; 34562306a36Sopenharmony_ci unsigned long value; 34662306a36Sopenharmony_ci int ret; 34762306a36Sopenharmony_ci 34862306a36Sopenharmony_ci ret = kstrtoul_from_user(user_buf, count, 10, &value); 34962306a36Sopenharmony_ci if (ret < 0) { 35062306a36Sopenharmony_ci wl1271_warning("illegal radar_debug_mode value!"); 35162306a36Sopenharmony_ci return -EINVAL; 35262306a36Sopenharmony_ci } 35362306a36Sopenharmony_ci 35462306a36Sopenharmony_ci /* valid values: 0/1 */ 35562306a36Sopenharmony_ci if (!(value == 0 || value == 1)) { 35662306a36Sopenharmony_ci wl1271_warning("value is not in valid!"); 35762306a36Sopenharmony_ci return -EINVAL; 35862306a36Sopenharmony_ci } 35962306a36Sopenharmony_ci 36062306a36Sopenharmony_ci mutex_lock(&wl->mutex); 36162306a36Sopenharmony_ci 36262306a36Sopenharmony_ci wl->radar_debug_mode = value; 36362306a36Sopenharmony_ci 36462306a36Sopenharmony_ci if (unlikely(wl->state != WLCORE_STATE_ON)) 36562306a36Sopenharmony_ci goto out; 36662306a36Sopenharmony_ci 36762306a36Sopenharmony_ci ret = pm_runtime_resume_and_get(wl->dev); 36862306a36Sopenharmony_ci if (ret < 0) 36962306a36Sopenharmony_ci goto out; 37062306a36Sopenharmony_ci 37162306a36Sopenharmony_ci wl12xx_for_each_wlvif_ap(wl, wlvif) { 37262306a36Sopenharmony_ci wlcore_cmd_generic_cfg(wl, wlvif, 37362306a36Sopenharmony_ci WLCORE_CFG_FEATURE_RADAR_DEBUG, 37462306a36Sopenharmony_ci wl->radar_debug_mode, 0); 37562306a36Sopenharmony_ci } 37662306a36Sopenharmony_ci 37762306a36Sopenharmony_ci pm_runtime_mark_last_busy(wl->dev); 37862306a36Sopenharmony_ci pm_runtime_put_autosuspend(wl->dev); 37962306a36Sopenharmony_ciout: 38062306a36Sopenharmony_ci mutex_unlock(&wl->mutex); 38162306a36Sopenharmony_ci return count; 38262306a36Sopenharmony_ci} 38362306a36Sopenharmony_ci 38462306a36Sopenharmony_cistatic ssize_t radar_debug_mode_read(struct file *file, 38562306a36Sopenharmony_ci char __user *userbuf, 38662306a36Sopenharmony_ci size_t count, loff_t *ppos) 38762306a36Sopenharmony_ci{ 38862306a36Sopenharmony_ci struct wl1271 *wl = file->private_data; 38962306a36Sopenharmony_ci 39062306a36Sopenharmony_ci return wl1271_format_buffer(userbuf, count, ppos, 39162306a36Sopenharmony_ci "%d\n", wl->radar_debug_mode); 39262306a36Sopenharmony_ci} 39362306a36Sopenharmony_ci 39462306a36Sopenharmony_cistatic const struct file_operations radar_debug_mode_ops = { 39562306a36Sopenharmony_ci .write = radar_debug_mode_write, 39662306a36Sopenharmony_ci .read = radar_debug_mode_read, 39762306a36Sopenharmony_ci .open = simple_open, 39862306a36Sopenharmony_ci .llseek = default_llseek, 39962306a36Sopenharmony_ci}; 40062306a36Sopenharmony_ci#endif /* CFG80211_CERTIFICATION_ONUS */ 40162306a36Sopenharmony_ci 40262306a36Sopenharmony_ciint wl18xx_debugfs_add_files(struct wl1271 *wl, 40362306a36Sopenharmony_ci struct dentry *rootdir) 40462306a36Sopenharmony_ci{ 40562306a36Sopenharmony_ci struct dentry *stats, *moddir; 40662306a36Sopenharmony_ci 40762306a36Sopenharmony_ci moddir = debugfs_create_dir(KBUILD_MODNAME, rootdir); 40862306a36Sopenharmony_ci stats = debugfs_create_dir("fw_stats", moddir); 40962306a36Sopenharmony_ci 41062306a36Sopenharmony_ci DEBUGFS_ADD(clear_fw_stats, stats); 41162306a36Sopenharmony_ci 41262306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(error, error_frame_non_ctrl); 41362306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(error, error_frame_ctrl); 41462306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(error, error_frame_during_protection); 41562306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(error, null_frame_tx_start); 41662306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(error, null_frame_cts_start); 41762306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(error, bar_retry); 41862306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(error, num_frame_cts_nul_flid); 41962306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(error, tx_abort_failure); 42062306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(error, tx_resume_failure); 42162306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(error, rx_cmplt_db_overflow_cnt); 42262306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(error, elp_while_rx_exch); 42362306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(error, elp_while_tx_exch); 42462306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(error, elp_while_tx); 42562306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(error, elp_while_nvic_pending); 42662306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(error, rx_excessive_frame_len); 42762306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(error, burst_mismatch); 42862306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(error, tbc_exch_mismatch); 42962306a36Sopenharmony_ci 43062306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(tx, tx_prepared_descs); 43162306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(tx, tx_cmplt); 43262306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(tx, tx_template_prepared); 43362306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(tx, tx_data_prepared); 43462306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(tx, tx_template_programmed); 43562306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(tx, tx_data_programmed); 43662306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(tx, tx_burst_programmed); 43762306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(tx, tx_starts); 43862306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(tx, tx_stop); 43962306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(tx, tx_start_templates); 44062306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(tx, tx_start_int_templates); 44162306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(tx, tx_start_fw_gen); 44262306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(tx, tx_start_data); 44362306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(tx, tx_start_null_frame); 44462306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(tx, tx_exch); 44562306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(tx, tx_retry_template); 44662306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(tx, tx_retry_data); 44762306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(tx, tx_retry_per_rate); 44862306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(tx, tx_exch_pending); 44962306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(tx, tx_exch_expiry); 45062306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(tx, tx_done_template); 45162306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(tx, tx_done_data); 45262306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(tx, tx_done_int_template); 45362306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(tx, tx_cfe1); 45462306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(tx, tx_cfe2); 45562306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(tx, frag_called); 45662306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(tx, frag_mpdu_alloc_failed); 45762306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(tx, frag_init_called); 45862306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(tx, frag_in_process_called); 45962306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(tx, frag_tkip_called); 46062306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(tx, frag_key_not_found); 46162306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(tx, frag_need_fragmentation); 46262306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(tx, frag_bad_mblk_num); 46362306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(tx, frag_failed); 46462306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(tx, frag_cache_hit); 46562306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(tx, frag_cache_miss); 46662306a36Sopenharmony_ci 46762306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(rx, rx_beacon_early_term); 46862306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(rx, rx_out_of_mpdu_nodes); 46962306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(rx, rx_hdr_overflow); 47062306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(rx, rx_dropped_frame); 47162306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(rx, rx_done); 47262306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(rx, rx_defrag); 47362306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(rx, rx_defrag_end); 47462306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(rx, rx_cmplt); 47562306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(rx, rx_pre_complt); 47662306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(rx, rx_cmplt_task); 47762306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(rx, rx_phy_hdr); 47862306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(rx, rx_timeout); 47962306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(rx, rx_rts_timeout); 48062306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(rx, rx_timeout_wa); 48162306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(rx, defrag_called); 48262306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(rx, defrag_init_called); 48362306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(rx, defrag_in_process_called); 48462306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(rx, defrag_tkip_called); 48562306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(rx, defrag_need_defrag); 48662306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(rx, defrag_decrypt_failed); 48762306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(rx, decrypt_key_not_found); 48862306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(rx, defrag_need_decrypt); 48962306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(rx, rx_tkip_replays); 49062306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(rx, rx_xfr); 49162306a36Sopenharmony_ci 49262306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(isr, irqs); 49362306a36Sopenharmony_ci 49462306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(pwr, missing_bcns_cnt); 49562306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(pwr, rcvd_bcns_cnt); 49662306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(pwr, connection_out_of_sync); 49762306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(pwr, cont_miss_bcns_spread); 49862306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(pwr, rcvd_awake_bcns_cnt); 49962306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(pwr, sleep_time_count); 50062306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(pwr, sleep_time_avg); 50162306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(pwr, sleep_cycle_avg); 50262306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(pwr, sleep_percent); 50362306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(pwr, ap_sleep_active_conf); 50462306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(pwr, ap_sleep_user_conf); 50562306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(pwr, ap_sleep_counter); 50662306a36Sopenharmony_ci 50762306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(rx_filter, beacon_filter); 50862306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(rx_filter, arp_filter); 50962306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(rx_filter, mc_filter); 51062306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(rx_filter, dup_filter); 51162306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(rx_filter, data_filter); 51262306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(rx_filter, ibss_filter); 51362306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(rx_filter, protection_filter); 51462306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(rx_filter, accum_arp_pend_requests); 51562306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(rx_filter, max_arp_queue_dep); 51662306a36Sopenharmony_ci 51762306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(rx_rate, rx_frames_per_rates); 51862306a36Sopenharmony_ci 51962306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(aggr_size, tx_agg_rate); 52062306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(aggr_size, tx_agg_len); 52162306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(aggr_size, rx_size); 52262306a36Sopenharmony_ci 52362306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(pipeline, hs_tx_stat_fifo_int); 52462306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(pipeline, enc_tx_stat_fifo_int); 52562306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(pipeline, enc_rx_stat_fifo_int); 52662306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(pipeline, rx_complete_stat_fifo_int); 52762306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(pipeline, pre_proc_swi); 52862306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(pipeline, post_proc_swi); 52962306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(pipeline, sec_frag_swi); 53062306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(pipeline, pre_to_defrag_swi); 53162306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(pipeline, defrag_to_rx_xfer_swi); 53262306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(pipeline, dec_packet_in); 53362306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(pipeline, dec_packet_in_fifo_full); 53462306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(pipeline, dec_packet_out); 53562306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(pipeline, pipeline_fifo_full); 53662306a36Sopenharmony_ci 53762306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(diversity, num_of_packets_per_ant); 53862306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(diversity, total_num_of_toggles); 53962306a36Sopenharmony_ci 54062306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(thermal, irq_thr_low); 54162306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(thermal, irq_thr_high); 54262306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(thermal, tx_stop); 54362306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(thermal, tx_resume); 54462306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(thermal, false_irq); 54562306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(thermal, adc_source_unexpected); 54662306a36Sopenharmony_ci 54762306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(calib, fail_count); 54862306a36Sopenharmony_ci 54962306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(calib, calib_count); 55062306a36Sopenharmony_ci 55162306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(roaming, rssi_level); 55262306a36Sopenharmony_ci 55362306a36Sopenharmony_ci DEBUGFS_FWSTATS_ADD(dfs, num_of_radar_detections); 55462306a36Sopenharmony_ci 55562306a36Sopenharmony_ci DEBUGFS_ADD(conf, moddir); 55662306a36Sopenharmony_ci DEBUGFS_ADD(radar_detection, moddir); 55762306a36Sopenharmony_ci#ifdef CONFIG_CFG80211_CERTIFICATION_ONUS 55862306a36Sopenharmony_ci DEBUGFS_ADD(radar_debug_mode, moddir); 55962306a36Sopenharmony_ci#endif 56062306a36Sopenharmony_ci DEBUGFS_ADD(dynamic_fw_traces, moddir); 56162306a36Sopenharmony_ci 56262306a36Sopenharmony_ci return 0; 56362306a36Sopenharmony_ci} 564