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