1 // SPDX-License-Identifier: GPL-2.0-only
2 /******************************************************************************
4 * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
7 * Intel Linux Wireless <ilw@linux.intel.com>
8 * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
9 *****************************************************************************/
13 static const char *fmt_value
= " %-30s %10u\n";
14 static const char *fmt_table
= " %-30s %10u %10u %10u %10u\n";
15 static const char *fmt_header
=
16 "%-32s current cumulative delta max\n";
19 il4965_stats_flag(struct il_priv
*il
, char *buf
, int bufsz
)
24 flag
= le32_to_cpu(il
->_4965
.stats
.flag
);
26 p
+= scnprintf(buf
+ p
, bufsz
- p
, "Statistics Flag(0x%X):\n", flag
);
27 if (flag
& UCODE_STATS_CLEAR_MSK
)
28 p
+= scnprintf(buf
+ p
, bufsz
- p
,
29 "\tStatistics have been cleared\n");
30 p
+= scnprintf(buf
+ p
, bufsz
- p
, "\tOperational Frequency: %s\n",
31 (flag
& UCODE_STATS_FREQUENCY_MSK
) ? "2.4 GHz" :
33 p
+= scnprintf(buf
+ p
, bufsz
- p
, "\tTGj Narrow Band: %s\n",
34 (flag
& UCODE_STATS_NARROW_BAND_MSK
) ? "enabled" :
41 il4965_ucode_rx_stats_read(struct file
*file
, char __user
*user_buf
,
42 size_t count
, loff_t
*ppos
)
44 struct il_priv
*il
= file
->private_data
;
48 sizeof(struct stats_rx_phy
) * 40 +
49 sizeof(struct stats_rx_non_phy
) * 40 +
50 sizeof(struct stats_rx_ht_phy
) * 40 + 400;
52 struct stats_rx_phy
*ofdm
, *accum_ofdm
, *delta_ofdm
, *max_ofdm
;
53 struct stats_rx_phy
*cck
, *accum_cck
, *delta_cck
, *max_cck
;
54 struct stats_rx_non_phy
*general
, *accum_general
;
55 struct stats_rx_non_phy
*delta_general
, *max_general
;
56 struct stats_rx_ht_phy
*ht
, *accum_ht
, *delta_ht
, *max_ht
;
61 buf
= kzalloc(bufsz
, GFP_KERNEL
);
63 IL_ERR("Can not allocate Buffer\n");
68 * the statistic information display here is based on
69 * the last stats notification from uCode
70 * might not reflect the current uCode activity
72 ofdm
= &il
->_4965
.stats
.rx
.ofdm
;
73 cck
= &il
->_4965
.stats
.rx
.cck
;
74 general
= &il
->_4965
.stats
.rx
.general
;
75 ht
= &il
->_4965
.stats
.rx
.ofdm_ht
;
76 accum_ofdm
= &il
->_4965
.accum_stats
.rx
.ofdm
;
77 accum_cck
= &il
->_4965
.accum_stats
.rx
.cck
;
78 accum_general
= &il
->_4965
.accum_stats
.rx
.general
;
79 accum_ht
= &il
->_4965
.accum_stats
.rx
.ofdm_ht
;
80 delta_ofdm
= &il
->_4965
.delta_stats
.rx
.ofdm
;
81 delta_cck
= &il
->_4965
.delta_stats
.rx
.cck
;
82 delta_general
= &il
->_4965
.delta_stats
.rx
.general
;
83 delta_ht
= &il
->_4965
.delta_stats
.rx
.ofdm_ht
;
84 max_ofdm
= &il
->_4965
.max_delta
.rx
.ofdm
;
85 max_cck
= &il
->_4965
.max_delta
.rx
.cck
;
86 max_general
= &il
->_4965
.max_delta
.rx
.general
;
87 max_ht
= &il
->_4965
.max_delta
.rx
.ofdm_ht
;
89 pos
+= il4965_stats_flag(il
, buf
, bufsz
);
91 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_header
,
92 "Statistics_Rx - OFDM:");
94 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "ina_cnt:",
95 le32_to_cpu(ofdm
->ina_cnt
), accum_ofdm
->ina_cnt
,
96 delta_ofdm
->ina_cnt
, max_ofdm
->ina_cnt
);
98 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "fina_cnt:",
99 le32_to_cpu(ofdm
->fina_cnt
), accum_ofdm
->fina_cnt
,
100 delta_ofdm
->fina_cnt
, max_ofdm
->fina_cnt
);
102 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "plcp_err:",
103 le32_to_cpu(ofdm
->plcp_err
), accum_ofdm
->plcp_err
,
104 delta_ofdm
->plcp_err
, max_ofdm
->plcp_err
);
106 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "crc32_err:",
107 le32_to_cpu(ofdm
->crc32_err
), accum_ofdm
->crc32_err
,
108 delta_ofdm
->crc32_err
, max_ofdm
->crc32_err
);
110 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "overrun_err:",
111 le32_to_cpu(ofdm
->overrun_err
), accum_ofdm
->overrun_err
,
112 delta_ofdm
->overrun_err
, max_ofdm
->overrun_err
);
114 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "early_overrun_err:",
115 le32_to_cpu(ofdm
->early_overrun_err
),
116 accum_ofdm
->early_overrun_err
,
117 delta_ofdm
->early_overrun_err
,
118 max_ofdm
->early_overrun_err
);
120 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "crc32_good:",
121 le32_to_cpu(ofdm
->crc32_good
), accum_ofdm
->crc32_good
,
122 delta_ofdm
->crc32_good
, max_ofdm
->crc32_good
);
124 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "false_alarm_cnt:",
125 le32_to_cpu(ofdm
->false_alarm_cnt
),
126 accum_ofdm
->false_alarm_cnt
, delta_ofdm
->false_alarm_cnt
,
127 max_ofdm
->false_alarm_cnt
);
129 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "fina_sync_err_cnt:",
130 le32_to_cpu(ofdm
->fina_sync_err_cnt
),
131 accum_ofdm
->fina_sync_err_cnt
,
132 delta_ofdm
->fina_sync_err_cnt
,
133 max_ofdm
->fina_sync_err_cnt
);
135 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "sfd_timeout:",
136 le32_to_cpu(ofdm
->sfd_timeout
), accum_ofdm
->sfd_timeout
,
137 delta_ofdm
->sfd_timeout
, max_ofdm
->sfd_timeout
);
139 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "fina_timeout:",
140 le32_to_cpu(ofdm
->fina_timeout
), accum_ofdm
->fina_timeout
,
141 delta_ofdm
->fina_timeout
, max_ofdm
->fina_timeout
);
143 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "unresponded_rts:",
144 le32_to_cpu(ofdm
->unresponded_rts
),
145 accum_ofdm
->unresponded_rts
, delta_ofdm
->unresponded_rts
,
146 max_ofdm
->unresponded_rts
);
148 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "rxe_frame_lmt_ovrun:",
149 le32_to_cpu(ofdm
->rxe_frame_limit_overrun
),
150 accum_ofdm
->rxe_frame_limit_overrun
,
151 delta_ofdm
->rxe_frame_limit_overrun
,
152 max_ofdm
->rxe_frame_limit_overrun
);
154 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "sent_ack_cnt:",
155 le32_to_cpu(ofdm
->sent_ack_cnt
), accum_ofdm
->sent_ack_cnt
,
156 delta_ofdm
->sent_ack_cnt
, max_ofdm
->sent_ack_cnt
);
158 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "sent_cts_cnt:",
159 le32_to_cpu(ofdm
->sent_cts_cnt
), accum_ofdm
->sent_cts_cnt
,
160 delta_ofdm
->sent_cts_cnt
, max_ofdm
->sent_cts_cnt
);
162 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "sent_ba_rsp_cnt:",
163 le32_to_cpu(ofdm
->sent_ba_rsp_cnt
),
164 accum_ofdm
->sent_ba_rsp_cnt
, delta_ofdm
->sent_ba_rsp_cnt
,
165 max_ofdm
->sent_ba_rsp_cnt
);
167 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "dsp_self_kill:",
168 le32_to_cpu(ofdm
->dsp_self_kill
),
169 accum_ofdm
->dsp_self_kill
, delta_ofdm
->dsp_self_kill
,
170 max_ofdm
->dsp_self_kill
);
172 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "mh_format_err:",
173 le32_to_cpu(ofdm
->mh_format_err
),
174 accum_ofdm
->mh_format_err
, delta_ofdm
->mh_format_err
,
175 max_ofdm
->mh_format_err
);
177 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
,
178 "re_acq_main_rssi_sum:",
179 le32_to_cpu(ofdm
->re_acq_main_rssi_sum
),
180 accum_ofdm
->re_acq_main_rssi_sum
,
181 delta_ofdm
->re_acq_main_rssi_sum
,
182 max_ofdm
->re_acq_main_rssi_sum
);
185 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_header
,
186 "Statistics_Rx - CCK:");
188 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "ina_cnt:",
189 le32_to_cpu(cck
->ina_cnt
), accum_cck
->ina_cnt
,
190 delta_cck
->ina_cnt
, max_cck
->ina_cnt
);
192 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "fina_cnt:",
193 le32_to_cpu(cck
->fina_cnt
), accum_cck
->fina_cnt
,
194 delta_cck
->fina_cnt
, max_cck
->fina_cnt
);
196 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "plcp_err:",
197 le32_to_cpu(cck
->plcp_err
), accum_cck
->plcp_err
,
198 delta_cck
->plcp_err
, max_cck
->plcp_err
);
200 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "crc32_err:",
201 le32_to_cpu(cck
->crc32_err
), accum_cck
->crc32_err
,
202 delta_cck
->crc32_err
, max_cck
->crc32_err
);
204 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "overrun_err:",
205 le32_to_cpu(cck
->overrun_err
), accum_cck
->overrun_err
,
206 delta_cck
->overrun_err
, max_cck
->overrun_err
);
208 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "early_overrun_err:",
209 le32_to_cpu(cck
->early_overrun_err
),
210 accum_cck
->early_overrun_err
,
211 delta_cck
->early_overrun_err
, max_cck
->early_overrun_err
);
213 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "crc32_good:",
214 le32_to_cpu(cck
->crc32_good
), accum_cck
->crc32_good
,
215 delta_cck
->crc32_good
, max_cck
->crc32_good
);
217 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "false_alarm_cnt:",
218 le32_to_cpu(cck
->false_alarm_cnt
),
219 accum_cck
->false_alarm_cnt
, delta_cck
->false_alarm_cnt
,
220 max_cck
->false_alarm_cnt
);
222 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "fina_sync_err_cnt:",
223 le32_to_cpu(cck
->fina_sync_err_cnt
),
224 accum_cck
->fina_sync_err_cnt
,
225 delta_cck
->fina_sync_err_cnt
, max_cck
->fina_sync_err_cnt
);
227 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "sfd_timeout:",
228 le32_to_cpu(cck
->sfd_timeout
), accum_cck
->sfd_timeout
,
229 delta_cck
->sfd_timeout
, max_cck
->sfd_timeout
);
231 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "fina_timeout:",
232 le32_to_cpu(cck
->fina_timeout
), accum_cck
->fina_timeout
,
233 delta_cck
->fina_timeout
, max_cck
->fina_timeout
);
235 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "unresponded_rts:",
236 le32_to_cpu(cck
->unresponded_rts
),
237 accum_cck
->unresponded_rts
, delta_cck
->unresponded_rts
,
238 max_cck
->unresponded_rts
);
240 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "rxe_frame_lmt_ovrun:",
241 le32_to_cpu(cck
->rxe_frame_limit_overrun
),
242 accum_cck
->rxe_frame_limit_overrun
,
243 delta_cck
->rxe_frame_limit_overrun
,
244 max_cck
->rxe_frame_limit_overrun
);
246 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "sent_ack_cnt:",
247 le32_to_cpu(cck
->sent_ack_cnt
), accum_cck
->sent_ack_cnt
,
248 delta_cck
->sent_ack_cnt
, max_cck
->sent_ack_cnt
);
250 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "sent_cts_cnt:",
251 le32_to_cpu(cck
->sent_cts_cnt
), accum_cck
->sent_cts_cnt
,
252 delta_cck
->sent_cts_cnt
, max_cck
->sent_cts_cnt
);
254 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "sent_ba_rsp_cnt:",
255 le32_to_cpu(cck
->sent_ba_rsp_cnt
),
256 accum_cck
->sent_ba_rsp_cnt
, delta_cck
->sent_ba_rsp_cnt
,
257 max_cck
->sent_ba_rsp_cnt
);
259 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "dsp_self_kill:",
260 le32_to_cpu(cck
->dsp_self_kill
), accum_cck
->dsp_self_kill
,
261 delta_cck
->dsp_self_kill
, max_cck
->dsp_self_kill
);
263 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "mh_format_err:",
264 le32_to_cpu(cck
->mh_format_err
), accum_cck
->mh_format_err
,
265 delta_cck
->mh_format_err
, max_cck
->mh_format_err
);
267 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
,
268 "re_acq_main_rssi_sum:",
269 le32_to_cpu(cck
->re_acq_main_rssi_sum
),
270 accum_cck
->re_acq_main_rssi_sum
,
271 delta_cck
->re_acq_main_rssi_sum
,
272 max_cck
->re_acq_main_rssi_sum
);
275 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_header
,
276 "Statistics_Rx - GENERAL:");
278 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "bogus_cts:",
279 le32_to_cpu(general
->bogus_cts
), accum_general
->bogus_cts
,
280 delta_general
->bogus_cts
, max_general
->bogus_cts
);
282 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "bogus_ack:",
283 le32_to_cpu(general
->bogus_ack
), accum_general
->bogus_ack
,
284 delta_general
->bogus_ack
, max_general
->bogus_ack
);
286 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "non_bssid_frames:",
287 le32_to_cpu(general
->non_bssid_frames
),
288 accum_general
->non_bssid_frames
,
289 delta_general
->non_bssid_frames
,
290 max_general
->non_bssid_frames
);
292 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "filtered_frames:",
293 le32_to_cpu(general
->filtered_frames
),
294 accum_general
->filtered_frames
,
295 delta_general
->filtered_frames
,
296 max_general
->filtered_frames
);
298 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "non_channel_beacons:",
299 le32_to_cpu(general
->non_channel_beacons
),
300 accum_general
->non_channel_beacons
,
301 delta_general
->non_channel_beacons
,
302 max_general
->non_channel_beacons
);
304 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "channel_beacons:",
305 le32_to_cpu(general
->channel_beacons
),
306 accum_general
->channel_beacons
,
307 delta_general
->channel_beacons
,
308 max_general
->channel_beacons
);
310 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "num_missed_bcon:",
311 le32_to_cpu(general
->num_missed_bcon
),
312 accum_general
->num_missed_bcon
,
313 delta_general
->num_missed_bcon
,
314 max_general
->num_missed_bcon
);
316 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
,
317 "adc_rx_saturation_time:",
318 le32_to_cpu(general
->adc_rx_saturation_time
),
319 accum_general
->adc_rx_saturation_time
,
320 delta_general
->adc_rx_saturation_time
,
321 max_general
->adc_rx_saturation_time
);
323 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
,
324 "ina_detect_search_tm:",
325 le32_to_cpu(general
->ina_detection_search_time
),
326 accum_general
->ina_detection_search_time
,
327 delta_general
->ina_detection_search_time
,
328 max_general
->ina_detection_search_time
);
330 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
,
331 "beacon_silence_rssi_a:",
332 le32_to_cpu(general
->beacon_silence_rssi_a
),
333 accum_general
->beacon_silence_rssi_a
,
334 delta_general
->beacon_silence_rssi_a
,
335 max_general
->beacon_silence_rssi_a
);
337 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
,
338 "beacon_silence_rssi_b:",
339 le32_to_cpu(general
->beacon_silence_rssi_b
),
340 accum_general
->beacon_silence_rssi_b
,
341 delta_general
->beacon_silence_rssi_b
,
342 max_general
->beacon_silence_rssi_b
);
344 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
,
345 "beacon_silence_rssi_c:",
346 le32_to_cpu(general
->beacon_silence_rssi_c
),
347 accum_general
->beacon_silence_rssi_c
,
348 delta_general
->beacon_silence_rssi_c
,
349 max_general
->beacon_silence_rssi_c
);
351 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
,
352 "interference_data_flag:",
353 le32_to_cpu(general
->interference_data_flag
),
354 accum_general
->interference_data_flag
,
355 delta_general
->interference_data_flag
,
356 max_general
->interference_data_flag
);
358 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "channel_load:",
359 le32_to_cpu(general
->channel_load
),
360 accum_general
->channel_load
, delta_general
->channel_load
,
361 max_general
->channel_load
);
363 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "dsp_false_alarms:",
364 le32_to_cpu(general
->dsp_false_alarms
),
365 accum_general
->dsp_false_alarms
,
366 delta_general
->dsp_false_alarms
,
367 max_general
->dsp_false_alarms
);
369 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "beacon_rssi_a:",
370 le32_to_cpu(general
->beacon_rssi_a
),
371 accum_general
->beacon_rssi_a
,
372 delta_general
->beacon_rssi_a
, max_general
->beacon_rssi_a
);
374 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "beacon_rssi_b:",
375 le32_to_cpu(general
->beacon_rssi_b
),
376 accum_general
->beacon_rssi_b
,
377 delta_general
->beacon_rssi_b
, max_general
->beacon_rssi_b
);
379 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "beacon_rssi_c:",
380 le32_to_cpu(general
->beacon_rssi_c
),
381 accum_general
->beacon_rssi_c
,
382 delta_general
->beacon_rssi_c
, max_general
->beacon_rssi_c
);
384 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "beacon_energy_a:",
385 le32_to_cpu(general
->beacon_energy_a
),
386 accum_general
->beacon_energy_a
,
387 delta_general
->beacon_energy_a
,
388 max_general
->beacon_energy_a
);
390 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "beacon_energy_b:",
391 le32_to_cpu(general
->beacon_energy_b
),
392 accum_general
->beacon_energy_b
,
393 delta_general
->beacon_energy_b
,
394 max_general
->beacon_energy_b
);
396 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "beacon_energy_c:",
397 le32_to_cpu(general
->beacon_energy_c
),
398 accum_general
->beacon_energy_c
,
399 delta_general
->beacon_energy_c
,
400 max_general
->beacon_energy_c
);
403 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_header
,
404 "Statistics_Rx - OFDM_HT:");
406 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "plcp_err:",
407 le32_to_cpu(ht
->plcp_err
), accum_ht
->plcp_err
,
408 delta_ht
->plcp_err
, max_ht
->plcp_err
);
410 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "overrun_err:",
411 le32_to_cpu(ht
->overrun_err
), accum_ht
->overrun_err
,
412 delta_ht
->overrun_err
, max_ht
->overrun_err
);
414 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "early_overrun_err:",
415 le32_to_cpu(ht
->early_overrun_err
),
416 accum_ht
->early_overrun_err
, delta_ht
->early_overrun_err
,
417 max_ht
->early_overrun_err
);
419 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "crc32_good:",
420 le32_to_cpu(ht
->crc32_good
), accum_ht
->crc32_good
,
421 delta_ht
->crc32_good
, max_ht
->crc32_good
);
423 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "crc32_err:",
424 le32_to_cpu(ht
->crc32_err
), accum_ht
->crc32_err
,
425 delta_ht
->crc32_err
, max_ht
->crc32_err
);
427 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "mh_format_err:",
428 le32_to_cpu(ht
->mh_format_err
), accum_ht
->mh_format_err
,
429 delta_ht
->mh_format_err
, max_ht
->mh_format_err
);
431 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "agg_crc32_good:",
432 le32_to_cpu(ht
->agg_crc32_good
), accum_ht
->agg_crc32_good
,
433 delta_ht
->agg_crc32_good
, max_ht
->agg_crc32_good
);
435 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "agg_mpdu_cnt:",
436 le32_to_cpu(ht
->agg_mpdu_cnt
), accum_ht
->agg_mpdu_cnt
,
437 delta_ht
->agg_mpdu_cnt
, max_ht
->agg_mpdu_cnt
);
439 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "agg_cnt:",
440 le32_to_cpu(ht
->agg_cnt
), accum_ht
->agg_cnt
,
441 delta_ht
->agg_cnt
, max_ht
->agg_cnt
);
443 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "unsupport_mcs:",
444 le32_to_cpu(ht
->unsupport_mcs
), accum_ht
->unsupport_mcs
,
445 delta_ht
->unsupport_mcs
, max_ht
->unsupport_mcs
);
447 ret
= simple_read_from_buffer(user_buf
, count
, ppos
, buf
, pos
);
453 il4965_ucode_tx_stats_read(struct file
*file
, char __user
*user_buf
,
454 size_t count
, loff_t
*ppos
)
456 struct il_priv
*il
= file
->private_data
;
459 int bufsz
= (sizeof(struct stats_tx
) * 48) + 250;
461 struct stats_tx
*tx
, *accum_tx
, *delta_tx
, *max_tx
;
463 if (!il_is_alive(il
))
466 buf
= kzalloc(bufsz
, GFP_KERNEL
);
468 IL_ERR("Can not allocate Buffer\n");
472 /* the statistic information display here is based on
473 * the last stats notification from uCode
474 * might not reflect the current uCode activity
476 tx
= &il
->_4965
.stats
.tx
;
477 accum_tx
= &il
->_4965
.accum_stats
.tx
;
478 delta_tx
= &il
->_4965
.delta_stats
.tx
;
479 max_tx
= &il
->_4965
.max_delta
.tx
;
481 pos
+= il4965_stats_flag(il
, buf
, bufsz
);
482 pos
+= scnprintf(buf
+ pos
, bufsz
- pos
, fmt_header
, "Statistics_Tx:");
484 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "preamble:",
485 le32_to_cpu(tx
->preamble_cnt
), accum_tx
->preamble_cnt
,
486 delta_tx
->preamble_cnt
, max_tx
->preamble_cnt
);
488 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "rx_detected_cnt:",
489 le32_to_cpu(tx
->rx_detected_cnt
),
490 accum_tx
->rx_detected_cnt
, delta_tx
->rx_detected_cnt
,
491 max_tx
->rx_detected_cnt
);
493 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "bt_prio_defer_cnt:",
494 le32_to_cpu(tx
->bt_prio_defer_cnt
),
495 accum_tx
->bt_prio_defer_cnt
, delta_tx
->bt_prio_defer_cnt
,
496 max_tx
->bt_prio_defer_cnt
);
498 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "bt_prio_kill_cnt:",
499 le32_to_cpu(tx
->bt_prio_kill_cnt
),
500 accum_tx
->bt_prio_kill_cnt
, delta_tx
->bt_prio_kill_cnt
,
501 max_tx
->bt_prio_kill_cnt
);
503 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "few_bytes_cnt:",
504 le32_to_cpu(tx
->few_bytes_cnt
), accum_tx
->few_bytes_cnt
,
505 delta_tx
->few_bytes_cnt
, max_tx
->few_bytes_cnt
);
507 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "cts_timeout:",
508 le32_to_cpu(tx
->cts_timeout
), accum_tx
->cts_timeout
,
509 delta_tx
->cts_timeout
, max_tx
->cts_timeout
);
511 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "ack_timeout:",
512 le32_to_cpu(tx
->ack_timeout
), accum_tx
->ack_timeout
,
513 delta_tx
->ack_timeout
, max_tx
->ack_timeout
);
515 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "expected_ack_cnt:",
516 le32_to_cpu(tx
->expected_ack_cnt
),
517 accum_tx
->expected_ack_cnt
, delta_tx
->expected_ack_cnt
,
518 max_tx
->expected_ack_cnt
);
520 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "actual_ack_cnt:",
521 le32_to_cpu(tx
->actual_ack_cnt
), accum_tx
->actual_ack_cnt
,
522 delta_tx
->actual_ack_cnt
, max_tx
->actual_ack_cnt
);
524 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "dump_msdu_cnt:",
525 le32_to_cpu(tx
->dump_msdu_cnt
), accum_tx
->dump_msdu_cnt
,
526 delta_tx
->dump_msdu_cnt
, max_tx
->dump_msdu_cnt
);
528 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
,
529 "abort_nxt_frame_mismatch:",
530 le32_to_cpu(tx
->burst_abort_next_frame_mismatch_cnt
),
531 accum_tx
->burst_abort_next_frame_mismatch_cnt
,
532 delta_tx
->burst_abort_next_frame_mismatch_cnt
,
533 max_tx
->burst_abort_next_frame_mismatch_cnt
);
535 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
,
536 "abort_missing_nxt_frame:",
537 le32_to_cpu(tx
->burst_abort_missing_next_frame_cnt
),
538 accum_tx
->burst_abort_missing_next_frame_cnt
,
539 delta_tx
->burst_abort_missing_next_frame_cnt
,
540 max_tx
->burst_abort_missing_next_frame_cnt
);
542 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
,
543 "cts_timeout_collision:",
544 le32_to_cpu(tx
->cts_timeout_collision
),
545 accum_tx
->cts_timeout_collision
,
546 delta_tx
->cts_timeout_collision
,
547 max_tx
->cts_timeout_collision
);
549 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
,
550 "ack_ba_timeout_collision:",
551 le32_to_cpu(tx
->ack_or_ba_timeout_collision
),
552 accum_tx
->ack_or_ba_timeout_collision
,
553 delta_tx
->ack_or_ba_timeout_collision
,
554 max_tx
->ack_or_ba_timeout_collision
);
556 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "agg ba_timeout:",
557 le32_to_cpu(tx
->agg
.ba_timeout
), accum_tx
->agg
.ba_timeout
,
558 delta_tx
->agg
.ba_timeout
, max_tx
->agg
.ba_timeout
);
560 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
,
561 "agg ba_resched_frames:",
562 le32_to_cpu(tx
->agg
.ba_reschedule_frames
),
563 accum_tx
->agg
.ba_reschedule_frames
,
564 delta_tx
->agg
.ba_reschedule_frames
,
565 max_tx
->agg
.ba_reschedule_frames
);
567 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
,
568 "agg scd_query_agg_frame:",
569 le32_to_cpu(tx
->agg
.scd_query_agg_frame_cnt
),
570 accum_tx
->agg
.scd_query_agg_frame_cnt
,
571 delta_tx
->agg
.scd_query_agg_frame_cnt
,
572 max_tx
->agg
.scd_query_agg_frame_cnt
);
574 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
,
575 "agg scd_query_no_agg:",
576 le32_to_cpu(tx
->agg
.scd_query_no_agg
),
577 accum_tx
->agg
.scd_query_no_agg
,
578 delta_tx
->agg
.scd_query_no_agg
,
579 max_tx
->agg
.scd_query_no_agg
);
581 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "agg scd_query_agg:",
582 le32_to_cpu(tx
->agg
.scd_query_agg
),
583 accum_tx
->agg
.scd_query_agg
, delta_tx
->agg
.scd_query_agg
,
584 max_tx
->agg
.scd_query_agg
);
586 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
,
587 "agg scd_query_mismatch:",
588 le32_to_cpu(tx
->agg
.scd_query_mismatch
),
589 accum_tx
->agg
.scd_query_mismatch
,
590 delta_tx
->agg
.scd_query_mismatch
,
591 max_tx
->agg
.scd_query_mismatch
);
593 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "agg frame_not_ready:",
594 le32_to_cpu(tx
->agg
.frame_not_ready
),
595 accum_tx
->agg
.frame_not_ready
,
596 delta_tx
->agg
.frame_not_ready
,
597 max_tx
->agg
.frame_not_ready
);
599 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "agg underrun:",
600 le32_to_cpu(tx
->agg
.underrun
), accum_tx
->agg
.underrun
,
601 delta_tx
->agg
.underrun
, max_tx
->agg
.underrun
);
603 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "agg bt_prio_kill:",
604 le32_to_cpu(tx
->agg
.bt_prio_kill
),
605 accum_tx
->agg
.bt_prio_kill
, delta_tx
->agg
.bt_prio_kill
,
606 max_tx
->agg
.bt_prio_kill
);
608 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "agg rx_ba_rsp_cnt:",
609 le32_to_cpu(tx
->agg
.rx_ba_rsp_cnt
),
610 accum_tx
->agg
.rx_ba_rsp_cnt
, delta_tx
->agg
.rx_ba_rsp_cnt
,
611 max_tx
->agg
.rx_ba_rsp_cnt
);
613 ret
= simple_read_from_buffer(user_buf
, count
, ppos
, buf
, pos
);
619 il4965_ucode_general_stats_read(struct file
*file
, char __user
*user_buf
,
620 size_t count
, loff_t
*ppos
)
622 struct il_priv
*il
= file
->private_data
;
625 int bufsz
= sizeof(struct stats_general
) * 10 + 300;
627 struct stats_general_common
*general
, *accum_general
;
628 struct stats_general_common
*delta_general
, *max_general
;
629 struct stats_dbg
*dbg
, *accum_dbg
, *delta_dbg
, *max_dbg
;
630 struct stats_div
*div
, *accum_div
, *delta_div
, *max_div
;
632 if (!il_is_alive(il
))
635 buf
= kzalloc(bufsz
, GFP_KERNEL
);
637 IL_ERR("Can not allocate Buffer\n");
641 /* the statistic information display here is based on
642 * the last stats notification from uCode
643 * might not reflect the current uCode activity
645 general
= &il
->_4965
.stats
.general
.common
;
646 dbg
= &il
->_4965
.stats
.general
.common
.dbg
;
647 div
= &il
->_4965
.stats
.general
.common
.div
;
648 accum_general
= &il
->_4965
.accum_stats
.general
.common
;
649 accum_dbg
= &il
->_4965
.accum_stats
.general
.common
.dbg
;
650 accum_div
= &il
->_4965
.accum_stats
.general
.common
.div
;
651 delta_general
= &il
->_4965
.delta_stats
.general
.common
;
652 max_general
= &il
->_4965
.max_delta
.general
.common
;
653 delta_dbg
= &il
->_4965
.delta_stats
.general
.common
.dbg
;
654 max_dbg
= &il
->_4965
.max_delta
.general
.common
.dbg
;
655 delta_div
= &il
->_4965
.delta_stats
.general
.common
.div
;
656 max_div
= &il
->_4965
.max_delta
.general
.common
.div
;
658 pos
+= il4965_stats_flag(il
, buf
, bufsz
);
660 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_header
,
661 "Statistics_General:");
663 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_value
, "temperature:",
664 le32_to_cpu(general
->temperature
));
666 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_value
, "ttl_timestamp:",
667 le32_to_cpu(general
->ttl_timestamp
));
669 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "burst_check:",
670 le32_to_cpu(dbg
->burst_check
), accum_dbg
->burst_check
,
671 delta_dbg
->burst_check
, max_dbg
->burst_check
);
673 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "burst_count:",
674 le32_to_cpu(dbg
->burst_count
), accum_dbg
->burst_count
,
675 delta_dbg
->burst_count
, max_dbg
->burst_count
);
677 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
,
678 "wait_for_silence_timeout_count:",
679 le32_to_cpu(dbg
->wait_for_silence_timeout_cnt
),
680 accum_dbg
->wait_for_silence_timeout_cnt
,
681 delta_dbg
->wait_for_silence_timeout_cnt
,
682 max_dbg
->wait_for_silence_timeout_cnt
);
684 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "sleep_time:",
685 le32_to_cpu(general
->sleep_time
),
686 accum_general
->sleep_time
, delta_general
->sleep_time
,
687 max_general
->sleep_time
);
689 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "slots_out:",
690 le32_to_cpu(general
->slots_out
), accum_general
->slots_out
,
691 delta_general
->slots_out
, max_general
->slots_out
);
693 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "slots_idle:",
694 le32_to_cpu(general
->slots_idle
),
695 accum_general
->slots_idle
, delta_general
->slots_idle
,
696 max_general
->slots_idle
);
698 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "tx_on_a:",
699 le32_to_cpu(div
->tx_on_a
), accum_div
->tx_on_a
,
700 delta_div
->tx_on_a
, max_div
->tx_on_a
);
702 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "tx_on_b:",
703 le32_to_cpu(div
->tx_on_b
), accum_div
->tx_on_b
,
704 delta_div
->tx_on_b
, max_div
->tx_on_b
);
706 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "exec_time:",
707 le32_to_cpu(div
->exec_time
), accum_div
->exec_time
,
708 delta_div
->exec_time
, max_div
->exec_time
);
710 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "probe_time:",
711 le32_to_cpu(div
->probe_time
), accum_div
->probe_time
,
712 delta_div
->probe_time
, max_div
->probe_time
);
714 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "rx_enable_counter:",
715 le32_to_cpu(general
->rx_enable_counter
),
716 accum_general
->rx_enable_counter
,
717 delta_general
->rx_enable_counter
,
718 max_general
->rx_enable_counter
);
720 scnprintf(buf
+ pos
, bufsz
- pos
, fmt_table
, "num_of_sos_states:",
721 le32_to_cpu(general
->num_of_sos_states
),
722 accum_general
->num_of_sos_states
,
723 delta_general
->num_of_sos_states
,
724 max_general
->num_of_sos_states
);
725 ret
= simple_read_from_buffer(user_buf
, count
, ppos
, buf
, pos
);
730 const struct il_debugfs_ops il4965_debugfs_ops
= {
731 .rx_stats_read
= il4965_ucode_rx_stats_read
,
732 .tx_stats_read
= il4965_ucode_tx_stats_read
,
733 .general_stats_read
= il4965_ucode_general_stats_read
,