1
/******************************************************************************
5
* Copyright(c) 2008 - 2010 Intel Corporation. All rights reserved.
7
* This program is free software; you can redistribute it and/or modify
8
* it under the terms of version 2 of the GNU General Public License as
9
* published by the Free Software Foundation.
11
* This program is distributed in the hope that it will be useful, but
12
* WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14
* General Public License for more details.
16
* You should have received a copy of the GNU General Public License
17
* along with this program; if not, write to the Free Software
18
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110,
21
* The full GNU General Public License is included in this distribution
22
* in the file called LICENSE.GPL.
24
* Contact Information:
25
* Intel Linux Wireless <ilw@linux.intel.com>
26
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
27
*****************************************************************************/
29
#include "iwl-agn-debugfs.h"
31
static const char *fmt_value = " %-30s %10u\n";
32
static const char *fmt_hex = " %-30s 0x%02X\n";
33
static const char *fmt_table = " %-30s %10u %10u %10u %10u\n";
34
static const char *fmt_header =
35
"%-32s current cumulative delta max\n";
37
static int iwl_statistics_flag(struct iwl_priv *priv, char *buf, int bufsz)
42
if (priv->cfg->bt_params &&
43
priv->cfg->bt_params->bt_statistics)
44
flag = le32_to_cpu(priv->_agn.statistics_bt.flag);
46
flag = le32_to_cpu(priv->_agn.statistics.flag);
48
p += scnprintf(buf + p, bufsz - p, "Statistics Flag(0x%X):\n", flag);
49
if (flag & UCODE_STATISTICS_CLEAR_MSK)
50
p += scnprintf(buf + p, bufsz - p,
51
"\tStatistics have been cleared\n");
52
p += scnprintf(buf + p, bufsz - p, "\tOperational Frequency: %s\n",
53
(flag & UCODE_STATISTICS_FREQUENCY_MSK)
54
? "2.4 GHz" : "5.2 GHz");
55
p += scnprintf(buf + p, bufsz - p, "\tTGj Narrow Band: %s\n",
56
(flag & UCODE_STATISTICS_NARROW_BAND_MSK)
57
? "enabled" : "disabled");
62
ssize_t iwl_ucode_rx_stats_read(struct file *file, char __user *user_buf,
63
size_t count, loff_t *ppos)
65
struct iwl_priv *priv = file->private_data;
68
int bufsz = sizeof(struct statistics_rx_phy) * 40 +
69
sizeof(struct statistics_rx_non_phy) * 40 +
70
sizeof(struct statistics_rx_ht_phy) * 40 + 400;
72
struct statistics_rx_phy *ofdm, *accum_ofdm, *delta_ofdm, *max_ofdm;
73
struct statistics_rx_phy *cck, *accum_cck, *delta_cck, *max_cck;
74
struct statistics_rx_non_phy *general, *accum_general;
75
struct statistics_rx_non_phy *delta_general, *max_general;
76
struct statistics_rx_ht_phy *ht, *accum_ht, *delta_ht, *max_ht;
78
if (!iwl_is_alive(priv))
81
buf = kzalloc(bufsz, GFP_KERNEL);
83
IWL_ERR(priv, "Can not allocate Buffer\n");
88
* the statistic information display here is based on
89
* the last statistics notification from uCode
90
* might not reflect the current uCode activity
92
if (priv->cfg->bt_params &&
93
priv->cfg->bt_params->bt_statistics) {
94
ofdm = &priv->_agn.statistics_bt.rx.ofdm;
95
cck = &priv->_agn.statistics_bt.rx.cck;
96
general = &priv->_agn.statistics_bt.rx.general.common;
97
ht = &priv->_agn.statistics_bt.rx.ofdm_ht;
98
accum_ofdm = &priv->_agn.accum_statistics_bt.rx.ofdm;
99
accum_cck = &priv->_agn.accum_statistics_bt.rx.cck;
101
&priv->_agn.accum_statistics_bt.rx.general.common;
102
accum_ht = &priv->_agn.accum_statistics_bt.rx.ofdm_ht;
103
delta_ofdm = &priv->_agn.delta_statistics_bt.rx.ofdm;
104
delta_cck = &priv->_agn.delta_statistics_bt.rx.cck;
106
&priv->_agn.delta_statistics_bt.rx.general.common;
107
delta_ht = &priv->_agn.delta_statistics_bt.rx.ofdm_ht;
108
max_ofdm = &priv->_agn.max_delta_bt.rx.ofdm;
109
max_cck = &priv->_agn.max_delta_bt.rx.cck;
110
max_general = &priv->_agn.max_delta_bt.rx.general.common;
111
max_ht = &priv->_agn.max_delta_bt.rx.ofdm_ht;
113
ofdm = &priv->_agn.statistics.rx.ofdm;
114
cck = &priv->_agn.statistics.rx.cck;
115
general = &priv->_agn.statistics.rx.general;
116
ht = &priv->_agn.statistics.rx.ofdm_ht;
117
accum_ofdm = &priv->_agn.accum_statistics.rx.ofdm;
118
accum_cck = &priv->_agn.accum_statistics.rx.cck;
119
accum_general = &priv->_agn.accum_statistics.rx.general;
120
accum_ht = &priv->_agn.accum_statistics.rx.ofdm_ht;
121
delta_ofdm = &priv->_agn.delta_statistics.rx.ofdm;
122
delta_cck = &priv->_agn.delta_statistics.rx.cck;
123
delta_general = &priv->_agn.delta_statistics.rx.general;
124
delta_ht = &priv->_agn.delta_statistics.rx.ofdm_ht;
125
max_ofdm = &priv->_agn.max_delta.rx.ofdm;
126
max_cck = &priv->_agn.max_delta.rx.cck;
127
max_general = &priv->_agn.max_delta.rx.general;
128
max_ht = &priv->_agn.max_delta.rx.ofdm_ht;
131
pos += iwl_statistics_flag(priv, buf, bufsz);
132
pos += scnprintf(buf + pos, bufsz - pos,
133
fmt_header, "Statistics_Rx - OFDM:");
134
pos += scnprintf(buf + pos, bufsz - pos,
135
fmt_table, "ina_cnt:",
136
le32_to_cpu(ofdm->ina_cnt),
138
delta_ofdm->ina_cnt, max_ofdm->ina_cnt);
139
pos += scnprintf(buf + pos, bufsz - pos,
140
fmt_table, "fina_cnt:",
141
le32_to_cpu(ofdm->fina_cnt), accum_ofdm->fina_cnt,
142
delta_ofdm->fina_cnt, max_ofdm->fina_cnt);
143
pos += scnprintf(buf + pos, bufsz - pos,
144
fmt_table, "plcp_err:",
145
le32_to_cpu(ofdm->plcp_err), accum_ofdm->plcp_err,
146
delta_ofdm->plcp_err, max_ofdm->plcp_err);
147
pos += scnprintf(buf + pos, bufsz - pos,
148
fmt_table, "crc32_err:",
149
le32_to_cpu(ofdm->crc32_err), accum_ofdm->crc32_err,
150
delta_ofdm->crc32_err, max_ofdm->crc32_err);
151
pos += scnprintf(buf + pos, bufsz - pos,
152
fmt_table, "overrun_err:",
153
le32_to_cpu(ofdm->overrun_err),
154
accum_ofdm->overrun_err, delta_ofdm->overrun_err,
155
max_ofdm->overrun_err);
156
pos += scnprintf(buf + pos, bufsz - pos,
157
fmt_table, "early_overrun_err:",
158
le32_to_cpu(ofdm->early_overrun_err),
159
accum_ofdm->early_overrun_err,
160
delta_ofdm->early_overrun_err,
161
max_ofdm->early_overrun_err);
162
pos += scnprintf(buf + pos, bufsz - pos,
163
fmt_table, "crc32_good:",
164
le32_to_cpu(ofdm->crc32_good),
165
accum_ofdm->crc32_good, delta_ofdm->crc32_good,
166
max_ofdm->crc32_good);
167
pos += scnprintf(buf + pos, bufsz - pos,
168
fmt_table, "false_alarm_cnt:",
169
le32_to_cpu(ofdm->false_alarm_cnt),
170
accum_ofdm->false_alarm_cnt,
171
delta_ofdm->false_alarm_cnt,
172
max_ofdm->false_alarm_cnt);
173
pos += scnprintf(buf + pos, bufsz - pos,
174
fmt_table, "fina_sync_err_cnt:",
175
le32_to_cpu(ofdm->fina_sync_err_cnt),
176
accum_ofdm->fina_sync_err_cnt,
177
delta_ofdm->fina_sync_err_cnt,
178
max_ofdm->fina_sync_err_cnt);
179
pos += scnprintf(buf + pos, bufsz - pos,
180
fmt_table, "sfd_timeout:",
181
le32_to_cpu(ofdm->sfd_timeout),
182
accum_ofdm->sfd_timeout, delta_ofdm->sfd_timeout,
183
max_ofdm->sfd_timeout);
184
pos += scnprintf(buf + pos, bufsz - pos,
185
fmt_table, "fina_timeout:",
186
le32_to_cpu(ofdm->fina_timeout),
187
accum_ofdm->fina_timeout, delta_ofdm->fina_timeout,
188
max_ofdm->fina_timeout);
189
pos += scnprintf(buf + pos, bufsz - pos,
190
fmt_table, "unresponded_rts:",
191
le32_to_cpu(ofdm->unresponded_rts),
192
accum_ofdm->unresponded_rts,
193
delta_ofdm->unresponded_rts,
194
max_ofdm->unresponded_rts);
195
pos += scnprintf(buf + pos, bufsz - pos,
196
fmt_table, "rxe_frame_lmt_ovrun:",
197
le32_to_cpu(ofdm->rxe_frame_limit_overrun),
198
accum_ofdm->rxe_frame_limit_overrun,
199
delta_ofdm->rxe_frame_limit_overrun,
200
max_ofdm->rxe_frame_limit_overrun);
201
pos += scnprintf(buf + pos, bufsz - pos,
202
fmt_table, "sent_ack_cnt:",
203
le32_to_cpu(ofdm->sent_ack_cnt),
204
accum_ofdm->sent_ack_cnt, delta_ofdm->sent_ack_cnt,
205
max_ofdm->sent_ack_cnt);
206
pos += scnprintf(buf + pos, bufsz - pos,
207
fmt_table, "sent_cts_cnt:",
208
le32_to_cpu(ofdm->sent_cts_cnt),
209
accum_ofdm->sent_cts_cnt, delta_ofdm->sent_cts_cnt,
210
max_ofdm->sent_cts_cnt);
211
pos += scnprintf(buf + pos, bufsz - pos,
212
fmt_table, "sent_ba_rsp_cnt:",
213
le32_to_cpu(ofdm->sent_ba_rsp_cnt),
214
accum_ofdm->sent_ba_rsp_cnt,
215
delta_ofdm->sent_ba_rsp_cnt,
216
max_ofdm->sent_ba_rsp_cnt);
217
pos += scnprintf(buf + pos, bufsz - pos,
218
fmt_table, "dsp_self_kill:",
219
le32_to_cpu(ofdm->dsp_self_kill),
220
accum_ofdm->dsp_self_kill,
221
delta_ofdm->dsp_self_kill,
222
max_ofdm->dsp_self_kill);
223
pos += scnprintf(buf + pos, bufsz - pos,
224
fmt_table, "mh_format_err:",
225
le32_to_cpu(ofdm->mh_format_err),
226
accum_ofdm->mh_format_err,
227
delta_ofdm->mh_format_err,
228
max_ofdm->mh_format_err);
229
pos += scnprintf(buf + pos, bufsz - pos,
230
fmt_table, "re_acq_main_rssi_sum:",
231
le32_to_cpu(ofdm->re_acq_main_rssi_sum),
232
accum_ofdm->re_acq_main_rssi_sum,
233
delta_ofdm->re_acq_main_rssi_sum,
234
max_ofdm->re_acq_main_rssi_sum);
236
pos += scnprintf(buf + pos, bufsz - pos,
237
fmt_header, "Statistics_Rx - CCK:");
238
pos += scnprintf(buf + pos, bufsz - pos,
239
fmt_table, "ina_cnt:",
240
le32_to_cpu(cck->ina_cnt), accum_cck->ina_cnt,
241
delta_cck->ina_cnt, max_cck->ina_cnt);
242
pos += scnprintf(buf + pos, bufsz - pos,
243
fmt_table, "fina_cnt:",
244
le32_to_cpu(cck->fina_cnt), accum_cck->fina_cnt,
245
delta_cck->fina_cnt, max_cck->fina_cnt);
246
pos += scnprintf(buf + pos, bufsz - pos,
247
fmt_table, "plcp_err:",
248
le32_to_cpu(cck->plcp_err), accum_cck->plcp_err,
249
delta_cck->plcp_err, max_cck->plcp_err);
250
pos += scnprintf(buf + pos, bufsz - pos,
251
fmt_table, "crc32_err:",
252
le32_to_cpu(cck->crc32_err), accum_cck->crc32_err,
253
delta_cck->crc32_err, max_cck->crc32_err);
254
pos += scnprintf(buf + pos, bufsz - pos,
255
fmt_table, "overrun_err:",
256
le32_to_cpu(cck->overrun_err),
257
accum_cck->overrun_err, delta_cck->overrun_err,
258
max_cck->overrun_err);
259
pos += scnprintf(buf + pos, bufsz - pos,
260
fmt_table, "early_overrun_err:",
261
le32_to_cpu(cck->early_overrun_err),
262
accum_cck->early_overrun_err,
263
delta_cck->early_overrun_err,
264
max_cck->early_overrun_err);
265
pos += scnprintf(buf + pos, bufsz - pos,
266
fmt_table, "crc32_good:",
267
le32_to_cpu(cck->crc32_good), accum_cck->crc32_good,
268
delta_cck->crc32_good, max_cck->crc32_good);
269
pos += scnprintf(buf + pos, bufsz - pos,
270
fmt_table, "false_alarm_cnt:",
271
le32_to_cpu(cck->false_alarm_cnt),
272
accum_cck->false_alarm_cnt,
273
delta_cck->false_alarm_cnt, max_cck->false_alarm_cnt);
274
pos += scnprintf(buf + pos, bufsz - pos,
275
fmt_table, "fina_sync_err_cnt:",
276
le32_to_cpu(cck->fina_sync_err_cnt),
277
accum_cck->fina_sync_err_cnt,
278
delta_cck->fina_sync_err_cnt,
279
max_cck->fina_sync_err_cnt);
280
pos += scnprintf(buf + pos, bufsz - pos,
281
fmt_table, "sfd_timeout:",
282
le32_to_cpu(cck->sfd_timeout),
283
accum_cck->sfd_timeout, delta_cck->sfd_timeout,
284
max_cck->sfd_timeout);
285
pos += scnprintf(buf + pos, bufsz - pos,
286
fmt_table, "fina_timeout:",
287
le32_to_cpu(cck->fina_timeout),
288
accum_cck->fina_timeout, delta_cck->fina_timeout,
289
max_cck->fina_timeout);
290
pos += scnprintf(buf + pos, bufsz - pos,
291
fmt_table, "unresponded_rts:",
292
le32_to_cpu(cck->unresponded_rts),
293
accum_cck->unresponded_rts, delta_cck->unresponded_rts,
294
max_cck->unresponded_rts);
295
pos += scnprintf(buf + pos, bufsz - pos,
296
fmt_table, "rxe_frame_lmt_ovrun:",
297
le32_to_cpu(cck->rxe_frame_limit_overrun),
298
accum_cck->rxe_frame_limit_overrun,
299
delta_cck->rxe_frame_limit_overrun,
300
max_cck->rxe_frame_limit_overrun);
301
pos += scnprintf(buf + pos, bufsz - pos,
302
fmt_table, "sent_ack_cnt:",
303
le32_to_cpu(cck->sent_ack_cnt),
304
accum_cck->sent_ack_cnt, delta_cck->sent_ack_cnt,
305
max_cck->sent_ack_cnt);
306
pos += scnprintf(buf + pos, bufsz - pos,
307
fmt_table, "sent_cts_cnt:",
308
le32_to_cpu(cck->sent_cts_cnt),
309
accum_cck->sent_cts_cnt, delta_cck->sent_cts_cnt,
310
max_cck->sent_cts_cnt);
311
pos += scnprintf(buf + pos, bufsz - pos,
312
fmt_table, "sent_ba_rsp_cnt:",
313
le32_to_cpu(cck->sent_ba_rsp_cnt),
314
accum_cck->sent_ba_rsp_cnt,
315
delta_cck->sent_ba_rsp_cnt,
316
max_cck->sent_ba_rsp_cnt);
317
pos += scnprintf(buf + pos, bufsz - pos,
318
fmt_table, "dsp_self_kill:",
319
le32_to_cpu(cck->dsp_self_kill),
320
accum_cck->dsp_self_kill, delta_cck->dsp_self_kill,
321
max_cck->dsp_self_kill);
322
pos += scnprintf(buf + pos, bufsz - pos,
323
fmt_table, "mh_format_err:",
324
le32_to_cpu(cck->mh_format_err),
325
accum_cck->mh_format_err, delta_cck->mh_format_err,
326
max_cck->mh_format_err);
327
pos += scnprintf(buf + pos, bufsz - pos,
328
fmt_table, "re_acq_main_rssi_sum:",
329
le32_to_cpu(cck->re_acq_main_rssi_sum),
330
accum_cck->re_acq_main_rssi_sum,
331
delta_cck->re_acq_main_rssi_sum,
332
max_cck->re_acq_main_rssi_sum);
334
pos += scnprintf(buf + pos, bufsz - pos,
335
fmt_header, "Statistics_Rx - GENERAL:");
336
pos += scnprintf(buf + pos, bufsz - pos,
337
fmt_table, "bogus_cts:",
338
le32_to_cpu(general->bogus_cts),
339
accum_general->bogus_cts, delta_general->bogus_cts,
340
max_general->bogus_cts);
341
pos += scnprintf(buf + pos, bufsz - pos,
342
fmt_table, "bogus_ack:",
343
le32_to_cpu(general->bogus_ack),
344
accum_general->bogus_ack, delta_general->bogus_ack,
345
max_general->bogus_ack);
346
pos += scnprintf(buf + pos, bufsz - pos,
347
fmt_table, "non_bssid_frames:",
348
le32_to_cpu(general->non_bssid_frames),
349
accum_general->non_bssid_frames,
350
delta_general->non_bssid_frames,
351
max_general->non_bssid_frames);
352
pos += scnprintf(buf + pos, bufsz - pos,
353
fmt_table, "filtered_frames:",
354
le32_to_cpu(general->filtered_frames),
355
accum_general->filtered_frames,
356
delta_general->filtered_frames,
357
max_general->filtered_frames);
358
pos += scnprintf(buf + pos, bufsz - pos,
359
fmt_table, "non_channel_beacons:",
360
le32_to_cpu(general->non_channel_beacons),
361
accum_general->non_channel_beacons,
362
delta_general->non_channel_beacons,
363
max_general->non_channel_beacons);
364
pos += scnprintf(buf + pos, bufsz - pos,
365
fmt_table, "channel_beacons:",
366
le32_to_cpu(general->channel_beacons),
367
accum_general->channel_beacons,
368
delta_general->channel_beacons,
369
max_general->channel_beacons);
370
pos += scnprintf(buf + pos, bufsz - pos,
371
fmt_table, "num_missed_bcon:",
372
le32_to_cpu(general->num_missed_bcon),
373
accum_general->num_missed_bcon,
374
delta_general->num_missed_bcon,
375
max_general->num_missed_bcon);
376
pos += scnprintf(buf + pos, bufsz - pos,
377
fmt_table, "adc_rx_saturation_time:",
378
le32_to_cpu(general->adc_rx_saturation_time),
379
accum_general->adc_rx_saturation_time,
380
delta_general->adc_rx_saturation_time,
381
max_general->adc_rx_saturation_time);
382
pos += scnprintf(buf + pos, bufsz - pos,
383
fmt_table, "ina_detect_search_tm:",
384
le32_to_cpu(general->ina_detection_search_time),
385
accum_general->ina_detection_search_time,
386
delta_general->ina_detection_search_time,
387
max_general->ina_detection_search_time);
388
pos += scnprintf(buf + pos, bufsz - pos,
389
fmt_table, "beacon_silence_rssi_a:",
390
le32_to_cpu(general->beacon_silence_rssi_a),
391
accum_general->beacon_silence_rssi_a,
392
delta_general->beacon_silence_rssi_a,
393
max_general->beacon_silence_rssi_a);
394
pos += scnprintf(buf + pos, bufsz - pos,
395
fmt_table, "beacon_silence_rssi_b:",
396
le32_to_cpu(general->beacon_silence_rssi_b),
397
accum_general->beacon_silence_rssi_b,
398
delta_general->beacon_silence_rssi_b,
399
max_general->beacon_silence_rssi_b);
400
pos += scnprintf(buf + pos, bufsz - pos,
401
fmt_table, "beacon_silence_rssi_c:",
402
le32_to_cpu(general->beacon_silence_rssi_c),
403
accum_general->beacon_silence_rssi_c,
404
delta_general->beacon_silence_rssi_c,
405
max_general->beacon_silence_rssi_c);
406
pos += scnprintf(buf + pos, bufsz - pos,
407
fmt_table, "interference_data_flag:",
408
le32_to_cpu(general->interference_data_flag),
409
accum_general->interference_data_flag,
410
delta_general->interference_data_flag,
411
max_general->interference_data_flag);
412
pos += scnprintf(buf + pos, bufsz - pos,
413
fmt_table, "channel_load:",
414
le32_to_cpu(general->channel_load),
415
accum_general->channel_load,
416
delta_general->channel_load,
417
max_general->channel_load);
418
pos += scnprintf(buf + pos, bufsz - pos,
419
fmt_table, "dsp_false_alarms:",
420
le32_to_cpu(general->dsp_false_alarms),
421
accum_general->dsp_false_alarms,
422
delta_general->dsp_false_alarms,
423
max_general->dsp_false_alarms);
424
pos += scnprintf(buf + pos, bufsz - pos,
425
fmt_table, "beacon_rssi_a:",
426
le32_to_cpu(general->beacon_rssi_a),
427
accum_general->beacon_rssi_a,
428
delta_general->beacon_rssi_a,
429
max_general->beacon_rssi_a);
430
pos += scnprintf(buf + pos, bufsz - pos,
431
fmt_table, "beacon_rssi_b:",
432
le32_to_cpu(general->beacon_rssi_b),
433
accum_general->beacon_rssi_b,
434
delta_general->beacon_rssi_b,
435
max_general->beacon_rssi_b);
436
pos += scnprintf(buf + pos, bufsz - pos,
437
fmt_table, "beacon_rssi_c:",
438
le32_to_cpu(general->beacon_rssi_c),
439
accum_general->beacon_rssi_c,
440
delta_general->beacon_rssi_c,
441
max_general->beacon_rssi_c);
442
pos += scnprintf(buf + pos, bufsz - pos,
443
fmt_table, "beacon_energy_a:",
444
le32_to_cpu(general->beacon_energy_a),
445
accum_general->beacon_energy_a,
446
delta_general->beacon_energy_a,
447
max_general->beacon_energy_a);
448
pos += scnprintf(buf + pos, bufsz - pos,
449
fmt_table, "beacon_energy_b:",
450
le32_to_cpu(general->beacon_energy_b),
451
accum_general->beacon_energy_b,
452
delta_general->beacon_energy_b,
453
max_general->beacon_energy_b);
454
pos += scnprintf(buf + pos, bufsz - pos,
455
fmt_table, "beacon_energy_c:",
456
le32_to_cpu(general->beacon_energy_c),
457
accum_general->beacon_energy_c,
458
delta_general->beacon_energy_c,
459
max_general->beacon_energy_c);
461
pos += scnprintf(buf + pos, bufsz - pos,
462
fmt_header, "Statistics_Rx - OFDM_HT:");
463
pos += scnprintf(buf + pos, bufsz - pos,
464
fmt_table, "plcp_err:",
465
le32_to_cpu(ht->plcp_err), accum_ht->plcp_err,
466
delta_ht->plcp_err, max_ht->plcp_err);
467
pos += scnprintf(buf + pos, bufsz - pos,
468
fmt_table, "overrun_err:",
469
le32_to_cpu(ht->overrun_err), accum_ht->overrun_err,
470
delta_ht->overrun_err, max_ht->overrun_err);
471
pos += scnprintf(buf + pos, bufsz - pos,
472
fmt_table, "early_overrun_err:",
473
le32_to_cpu(ht->early_overrun_err),
474
accum_ht->early_overrun_err,
475
delta_ht->early_overrun_err,
476
max_ht->early_overrun_err);
477
pos += scnprintf(buf + pos, bufsz - pos,
478
fmt_table, "crc32_good:",
479
le32_to_cpu(ht->crc32_good), accum_ht->crc32_good,
480
delta_ht->crc32_good, max_ht->crc32_good);
481
pos += scnprintf(buf + pos, bufsz - pos,
482
fmt_table, "crc32_err:",
483
le32_to_cpu(ht->crc32_err), accum_ht->crc32_err,
484
delta_ht->crc32_err, max_ht->crc32_err);
485
pos += scnprintf(buf + pos, bufsz - pos,
486
fmt_table, "mh_format_err:",
487
le32_to_cpu(ht->mh_format_err),
488
accum_ht->mh_format_err,
489
delta_ht->mh_format_err, max_ht->mh_format_err);
490
pos += scnprintf(buf + pos, bufsz - pos,
491
fmt_table, "agg_crc32_good:",
492
le32_to_cpu(ht->agg_crc32_good),
493
accum_ht->agg_crc32_good,
494
delta_ht->agg_crc32_good, max_ht->agg_crc32_good);
495
pos += scnprintf(buf + pos, bufsz - pos,
496
fmt_table, "agg_mpdu_cnt:",
497
le32_to_cpu(ht->agg_mpdu_cnt),
498
accum_ht->agg_mpdu_cnt,
499
delta_ht->agg_mpdu_cnt, max_ht->agg_mpdu_cnt);
500
pos += scnprintf(buf + pos, bufsz - pos,
501
fmt_table, "agg_cnt:",
502
le32_to_cpu(ht->agg_cnt), accum_ht->agg_cnt,
503
delta_ht->agg_cnt, max_ht->agg_cnt);
504
pos += scnprintf(buf + pos, bufsz - pos,
505
fmt_table, "unsupport_mcs:",
506
le32_to_cpu(ht->unsupport_mcs),
507
accum_ht->unsupport_mcs,
508
delta_ht->unsupport_mcs, max_ht->unsupport_mcs);
510
ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos);
515
ssize_t iwl_ucode_tx_stats_read(struct file *file,
516
char __user *user_buf,
517
size_t count, loff_t *ppos)
519
struct iwl_priv *priv = file->private_data;
522
int bufsz = (sizeof(struct statistics_tx) * 48) + 250;
524
struct statistics_tx *tx, *accum_tx, *delta_tx, *max_tx;
526
if (!iwl_is_alive(priv))
529
buf = kzalloc(bufsz, GFP_KERNEL);
531
IWL_ERR(priv, "Can not allocate Buffer\n");
535
/* the statistic information display here is based on
536
* the last statistics notification from uCode
537
* might not reflect the current uCode activity
539
if (priv->cfg->bt_params &&
540
priv->cfg->bt_params->bt_statistics) {
541
tx = &priv->_agn.statistics_bt.tx;
542
accum_tx = &priv->_agn.accum_statistics_bt.tx;
543
delta_tx = &priv->_agn.delta_statistics_bt.tx;
544
max_tx = &priv->_agn.max_delta_bt.tx;
546
tx = &priv->_agn.statistics.tx;
547
accum_tx = &priv->_agn.accum_statistics.tx;
548
delta_tx = &priv->_agn.delta_statistics.tx;
549
max_tx = &priv->_agn.max_delta.tx;
552
pos += iwl_statistics_flag(priv, buf, bufsz);
553
pos += scnprintf(buf + pos, bufsz - pos,
554
fmt_header, "Statistics_Tx:");
555
pos += scnprintf(buf + pos, bufsz - pos,
556
fmt_table, "preamble:",
557
le32_to_cpu(tx->preamble_cnt),
558
accum_tx->preamble_cnt,
559
delta_tx->preamble_cnt, max_tx->preamble_cnt);
560
pos += scnprintf(buf + pos, bufsz - pos,
561
fmt_table, "rx_detected_cnt:",
562
le32_to_cpu(tx->rx_detected_cnt),
563
accum_tx->rx_detected_cnt,
564
delta_tx->rx_detected_cnt, max_tx->rx_detected_cnt);
565
pos += scnprintf(buf + pos, bufsz - pos,
566
fmt_table, "bt_prio_defer_cnt:",
567
le32_to_cpu(tx->bt_prio_defer_cnt),
568
accum_tx->bt_prio_defer_cnt,
569
delta_tx->bt_prio_defer_cnt,
570
max_tx->bt_prio_defer_cnt);
571
pos += scnprintf(buf + pos, bufsz - pos,
572
fmt_table, "bt_prio_kill_cnt:",
573
le32_to_cpu(tx->bt_prio_kill_cnt),
574
accum_tx->bt_prio_kill_cnt,
575
delta_tx->bt_prio_kill_cnt,
576
max_tx->bt_prio_kill_cnt);
577
pos += scnprintf(buf + pos, bufsz - pos,
578
fmt_table, "few_bytes_cnt:",
579
le32_to_cpu(tx->few_bytes_cnt),
580
accum_tx->few_bytes_cnt,
581
delta_tx->few_bytes_cnt, max_tx->few_bytes_cnt);
582
pos += scnprintf(buf + pos, bufsz - pos,
583
fmt_table, "cts_timeout:",
584
le32_to_cpu(tx->cts_timeout), accum_tx->cts_timeout,
585
delta_tx->cts_timeout, max_tx->cts_timeout);
586
pos += scnprintf(buf + pos, bufsz - pos,
587
fmt_table, "ack_timeout:",
588
le32_to_cpu(tx->ack_timeout),
589
accum_tx->ack_timeout,
590
delta_tx->ack_timeout, max_tx->ack_timeout);
591
pos += scnprintf(buf + pos, bufsz - pos,
592
fmt_table, "expected_ack_cnt:",
593
le32_to_cpu(tx->expected_ack_cnt),
594
accum_tx->expected_ack_cnt,
595
delta_tx->expected_ack_cnt,
596
max_tx->expected_ack_cnt);
597
pos += scnprintf(buf + pos, bufsz - pos,
598
fmt_table, "actual_ack_cnt:",
599
le32_to_cpu(tx->actual_ack_cnt),
600
accum_tx->actual_ack_cnt,
601
delta_tx->actual_ack_cnt,
602
max_tx->actual_ack_cnt);
603
pos += scnprintf(buf + pos, bufsz - pos,
604
fmt_table, "dump_msdu_cnt:",
605
le32_to_cpu(tx->dump_msdu_cnt),
606
accum_tx->dump_msdu_cnt,
607
delta_tx->dump_msdu_cnt,
608
max_tx->dump_msdu_cnt);
609
pos += scnprintf(buf + pos, bufsz - pos,
610
fmt_table, "abort_nxt_frame_mismatch:",
611
le32_to_cpu(tx->burst_abort_next_frame_mismatch_cnt),
612
accum_tx->burst_abort_next_frame_mismatch_cnt,
613
delta_tx->burst_abort_next_frame_mismatch_cnt,
614
max_tx->burst_abort_next_frame_mismatch_cnt);
615
pos += scnprintf(buf + pos, bufsz - pos,
616
fmt_table, "abort_missing_nxt_frame:",
617
le32_to_cpu(tx->burst_abort_missing_next_frame_cnt),
618
accum_tx->burst_abort_missing_next_frame_cnt,
619
delta_tx->burst_abort_missing_next_frame_cnt,
620
max_tx->burst_abort_missing_next_frame_cnt);
621
pos += scnprintf(buf + pos, bufsz - pos,
622
fmt_table, "cts_timeout_collision:",
623
le32_to_cpu(tx->cts_timeout_collision),
624
accum_tx->cts_timeout_collision,
625
delta_tx->cts_timeout_collision,
626
max_tx->cts_timeout_collision);
627
pos += scnprintf(buf + pos, bufsz - pos,
628
fmt_table, "ack_ba_timeout_collision:",
629
le32_to_cpu(tx->ack_or_ba_timeout_collision),
630
accum_tx->ack_or_ba_timeout_collision,
631
delta_tx->ack_or_ba_timeout_collision,
632
max_tx->ack_or_ba_timeout_collision);
633
pos += scnprintf(buf + pos, bufsz - pos,
634
fmt_table, "agg ba_timeout:",
635
le32_to_cpu(tx->agg.ba_timeout),
636
accum_tx->agg.ba_timeout,
637
delta_tx->agg.ba_timeout,
638
max_tx->agg.ba_timeout);
639
pos += scnprintf(buf + pos, bufsz - pos,
640
fmt_table, "agg ba_resched_frames:",
641
le32_to_cpu(tx->agg.ba_reschedule_frames),
642
accum_tx->agg.ba_reschedule_frames,
643
delta_tx->agg.ba_reschedule_frames,
644
max_tx->agg.ba_reschedule_frames);
645
pos += scnprintf(buf + pos, bufsz - pos,
646
fmt_table, "agg scd_query_agg_frame:",
647
le32_to_cpu(tx->agg.scd_query_agg_frame_cnt),
648
accum_tx->agg.scd_query_agg_frame_cnt,
649
delta_tx->agg.scd_query_agg_frame_cnt,
650
max_tx->agg.scd_query_agg_frame_cnt);
651
pos += scnprintf(buf + pos, bufsz - pos,
652
fmt_table, "agg scd_query_no_agg:",
653
le32_to_cpu(tx->agg.scd_query_no_agg),
654
accum_tx->agg.scd_query_no_agg,
655
delta_tx->agg.scd_query_no_agg,
656
max_tx->agg.scd_query_no_agg);
657
pos += scnprintf(buf + pos, bufsz - pos,
658
fmt_table, "agg scd_query_agg:",
659
le32_to_cpu(tx->agg.scd_query_agg),
660
accum_tx->agg.scd_query_agg,
661
delta_tx->agg.scd_query_agg,
662
max_tx->agg.scd_query_agg);
663
pos += scnprintf(buf + pos, bufsz - pos,
664
fmt_table, "agg scd_query_mismatch:",
665
le32_to_cpu(tx->agg.scd_query_mismatch),
666
accum_tx->agg.scd_query_mismatch,
667
delta_tx->agg.scd_query_mismatch,
668
max_tx->agg.scd_query_mismatch);
669
pos += scnprintf(buf + pos, bufsz - pos,
670
fmt_table, "agg frame_not_ready:",
671
le32_to_cpu(tx->agg.frame_not_ready),
672
accum_tx->agg.frame_not_ready,
673
delta_tx->agg.frame_not_ready,
674
max_tx->agg.frame_not_ready);
675
pos += scnprintf(buf + pos, bufsz - pos,
676
fmt_table, "agg underrun:",
677
le32_to_cpu(tx->agg.underrun),
678
accum_tx->agg.underrun,
679
delta_tx->agg.underrun, max_tx->agg.underrun);
680
pos += scnprintf(buf + pos, bufsz - pos,
681
fmt_table, "agg bt_prio_kill:",
682
le32_to_cpu(tx->agg.bt_prio_kill),
683
accum_tx->agg.bt_prio_kill,
684
delta_tx->agg.bt_prio_kill,
685
max_tx->agg.bt_prio_kill);
686
pos += scnprintf(buf + pos, bufsz - pos,
687
fmt_table, "agg rx_ba_rsp_cnt:",
688
le32_to_cpu(tx->agg.rx_ba_rsp_cnt),
689
accum_tx->agg.rx_ba_rsp_cnt,
690
delta_tx->agg.rx_ba_rsp_cnt,
691
max_tx->agg.rx_ba_rsp_cnt);
693
if (tx->tx_power.ant_a || tx->tx_power.ant_b || tx->tx_power.ant_c) {
694
pos += scnprintf(buf + pos, bufsz - pos,
695
"tx power: (1/2 dB step)\n");
696
if ((priv->cfg->valid_tx_ant & ANT_A) && tx->tx_power.ant_a)
697
pos += scnprintf(buf + pos, bufsz - pos,
698
fmt_hex, "antenna A:",
700
if ((priv->cfg->valid_tx_ant & ANT_B) && tx->tx_power.ant_b)
701
pos += scnprintf(buf + pos, bufsz - pos,
702
fmt_hex, "antenna B:",
704
if ((priv->cfg->valid_tx_ant & ANT_C) && tx->tx_power.ant_c)
705
pos += scnprintf(buf + pos, bufsz - pos,
706
fmt_hex, "antenna C:",
709
ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos);
714
ssize_t iwl_ucode_general_stats_read(struct file *file, char __user *user_buf,
715
size_t count, loff_t *ppos)
717
struct iwl_priv *priv = file->private_data;
720
int bufsz = sizeof(struct statistics_general) * 10 + 300;
722
struct statistics_general_common *general, *accum_general;
723
struct statistics_general_common *delta_general, *max_general;
724
struct statistics_dbg *dbg, *accum_dbg, *delta_dbg, *max_dbg;
725
struct statistics_div *div, *accum_div, *delta_div, *max_div;
727
if (!iwl_is_alive(priv))
730
buf = kzalloc(bufsz, GFP_KERNEL);
732
IWL_ERR(priv, "Can not allocate Buffer\n");
736
/* the statistic information display here is based on
737
* the last statistics notification from uCode
738
* might not reflect the current uCode activity
740
if (priv->cfg->bt_params &&
741
priv->cfg->bt_params->bt_statistics) {
742
general = &priv->_agn.statistics_bt.general.common;
743
dbg = &priv->_agn.statistics_bt.general.common.dbg;
744
div = &priv->_agn.statistics_bt.general.common.div;
745
accum_general = &priv->_agn.accum_statistics_bt.general.common;
746
accum_dbg = &priv->_agn.accum_statistics_bt.general.common.dbg;
747
accum_div = &priv->_agn.accum_statistics_bt.general.common.div;
748
delta_general = &priv->_agn.delta_statistics_bt.general.common;
749
max_general = &priv->_agn.max_delta_bt.general.common;
750
delta_dbg = &priv->_agn.delta_statistics_bt.general.common.dbg;
751
max_dbg = &priv->_agn.max_delta_bt.general.common.dbg;
752
delta_div = &priv->_agn.delta_statistics_bt.general.common.div;
753
max_div = &priv->_agn.max_delta_bt.general.common.div;
755
general = &priv->_agn.statistics.general.common;
756
dbg = &priv->_agn.statistics.general.common.dbg;
757
div = &priv->_agn.statistics.general.common.div;
758
accum_general = &priv->_agn.accum_statistics.general.common;
759
accum_dbg = &priv->_agn.accum_statistics.general.common.dbg;
760
accum_div = &priv->_agn.accum_statistics.general.common.div;
761
delta_general = &priv->_agn.delta_statistics.general.common;
762
max_general = &priv->_agn.max_delta.general.common;
763
delta_dbg = &priv->_agn.delta_statistics.general.common.dbg;
764
max_dbg = &priv->_agn.max_delta.general.common.dbg;
765
delta_div = &priv->_agn.delta_statistics.general.common.div;
766
max_div = &priv->_agn.max_delta.general.common.div;
769
pos += iwl_statistics_flag(priv, buf, bufsz);
770
pos += scnprintf(buf + pos, bufsz - pos,
771
fmt_header, "Statistics_General:");
772
pos += scnprintf(buf + pos, bufsz - pos,
773
fmt_value, "temperature:",
774
le32_to_cpu(general->temperature));
775
pos += scnprintf(buf + pos, bufsz - pos,
776
fmt_value, "temperature_m:",
777
le32_to_cpu(general->temperature_m));
778
pos += scnprintf(buf + pos, bufsz - pos,
779
fmt_value, "ttl_timestamp:",
780
le32_to_cpu(general->ttl_timestamp));
781
pos += scnprintf(buf + pos, bufsz - pos,
782
fmt_table, "burst_check:",
783
le32_to_cpu(dbg->burst_check),
784
accum_dbg->burst_check,
785
delta_dbg->burst_check, max_dbg->burst_check);
786
pos += scnprintf(buf + pos, bufsz - pos,
787
fmt_table, "burst_count:",
788
le32_to_cpu(dbg->burst_count),
789
accum_dbg->burst_count,
790
delta_dbg->burst_count, max_dbg->burst_count);
791
pos += scnprintf(buf + pos, bufsz - pos,
792
fmt_table, "wait_for_silence_timeout_count:",
793
le32_to_cpu(dbg->wait_for_silence_timeout_cnt),
794
accum_dbg->wait_for_silence_timeout_cnt,
795
delta_dbg->wait_for_silence_timeout_cnt,
796
max_dbg->wait_for_silence_timeout_cnt);
797
pos += scnprintf(buf + pos, bufsz - pos,
798
fmt_table, "sleep_time:",
799
le32_to_cpu(general->sleep_time),
800
accum_general->sleep_time,
801
delta_general->sleep_time, max_general->sleep_time);
802
pos += scnprintf(buf + pos, bufsz - pos,
803
fmt_table, "slots_out:",
804
le32_to_cpu(general->slots_out),
805
accum_general->slots_out,
806
delta_general->slots_out, max_general->slots_out);
807
pos += scnprintf(buf + pos, bufsz - pos,
808
fmt_table, "slots_idle:",
809
le32_to_cpu(general->slots_idle),
810
accum_general->slots_idle,
811
delta_general->slots_idle, max_general->slots_idle);
812
pos += scnprintf(buf + pos, bufsz - pos,
813
fmt_table, "tx_on_a:",
814
le32_to_cpu(div->tx_on_a), accum_div->tx_on_a,
815
delta_div->tx_on_a, max_div->tx_on_a);
816
pos += scnprintf(buf + pos, bufsz - pos,
817
fmt_table, "tx_on_b:",
818
le32_to_cpu(div->tx_on_b), accum_div->tx_on_b,
819
delta_div->tx_on_b, max_div->tx_on_b);
820
pos += scnprintf(buf + pos, bufsz - pos,
821
fmt_table, "exec_time:",
822
le32_to_cpu(div->exec_time), accum_div->exec_time,
823
delta_div->exec_time, max_div->exec_time);
824
pos += scnprintf(buf + pos, bufsz - pos,
825
fmt_table, "probe_time:",
826
le32_to_cpu(div->probe_time), accum_div->probe_time,
827
delta_div->probe_time, max_div->probe_time);
828
pos += scnprintf(buf + pos, bufsz - pos,
829
fmt_table, "rx_enable_counter:",
830
le32_to_cpu(general->rx_enable_counter),
831
accum_general->rx_enable_counter,
832
delta_general->rx_enable_counter,
833
max_general->rx_enable_counter);
834
pos += scnprintf(buf + pos, bufsz - pos,
835
fmt_table, "num_of_sos_states:",
836
le32_to_cpu(general->num_of_sos_states),
837
accum_general->num_of_sos_states,
838
delta_general->num_of_sos_states,
839
max_general->num_of_sos_states);
840
ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos);
845
ssize_t iwl_ucode_bt_stats_read(struct file *file,
846
char __user *user_buf,
847
size_t count, loff_t *ppos)
849
struct iwl_priv *priv = (struct iwl_priv *)file->private_data;
852
int bufsz = (sizeof(struct statistics_bt_activity) * 24) + 200;
854
struct statistics_bt_activity *bt, *accum_bt;
856
if (!iwl_is_alive(priv))
859
if (!priv->bt_enable_flag)
862
/* make request to uCode to retrieve statistics information */
863
mutex_lock(&priv->mutex);
864
ret = iwl_send_statistics_request(priv, CMD_SYNC, false);
865
mutex_unlock(&priv->mutex);
869
"Error sending statistics request: %zd\n", ret);
872
buf = kzalloc(bufsz, GFP_KERNEL);
874
IWL_ERR(priv, "Can not allocate Buffer\n");
879
* the statistic information display here is based on
880
* the last statistics notification from uCode
881
* might not reflect the current uCode activity
883
bt = &priv->_agn.statistics_bt.general.activity;
884
accum_bt = &priv->_agn.accum_statistics_bt.general.activity;
886
pos += iwl_statistics_flag(priv, buf, bufsz);
887
pos += scnprintf(buf + pos, bufsz - pos, "Statistics_BT:\n");
888
pos += scnprintf(buf + pos, bufsz - pos,
889
"\t\t\tcurrent\t\t\taccumulative\n");
890
pos += scnprintf(buf + pos, bufsz - pos,
891
"hi_priority_tx_req_cnt:\t\t%u\t\t\t%u\n",
892
le32_to_cpu(bt->hi_priority_tx_req_cnt),
893
accum_bt->hi_priority_tx_req_cnt);
894
pos += scnprintf(buf + pos, bufsz - pos,
895
"hi_priority_tx_denied_cnt:\t%u\t\t\t%u\n",
896
le32_to_cpu(bt->hi_priority_tx_denied_cnt),
897
accum_bt->hi_priority_tx_denied_cnt);
898
pos += scnprintf(buf + pos, bufsz - pos,
899
"lo_priority_tx_req_cnt:\t\t%u\t\t\t%u\n",
900
le32_to_cpu(bt->lo_priority_tx_req_cnt),
901
accum_bt->lo_priority_tx_req_cnt);
902
pos += scnprintf(buf + pos, bufsz - pos,
903
"lo_priority_tx_denied_cnt:\t%u\t\t\t%u\n",
904
le32_to_cpu(bt->lo_priority_tx_denied_cnt),
905
accum_bt->lo_priority_tx_denied_cnt);
906
pos += scnprintf(buf + pos, bufsz - pos,
907
"hi_priority_rx_req_cnt:\t\t%u\t\t\t%u\n",
908
le32_to_cpu(bt->hi_priority_rx_req_cnt),
909
accum_bt->hi_priority_rx_req_cnt);
910
pos += scnprintf(buf + pos, bufsz - pos,
911
"hi_priority_rx_denied_cnt:\t%u\t\t\t%u\n",
912
le32_to_cpu(bt->hi_priority_rx_denied_cnt),
913
accum_bt->hi_priority_rx_denied_cnt);
914
pos += scnprintf(buf + pos, bufsz - pos,
915
"lo_priority_rx_req_cnt:\t\t%u\t\t\t%u\n",
916
le32_to_cpu(bt->lo_priority_rx_req_cnt),
917
accum_bt->lo_priority_rx_req_cnt);
918
pos += scnprintf(buf + pos, bufsz - pos,
919
"lo_priority_rx_denied_cnt:\t%u\t\t\t%u\n",
920
le32_to_cpu(bt->lo_priority_rx_denied_cnt),
921
accum_bt->lo_priority_rx_denied_cnt);
923
pos += scnprintf(buf + pos, bufsz - pos,
924
"(rx)num_bt_kills:\t\t%u\t\t\t%u\n",
925
le32_to_cpu(priv->_agn.statistics_bt.rx.
926
general.num_bt_kills),
927
priv->_agn.accum_statistics_bt.rx.
928
general.num_bt_kills);
930
ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos);
935
ssize_t iwl_reply_tx_error_read(struct file *file,
936
char __user *user_buf,
937
size_t count, loff_t *ppos)
939
struct iwl_priv *priv = (struct iwl_priv *)file->private_data;
942
int bufsz = (sizeof(struct reply_tx_error_statistics) * 24) +
943
(sizeof(struct reply_agg_tx_error_statistics) * 24) + 200;
946
if (!iwl_is_alive(priv))
949
buf = kzalloc(bufsz, GFP_KERNEL);
951
IWL_ERR(priv, "Can not allocate Buffer\n");
955
pos += scnprintf(buf + pos, bufsz - pos, "Statistics_TX_Error:\n");
956
pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t\t%u\n",
957
iwl_get_tx_fail_reason(TX_STATUS_POSTPONE_DELAY),
958
priv->_agn.reply_tx_stats.pp_delay);
959
pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n",
960
iwl_get_tx_fail_reason(TX_STATUS_POSTPONE_FEW_BYTES),
961
priv->_agn.reply_tx_stats.pp_few_bytes);
962
pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n",
963
iwl_get_tx_fail_reason(TX_STATUS_POSTPONE_BT_PRIO),
964
priv->_agn.reply_tx_stats.pp_bt_prio);
965
pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n",
966
iwl_get_tx_fail_reason(TX_STATUS_POSTPONE_QUIET_PERIOD),
967
priv->_agn.reply_tx_stats.pp_quiet_period);
968
pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n",
969
iwl_get_tx_fail_reason(TX_STATUS_POSTPONE_CALC_TTAK),
970
priv->_agn.reply_tx_stats.pp_calc_ttak);
971
pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t%u\n",
972
iwl_get_tx_fail_reason(
973
TX_STATUS_FAIL_INTERNAL_CROSSED_RETRY),
974
priv->_agn.reply_tx_stats.int_crossed_retry);
975
pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n",
976
iwl_get_tx_fail_reason(TX_STATUS_FAIL_SHORT_LIMIT),
977
priv->_agn.reply_tx_stats.short_limit);
978
pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n",
979
iwl_get_tx_fail_reason(TX_STATUS_FAIL_LONG_LIMIT),
980
priv->_agn.reply_tx_stats.long_limit);
981
pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n",
982
iwl_get_tx_fail_reason(TX_STATUS_FAIL_FIFO_UNDERRUN),
983
priv->_agn.reply_tx_stats.fifo_underrun);
984
pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n",
985
iwl_get_tx_fail_reason(TX_STATUS_FAIL_DRAIN_FLOW),
986
priv->_agn.reply_tx_stats.drain_flow);
987
pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n",
988
iwl_get_tx_fail_reason(TX_STATUS_FAIL_RFKILL_FLUSH),
989
priv->_agn.reply_tx_stats.rfkill_flush);
990
pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n",
991
iwl_get_tx_fail_reason(TX_STATUS_FAIL_LIFE_EXPIRE),
992
priv->_agn.reply_tx_stats.life_expire);
993
pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n",
994
iwl_get_tx_fail_reason(TX_STATUS_FAIL_DEST_PS),
995
priv->_agn.reply_tx_stats.dest_ps);
996
pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n",
997
iwl_get_tx_fail_reason(TX_STATUS_FAIL_HOST_ABORTED),
998
priv->_agn.reply_tx_stats.host_abort);
999
pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n",
1000
iwl_get_tx_fail_reason(TX_STATUS_FAIL_BT_RETRY),
1001
priv->_agn.reply_tx_stats.pp_delay);
1002
pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n",
1003
iwl_get_tx_fail_reason(TX_STATUS_FAIL_STA_INVALID),
1004
priv->_agn.reply_tx_stats.sta_invalid);
1005
pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n",
1006
iwl_get_tx_fail_reason(TX_STATUS_FAIL_FRAG_DROPPED),
1007
priv->_agn.reply_tx_stats.frag_drop);
1008
pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n",
1009
iwl_get_tx_fail_reason(TX_STATUS_FAIL_TID_DISABLE),
1010
priv->_agn.reply_tx_stats.tid_disable);
1011
pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n",
1012
iwl_get_tx_fail_reason(TX_STATUS_FAIL_FIFO_FLUSHED),
1013
priv->_agn.reply_tx_stats.fifo_flush);
1014
pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t%u\n",
1015
iwl_get_tx_fail_reason(
1016
TX_STATUS_FAIL_INSUFFICIENT_CF_POLL),
1017
priv->_agn.reply_tx_stats.insuff_cf_poll);
1018
pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n",
1019
iwl_get_tx_fail_reason(TX_STATUS_FAIL_PASSIVE_NO_RX),
1020
priv->_agn.reply_tx_stats.fail_hw_drop);
1021
pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t%u\n",
1022
iwl_get_tx_fail_reason(
1023
TX_STATUS_FAIL_NO_BEACON_ON_RADAR),
1024
priv->_agn.reply_tx_stats.sta_color_mismatch);
1025
pos += scnprintf(buf + pos, bufsz - pos, "UNKNOWN:\t\t\t%u\n",
1026
priv->_agn.reply_tx_stats.unknown);
1028
pos += scnprintf(buf + pos, bufsz - pos,
1029
"\nStatistics_Agg_TX_Error:\n");
1031
pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n",
1032
iwl_get_agg_tx_fail_reason(AGG_TX_STATE_UNDERRUN_MSK),
1033
priv->_agn.reply_agg_tx_stats.underrun);
1034
pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n",
1035
iwl_get_agg_tx_fail_reason(AGG_TX_STATE_BT_PRIO_MSK),
1036
priv->_agn.reply_agg_tx_stats.bt_prio);
1037
pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n",
1038
iwl_get_agg_tx_fail_reason(AGG_TX_STATE_FEW_BYTES_MSK),
1039
priv->_agn.reply_agg_tx_stats.few_bytes);
1040
pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n",
1041
iwl_get_agg_tx_fail_reason(AGG_TX_STATE_ABORT_MSK),
1042
priv->_agn.reply_agg_tx_stats.abort);
1043
pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t%u\n",
1044
iwl_get_agg_tx_fail_reason(
1045
AGG_TX_STATE_LAST_SENT_TTL_MSK),
1046
priv->_agn.reply_agg_tx_stats.last_sent_ttl);
1047
pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t%u\n",
1048
iwl_get_agg_tx_fail_reason(
1049
AGG_TX_STATE_LAST_SENT_TRY_CNT_MSK),
1050
priv->_agn.reply_agg_tx_stats.last_sent_try);
1051
pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t%u\n",
1052
iwl_get_agg_tx_fail_reason(
1053
AGG_TX_STATE_LAST_SENT_BT_KILL_MSK),
1054
priv->_agn.reply_agg_tx_stats.last_sent_bt_kill);
1055
pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n",
1056
iwl_get_agg_tx_fail_reason(AGG_TX_STATE_SCD_QUERY_MSK),
1057
priv->_agn.reply_agg_tx_stats.scd_query);
1058
pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t%u\n",
1059
iwl_get_agg_tx_fail_reason(
1060
AGG_TX_STATE_TEST_BAD_CRC32_MSK),
1061
priv->_agn.reply_agg_tx_stats.bad_crc32);
1062
pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n",
1063
iwl_get_agg_tx_fail_reason(AGG_TX_STATE_RESPONSE_MSK),
1064
priv->_agn.reply_agg_tx_stats.response);
1065
pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n",
1066
iwl_get_agg_tx_fail_reason(AGG_TX_STATE_DUMP_TX_MSK),
1067
priv->_agn.reply_agg_tx_stats.dump_tx);
1068
pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n",
1069
iwl_get_agg_tx_fail_reason(AGG_TX_STATE_DELAY_TX_MSK),
1070
priv->_agn.reply_agg_tx_stats.delay_tx);
1071
pos += scnprintf(buf + pos, bufsz - pos, "UNKNOWN:\t\t\t%u\n",
1072
priv->_agn.reply_agg_tx_stats.unknown);
1074
ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos);