1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-only
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * This file is part of wl18xx
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * Copyright (C) 2009 Nokia Corporation
6*4882a593Smuzhiyun * Copyright (C) 2011-2012 Texas Instruments
7*4882a593Smuzhiyun */
8*4882a593Smuzhiyun
9*4882a593Smuzhiyun #include <linux/pm_runtime.h>
10*4882a593Smuzhiyun
11*4882a593Smuzhiyun #include "../wlcore/debugfs.h"
12*4882a593Smuzhiyun #include "../wlcore/wlcore.h"
13*4882a593Smuzhiyun #include "../wlcore/debug.h"
14*4882a593Smuzhiyun #include "../wlcore/ps.h"
15*4882a593Smuzhiyun
16*4882a593Smuzhiyun #include "wl18xx.h"
17*4882a593Smuzhiyun #include "acx.h"
18*4882a593Smuzhiyun #include "cmd.h"
19*4882a593Smuzhiyun #include "debugfs.h"
20*4882a593Smuzhiyun
21*4882a593Smuzhiyun #define WL18XX_DEBUGFS_FWSTATS_FILE(a, b, c) \
22*4882a593Smuzhiyun DEBUGFS_FWSTATS_FILE(a, b, c, wl18xx_acx_statistics)
23*4882a593Smuzhiyun #define WL18XX_DEBUGFS_FWSTATS_FILE_ARRAY(a, b, c) \
24*4882a593Smuzhiyun DEBUGFS_FWSTATS_FILE_ARRAY(a, b, c, wl18xx_acx_statistics)
25*4882a593Smuzhiyun
26*4882a593Smuzhiyun
27*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(error, error_frame_non_ctrl, "%u");
28*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(error, error_frame_ctrl, "%u");
29*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(error, error_frame_during_protection, "%u");
30*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(error, null_frame_tx_start, "%u");
31*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(error, null_frame_cts_start, "%u");
32*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(error, bar_retry, "%u");
33*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(error, num_frame_cts_nul_flid, "%u");
34*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(error, tx_abort_failure, "%u");
35*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(error, tx_resume_failure, "%u");
36*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(error, rx_cmplt_db_overflow_cnt, "%u");
37*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(error, elp_while_rx_exch, "%u");
38*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(error, elp_while_tx_exch, "%u");
39*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(error, elp_while_tx, "%u");
40*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(error, elp_while_nvic_pending, "%u");
41*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(error, rx_excessive_frame_len, "%u");
42*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(error, burst_mismatch, "%u");
43*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(error, tbc_exch_mismatch, "%u");
44*4882a593Smuzhiyun
45*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(tx, tx_prepared_descs, "%u");
46*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(tx, tx_cmplt, "%u");
47*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(tx, tx_template_prepared, "%u");
48*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(tx, tx_data_prepared, "%u");
49*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(tx, tx_template_programmed, "%u");
50*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(tx, tx_data_programmed, "%u");
51*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(tx, tx_burst_programmed, "%u");
52*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(tx, tx_starts, "%u");
53*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(tx, tx_stop, "%u");
54*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(tx, tx_start_templates, "%u");
55*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(tx, tx_start_int_templates, "%u");
56*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(tx, tx_start_fw_gen, "%u");
57*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(tx, tx_start_data, "%u");
58*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(tx, tx_start_null_frame, "%u");
59*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(tx, tx_exch, "%u");
60*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(tx, tx_retry_template, "%u");
61*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(tx, tx_retry_data, "%u");
62*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE_ARRAY(tx, tx_retry_per_rate,
63*4882a593Smuzhiyun NUM_OF_RATES_INDEXES);
64*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(tx, tx_exch_pending, "%u");
65*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(tx, tx_exch_expiry, "%u");
66*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(tx, tx_done_template, "%u");
67*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(tx, tx_done_data, "%u");
68*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(tx, tx_done_int_template, "%u");
69*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(tx, tx_cfe1, "%u");
70*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(tx, tx_cfe2, "%u");
71*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(tx, frag_called, "%u");
72*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(tx, frag_mpdu_alloc_failed, "%u");
73*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(tx, frag_init_called, "%u");
74*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(tx, frag_in_process_called, "%u");
75*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(tx, frag_tkip_called, "%u");
76*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(tx, frag_key_not_found, "%u");
77*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(tx, frag_need_fragmentation, "%u");
78*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(tx, frag_bad_mblk_num, "%u");
79*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(tx, frag_failed, "%u");
80*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(tx, frag_cache_hit, "%u");
81*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(tx, frag_cache_miss, "%u");
82*4882a593Smuzhiyun
83*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(rx, rx_beacon_early_term, "%u");
84*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(rx, rx_out_of_mpdu_nodes, "%u");
85*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(rx, rx_hdr_overflow, "%u");
86*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(rx, rx_dropped_frame, "%u");
87*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(rx, rx_done, "%u");
88*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(rx, rx_defrag, "%u");
89*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(rx, rx_defrag_end, "%u");
90*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(rx, rx_cmplt, "%u");
91*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(rx, rx_pre_complt, "%u");
92*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(rx, rx_cmplt_task, "%u");
93*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(rx, rx_phy_hdr, "%u");
94*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(rx, rx_timeout, "%u");
95*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(rx, rx_rts_timeout, "%u");
96*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(rx, rx_timeout_wa, "%u");
97*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(rx, defrag_called, "%u");
98*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(rx, defrag_init_called, "%u");
99*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(rx, defrag_in_process_called, "%u");
100*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(rx, defrag_tkip_called, "%u");
101*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(rx, defrag_need_defrag, "%u");
102*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(rx, defrag_decrypt_failed, "%u");
103*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(rx, decrypt_key_not_found, "%u");
104*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(rx, defrag_need_decrypt, "%u");
105*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(rx, rx_tkip_replays, "%u");
106*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(rx, rx_xfr, "%u");
107*4882a593Smuzhiyun
108*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(isr, irqs, "%u");
109*4882a593Smuzhiyun
110*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(pwr, missing_bcns_cnt, "%u");
111*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(pwr, rcvd_bcns_cnt, "%u");
112*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(pwr, connection_out_of_sync, "%u");
113*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE_ARRAY(pwr, cont_miss_bcns_spread,
114*4882a593Smuzhiyun PWR_STAT_MAX_CONT_MISSED_BCNS_SPREAD);
115*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(pwr, rcvd_awake_bcns_cnt, "%u");
116*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(pwr, sleep_time_count, "%u");
117*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(pwr, sleep_time_avg, "%u");
118*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(pwr, sleep_cycle_avg, "%u");
119*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(pwr, sleep_percent, "%u");
120*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(pwr, ap_sleep_active_conf, "%u");
121*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(pwr, ap_sleep_user_conf, "%u");
122*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(pwr, ap_sleep_counter, "%u");
123*4882a593Smuzhiyun
124*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(rx_filter, beacon_filter, "%u");
125*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(rx_filter, arp_filter, "%u");
126*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(rx_filter, mc_filter, "%u");
127*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(rx_filter, dup_filter, "%u");
128*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(rx_filter, data_filter, "%u");
129*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(rx_filter, ibss_filter, "%u");
130*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(rx_filter, protection_filter, "%u");
131*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(rx_filter, accum_arp_pend_requests, "%u");
132*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(rx_filter, max_arp_queue_dep, "%u");
133*4882a593Smuzhiyun
134*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE_ARRAY(rx_rate, rx_frames_per_rates, 50);
135*4882a593Smuzhiyun
136*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE_ARRAY(aggr_size, tx_agg_rate,
137*4882a593Smuzhiyun AGGR_STATS_TX_AGG);
138*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE_ARRAY(aggr_size, tx_agg_len,
139*4882a593Smuzhiyun AGGR_STATS_TX_AGG);
140*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE_ARRAY(aggr_size, rx_size,
141*4882a593Smuzhiyun AGGR_STATS_RX_SIZE_LEN);
142*4882a593Smuzhiyun
143*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(pipeline, hs_tx_stat_fifo_int, "%u");
144*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(pipeline, enc_tx_stat_fifo_int, "%u");
145*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(pipeline, enc_rx_stat_fifo_int, "%u");
146*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(pipeline, rx_complete_stat_fifo_int, "%u");
147*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(pipeline, pre_proc_swi, "%u");
148*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(pipeline, post_proc_swi, "%u");
149*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(pipeline, sec_frag_swi, "%u");
150*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(pipeline, pre_to_defrag_swi, "%u");
151*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(pipeline, defrag_to_rx_xfer_swi, "%u");
152*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(pipeline, dec_packet_in, "%u");
153*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(pipeline, dec_packet_in_fifo_full, "%u");
154*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(pipeline, dec_packet_out, "%u");
155*4882a593Smuzhiyun
156*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE_ARRAY(pipeline, pipeline_fifo_full,
157*4882a593Smuzhiyun PIPE_STATS_HW_FIFO);
158*4882a593Smuzhiyun
159*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE_ARRAY(diversity, num_of_packets_per_ant,
160*4882a593Smuzhiyun DIVERSITY_STATS_NUM_OF_ANT);
161*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(diversity, total_num_of_toggles, "%u");
162*4882a593Smuzhiyun
163*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(thermal, irq_thr_low, "%u");
164*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(thermal, irq_thr_high, "%u");
165*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(thermal, tx_stop, "%u");
166*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(thermal, tx_resume, "%u");
167*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(thermal, false_irq, "%u");
168*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(thermal, adc_source_unexpected, "%u");
169*4882a593Smuzhiyun
170*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE_ARRAY(calib, fail_count,
171*4882a593Smuzhiyun WL18XX_NUM_OF_CALIBRATIONS_ERRORS);
172*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(calib, calib_count, "%u");
173*4882a593Smuzhiyun
174*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(roaming, rssi_level, "%d");
175*4882a593Smuzhiyun
176*4882a593Smuzhiyun WL18XX_DEBUGFS_FWSTATS_FILE(dfs, num_of_radar_detections, "%d");
177*4882a593Smuzhiyun
conf_read(struct file * file,char __user * user_buf,size_t count,loff_t * ppos)178*4882a593Smuzhiyun static ssize_t conf_read(struct file *file, char __user *user_buf,
179*4882a593Smuzhiyun size_t count, loff_t *ppos)
180*4882a593Smuzhiyun {
181*4882a593Smuzhiyun struct wl1271 *wl = file->private_data;
182*4882a593Smuzhiyun struct wl18xx_priv *priv = wl->priv;
183*4882a593Smuzhiyun struct wlcore_conf_header header;
184*4882a593Smuzhiyun char *buf, *pos;
185*4882a593Smuzhiyun size_t len;
186*4882a593Smuzhiyun int ret;
187*4882a593Smuzhiyun
188*4882a593Smuzhiyun len = WL18XX_CONF_SIZE;
189*4882a593Smuzhiyun buf = kmalloc(len, GFP_KERNEL);
190*4882a593Smuzhiyun if (!buf)
191*4882a593Smuzhiyun return -ENOMEM;
192*4882a593Smuzhiyun
193*4882a593Smuzhiyun header.magic = cpu_to_le32(WL18XX_CONF_MAGIC);
194*4882a593Smuzhiyun header.version = cpu_to_le32(WL18XX_CONF_VERSION);
195*4882a593Smuzhiyun header.checksum = 0;
196*4882a593Smuzhiyun
197*4882a593Smuzhiyun mutex_lock(&wl->mutex);
198*4882a593Smuzhiyun
199*4882a593Smuzhiyun pos = buf;
200*4882a593Smuzhiyun memcpy(pos, &header, sizeof(header));
201*4882a593Smuzhiyun pos += sizeof(header);
202*4882a593Smuzhiyun memcpy(pos, &wl->conf, sizeof(wl->conf));
203*4882a593Smuzhiyun pos += sizeof(wl->conf);
204*4882a593Smuzhiyun memcpy(pos, &priv->conf, sizeof(priv->conf));
205*4882a593Smuzhiyun
206*4882a593Smuzhiyun mutex_unlock(&wl->mutex);
207*4882a593Smuzhiyun
208*4882a593Smuzhiyun ret = simple_read_from_buffer(user_buf, count, ppos, buf, len);
209*4882a593Smuzhiyun
210*4882a593Smuzhiyun kfree(buf);
211*4882a593Smuzhiyun return ret;
212*4882a593Smuzhiyun }
213*4882a593Smuzhiyun
214*4882a593Smuzhiyun static const struct file_operations conf_ops = {
215*4882a593Smuzhiyun .read = conf_read,
216*4882a593Smuzhiyun .open = simple_open,
217*4882a593Smuzhiyun .llseek = default_llseek,
218*4882a593Smuzhiyun };
219*4882a593Smuzhiyun
clear_fw_stats_write(struct file * file,const char __user * user_buf,size_t count,loff_t * ppos)220*4882a593Smuzhiyun static ssize_t clear_fw_stats_write(struct file *file,
221*4882a593Smuzhiyun const char __user *user_buf,
222*4882a593Smuzhiyun size_t count, loff_t *ppos)
223*4882a593Smuzhiyun {
224*4882a593Smuzhiyun struct wl1271 *wl = file->private_data;
225*4882a593Smuzhiyun int ret;
226*4882a593Smuzhiyun
227*4882a593Smuzhiyun mutex_lock(&wl->mutex);
228*4882a593Smuzhiyun
229*4882a593Smuzhiyun if (unlikely(wl->state != WLCORE_STATE_ON))
230*4882a593Smuzhiyun goto out;
231*4882a593Smuzhiyun
232*4882a593Smuzhiyun ret = wl18xx_acx_clear_statistics(wl);
233*4882a593Smuzhiyun if (ret < 0) {
234*4882a593Smuzhiyun count = ret;
235*4882a593Smuzhiyun goto out;
236*4882a593Smuzhiyun }
237*4882a593Smuzhiyun out:
238*4882a593Smuzhiyun mutex_unlock(&wl->mutex);
239*4882a593Smuzhiyun return count;
240*4882a593Smuzhiyun }
241*4882a593Smuzhiyun
242*4882a593Smuzhiyun static const struct file_operations clear_fw_stats_ops = {
243*4882a593Smuzhiyun .write = clear_fw_stats_write,
244*4882a593Smuzhiyun .open = simple_open,
245*4882a593Smuzhiyun .llseek = default_llseek,
246*4882a593Smuzhiyun };
247*4882a593Smuzhiyun
radar_detection_write(struct file * file,const char __user * user_buf,size_t count,loff_t * ppos)248*4882a593Smuzhiyun static ssize_t radar_detection_write(struct file *file,
249*4882a593Smuzhiyun const char __user *user_buf,
250*4882a593Smuzhiyun size_t count, loff_t *ppos)
251*4882a593Smuzhiyun {
252*4882a593Smuzhiyun struct wl1271 *wl = file->private_data;
253*4882a593Smuzhiyun int ret;
254*4882a593Smuzhiyun u8 channel;
255*4882a593Smuzhiyun
256*4882a593Smuzhiyun ret = kstrtou8_from_user(user_buf, count, 10, &channel);
257*4882a593Smuzhiyun if (ret < 0) {
258*4882a593Smuzhiyun wl1271_warning("illegal channel");
259*4882a593Smuzhiyun return -EINVAL;
260*4882a593Smuzhiyun }
261*4882a593Smuzhiyun
262*4882a593Smuzhiyun mutex_lock(&wl->mutex);
263*4882a593Smuzhiyun
264*4882a593Smuzhiyun if (unlikely(wl->state != WLCORE_STATE_ON))
265*4882a593Smuzhiyun goto out;
266*4882a593Smuzhiyun
267*4882a593Smuzhiyun ret = pm_runtime_get_sync(wl->dev);
268*4882a593Smuzhiyun if (ret < 0) {
269*4882a593Smuzhiyun pm_runtime_put_noidle(wl->dev);
270*4882a593Smuzhiyun goto out;
271*4882a593Smuzhiyun }
272*4882a593Smuzhiyun
273*4882a593Smuzhiyun ret = wl18xx_cmd_radar_detection_debug(wl, channel);
274*4882a593Smuzhiyun if (ret < 0)
275*4882a593Smuzhiyun count = ret;
276*4882a593Smuzhiyun
277*4882a593Smuzhiyun pm_runtime_mark_last_busy(wl->dev);
278*4882a593Smuzhiyun pm_runtime_put_autosuspend(wl->dev);
279*4882a593Smuzhiyun out:
280*4882a593Smuzhiyun mutex_unlock(&wl->mutex);
281*4882a593Smuzhiyun return count;
282*4882a593Smuzhiyun }
283*4882a593Smuzhiyun
284*4882a593Smuzhiyun static const struct file_operations radar_detection_ops = {
285*4882a593Smuzhiyun .write = radar_detection_write,
286*4882a593Smuzhiyun .open = simple_open,
287*4882a593Smuzhiyun .llseek = default_llseek,
288*4882a593Smuzhiyun };
289*4882a593Smuzhiyun
dynamic_fw_traces_write(struct file * file,const char __user * user_buf,size_t count,loff_t * ppos)290*4882a593Smuzhiyun static ssize_t dynamic_fw_traces_write(struct file *file,
291*4882a593Smuzhiyun const char __user *user_buf,
292*4882a593Smuzhiyun size_t count, loff_t *ppos)
293*4882a593Smuzhiyun {
294*4882a593Smuzhiyun struct wl1271 *wl = file->private_data;
295*4882a593Smuzhiyun unsigned long value;
296*4882a593Smuzhiyun int ret;
297*4882a593Smuzhiyun
298*4882a593Smuzhiyun ret = kstrtoul_from_user(user_buf, count, 0, &value);
299*4882a593Smuzhiyun if (ret < 0)
300*4882a593Smuzhiyun return ret;
301*4882a593Smuzhiyun
302*4882a593Smuzhiyun mutex_lock(&wl->mutex);
303*4882a593Smuzhiyun
304*4882a593Smuzhiyun wl->dynamic_fw_traces = value;
305*4882a593Smuzhiyun
306*4882a593Smuzhiyun if (unlikely(wl->state != WLCORE_STATE_ON))
307*4882a593Smuzhiyun goto out;
308*4882a593Smuzhiyun
309*4882a593Smuzhiyun ret = pm_runtime_get_sync(wl->dev);
310*4882a593Smuzhiyun if (ret < 0) {
311*4882a593Smuzhiyun pm_runtime_put_noidle(wl->dev);
312*4882a593Smuzhiyun goto out;
313*4882a593Smuzhiyun }
314*4882a593Smuzhiyun
315*4882a593Smuzhiyun ret = wl18xx_acx_dynamic_fw_traces(wl);
316*4882a593Smuzhiyun if (ret < 0)
317*4882a593Smuzhiyun count = ret;
318*4882a593Smuzhiyun
319*4882a593Smuzhiyun pm_runtime_mark_last_busy(wl->dev);
320*4882a593Smuzhiyun pm_runtime_put_autosuspend(wl->dev);
321*4882a593Smuzhiyun out:
322*4882a593Smuzhiyun mutex_unlock(&wl->mutex);
323*4882a593Smuzhiyun return count;
324*4882a593Smuzhiyun }
325*4882a593Smuzhiyun
dynamic_fw_traces_read(struct file * file,char __user * userbuf,size_t count,loff_t * ppos)326*4882a593Smuzhiyun static ssize_t dynamic_fw_traces_read(struct file *file,
327*4882a593Smuzhiyun char __user *userbuf,
328*4882a593Smuzhiyun size_t count, loff_t *ppos)
329*4882a593Smuzhiyun {
330*4882a593Smuzhiyun struct wl1271 *wl = file->private_data;
331*4882a593Smuzhiyun return wl1271_format_buffer(userbuf, count, ppos,
332*4882a593Smuzhiyun "%d\n", wl->dynamic_fw_traces);
333*4882a593Smuzhiyun }
334*4882a593Smuzhiyun
335*4882a593Smuzhiyun static const struct file_operations dynamic_fw_traces_ops = {
336*4882a593Smuzhiyun .read = dynamic_fw_traces_read,
337*4882a593Smuzhiyun .write = dynamic_fw_traces_write,
338*4882a593Smuzhiyun .open = simple_open,
339*4882a593Smuzhiyun .llseek = default_llseek,
340*4882a593Smuzhiyun };
341*4882a593Smuzhiyun
342*4882a593Smuzhiyun #ifdef CONFIG_CFG80211_CERTIFICATION_ONUS
radar_debug_mode_write(struct file * file,const char __user * user_buf,size_t count,loff_t * ppos)343*4882a593Smuzhiyun static ssize_t radar_debug_mode_write(struct file *file,
344*4882a593Smuzhiyun const char __user *user_buf,
345*4882a593Smuzhiyun size_t count, loff_t *ppos)
346*4882a593Smuzhiyun {
347*4882a593Smuzhiyun struct wl1271 *wl = file->private_data;
348*4882a593Smuzhiyun struct wl12xx_vif *wlvif;
349*4882a593Smuzhiyun unsigned long value;
350*4882a593Smuzhiyun int ret;
351*4882a593Smuzhiyun
352*4882a593Smuzhiyun ret = kstrtoul_from_user(user_buf, count, 10, &value);
353*4882a593Smuzhiyun if (ret < 0) {
354*4882a593Smuzhiyun wl1271_warning("illegal radar_debug_mode value!");
355*4882a593Smuzhiyun return -EINVAL;
356*4882a593Smuzhiyun }
357*4882a593Smuzhiyun
358*4882a593Smuzhiyun /* valid values: 0/1 */
359*4882a593Smuzhiyun if (!(value == 0 || value == 1)) {
360*4882a593Smuzhiyun wl1271_warning("value is not in valid!");
361*4882a593Smuzhiyun return -EINVAL;
362*4882a593Smuzhiyun }
363*4882a593Smuzhiyun
364*4882a593Smuzhiyun mutex_lock(&wl->mutex);
365*4882a593Smuzhiyun
366*4882a593Smuzhiyun wl->radar_debug_mode = value;
367*4882a593Smuzhiyun
368*4882a593Smuzhiyun if (unlikely(wl->state != WLCORE_STATE_ON))
369*4882a593Smuzhiyun goto out;
370*4882a593Smuzhiyun
371*4882a593Smuzhiyun ret = pm_runtime_get_sync(wl->dev);
372*4882a593Smuzhiyun if (ret < 0) {
373*4882a593Smuzhiyun pm_runtime_put_noidle(wl->dev);
374*4882a593Smuzhiyun goto out;
375*4882a593Smuzhiyun }
376*4882a593Smuzhiyun
377*4882a593Smuzhiyun wl12xx_for_each_wlvif_ap(wl, wlvif) {
378*4882a593Smuzhiyun wlcore_cmd_generic_cfg(wl, wlvif,
379*4882a593Smuzhiyun WLCORE_CFG_FEATURE_RADAR_DEBUG,
380*4882a593Smuzhiyun wl->radar_debug_mode, 0);
381*4882a593Smuzhiyun }
382*4882a593Smuzhiyun
383*4882a593Smuzhiyun pm_runtime_mark_last_busy(wl->dev);
384*4882a593Smuzhiyun pm_runtime_put_autosuspend(wl->dev);
385*4882a593Smuzhiyun out:
386*4882a593Smuzhiyun mutex_unlock(&wl->mutex);
387*4882a593Smuzhiyun return count;
388*4882a593Smuzhiyun }
389*4882a593Smuzhiyun
radar_debug_mode_read(struct file * file,char __user * userbuf,size_t count,loff_t * ppos)390*4882a593Smuzhiyun static ssize_t radar_debug_mode_read(struct file *file,
391*4882a593Smuzhiyun char __user *userbuf,
392*4882a593Smuzhiyun size_t count, loff_t *ppos)
393*4882a593Smuzhiyun {
394*4882a593Smuzhiyun struct wl1271 *wl = file->private_data;
395*4882a593Smuzhiyun
396*4882a593Smuzhiyun return wl1271_format_buffer(userbuf, count, ppos,
397*4882a593Smuzhiyun "%d\n", wl->radar_debug_mode);
398*4882a593Smuzhiyun }
399*4882a593Smuzhiyun
400*4882a593Smuzhiyun static const struct file_operations radar_debug_mode_ops = {
401*4882a593Smuzhiyun .write = radar_debug_mode_write,
402*4882a593Smuzhiyun .read = radar_debug_mode_read,
403*4882a593Smuzhiyun .open = simple_open,
404*4882a593Smuzhiyun .llseek = default_llseek,
405*4882a593Smuzhiyun };
406*4882a593Smuzhiyun #endif /* CFG80211_CERTIFICATION_ONUS */
407*4882a593Smuzhiyun
wl18xx_debugfs_add_files(struct wl1271 * wl,struct dentry * rootdir)408*4882a593Smuzhiyun int wl18xx_debugfs_add_files(struct wl1271 *wl,
409*4882a593Smuzhiyun struct dentry *rootdir)
410*4882a593Smuzhiyun {
411*4882a593Smuzhiyun struct dentry *stats, *moddir;
412*4882a593Smuzhiyun
413*4882a593Smuzhiyun moddir = debugfs_create_dir(KBUILD_MODNAME, rootdir);
414*4882a593Smuzhiyun stats = debugfs_create_dir("fw_stats", moddir);
415*4882a593Smuzhiyun
416*4882a593Smuzhiyun DEBUGFS_ADD(clear_fw_stats, stats);
417*4882a593Smuzhiyun
418*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(error, error_frame_non_ctrl);
419*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(error, error_frame_ctrl);
420*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(error, error_frame_during_protection);
421*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(error, null_frame_tx_start);
422*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(error, null_frame_cts_start);
423*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(error, bar_retry);
424*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(error, num_frame_cts_nul_flid);
425*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(error, tx_abort_failure);
426*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(error, tx_resume_failure);
427*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(error, rx_cmplt_db_overflow_cnt);
428*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(error, elp_while_rx_exch);
429*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(error, elp_while_tx_exch);
430*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(error, elp_while_tx);
431*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(error, elp_while_nvic_pending);
432*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(error, rx_excessive_frame_len);
433*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(error, burst_mismatch);
434*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(error, tbc_exch_mismatch);
435*4882a593Smuzhiyun
436*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(tx, tx_prepared_descs);
437*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(tx, tx_cmplt);
438*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(tx, tx_template_prepared);
439*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(tx, tx_data_prepared);
440*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(tx, tx_template_programmed);
441*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(tx, tx_data_programmed);
442*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(tx, tx_burst_programmed);
443*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(tx, tx_starts);
444*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(tx, tx_stop);
445*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(tx, tx_start_templates);
446*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(tx, tx_start_int_templates);
447*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(tx, tx_start_fw_gen);
448*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(tx, tx_start_data);
449*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(tx, tx_start_null_frame);
450*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(tx, tx_exch);
451*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(tx, tx_retry_template);
452*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(tx, tx_retry_data);
453*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(tx, tx_retry_per_rate);
454*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(tx, tx_exch_pending);
455*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(tx, tx_exch_expiry);
456*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(tx, tx_done_template);
457*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(tx, tx_done_data);
458*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(tx, tx_done_int_template);
459*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(tx, tx_cfe1);
460*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(tx, tx_cfe2);
461*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(tx, frag_called);
462*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(tx, frag_mpdu_alloc_failed);
463*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(tx, frag_init_called);
464*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(tx, frag_in_process_called);
465*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(tx, frag_tkip_called);
466*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(tx, frag_key_not_found);
467*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(tx, frag_need_fragmentation);
468*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(tx, frag_bad_mblk_num);
469*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(tx, frag_failed);
470*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(tx, frag_cache_hit);
471*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(tx, frag_cache_miss);
472*4882a593Smuzhiyun
473*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(rx, rx_beacon_early_term);
474*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(rx, rx_out_of_mpdu_nodes);
475*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(rx, rx_hdr_overflow);
476*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(rx, rx_dropped_frame);
477*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(rx, rx_done);
478*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(rx, rx_defrag);
479*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(rx, rx_defrag_end);
480*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(rx, rx_cmplt);
481*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(rx, rx_pre_complt);
482*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(rx, rx_cmplt_task);
483*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(rx, rx_phy_hdr);
484*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(rx, rx_timeout);
485*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(rx, rx_rts_timeout);
486*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(rx, rx_timeout_wa);
487*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(rx, defrag_called);
488*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(rx, defrag_init_called);
489*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(rx, defrag_in_process_called);
490*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(rx, defrag_tkip_called);
491*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(rx, defrag_need_defrag);
492*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(rx, defrag_decrypt_failed);
493*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(rx, decrypt_key_not_found);
494*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(rx, defrag_need_decrypt);
495*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(rx, rx_tkip_replays);
496*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(rx, rx_xfr);
497*4882a593Smuzhiyun
498*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(isr, irqs);
499*4882a593Smuzhiyun
500*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(pwr, missing_bcns_cnt);
501*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(pwr, rcvd_bcns_cnt);
502*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(pwr, connection_out_of_sync);
503*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(pwr, cont_miss_bcns_spread);
504*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(pwr, rcvd_awake_bcns_cnt);
505*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(pwr, sleep_time_count);
506*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(pwr, sleep_time_avg);
507*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(pwr, sleep_cycle_avg);
508*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(pwr, sleep_percent);
509*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(pwr, ap_sleep_active_conf);
510*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(pwr, ap_sleep_user_conf);
511*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(pwr, ap_sleep_counter);
512*4882a593Smuzhiyun
513*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(rx_filter, beacon_filter);
514*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(rx_filter, arp_filter);
515*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(rx_filter, mc_filter);
516*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(rx_filter, dup_filter);
517*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(rx_filter, data_filter);
518*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(rx_filter, ibss_filter);
519*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(rx_filter, protection_filter);
520*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(rx_filter, accum_arp_pend_requests);
521*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(rx_filter, max_arp_queue_dep);
522*4882a593Smuzhiyun
523*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(rx_rate, rx_frames_per_rates);
524*4882a593Smuzhiyun
525*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(aggr_size, tx_agg_rate);
526*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(aggr_size, tx_agg_len);
527*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(aggr_size, rx_size);
528*4882a593Smuzhiyun
529*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(pipeline, hs_tx_stat_fifo_int);
530*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(pipeline, enc_tx_stat_fifo_int);
531*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(pipeline, enc_rx_stat_fifo_int);
532*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(pipeline, rx_complete_stat_fifo_int);
533*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(pipeline, pre_proc_swi);
534*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(pipeline, post_proc_swi);
535*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(pipeline, sec_frag_swi);
536*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(pipeline, pre_to_defrag_swi);
537*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(pipeline, defrag_to_rx_xfer_swi);
538*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(pipeline, dec_packet_in);
539*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(pipeline, dec_packet_in_fifo_full);
540*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(pipeline, dec_packet_out);
541*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(pipeline, pipeline_fifo_full);
542*4882a593Smuzhiyun
543*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(diversity, num_of_packets_per_ant);
544*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(diversity, total_num_of_toggles);
545*4882a593Smuzhiyun
546*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(thermal, irq_thr_low);
547*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(thermal, irq_thr_high);
548*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(thermal, tx_stop);
549*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(thermal, tx_resume);
550*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(thermal, false_irq);
551*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(thermal, adc_source_unexpected);
552*4882a593Smuzhiyun
553*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(calib, fail_count);
554*4882a593Smuzhiyun
555*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(calib, calib_count);
556*4882a593Smuzhiyun
557*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(roaming, rssi_level);
558*4882a593Smuzhiyun
559*4882a593Smuzhiyun DEBUGFS_FWSTATS_ADD(dfs, num_of_radar_detections);
560*4882a593Smuzhiyun
561*4882a593Smuzhiyun DEBUGFS_ADD(conf, moddir);
562*4882a593Smuzhiyun DEBUGFS_ADD(radar_detection, moddir);
563*4882a593Smuzhiyun #ifdef CONFIG_CFG80211_CERTIFICATION_ONUS
564*4882a593Smuzhiyun DEBUGFS_ADD(radar_debug_mode, moddir);
565*4882a593Smuzhiyun #endif
566*4882a593Smuzhiyun DEBUGFS_ADD(dynamic_fw_traces, moddir);
567*4882a593Smuzhiyun
568*4882a593Smuzhiyun return 0;
569*4882a593Smuzhiyun }
570