Blame view

net/mac80211/debugfs.c 13.3 KB
7bcfaf2f4   Johannes Berg   cfg80211/mac80211...
1

e9f207f0f   Jiri Benc   [MAC80211]: Add d...
2
3
4
5
6
7
8
9
10
11
12
13
  /*
   * mac80211 debugfs for wireless PHYs
   *
   * Copyright 2007	Johannes Berg <johannes@sipsolutions.net>
   *
   * GPLv2
   *
   */
  
  #include <linux/debugfs.h>
  #include <linux/rtnetlink.h>
  #include "ieee80211_i.h"
244879813   Johannes Berg   mac80211: add dri...
14
  #include "driver-ops.h"
2c8dccc77   Johannes Berg   mac80211: rename ...
15
  #include "rate.h"
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
16
17
18
19
20
21
22
  #include "debugfs.h"
  
  int mac80211_open_file_generic(struct inode *inode, struct file *file)
  {
  	file->private_data = inode->i_private;
  	return 0;
  }
07caf9d6c   Eliad Peller   mac80211: refacto...
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
  #define DEBUGFS_FORMAT_BUFFER_SIZE 100
  
  int mac80211_format_buffer(char __user *userbuf, size_t count,
  				  loff_t *ppos, char *fmt, ...)
  {
  	va_list args;
  	char buf[DEBUGFS_FORMAT_BUFFER_SIZE];
  	int res;
  
  	va_start(args, fmt);
  	res = vscnprintf(buf, sizeof(buf), fmt, args);
  	va_end(args);
  
  	return simple_read_from_buffer(userbuf, count, ppos, buf, res);
  }
279daf64c   Ben Greear   wifi: Add hwflags...
38
  #define DEBUGFS_READONLY_FILE_FN(name, fmt, value...)			\
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
39
40
41
42
  static ssize_t name## _read(struct file *file, char __user *userbuf,	\
  			    size_t count, loff_t *ppos)			\
  {									\
  	struct ieee80211_local *local = file->private_data;		\
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
43
  									\
07caf9d6c   Eliad Peller   mac80211: refacto...
44
45
46
  	return mac80211_format_buffer(userbuf, count, ppos, 		\
  				      fmt "
  ", ##value);		\
279daf64c   Ben Greear   wifi: Add hwflags...
47
48
49
  }
  
  #define DEBUGFS_READONLY_FILE_OPS(name)			\
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
50
51
52
  static const struct file_operations name## _ops = {			\
  	.read = name## _read,						\
  	.open = mac80211_open_file_generic,				\
2b18ab36c   Arnd Bergmann   net/wireless: use...
53
  	.llseek = generic_file_llseek,					\
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
54
  };
279daf64c   Ben Greear   wifi: Add hwflags...
55
56
57
  #define DEBUGFS_READONLY_FILE(name, fmt, value...)		\
  	DEBUGFS_READONLY_FILE_FN(name, fmt, value)		\
  	DEBUGFS_READONLY_FILE_OPS(name)
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
58
  #define DEBUGFS_ADD(name)						\
