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