7bcfaf2f4   Johannes Berg   cfg80211/mac80211...
59
  	debugfs_create_file(#name, 0400, phyd, local, &name## _ops);
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
60

827b1fb44   Johannes Berg   mac80211: resume ...
61
  #define DEBUGFS_ADD_MODE(name, mode)					\
7bcfaf2f4   Johannes Berg   cfg80211/mac80211...
62
  	debugfs_create_file(#name, mode, phyd, local, &name## _ops);
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
63

83bdf2a17   Ben Greear   mac80211: Add pow...
64
65
66
67
  DEBUGFS_READONLY_FILE(user_power, "%d",
  		      local->user_power_level);
  DEBUGFS_READONLY_FILE(power, "%d",
  		      local->hw.conf.power_level);
07caf9d6c   Eliad Peller   mac80211: refacto...
68
  DEBUGFS_READONLY_FILE(frequency, "%d",
8318d78a4   Johannes Berg   cfg80211 API for ...
69
  		      local->hw.conf.channel->center_freq);
07caf9d6c   Eliad Peller   mac80211: refacto...
70
  DEBUGFS_READONLY_FILE(total_ps_buffered, "%d",
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
71
  		      local->total_ps_buffered);
07caf9d6c   Eliad Peller   mac80211: refacto...
72
  DEBUGFS_READONLY_FILE(wep_iv, "%#08x",
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
73
  		      local->wep_iv & 0xffffff);
07caf9d6c   Eliad Peller   mac80211: refacto...
74
  DEBUGFS_READONLY_FILE(rate_ctrl_alg, "%s",
af65cd96d   Johannes Berg   mac80211: make so...
75
  	local->rate_ctrl ? local->rate_ctrl->ops->name : "hw/driver");
3b5d665b5   Alina Friedrichsen   mac80211: Generic...
76

827b1fb44   Johannes Berg   mac80211: resume ...
77
78
79
80
81
82
  static ssize_t reset_write(struct file *file, const char __user *user_buf,
  			   size_t count, loff_t *ppos)
  {
  	struct ieee80211_local *local = file->private_data;
  
  	rtnl_lock();
eecc48000   Johannes Berg   mac80211: add bas...
83
  	__ieee80211_suspend(&local->hw, NULL);
827b1fb44   Johannes Berg   mac80211: resume ...
84
85
86
87
88
89
90
91
92
  	__ieee80211_resume(&local->hw);
  	rtnl_unlock();
  
  	return count;
  }
  
  static const struct file_operations reset_ops = {
  	.write = reset_write,
  	.open = mac80211_open_file_generic,
6038f373a   Arnd Bergmann   llseek: automatic...
93
  	.llseek = noop_llseek,
827b1fb44   Johannes Berg   mac80211: resume ...
94
  };
50ae0cf15   Kalle Valo   mac80211: add deb...
95
96
97
98
  static ssize_t uapsd_queues_read(struct file *file, char __user *user_buf,
  				 size_t count, loff_t *ppos)
  {
  	struct ieee80211_local *local = file->private_data;
07caf9d6c   Eliad Peller   mac80211: refacto...
99
100
101
  	return mac80211_format_buffer(user_buf, count, ppos, "0x%x
  ",
  				      local->uapsd_queues);
50ae0cf15   Kalle Valo   mac80211: add deb...
102
103
104
105
106
107
108
  }
  
  static ssize_t uapsd_queues_write(struct file *file,
  				  const char __user *user_buf,
  				  size_t count, loff_t *ppos)
  {
  	struct ieee80211_local *local = file->private_data;
b38de31ff   Peter Huewe   net/mac80211/debu...
109
  	u8 val;
50ae0cf15   Kalle Valo   mac80211: add deb...
110
  	int ret;
b38de31ff   Peter Huewe   net/mac80211/debu...
111
  	ret = kstrtou8_from_user(user_buf, count, 0, &val);
50ae0cf15   Kalle Valo   mac80211: add deb...
112
  	if (ret)
b38de31ff   Peter Huewe   net/mac80211/debu...
113
  		return ret;
50ae0cf15   Kalle Valo   mac80211: add deb...
114
115
116
117
118
119
120
121
122
123
124
125
  
  	if (val & ~IEEE80211_WMM_IE_STA_QOSINFO_AC_MASK)
  		return -ERANGE;
  
  	local->uapsd_queues = val;
  
  	return count;
  }
  
  static const struct file_operations uapsd_queues_ops = {
  	.read = uapsd_queues_read,
  	.write = uapsd_queues_write,
6038f373a   Arnd Bergmann   llseek: automatic...
126
127
  	.open = mac80211_open_file_generic,
  	.llseek = default_llseek,
50ae0cf15   Kalle Valo   mac80211: add deb...
128
129
130
131
132
133
  };
  
  static ssize_t uapsd_max_sp_len_read(struct file *file, char __user *user_buf,
  				     size_t count, loff_t *ppos)
  {
  	struct ieee80211_local *local = file->private_data;
50ae0cf15   Kalle Valo   mac80211: add deb...
134

07caf9d6c   Eliad Peller   mac80211: refacto...
135
136
137
  	return mac80211_format_buffer(user_buf, count, ppos, "0x%x
  ",
  				      local->uapsd_max_sp_len);
50ae0cf15   Kalle Valo   mac80211: add deb...
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
  }
  
  static ssize_t uapsd_max_sp_len_write(struct file *file,
  				      const char __user *user_buf,
  				      size_t count, loff_t *ppos)
  {
  	struct ieee80211_local *local = file->private_data;
  	unsigned long val;
  	char buf[10];
  	size_t len;
  	int ret;
  
  	len = min(count, sizeof(buf) - 1);
  	if (copy_from_user(buf, user_buf, len))
  		return -EFAULT;
  	buf[len] = '\0';
61e3f32c1   Julia Lawall   net/mac80211/debu...
154
  	ret = kstrtoul(buf, 0, &val);
50ae0cf15   Kalle Valo   mac80211: add deb...
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
  
  	if (ret)
  		return -EINVAL;
  
  	if (val & ~IEEE80211_WMM_IE_STA_QOSINFO_SP_MASK)
  		return -ERANGE;
  
  	local->uapsd_max_sp_len = val;
  
  	return count;
  }
  
  static const struct file_operations uapsd_max_sp_len_ops = {
  	.read = uapsd_max_sp_len_read,
  	.write = uapsd_max_sp_len_write,
6038f373a   Arnd Bergmann   llseek: automatic...
170
171
  	.open = mac80211_open_file_generic,
  	.llseek = default_llseek,
50ae0cf15   Kalle Valo   mac80211: add deb...
172
  };
199d69f27   Benoit Papillault   mac80211: Added a...
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
  static ssize_t channel_type_read(struct file *file, char __user *user_buf,
  		       size_t count, loff_t *ppos)
  {
  	struct ieee80211_local *local = file->private_data;
  	const char *buf;
  
  	switch (local->hw.conf.channel_type) {
  	case NL80211_CHAN_NO_HT:
  		buf = "no ht
  ";
  		break;
  	case NL80211_CHAN_HT20:
  		buf = "ht20
  ";
  		break;
  	case NL80211_CHAN_HT40MINUS:
  		buf = "ht40-
  ";
  		break;
  	case NL80211_CHAN_HT40PLUS:
  		buf = "ht40+
  ";
  		break;
  	default:
  		buf = "???";
  		break;
  	}
  
  	return simple_read_from_buffer(user_buf, count, ppos, buf, strlen(buf));
  }
279daf64c   Ben Greear   wifi: Add hwflags...
203
204
205
206
207
208
209
210
  static ssize_t hwflags_read(struct file *file, char __user *user_buf,
  			    size_t count, loff_t *ppos)
  {
  	struct ieee80211_local *local = file->private_data;
  	int mxln = 500;
  	ssize_t rv;
  	char *buf = kzalloc(mxln, GFP_KERNEL);
  	int sf = 0; /* how many written so far */
d15b84590   Joe Perches   mac80211: Remove ...
211
212
  	if (!buf)
  		return 0;
279daf64c   Ben Greear   wifi: Add hwflags...
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
  	sf += snprintf(buf, mxln - sf, "0x%x
  ", local->hw.flags);
  	if (local->hw.flags & IEEE80211_HW_HAS_RATE_CONTROL)
  		sf += snprintf(buf + sf, mxln - sf, "HAS_RATE_CONTROL
  ");
  	if (local->hw.flags & IEEE80211_HW_RX_INCLUDES_FCS)
  		sf += snprintf(buf + sf, mxln - sf, "RX_INCLUDES_FCS
  ");
  	if (local->hw.flags & IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING)
  		sf += snprintf(buf + sf, mxln - sf,
  			       "HOST_BCAST_PS_BUFFERING
  ");
  	if (local->hw.flags & IEEE80211_HW_2GHZ_SHORT_SLOT_INCAPABLE)
  		sf += snprintf(buf + sf, mxln - sf,
  			       "2GHZ_SHORT_SLOT_INCAPABLE
  ");
  	if (local->hw.flags & IEEE80211_HW_2GHZ_SHORT_PREAMBLE_INCAPABLE)
  		sf += snprintf(buf + sf, mxln - sf,
  			       "2GHZ_SHORT_PREAMBLE_INCAPABLE
  ");
  	if (local->hw.flags & IEEE80211_HW_SIGNAL_UNSPEC)
  		sf += snprintf(buf + sf, mxln - sf, "SIGNAL_UNSPEC
  ");
  	if (local->hw.flags & IEEE80211_HW_SIGNAL_DBM)
  		sf += snprintf(buf + sf, mxln - sf, "SIGNAL_DBM
  ");
  	if (local->hw.flags & IEEE80211_HW_NEED_DTIM_PERIOD)
  		sf += snprintf(buf + sf, mxln - sf, "NEED_DTIM_PERIOD
  ");
  	if (local->hw.flags & IEEE80211_HW_SPECTRUM_MGMT)
  		sf += snprintf(buf + sf, mxln - sf, "SPECTRUM_MGMT
  ");
  	if (local->hw.flags & IEEE80211_HW_AMPDU_AGGREGATION)
  		sf += snprintf(buf + sf, mxln - sf, "AMPDU_AGGREGATION
  ");
  	if (local->hw.flags & IEEE80211_HW_SUPPORTS_PS)
  		sf += snprintf(buf + sf, mxln - sf, "SUPPORTS_PS
  ");
  	if (local->hw.flags & IEEE80211_HW_PS_NULLFUNC_STACK)
  		sf += snprintf(buf + sf, mxln - sf, "PS_NULLFUNC_STACK
  ");
  	if (local->hw.flags & IEEE80211_HW_SUPPORTS_DYNAMIC_PS)
  		sf += snprintf(buf + sf, mxln - sf, "SUPPORTS_DYNAMIC_PS
  ");
  	if (local->hw.flags & IEEE80211_HW_MFP_CAPABLE)
  		sf += snprintf(buf + sf, mxln - sf, "MFP_CAPABLE
  ");
  	if (local->hw.flags & IEEE80211_HW_BEACON_FILTER)
  		sf += snprintf(buf + sf, mxln - sf, "BEACON_FILTER
  ");
  	if (local->hw.flags & IEEE80211_HW_SUPPORTS_STATIC_SMPS)
  		sf += snprintf(buf + sf, mxln - sf, "SUPPORTS_STATIC_SMPS
  ");
  	if (local->hw.flags & IEEE80211_HW_SUPPORTS_DYNAMIC_SMPS)
  		sf += snprintf(buf + sf, mxln - sf, "SUPPORTS_DYNAMIC_SMPS
  ");
  	if (local->hw.flags & IEEE80211_HW_SUPPORTS_UAPSD)
  		sf += snprintf(buf + sf, mxln - sf, "SUPPORTS_UAPSD
  ");
  	if (local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS)
  		sf += snprintf(buf + sf, mxln - sf, "REPORTS_TX_ACK_STATUS
  ");
  	if (local->hw.flags & IEEE80211_HW_CONNECTION_MONITOR)
  		sf += snprintf(buf + sf, mxln - sf, "CONNECTION_MONITOR
  ");
  	if (local->hw.flags & IEEE80211_HW_SUPPORTS_CQM_RSSI)
  		sf += snprintf(buf + sf, mxln - sf, "SUPPORTS_CQM_RSSI
  ");
  	if (local->hw.flags & IEEE80211_HW_SUPPORTS_PER_STA_GTK)
  		sf += snprintf(buf + sf, mxln - sf, "SUPPORTS_PER_STA_GTK
  ");
  	if (local->hw.flags & IEEE80211_HW_AP_LINK_PS)
  		sf += snprintf(buf + sf, mxln - sf, "AP_LINK_PS
  ");
edf6b784c   Arik Nemtsov   mac80211: add fla...
287
288
289
  	if (local->hw.flags & IEEE80211_HW_TX_AMPDU_SETUP_IN_HW)
  		sf += snprintf(buf + sf, mxln - sf, "TX_AMPDU_SETUP_IN_HW
  ");
279daf64c   Ben Greear   wifi: Add hwflags...
290
291
292
293
294
  
  	rv = simple_read_from_buffer(user_buf, count, ppos, buf, strlen(buf));
  	kfree(buf);
  	return rv;
  }
199d69f27   Benoit Papillault   mac80211: Added a...
295

db2e6bd4e   Johannes Berg   mac80211: add que...
296
297
298
299
300
301
302
303
304
305
306
307
308
  static ssize_t queues_read(struct file *file, char __user *user_buf,
  			   size_t count, loff_t *ppos)
  {
  	struct ieee80211_local *local = file->private_data;
  	unsigned long flags;
  	char buf[IEEE80211_MAX_QUEUES * 20];
  	int q, res = 0;
  
  	spin_lock_irqsave(&local->queue_stop_reason_lock, flags);
  	for (q = 0; q < local->hw.queues; q++)
  		res += sprintf(buf + res, "%02d: %#.8lx/%d
  ", q,
  				local->queue_stop_reasons[q],
3b8d81e02   Johannes Berg   mac80211: remove ...
309
  				skb_queue_len(&local->pending[q]));
db2e6bd4e   Johannes Berg   mac80211: add que...
310
311
312
313
  	spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags);
  
  	return simple_read_from_buffer(user_buf, count, ppos, buf, res);
  }
279daf64c   Ben Greear   wifi: Add hwflags...
314
315
316
  DEBUGFS_READONLY_FILE_OPS(hwflags);
  DEBUGFS_READONLY_FILE_OPS(channel_type);
  DEBUGFS_READONLY_FILE_OPS(queues);
db2e6bd4e   Johannes Berg   mac80211: add que...
317

e9f207f0f   Jiri Benc   [MAC80211]: Add d...
318
  /* statistics stuff */
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
319
320
321
322
323
324
325
326
327
  static ssize_t format_devstat_counter(struct ieee80211_local *local,
  	char __user *userbuf,
  	size_t count, loff_t *ppos,
  	int (*printvalue)(struct ieee80211_low_level_stats *stats, char *buf,
  			  int buflen))
  {
  	struct ieee80211_low_level_stats stats;
  	char buf[20];
  	int res;
75636525f   Johannes Berg   mac80211: revamp ...
328
  	rtnl_lock();
244879813   Johannes Berg   mac80211: add dri...
329
  	res = drv_get_stats(local, &stats);
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
330
  	rtnl_unlock();
244879813   Johannes Berg   mac80211: add dri...
331
332
333
  	if (res)
  		return res;
  	res = printvalue(&stats, buf, sizeof(buf));
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
  	return simple_read_from_buffer(userbuf, count, ppos, buf, res);
  }
  
  #define DEBUGFS_DEVSTATS_FILE(name)					\
  static int print_devstats_##name(struct ieee80211_low_level_stats *stats,\
  				 char *buf, int buflen)			\
  {									\
  	return scnprintf(buf, buflen, "%u
  ", stats->name);		\
  }									\
  static ssize_t stats_ ##name## _read(struct file *file,			\
  				     char __user *userbuf,		\
  				     size_t count, loff_t *ppos)	\
  {									\
  	return format_devstat_counter(file->private_data,		\
  				      userbuf,				\
  				      count,				\
  				      ppos,				\
  				      print_devstats_##name);		\
  }									\
  									\
  static const struct file_operations stats_ ##name## _ops = {		\
  	.read = stats_ ##name## _read,					\
  	.open = mac80211_open_file_generic,				\
2b18ab36c   Arnd Bergmann   net/wireless: use...
358
  	.llseek = generic_file_llseek,					\
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
359
  };
2826bcd84   Felix Fietkau   mac80211: reduce ...
360
361
362
  #define DEBUGFS_STATS_ADD(name, field)					\
  	debugfs_create_u32(#name, 0400, statsd, (u32 *) &field);
  #define DEBUGFS_DEVSTATS_ADD(name)					\
7bcfaf2f4   Johannes Berg   cfg80211/mac80211...
363
  	debugfs_create_file(#name, 0400, statsd, local, &stats_ ##name## _ops);
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
364

e9f207f0f   Jiri Benc   [MAC80211]: Add d...
365
366
367
368
  DEBUGFS_DEVSTATS_FILE(dot11ACKFailureCount);
  DEBUGFS_DEVSTATS_FILE(dot11RTSFailureCount);
  DEBUGFS_DEVSTATS_FILE(dot11FCSErrorCount);
  DEBUGFS_DEVSTATS_FILE(dot11RTSSuccessCount);
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
369
370
371
372
373
374
375
  void debugfs_hw_add(struct ieee80211_local *local)
  {
  	struct dentry *phyd = local->hw.wiphy->debugfsdir;
  	struct dentry *statsd;
  
  	if (!phyd)
  		return;
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
376
  	local->debugfs.keys = debugfs_create_dir("keys", phyd);
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
377
  	DEBUGFS_ADD(frequency);
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
378
  	DEBUGFS_ADD(total_ps_buffered);
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
379
  	DEBUGFS_ADD(wep_iv);
db2e6bd4e   Johannes Berg   mac80211: add que...
380
  	DEBUGFS_ADD(queues);
827b1fb44   Johannes Berg   mac80211: resume ...
381
  	DEBUGFS_ADD_MODE(reset, 0200);
50ae0cf15   Kalle Valo   mac80211: add deb...
382
383
  	DEBUGFS_ADD(uapsd_queues);
  	DEBUGFS_ADD(uapsd_max_sp_len);
199d69f27   Benoit Papillault   mac80211: Added a...
384
  	DEBUGFS_ADD(channel_type);
279daf64c   Ben Greear   wifi: Add hwflags...
385
  	DEBUGFS_ADD(hwflags);
83bdf2a17   Ben Greear   mac80211: Add pow...
386
387
  	DEBUGFS_ADD(user_power);
  	DEBUGFS_ADD(power);
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
388
389
  
  	statsd = debugfs_create_dir("statistics", phyd);
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
390
391
392
393
  
  	/* if the dir failed, don't put all the other things into the root! */
  	if (!statsd)
  		return;
2826bcd84   Felix Fietkau   mac80211: reduce ...
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
  	DEBUGFS_STATS_ADD(transmitted_fragment_count,
  		local->dot11TransmittedFragmentCount);
  	DEBUGFS_STATS_ADD(multicast_transmitted_frame_count,
  		local->dot11MulticastTransmittedFrameCount);
  	DEBUGFS_STATS_ADD(failed_count, local->dot11FailedCount);
  	DEBUGFS_STATS_ADD(retry_count, local->dot11RetryCount);
  	DEBUGFS_STATS_ADD(multiple_retry_count,
  		local->dot11MultipleRetryCount);
  	DEBUGFS_STATS_ADD(frame_duplicate_count,
  		local->dot11FrameDuplicateCount);
  	DEBUGFS_STATS_ADD(received_fragment_count,
  		local->dot11ReceivedFragmentCount);
  	DEBUGFS_STATS_ADD(multicast_received_frame_count,
  		local->dot11MulticastReceivedFrameCount);
  	DEBUGFS_STATS_ADD(transmitted_frame_count,
  		local->dot11TransmittedFrameCount);
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
410
  #ifdef CONFIG_MAC80211_DEBUG_COUNTERS
2826bcd84   Felix Fietkau   mac80211: reduce ...
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
  	DEBUGFS_STATS_ADD(tx_handlers_drop, local->tx_handlers_drop);
  	DEBUGFS_STATS_ADD(tx_handlers_queued, local->tx_handlers_queued);
  	DEBUGFS_STATS_ADD(tx_handlers_drop_unencrypted,
  		local->tx_handlers_drop_unencrypted);
  	DEBUGFS_STATS_ADD(tx_handlers_drop_fragment,
  		local->tx_handlers_drop_fragment);
  	DEBUGFS_STATS_ADD(tx_handlers_drop_wep,
  		local->tx_handlers_drop_wep);
  	DEBUGFS_STATS_ADD(tx_handlers_drop_not_assoc,
  		local->tx_handlers_drop_not_assoc);
  	DEBUGFS_STATS_ADD(tx_handlers_drop_unauth_port,
  		local->tx_handlers_drop_unauth_port);
  	DEBUGFS_STATS_ADD(rx_handlers_drop, local->rx_handlers_drop);
  	DEBUGFS_STATS_ADD(rx_handlers_queued, local->rx_handlers_queued);
  	DEBUGFS_STATS_ADD(rx_handlers_drop_nullfunc,
  		local->rx_handlers_drop_nullfunc);
  	DEBUGFS_STATS_ADD(rx_handlers_drop_defrag,
  		local->rx_handlers_drop_defrag);
  	DEBUGFS_STATS_ADD(rx_handlers_drop_short,
  		local->rx_handlers_drop_short);
  	DEBUGFS_STATS_ADD(rx_handlers_drop_passive_scan,
  		local->rx_handlers_drop_passive_scan);
  	DEBUGFS_STATS_ADD(tx_expand_skb_head,
  		local->tx_expand_skb_head);
  	DEBUGFS_STATS_ADD(tx_expand_skb_head_cloned,
  		local->tx_expand_skb_head_cloned);
  	DEBUGFS_STATS_ADD(rx_expand_skb_head,
  		local->rx_expand_skb_head);
  	DEBUGFS_STATS_ADD(rx_expand_skb_head2,
  		local->rx_expand_skb_head2);
  	DEBUGFS_STATS_ADD(rx_handlers_fragments,
  		local->rx_handlers_fragments);
  	DEBUGFS_STATS_ADD(tx_status_drop,
  		local->tx_status_drop);
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
445
  #endif
2826bcd84   Felix Fietkau   mac80211: reduce ...
446
447
448
449
  	DEBUGFS_DEVSTATS_ADD(dot11ACKFailureCount);
  	DEBUGFS_DEVSTATS_ADD(dot11RTSFailureCount);
  	DEBUGFS_DEVSTATS_ADD(dot11FCSErrorCount);
  	DEBUGFS_DEVSTATS_ADD(dot11RTSSuccessCount);
e9f207f0f   Jiri Benc   [MAC80211]: Add d...
450
  }