Commit | Line | Data |
---|---|---|
b8c76267 | 1 | /****************************************************************************** |
901069c7 WYG |
2 | * |
3 | * GPL LICENSE SUMMARY | |
4 | * | |
5 | * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved. | |
6 | * | |
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. | |
10 | * | |
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. | |
15 | * | |
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, | |
19 | * USA | |
20 | * | |
21 | * The full GNU General Public License is included in this distribution | |
22 | * in the file called LICENSE.GPL. | |
23 | * | |
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 | *****************************************************************************/ | |
95b49ed0 | 28 | #include "iwl-agn.h" |
b8c76267 AK |
29 | #include "iwl-agn-debugfs.h" |
30 | ||
0b7e5e85 JS |
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"; | |
36 | ||
1d60a79e WYG |
37 | static int iwl_statistics_flag(struct iwl_priv *priv, char *buf, int bufsz) |
38 | { | |
39 | int p = 0; | |
7980fba5 | 40 | u32 flag; |
1d60a79e | 41 | |
0da0e5bf | 42 | flag = le32_to_cpu(priv->statistics.flag); |
7980fba5 WYG |
43 | |
44 | p += scnprintf(buf + p, bufsz - p, "Statistics Flag(0x%X):\n", flag); | |
45 | if (flag & UCODE_STATISTICS_CLEAR_MSK) | |
1d60a79e | 46 | p += scnprintf(buf + p, bufsz - p, |
7980fba5 | 47 | "\tStatistics have been cleared\n"); |
1d60a79e | 48 | p += scnprintf(buf + p, bufsz - p, "\tOperational Frequency: %s\n", |
7980fba5 WYG |
49 | (flag & UCODE_STATISTICS_FREQUENCY_MSK) |
50 | ? "2.4 GHz" : "5.2 GHz"); | |
1d60a79e | 51 | p += scnprintf(buf + p, bufsz - p, "\tTGj Narrow Band: %s\n", |
7980fba5 WYG |
52 | (flag & UCODE_STATISTICS_NARROW_BAND_MSK) |
53 | ? "enabled" : "disabled"); | |
54 | ||
1d60a79e WYG |
55 | return p; |
56 | } | |
57 | ||
b8c76267 AK |
58 | ssize_t iwl_ucode_rx_stats_read(struct file *file, char __user *user_buf, |
59 | size_t count, loff_t *ppos) | |
60 | { | |
61 | struct iwl_priv *priv = file->private_data; | |
62 | int pos = 0; | |
63 | char *buf; | |
64 | int bufsz = sizeof(struct statistics_rx_phy) * 40 + | |
65 | sizeof(struct statistics_rx_non_phy) * 40 + | |
66 | sizeof(struct statistics_rx_ht_phy) * 40 + 400; | |
67 | ssize_t ret; | |
68 | struct statistics_rx_phy *ofdm, *accum_ofdm, *delta_ofdm, *max_ofdm; | |
69 | struct statistics_rx_phy *cck, *accum_cck, *delta_cck, *max_cck; | |
70 | struct statistics_rx_non_phy *general, *accum_general; | |
71 | struct statistics_rx_non_phy *delta_general, *max_general; | |
72 | struct statistics_rx_ht_phy *ht, *accum_ht, *delta_ht, *max_ht; | |
73 | ||
74 | if (!iwl_is_alive(priv)) | |
75 | return -EAGAIN; | |
76 | ||
77 | buf = kzalloc(bufsz, GFP_KERNEL); | |
78 | if (!buf) { | |
79 | IWL_ERR(priv, "Can not allocate Buffer\n"); | |
80 | return -ENOMEM; | |
81 | } | |
82 | ||
83 | /* | |
84 | * the statistic information display here is based on | |
85 | * the last statistics notification from uCode | |
86 | * might not reflect the current uCode activity | |
87 | */ | |
0da0e5bf JB |
88 | ofdm = &priv->statistics.rx_ofdm; |
89 | cck = &priv->statistics.rx_cck; | |
90 | general = &priv->statistics.rx_non_phy; | |
91 | ht = &priv->statistics.rx_ofdm_ht; | |
92 | accum_ofdm = &priv->accum_stats.rx_ofdm; | |
93 | accum_cck = &priv->accum_stats.rx_cck; | |
94 | accum_general = &priv->accum_stats.rx_non_phy; | |
95 | accum_ht = &priv->accum_stats.rx_ofdm_ht; | |
96 | delta_ofdm = &priv->delta_stats.rx_ofdm; | |
97 | delta_cck = &priv->delta_stats.rx_cck; | |
98 | delta_general = &priv->delta_stats.rx_non_phy; | |
99 | delta_ht = &priv->delta_stats.rx_ofdm_ht; | |
100 | max_ofdm = &priv->max_delta_stats.rx_ofdm; | |
101 | max_cck = &priv->max_delta_stats.rx_cck; | |
102 | max_general = &priv->max_delta_stats.rx_non_phy; | |
103 | max_ht = &priv->max_delta_stats.rx_ofdm_ht; | |
b8c76267 | 104 | |
1d60a79e | 105 | pos += iwl_statistics_flag(priv, buf, bufsz); |
b8c76267 | 106 | pos += scnprintf(buf + pos, bufsz - pos, |
0b7e5e85 JS |
107 | fmt_header, "Statistics_Rx - OFDM:"); |
108 | pos += scnprintf(buf + pos, bufsz - pos, | |
109 | fmt_table, "ina_cnt:", | |
110 | le32_to_cpu(ofdm->ina_cnt), | |
b8c76267 AK |
111 | accum_ofdm->ina_cnt, |
112 | delta_ofdm->ina_cnt, max_ofdm->ina_cnt); | |
113 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 114 | fmt_table, "fina_cnt:", |
b8c76267 AK |
115 | le32_to_cpu(ofdm->fina_cnt), accum_ofdm->fina_cnt, |
116 | delta_ofdm->fina_cnt, max_ofdm->fina_cnt); | |
117 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 118 | fmt_table, "plcp_err:", |
b8c76267 AK |
119 | le32_to_cpu(ofdm->plcp_err), accum_ofdm->plcp_err, |
120 | delta_ofdm->plcp_err, max_ofdm->plcp_err); | |
121 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 122 | fmt_table, "crc32_err:", |
b8c76267 AK |
123 | le32_to_cpu(ofdm->crc32_err), accum_ofdm->crc32_err, |
124 | delta_ofdm->crc32_err, max_ofdm->crc32_err); | |
125 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 126 | fmt_table, "overrun_err:", |
b8c76267 AK |
127 | le32_to_cpu(ofdm->overrun_err), |
128 | accum_ofdm->overrun_err, delta_ofdm->overrun_err, | |
129 | max_ofdm->overrun_err); | |
130 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 131 | fmt_table, "early_overrun_err:", |
b8c76267 AK |
132 | le32_to_cpu(ofdm->early_overrun_err), |
133 | accum_ofdm->early_overrun_err, | |
134 | delta_ofdm->early_overrun_err, | |
135 | max_ofdm->early_overrun_err); | |
136 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 JS |
137 | fmt_table, "crc32_good:", |
138 | le32_to_cpu(ofdm->crc32_good), | |
b8c76267 AK |
139 | accum_ofdm->crc32_good, delta_ofdm->crc32_good, |
140 | max_ofdm->crc32_good); | |
141 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 142 | fmt_table, "false_alarm_cnt:", |
b8c76267 AK |
143 | le32_to_cpu(ofdm->false_alarm_cnt), |
144 | accum_ofdm->false_alarm_cnt, | |
145 | delta_ofdm->false_alarm_cnt, | |
146 | max_ofdm->false_alarm_cnt); | |
147 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 148 | fmt_table, "fina_sync_err_cnt:", |
b8c76267 AK |
149 | le32_to_cpu(ofdm->fina_sync_err_cnt), |
150 | accum_ofdm->fina_sync_err_cnt, | |
151 | delta_ofdm->fina_sync_err_cnt, | |
152 | max_ofdm->fina_sync_err_cnt); | |
153 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 154 | fmt_table, "sfd_timeout:", |
b8c76267 AK |
155 | le32_to_cpu(ofdm->sfd_timeout), |
156 | accum_ofdm->sfd_timeout, delta_ofdm->sfd_timeout, | |
157 | max_ofdm->sfd_timeout); | |
158 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 159 | fmt_table, "fina_timeout:", |
b8c76267 AK |
160 | le32_to_cpu(ofdm->fina_timeout), |
161 | accum_ofdm->fina_timeout, delta_ofdm->fina_timeout, | |
162 | max_ofdm->fina_timeout); | |
163 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 164 | fmt_table, "unresponded_rts:", |
b8c76267 AK |
165 | le32_to_cpu(ofdm->unresponded_rts), |
166 | accum_ofdm->unresponded_rts, | |
167 | delta_ofdm->unresponded_rts, | |
168 | max_ofdm->unresponded_rts); | |
169 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 170 | fmt_table, "rxe_frame_lmt_ovrun:", |
b8c76267 AK |
171 | le32_to_cpu(ofdm->rxe_frame_limit_overrun), |
172 | accum_ofdm->rxe_frame_limit_overrun, | |
173 | delta_ofdm->rxe_frame_limit_overrun, | |
174 | max_ofdm->rxe_frame_limit_overrun); | |
175 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 176 | fmt_table, "sent_ack_cnt:", |
b8c76267 AK |
177 | le32_to_cpu(ofdm->sent_ack_cnt), |
178 | accum_ofdm->sent_ack_cnt, delta_ofdm->sent_ack_cnt, | |
179 | max_ofdm->sent_ack_cnt); | |
180 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 181 | fmt_table, "sent_cts_cnt:", |
b8c76267 AK |
182 | le32_to_cpu(ofdm->sent_cts_cnt), |
183 | accum_ofdm->sent_cts_cnt, delta_ofdm->sent_cts_cnt, | |
184 | max_ofdm->sent_cts_cnt); | |
185 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 186 | fmt_table, "sent_ba_rsp_cnt:", |
b8c76267 AK |
187 | le32_to_cpu(ofdm->sent_ba_rsp_cnt), |
188 | accum_ofdm->sent_ba_rsp_cnt, | |
189 | delta_ofdm->sent_ba_rsp_cnt, | |
190 | max_ofdm->sent_ba_rsp_cnt); | |
191 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 192 | fmt_table, "dsp_self_kill:", |
b8c76267 AK |
193 | le32_to_cpu(ofdm->dsp_self_kill), |
194 | accum_ofdm->dsp_self_kill, | |
195 | delta_ofdm->dsp_self_kill, | |
196 | max_ofdm->dsp_self_kill); | |
197 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 198 | fmt_table, "mh_format_err:", |
b8c76267 AK |
199 | le32_to_cpu(ofdm->mh_format_err), |
200 | accum_ofdm->mh_format_err, | |
201 | delta_ofdm->mh_format_err, | |
202 | max_ofdm->mh_format_err); | |
203 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 204 | fmt_table, "re_acq_main_rssi_sum:", |
b8c76267 AK |
205 | le32_to_cpu(ofdm->re_acq_main_rssi_sum), |
206 | accum_ofdm->re_acq_main_rssi_sum, | |
207 | delta_ofdm->re_acq_main_rssi_sum, | |
208 | max_ofdm->re_acq_main_rssi_sum); | |
209 | ||
b8c76267 | 210 | pos += scnprintf(buf + pos, bufsz - pos, |
0b7e5e85 JS |
211 | fmt_header, "Statistics_Rx - CCK:"); |
212 | pos += scnprintf(buf + pos, bufsz - pos, | |
213 | fmt_table, "ina_cnt:", | |
b8c76267 AK |
214 | le32_to_cpu(cck->ina_cnt), accum_cck->ina_cnt, |
215 | delta_cck->ina_cnt, max_cck->ina_cnt); | |
216 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 217 | fmt_table, "fina_cnt:", |
b8c76267 AK |
218 | le32_to_cpu(cck->fina_cnt), accum_cck->fina_cnt, |
219 | delta_cck->fina_cnt, max_cck->fina_cnt); | |
220 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 221 | fmt_table, "plcp_err:", |
b8c76267 AK |
222 | le32_to_cpu(cck->plcp_err), accum_cck->plcp_err, |
223 | delta_cck->plcp_err, max_cck->plcp_err); | |
224 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 225 | fmt_table, "crc32_err:", |
b8c76267 AK |
226 | le32_to_cpu(cck->crc32_err), accum_cck->crc32_err, |
227 | delta_cck->crc32_err, max_cck->crc32_err); | |
228 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 229 | fmt_table, "overrun_err:", |
b8c76267 AK |
230 | le32_to_cpu(cck->overrun_err), |
231 | accum_cck->overrun_err, delta_cck->overrun_err, | |
232 | max_cck->overrun_err); | |
233 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 234 | fmt_table, "early_overrun_err:", |
b8c76267 AK |
235 | le32_to_cpu(cck->early_overrun_err), |
236 | accum_cck->early_overrun_err, | |
237 | delta_cck->early_overrun_err, | |
238 | max_cck->early_overrun_err); | |
239 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 240 | fmt_table, "crc32_good:", |
b8c76267 AK |
241 | le32_to_cpu(cck->crc32_good), accum_cck->crc32_good, |
242 | delta_cck->crc32_good, max_cck->crc32_good); | |
243 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 244 | fmt_table, "false_alarm_cnt:", |
b8c76267 AK |
245 | le32_to_cpu(cck->false_alarm_cnt), |
246 | accum_cck->false_alarm_cnt, | |
247 | delta_cck->false_alarm_cnt, max_cck->false_alarm_cnt); | |
248 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 249 | fmt_table, "fina_sync_err_cnt:", |
b8c76267 AK |
250 | le32_to_cpu(cck->fina_sync_err_cnt), |
251 | accum_cck->fina_sync_err_cnt, | |
252 | delta_cck->fina_sync_err_cnt, | |
253 | max_cck->fina_sync_err_cnt); | |
254 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 255 | fmt_table, "sfd_timeout:", |
b8c76267 AK |
256 | le32_to_cpu(cck->sfd_timeout), |
257 | accum_cck->sfd_timeout, delta_cck->sfd_timeout, | |
258 | max_cck->sfd_timeout); | |
259 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 260 | fmt_table, "fina_timeout:", |
b8c76267 AK |
261 | le32_to_cpu(cck->fina_timeout), |
262 | accum_cck->fina_timeout, delta_cck->fina_timeout, | |
263 | max_cck->fina_timeout); | |
264 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 265 | fmt_table, "unresponded_rts:", |
b8c76267 AK |
266 | le32_to_cpu(cck->unresponded_rts), |
267 | accum_cck->unresponded_rts, delta_cck->unresponded_rts, | |
268 | max_cck->unresponded_rts); | |
269 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 270 | fmt_table, "rxe_frame_lmt_ovrun:", |
b8c76267 AK |
271 | le32_to_cpu(cck->rxe_frame_limit_overrun), |
272 | accum_cck->rxe_frame_limit_overrun, | |
273 | delta_cck->rxe_frame_limit_overrun, | |
274 | max_cck->rxe_frame_limit_overrun); | |
275 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 276 | fmt_table, "sent_ack_cnt:", |
b8c76267 AK |
277 | le32_to_cpu(cck->sent_ack_cnt), |
278 | accum_cck->sent_ack_cnt, delta_cck->sent_ack_cnt, | |
279 | max_cck->sent_ack_cnt); | |
280 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 281 | fmt_table, "sent_cts_cnt:", |
b8c76267 AK |
282 | le32_to_cpu(cck->sent_cts_cnt), |
283 | accum_cck->sent_cts_cnt, delta_cck->sent_cts_cnt, | |
284 | max_cck->sent_cts_cnt); | |
285 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 286 | fmt_table, "sent_ba_rsp_cnt:", |
b8c76267 AK |
287 | le32_to_cpu(cck->sent_ba_rsp_cnt), |
288 | accum_cck->sent_ba_rsp_cnt, | |
289 | delta_cck->sent_ba_rsp_cnt, | |
290 | max_cck->sent_ba_rsp_cnt); | |
291 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 292 | fmt_table, "dsp_self_kill:", |
b8c76267 AK |
293 | le32_to_cpu(cck->dsp_self_kill), |
294 | accum_cck->dsp_self_kill, delta_cck->dsp_self_kill, | |
295 | max_cck->dsp_self_kill); | |
296 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 297 | fmt_table, "mh_format_err:", |
b8c76267 AK |
298 | le32_to_cpu(cck->mh_format_err), |
299 | accum_cck->mh_format_err, delta_cck->mh_format_err, | |
300 | max_cck->mh_format_err); | |
301 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 302 | fmt_table, "re_acq_main_rssi_sum:", |
b8c76267 AK |
303 | le32_to_cpu(cck->re_acq_main_rssi_sum), |
304 | accum_cck->re_acq_main_rssi_sum, | |
305 | delta_cck->re_acq_main_rssi_sum, | |
306 | max_cck->re_acq_main_rssi_sum); | |
307 | ||
b8c76267 | 308 | pos += scnprintf(buf + pos, bufsz - pos, |
0b7e5e85 JS |
309 | fmt_header, "Statistics_Rx - GENERAL:"); |
310 | pos += scnprintf(buf + pos, bufsz - pos, | |
311 | fmt_table, "bogus_cts:", | |
b8c76267 AK |
312 | le32_to_cpu(general->bogus_cts), |
313 | accum_general->bogus_cts, delta_general->bogus_cts, | |
314 | max_general->bogus_cts); | |
315 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 316 | fmt_table, "bogus_ack:", |
b8c76267 AK |
317 | le32_to_cpu(general->bogus_ack), |
318 | accum_general->bogus_ack, delta_general->bogus_ack, | |
319 | max_general->bogus_ack); | |
320 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 321 | fmt_table, "non_bssid_frames:", |
b8c76267 AK |
322 | le32_to_cpu(general->non_bssid_frames), |
323 | accum_general->non_bssid_frames, | |
324 | delta_general->non_bssid_frames, | |
325 | max_general->non_bssid_frames); | |
326 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 327 | fmt_table, "filtered_frames:", |
b8c76267 AK |
328 | le32_to_cpu(general->filtered_frames), |
329 | accum_general->filtered_frames, | |
330 | delta_general->filtered_frames, | |
331 | max_general->filtered_frames); | |
332 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 333 | fmt_table, "non_channel_beacons:", |
b8c76267 AK |
334 | le32_to_cpu(general->non_channel_beacons), |
335 | accum_general->non_channel_beacons, | |
336 | delta_general->non_channel_beacons, | |
337 | max_general->non_channel_beacons); | |
338 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 339 | fmt_table, "channel_beacons:", |
b8c76267 AK |
340 | le32_to_cpu(general->channel_beacons), |
341 | accum_general->channel_beacons, | |
342 | delta_general->channel_beacons, | |
343 | max_general->channel_beacons); | |
344 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 345 | fmt_table, "num_missed_bcon:", |
b8c76267 AK |
346 | le32_to_cpu(general->num_missed_bcon), |
347 | accum_general->num_missed_bcon, | |
348 | delta_general->num_missed_bcon, | |
349 | max_general->num_missed_bcon); | |
350 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 351 | fmt_table, "adc_rx_saturation_time:", |
b8c76267 AK |
352 | le32_to_cpu(general->adc_rx_saturation_time), |
353 | accum_general->adc_rx_saturation_time, | |
354 | delta_general->adc_rx_saturation_time, | |
355 | max_general->adc_rx_saturation_time); | |
356 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 357 | fmt_table, "ina_detect_search_tm:", |
b8c76267 AK |
358 | le32_to_cpu(general->ina_detection_search_time), |
359 | accum_general->ina_detection_search_time, | |
360 | delta_general->ina_detection_search_time, | |
361 | max_general->ina_detection_search_time); | |
362 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 363 | fmt_table, "beacon_silence_rssi_a:", |
b8c76267 AK |
364 | le32_to_cpu(general->beacon_silence_rssi_a), |
365 | accum_general->beacon_silence_rssi_a, | |
366 | delta_general->beacon_silence_rssi_a, | |
367 | max_general->beacon_silence_rssi_a); | |
368 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 369 | fmt_table, "beacon_silence_rssi_b:", |
b8c76267 AK |
370 | le32_to_cpu(general->beacon_silence_rssi_b), |
371 | accum_general->beacon_silence_rssi_b, | |
372 | delta_general->beacon_silence_rssi_b, | |
373 | max_general->beacon_silence_rssi_b); | |
374 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 375 | fmt_table, "beacon_silence_rssi_c:", |
b8c76267 AK |
376 | le32_to_cpu(general->beacon_silence_rssi_c), |
377 | accum_general->beacon_silence_rssi_c, | |
378 | delta_general->beacon_silence_rssi_c, | |
379 | max_general->beacon_silence_rssi_c); | |
380 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 381 | fmt_table, "interference_data_flag:", |
b8c76267 AK |
382 | le32_to_cpu(general->interference_data_flag), |
383 | accum_general->interference_data_flag, | |
384 | delta_general->interference_data_flag, | |
385 | max_general->interference_data_flag); | |
386 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 387 | fmt_table, "channel_load:", |
b8c76267 AK |
388 | le32_to_cpu(general->channel_load), |
389 | accum_general->channel_load, | |
390 | delta_general->channel_load, | |
391 | max_general->channel_load); | |
392 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 393 | fmt_table, "dsp_false_alarms:", |
b8c76267 AK |
394 | le32_to_cpu(general->dsp_false_alarms), |
395 | accum_general->dsp_false_alarms, | |
396 | delta_general->dsp_false_alarms, | |
397 | max_general->dsp_false_alarms); | |
398 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 399 | fmt_table, "beacon_rssi_a:", |
b8c76267 AK |
400 | le32_to_cpu(general->beacon_rssi_a), |
401 | accum_general->beacon_rssi_a, | |
402 | delta_general->beacon_rssi_a, | |
403 | max_general->beacon_rssi_a); | |
404 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 405 | fmt_table, "beacon_rssi_b:", |
b8c76267 AK |
406 | le32_to_cpu(general->beacon_rssi_b), |
407 | accum_general->beacon_rssi_b, | |
408 | delta_general->beacon_rssi_b, | |
409 | max_general->beacon_rssi_b); | |
410 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 411 | fmt_table, "beacon_rssi_c:", |
b8c76267 AK |
412 | le32_to_cpu(general->beacon_rssi_c), |
413 | accum_general->beacon_rssi_c, | |
414 | delta_general->beacon_rssi_c, | |
415 | max_general->beacon_rssi_c); | |
416 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 417 | fmt_table, "beacon_energy_a:", |
b8c76267 AK |
418 | le32_to_cpu(general->beacon_energy_a), |
419 | accum_general->beacon_energy_a, | |
420 | delta_general->beacon_energy_a, | |
421 | max_general->beacon_energy_a); | |
422 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 423 | fmt_table, "beacon_energy_b:", |
b8c76267 AK |
424 | le32_to_cpu(general->beacon_energy_b), |
425 | accum_general->beacon_energy_b, | |
426 | delta_general->beacon_energy_b, | |
427 | max_general->beacon_energy_b); | |
428 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 429 | fmt_table, "beacon_energy_c:", |
b8c76267 AK |
430 | le32_to_cpu(general->beacon_energy_c), |
431 | accum_general->beacon_energy_c, | |
432 | delta_general->beacon_energy_c, | |
433 | max_general->beacon_energy_c); | |
434 | ||
b8c76267 | 435 | pos += scnprintf(buf + pos, bufsz - pos, |
0b7e5e85 JS |
436 | fmt_header, "Statistics_Rx - OFDM_HT:"); |
437 | pos += scnprintf(buf + pos, bufsz - pos, | |
438 | fmt_table, "plcp_err:", | |
b8c76267 AK |
439 | le32_to_cpu(ht->plcp_err), accum_ht->plcp_err, |
440 | delta_ht->plcp_err, max_ht->plcp_err); | |
441 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 442 | fmt_table, "overrun_err:", |
b8c76267 AK |
443 | le32_to_cpu(ht->overrun_err), accum_ht->overrun_err, |
444 | delta_ht->overrun_err, max_ht->overrun_err); | |
445 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 446 | fmt_table, "early_overrun_err:", |
b8c76267 AK |
447 | le32_to_cpu(ht->early_overrun_err), |
448 | accum_ht->early_overrun_err, | |
449 | delta_ht->early_overrun_err, | |
450 | max_ht->early_overrun_err); | |
451 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 452 | fmt_table, "crc32_good:", |
b8c76267 AK |
453 | le32_to_cpu(ht->crc32_good), accum_ht->crc32_good, |
454 | delta_ht->crc32_good, max_ht->crc32_good); | |
455 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 456 | fmt_table, "crc32_err:", |
b8c76267 AK |
457 | le32_to_cpu(ht->crc32_err), accum_ht->crc32_err, |
458 | delta_ht->crc32_err, max_ht->crc32_err); | |
459 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 460 | fmt_table, "mh_format_err:", |
b8c76267 AK |
461 | le32_to_cpu(ht->mh_format_err), |
462 | accum_ht->mh_format_err, | |
463 | delta_ht->mh_format_err, max_ht->mh_format_err); | |
464 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 465 | fmt_table, "agg_crc32_good:", |
b8c76267 AK |
466 | le32_to_cpu(ht->agg_crc32_good), |
467 | accum_ht->agg_crc32_good, | |
468 | delta_ht->agg_crc32_good, max_ht->agg_crc32_good); | |
469 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 470 | fmt_table, "agg_mpdu_cnt:", |
b8c76267 AK |
471 | le32_to_cpu(ht->agg_mpdu_cnt), |
472 | accum_ht->agg_mpdu_cnt, | |
473 | delta_ht->agg_mpdu_cnt, max_ht->agg_mpdu_cnt); | |
474 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 475 | fmt_table, "agg_cnt:", |
b8c76267 AK |
476 | le32_to_cpu(ht->agg_cnt), accum_ht->agg_cnt, |
477 | delta_ht->agg_cnt, max_ht->agg_cnt); | |
478 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 479 | fmt_table, "unsupport_mcs:", |
b8c76267 AK |
480 | le32_to_cpu(ht->unsupport_mcs), |
481 | accum_ht->unsupport_mcs, | |
482 | delta_ht->unsupport_mcs, max_ht->unsupport_mcs); | |
483 | ||
484 | ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); | |
485 | kfree(buf); | |
486 | return ret; | |
487 | } | |
488 | ||
489 | ssize_t iwl_ucode_tx_stats_read(struct file *file, | |
490 | char __user *user_buf, | |
491 | size_t count, loff_t *ppos) | |
492 | { | |
493 | struct iwl_priv *priv = file->private_data; | |
494 | int pos = 0; | |
495 | char *buf; | |
496 | int bufsz = (sizeof(struct statistics_tx) * 48) + 250; | |
497 | ssize_t ret; | |
498 | struct statistics_tx *tx, *accum_tx, *delta_tx, *max_tx; | |
499 | ||
500 | if (!iwl_is_alive(priv)) | |
501 | return -EAGAIN; | |
502 | ||
503 | buf = kzalloc(bufsz, GFP_KERNEL); | |
504 | if (!buf) { | |
505 | IWL_ERR(priv, "Can not allocate Buffer\n"); | |
506 | return -ENOMEM; | |
507 | } | |
508 | ||
509 | /* the statistic information display here is based on | |
0da0e5bf JB |
510 | * the last statistics notification from uCode |
511 | * might not reflect the current uCode activity | |
512 | */ | |
513 | tx = &priv->statistics.tx; | |
514 | accum_tx = &priv->accum_stats.tx; | |
515 | delta_tx = &priv->delta_stats.tx; | |
516 | max_tx = &priv->max_delta_stats.tx; | |
7980fba5 | 517 | |
1d60a79e | 518 | pos += iwl_statistics_flag(priv, buf, bufsz); |
b8c76267 | 519 | pos += scnprintf(buf + pos, bufsz - pos, |
0b7e5e85 JS |
520 | fmt_header, "Statistics_Tx:"); |
521 | pos += scnprintf(buf + pos, bufsz - pos, | |
522 | fmt_table, "preamble:", | |
b8c76267 AK |
523 | le32_to_cpu(tx->preamble_cnt), |
524 | accum_tx->preamble_cnt, | |
525 | delta_tx->preamble_cnt, max_tx->preamble_cnt); | |
526 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 527 | fmt_table, "rx_detected_cnt:", |
b8c76267 AK |
528 | le32_to_cpu(tx->rx_detected_cnt), |
529 | accum_tx->rx_detected_cnt, | |
530 | delta_tx->rx_detected_cnt, max_tx->rx_detected_cnt); | |
531 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 532 | fmt_table, "bt_prio_defer_cnt:", |
b8c76267 AK |
533 | le32_to_cpu(tx->bt_prio_defer_cnt), |
534 | accum_tx->bt_prio_defer_cnt, | |
535 | delta_tx->bt_prio_defer_cnt, | |
536 | max_tx->bt_prio_defer_cnt); | |
537 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 538 | fmt_table, "bt_prio_kill_cnt:", |
b8c76267 AK |
539 | le32_to_cpu(tx->bt_prio_kill_cnt), |
540 | accum_tx->bt_prio_kill_cnt, | |
541 | delta_tx->bt_prio_kill_cnt, | |
542 | max_tx->bt_prio_kill_cnt); | |
543 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 544 | fmt_table, "few_bytes_cnt:", |
b8c76267 AK |
545 | le32_to_cpu(tx->few_bytes_cnt), |
546 | accum_tx->few_bytes_cnt, | |
547 | delta_tx->few_bytes_cnt, max_tx->few_bytes_cnt); | |
548 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 549 | fmt_table, "cts_timeout:", |
b8c76267 AK |
550 | le32_to_cpu(tx->cts_timeout), accum_tx->cts_timeout, |
551 | delta_tx->cts_timeout, max_tx->cts_timeout); | |
552 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 553 | fmt_table, "ack_timeout:", |
b8c76267 AK |
554 | le32_to_cpu(tx->ack_timeout), |
555 | accum_tx->ack_timeout, | |
556 | delta_tx->ack_timeout, max_tx->ack_timeout); | |
557 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 558 | fmt_table, "expected_ack_cnt:", |
b8c76267 AK |
559 | le32_to_cpu(tx->expected_ack_cnt), |
560 | accum_tx->expected_ack_cnt, | |
561 | delta_tx->expected_ack_cnt, | |
562 | max_tx->expected_ack_cnt); | |
563 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 564 | fmt_table, "actual_ack_cnt:", |
b8c76267 AK |
565 | le32_to_cpu(tx->actual_ack_cnt), |
566 | accum_tx->actual_ack_cnt, | |
567 | delta_tx->actual_ack_cnt, | |
568 | max_tx->actual_ack_cnt); | |
569 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 570 | fmt_table, "dump_msdu_cnt:", |
b8c76267 AK |
571 | le32_to_cpu(tx->dump_msdu_cnt), |
572 | accum_tx->dump_msdu_cnt, | |
573 | delta_tx->dump_msdu_cnt, | |
574 | max_tx->dump_msdu_cnt); | |
575 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 576 | fmt_table, "abort_nxt_frame_mismatch:", |
b8c76267 AK |
577 | le32_to_cpu(tx->burst_abort_next_frame_mismatch_cnt), |
578 | accum_tx->burst_abort_next_frame_mismatch_cnt, | |
579 | delta_tx->burst_abort_next_frame_mismatch_cnt, | |
580 | max_tx->burst_abort_next_frame_mismatch_cnt); | |
581 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 582 | fmt_table, "abort_missing_nxt_frame:", |
b8c76267 AK |
583 | le32_to_cpu(tx->burst_abort_missing_next_frame_cnt), |
584 | accum_tx->burst_abort_missing_next_frame_cnt, | |
585 | delta_tx->burst_abort_missing_next_frame_cnt, | |
586 | max_tx->burst_abort_missing_next_frame_cnt); | |
587 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 588 | fmt_table, "cts_timeout_collision:", |
b8c76267 AK |
589 | le32_to_cpu(tx->cts_timeout_collision), |
590 | accum_tx->cts_timeout_collision, | |
591 | delta_tx->cts_timeout_collision, | |
592 | max_tx->cts_timeout_collision); | |
593 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 594 | fmt_table, "ack_ba_timeout_collision:", |
b8c76267 AK |
595 | le32_to_cpu(tx->ack_or_ba_timeout_collision), |
596 | accum_tx->ack_or_ba_timeout_collision, | |
597 | delta_tx->ack_or_ba_timeout_collision, | |
598 | max_tx->ack_or_ba_timeout_collision); | |
599 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 600 | fmt_table, "agg ba_timeout:", |
b8c76267 AK |
601 | le32_to_cpu(tx->agg.ba_timeout), |
602 | accum_tx->agg.ba_timeout, | |
603 | delta_tx->agg.ba_timeout, | |
604 | max_tx->agg.ba_timeout); | |
605 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 606 | fmt_table, "agg ba_resched_frames:", |
b8c76267 AK |
607 | le32_to_cpu(tx->agg.ba_reschedule_frames), |
608 | accum_tx->agg.ba_reschedule_frames, | |
609 | delta_tx->agg.ba_reschedule_frames, | |
610 | max_tx->agg.ba_reschedule_frames); | |
611 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 612 | fmt_table, "agg scd_query_agg_frame:", |
b8c76267 AK |
613 | le32_to_cpu(tx->agg.scd_query_agg_frame_cnt), |
614 | accum_tx->agg.scd_query_agg_frame_cnt, | |
615 | delta_tx->agg.scd_query_agg_frame_cnt, | |
616 | max_tx->agg.scd_query_agg_frame_cnt); | |
617 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 618 | fmt_table, "agg scd_query_no_agg:", |
b8c76267 AK |
619 | le32_to_cpu(tx->agg.scd_query_no_agg), |
620 | accum_tx->agg.scd_query_no_agg, | |
621 | delta_tx->agg.scd_query_no_agg, | |
622 | max_tx->agg.scd_query_no_agg); | |
623 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 624 | fmt_table, "agg scd_query_agg:", |
b8c76267 AK |
625 | le32_to_cpu(tx->agg.scd_query_agg), |
626 | accum_tx->agg.scd_query_agg, | |
627 | delta_tx->agg.scd_query_agg, | |
628 | max_tx->agg.scd_query_agg); | |
629 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 630 | fmt_table, "agg scd_query_mismatch:", |
b8c76267 AK |
631 | le32_to_cpu(tx->agg.scd_query_mismatch), |
632 | accum_tx->agg.scd_query_mismatch, | |
633 | delta_tx->agg.scd_query_mismatch, | |
634 | max_tx->agg.scd_query_mismatch); | |
635 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 636 | fmt_table, "agg frame_not_ready:", |
b8c76267 AK |
637 | le32_to_cpu(tx->agg.frame_not_ready), |
638 | accum_tx->agg.frame_not_ready, | |
639 | delta_tx->agg.frame_not_ready, | |
640 | max_tx->agg.frame_not_ready); | |
641 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 642 | fmt_table, "agg underrun:", |
b8c76267 AK |
643 | le32_to_cpu(tx->agg.underrun), |
644 | accum_tx->agg.underrun, | |
645 | delta_tx->agg.underrun, max_tx->agg.underrun); | |
646 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 647 | fmt_table, "agg bt_prio_kill:", |
b8c76267 AK |
648 | le32_to_cpu(tx->agg.bt_prio_kill), |
649 | accum_tx->agg.bt_prio_kill, | |
650 | delta_tx->agg.bt_prio_kill, | |
651 | max_tx->agg.bt_prio_kill); | |
652 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 653 | fmt_table, "agg rx_ba_rsp_cnt:", |
b8c76267 AK |
654 | le32_to_cpu(tx->agg.rx_ba_rsp_cnt), |
655 | accum_tx->agg.rx_ba_rsp_cnt, | |
656 | delta_tx->agg.rx_ba_rsp_cnt, | |
657 | max_tx->agg.rx_ba_rsp_cnt); | |
658 | ||
470356b8 WYG |
659 | if (tx->tx_power.ant_a || tx->tx_power.ant_b || tx->tx_power.ant_c) { |
660 | pos += scnprintf(buf + pos, bufsz - pos, | |
661 | "tx power: (1/2 dB step)\n"); | |
662 | if ((priv->cfg->valid_tx_ant & ANT_A) && tx->tx_power.ant_a) | |
663 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 664 | fmt_hex, "antenna A:", |
470356b8 WYG |
665 | tx->tx_power.ant_a); |
666 | if ((priv->cfg->valid_tx_ant & ANT_B) && tx->tx_power.ant_b) | |
667 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 668 | fmt_hex, "antenna B:", |
470356b8 WYG |
669 | tx->tx_power.ant_b); |
670 | if ((priv->cfg->valid_tx_ant & ANT_C) && tx->tx_power.ant_c) | |
671 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 672 | fmt_hex, "antenna C:", |
470356b8 WYG |
673 | tx->tx_power.ant_c); |
674 | } | |
b8c76267 AK |
675 | ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); |
676 | kfree(buf); | |
677 | return ret; | |
678 | } | |
679 | ||
680 | ssize_t iwl_ucode_general_stats_read(struct file *file, char __user *user_buf, | |
681 | size_t count, loff_t *ppos) | |
682 | { | |
683 | struct iwl_priv *priv = file->private_data; | |
684 | int pos = 0; | |
685 | char *buf; | |
686 | int bufsz = sizeof(struct statistics_general) * 10 + 300; | |
687 | ssize_t ret; | |
325322ee WYG |
688 | struct statistics_general_common *general, *accum_general; |
689 | struct statistics_general_common *delta_general, *max_general; | |
b8c76267 AK |
690 | struct statistics_dbg *dbg, *accum_dbg, *delta_dbg, *max_dbg; |
691 | struct statistics_div *div, *accum_div, *delta_div, *max_div; | |
692 | ||
693 | if (!iwl_is_alive(priv)) | |
694 | return -EAGAIN; | |
695 | ||
696 | buf = kzalloc(bufsz, GFP_KERNEL); | |
697 | if (!buf) { | |
698 | IWL_ERR(priv, "Can not allocate Buffer\n"); | |
699 | return -ENOMEM; | |
700 | } | |
701 | ||
702 | /* the statistic information display here is based on | |
0da0e5bf JB |
703 | * the last statistics notification from uCode |
704 | * might not reflect the current uCode activity | |
705 | */ | |
706 | general = &priv->statistics.common; | |
707 | dbg = &priv->statistics.common.dbg; | |
708 | div = &priv->statistics.common.div; | |
709 | accum_general = &priv->accum_stats.common; | |
710 | accum_dbg = &priv->accum_stats.common.dbg; | |
711 | accum_div = &priv->accum_stats.common.div; | |
712 | delta_general = &priv->delta_stats.common; | |
713 | max_general = &priv->max_delta_stats.common; | |
714 | delta_dbg = &priv->delta_stats.common.dbg; | |
715 | max_dbg = &priv->max_delta_stats.common.dbg; | |
716 | delta_div = &priv->delta_stats.common.div; | |
717 | max_div = &priv->max_delta_stats.common.div; | |
7980fba5 | 718 | |
1d60a79e | 719 | pos += iwl_statistics_flag(priv, buf, bufsz); |
0b7e5e85 JS |
720 | pos += scnprintf(buf + pos, bufsz - pos, |
721 | fmt_header, "Statistics_General:"); | |
722 | pos += scnprintf(buf + pos, bufsz - pos, | |
723 | fmt_value, "temperature:", | |
b8c76267 | 724 | le32_to_cpu(general->temperature)); |
0b7e5e85 JS |
725 | pos += scnprintf(buf + pos, bufsz - pos, |
726 | fmt_value, "temperature_m:", | |
b8c76267 AK |
727 | le32_to_cpu(general->temperature_m)); |
728 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 JS |
729 | fmt_value, "ttl_timestamp:", |
730 | le32_to_cpu(general->ttl_timestamp)); | |
731 | pos += scnprintf(buf + pos, bufsz - pos, | |
732 | fmt_table, "burst_check:", | |
b8c76267 AK |
733 | le32_to_cpu(dbg->burst_check), |
734 | accum_dbg->burst_check, | |
735 | delta_dbg->burst_check, max_dbg->burst_check); | |
736 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 737 | fmt_table, "burst_count:", |
b8c76267 AK |
738 | le32_to_cpu(dbg->burst_count), |
739 | accum_dbg->burst_count, | |
740 | delta_dbg->burst_count, max_dbg->burst_count); | |
9cae611f | 741 | pos += scnprintf(buf + pos, bufsz - pos, |
0b7e5e85 | 742 | fmt_table, "wait_for_silence_timeout_count:", |
9cae611f WYG |
743 | le32_to_cpu(dbg->wait_for_silence_timeout_cnt), |
744 | accum_dbg->wait_for_silence_timeout_cnt, | |
745 | delta_dbg->wait_for_silence_timeout_cnt, | |
746 | max_dbg->wait_for_silence_timeout_cnt); | |
b8c76267 | 747 | pos += scnprintf(buf + pos, bufsz - pos, |
0b7e5e85 | 748 | fmt_table, "sleep_time:", |
b8c76267 AK |
749 | le32_to_cpu(general->sleep_time), |
750 | accum_general->sleep_time, | |
751 | delta_general->sleep_time, max_general->sleep_time); | |
752 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 753 | fmt_table, "slots_out:", |
b8c76267 AK |
754 | le32_to_cpu(general->slots_out), |
755 | accum_general->slots_out, | |
756 | delta_general->slots_out, max_general->slots_out); | |
757 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 758 | fmt_table, "slots_idle:", |
b8c76267 AK |
759 | le32_to_cpu(general->slots_idle), |
760 | accum_general->slots_idle, | |
761 | delta_general->slots_idle, max_general->slots_idle); | |
b8c76267 | 762 | pos += scnprintf(buf + pos, bufsz - pos, |
0b7e5e85 | 763 | fmt_table, "tx_on_a:", |
b8c76267 AK |
764 | le32_to_cpu(div->tx_on_a), accum_div->tx_on_a, |
765 | delta_div->tx_on_a, max_div->tx_on_a); | |
766 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 767 | fmt_table, "tx_on_b:", |
b8c76267 AK |
768 | le32_to_cpu(div->tx_on_b), accum_div->tx_on_b, |
769 | delta_div->tx_on_b, max_div->tx_on_b); | |
770 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 771 | fmt_table, "exec_time:", |
b8c76267 AK |
772 | le32_to_cpu(div->exec_time), accum_div->exec_time, |
773 | delta_div->exec_time, max_div->exec_time); | |
774 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 775 | fmt_table, "probe_time:", |
b8c76267 AK |
776 | le32_to_cpu(div->probe_time), accum_div->probe_time, |
777 | delta_div->probe_time, max_div->probe_time); | |
778 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 779 | fmt_table, "rx_enable_counter:", |
b8c76267 AK |
780 | le32_to_cpu(general->rx_enable_counter), |
781 | accum_general->rx_enable_counter, | |
782 | delta_general->rx_enable_counter, | |
783 | max_general->rx_enable_counter); | |
784 | pos += scnprintf(buf + pos, bufsz - pos, | |
0b7e5e85 | 785 | fmt_table, "num_of_sos_states:", |
b8c76267 AK |
786 | le32_to_cpu(general->num_of_sos_states), |
787 | accum_general->num_of_sos_states, | |
788 | delta_general->num_of_sos_states, | |
789 | max_general->num_of_sos_states); | |
790 | ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); | |
791 | kfree(buf); | |
792 | return ret; | |
793 | } | |
ffb7d896 WYG |
794 | |
795 | ssize_t iwl_ucode_bt_stats_read(struct file *file, | |
796 | char __user *user_buf, | |
797 | size_t count, loff_t *ppos) | |
798 | { | |
799 | struct iwl_priv *priv = (struct iwl_priv *)file->private_data; | |
800 | int pos = 0; | |
801 | char *buf; | |
802 | int bufsz = (sizeof(struct statistics_bt_activity) * 24) + 200; | |
803 | ssize_t ret; | |
804 | struct statistics_bt_activity *bt, *accum_bt; | |
805 | ||
806 | if (!iwl_is_alive(priv)) | |
807 | return -EAGAIN; | |
808 | ||
f21dd005 WYG |
809 | if (!priv->bt_enable_flag) |
810 | return -EINVAL; | |
811 | ||
ffb7d896 WYG |
812 | /* make request to uCode to retrieve statistics information */ |
813 | mutex_lock(&priv->mutex); | |
814 | ret = iwl_send_statistics_request(priv, CMD_SYNC, false); | |
815 | mutex_unlock(&priv->mutex); | |
816 | ||
817 | if (ret) { | |
818 | IWL_ERR(priv, | |
819 | "Error sending statistics request: %zd\n", ret); | |
820 | return -EAGAIN; | |
821 | } | |
822 | buf = kzalloc(bufsz, GFP_KERNEL); | |
823 | if (!buf) { | |
824 | IWL_ERR(priv, "Can not allocate Buffer\n"); | |
825 | return -ENOMEM; | |
826 | } | |
827 | ||
828 | /* | |
829 | * the statistic information display here is based on | |
830 | * the last statistics notification from uCode | |
831 | * might not reflect the current uCode activity | |
832 | */ | |
0da0e5bf JB |
833 | bt = &priv->statistics.bt_activity; |
834 | accum_bt = &priv->accum_stats.bt_activity; | |
ffb7d896 WYG |
835 | |
836 | pos += iwl_statistics_flag(priv, buf, bufsz); | |
837 | pos += scnprintf(buf + pos, bufsz - pos, "Statistics_BT:\n"); | |
838 | pos += scnprintf(buf + pos, bufsz - pos, | |
839 | "\t\t\tcurrent\t\t\taccumulative\n"); | |
840 | pos += scnprintf(buf + pos, bufsz - pos, | |
841 | "hi_priority_tx_req_cnt:\t\t%u\t\t\t%u\n", | |
842 | le32_to_cpu(bt->hi_priority_tx_req_cnt), | |
843 | accum_bt->hi_priority_tx_req_cnt); | |
844 | pos += scnprintf(buf + pos, bufsz - pos, | |
845 | "hi_priority_tx_denied_cnt:\t%u\t\t\t%u\n", | |
846 | le32_to_cpu(bt->hi_priority_tx_denied_cnt), | |
847 | accum_bt->hi_priority_tx_denied_cnt); | |
848 | pos += scnprintf(buf + pos, bufsz - pos, | |
849 | "lo_priority_tx_req_cnt:\t\t%u\t\t\t%u\n", | |
850 | le32_to_cpu(bt->lo_priority_tx_req_cnt), | |
851 | accum_bt->lo_priority_tx_req_cnt); | |
852 | pos += scnprintf(buf + pos, bufsz - pos, | |
74dee2c3 | 853 | "lo_priority_tx_denied_cnt:\t%u\t\t\t%u\n", |
ffb7d896 WYG |
854 | le32_to_cpu(bt->lo_priority_tx_denied_cnt), |
855 | accum_bt->lo_priority_tx_denied_cnt); | |
856 | pos += scnprintf(buf + pos, bufsz - pos, | |
857 | "hi_priority_rx_req_cnt:\t\t%u\t\t\t%u\n", | |
858 | le32_to_cpu(bt->hi_priority_rx_req_cnt), | |
859 | accum_bt->hi_priority_rx_req_cnt); | |
860 | pos += scnprintf(buf + pos, bufsz - pos, | |
861 | "hi_priority_rx_denied_cnt:\t%u\t\t\t%u\n", | |
862 | le32_to_cpu(bt->hi_priority_rx_denied_cnt), | |
863 | accum_bt->hi_priority_rx_denied_cnt); | |
864 | pos += scnprintf(buf + pos, bufsz - pos, | |
865 | "lo_priority_rx_req_cnt:\t\t%u\t\t\t%u\n", | |
866 | le32_to_cpu(bt->lo_priority_rx_req_cnt), | |
867 | accum_bt->lo_priority_rx_req_cnt); | |
868 | pos += scnprintf(buf + pos, bufsz - pos, | |
869 | "lo_priority_rx_denied_cnt:\t%u\t\t\t%u\n", | |
870 | le32_to_cpu(bt->lo_priority_rx_denied_cnt), | |
871 | accum_bt->lo_priority_rx_denied_cnt); | |
872 | ||
873 | pos += scnprintf(buf + pos, bufsz - pos, | |
874 | "(rx)num_bt_kills:\t\t%u\t\t\t%u\n", | |
0da0e5bf JB |
875 | le32_to_cpu(priv->statistics.num_bt_kills), |
876 | priv->statistics.accum_num_bt_kills); | |
ffb7d896 WYG |
877 | |
878 | ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); | |
879 | kfree(buf); | |
880 | return ret; | |
881 | } | |
54a9aa65 WYG |
882 | |
883 | ssize_t iwl_reply_tx_error_read(struct file *file, | |
884 | char __user *user_buf, | |
885 | size_t count, loff_t *ppos) | |
886 | { | |
887 | struct iwl_priv *priv = (struct iwl_priv *)file->private_data; | |
888 | int pos = 0; | |
889 | char *buf; | |
95b49ed0 WYG |
890 | int bufsz = (sizeof(struct reply_tx_error_statistics) * 24) + |
891 | (sizeof(struct reply_agg_tx_error_statistics) * 24) + 200; | |
54a9aa65 WYG |
892 | ssize_t ret; |
893 | ||
894 | if (!iwl_is_alive(priv)) | |
895 | return -EAGAIN; | |
896 | ||
897 | buf = kzalloc(bufsz, GFP_KERNEL); | |
898 | if (!buf) { | |
899 | IWL_ERR(priv, "Can not allocate Buffer\n"); | |
900 | return -ENOMEM; | |
901 | } | |
902 | ||
903 | pos += scnprintf(buf + pos, bufsz - pos, "Statistics_TX_Error:\n"); | |
904 | pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t\t%u\n", | |
905 | iwl_get_tx_fail_reason(TX_STATUS_POSTPONE_DELAY), | |
906 | priv->_agn.reply_tx_stats.pp_delay); | |
907 | pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", | |
908 | iwl_get_tx_fail_reason(TX_STATUS_POSTPONE_FEW_BYTES), | |
909 | priv->_agn.reply_tx_stats.pp_few_bytes); | |
910 | pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", | |
911 | iwl_get_tx_fail_reason(TX_STATUS_POSTPONE_BT_PRIO), | |
912 | priv->_agn.reply_tx_stats.pp_bt_prio); | |
913 | pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", | |
914 | iwl_get_tx_fail_reason(TX_STATUS_POSTPONE_QUIET_PERIOD), | |
915 | priv->_agn.reply_tx_stats.pp_quiet_period); | |
916 | pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", | |
917 | iwl_get_tx_fail_reason(TX_STATUS_POSTPONE_CALC_TTAK), | |
918 | priv->_agn.reply_tx_stats.pp_calc_ttak); | |
919 | pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t%u\n", | |
920 | iwl_get_tx_fail_reason( | |
921 | TX_STATUS_FAIL_INTERNAL_CROSSED_RETRY), | |
922 | priv->_agn.reply_tx_stats.int_crossed_retry); | |
923 | pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", | |
924 | iwl_get_tx_fail_reason(TX_STATUS_FAIL_SHORT_LIMIT), | |
925 | priv->_agn.reply_tx_stats.short_limit); | |
926 | pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", | |
927 | iwl_get_tx_fail_reason(TX_STATUS_FAIL_LONG_LIMIT), | |
928 | priv->_agn.reply_tx_stats.long_limit); | |
929 | pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", | |
930 | iwl_get_tx_fail_reason(TX_STATUS_FAIL_FIFO_UNDERRUN), | |
931 | priv->_agn.reply_tx_stats.fifo_underrun); | |
932 | pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", | |
933 | iwl_get_tx_fail_reason(TX_STATUS_FAIL_DRAIN_FLOW), | |
934 | priv->_agn.reply_tx_stats.drain_flow); | |
935 | pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", | |
936 | iwl_get_tx_fail_reason(TX_STATUS_FAIL_RFKILL_FLUSH), | |
937 | priv->_agn.reply_tx_stats.rfkill_flush); | |
938 | pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", | |
939 | iwl_get_tx_fail_reason(TX_STATUS_FAIL_LIFE_EXPIRE), | |
940 | priv->_agn.reply_tx_stats.life_expire); | |
941 | pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", | |
942 | iwl_get_tx_fail_reason(TX_STATUS_FAIL_DEST_PS), | |
943 | priv->_agn.reply_tx_stats.dest_ps); | |
944 | pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", | |
945 | iwl_get_tx_fail_reason(TX_STATUS_FAIL_HOST_ABORTED), | |
946 | priv->_agn.reply_tx_stats.host_abort); | |
947 | pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", | |
948 | iwl_get_tx_fail_reason(TX_STATUS_FAIL_BT_RETRY), | |
949 | priv->_agn.reply_tx_stats.pp_delay); | |
950 | pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", | |
951 | iwl_get_tx_fail_reason(TX_STATUS_FAIL_STA_INVALID), | |
952 | priv->_agn.reply_tx_stats.sta_invalid); | |
953 | pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", | |
954 | iwl_get_tx_fail_reason(TX_STATUS_FAIL_FRAG_DROPPED), | |
955 | priv->_agn.reply_tx_stats.frag_drop); | |
956 | pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", | |
957 | iwl_get_tx_fail_reason(TX_STATUS_FAIL_TID_DISABLE), | |
958 | priv->_agn.reply_tx_stats.tid_disable); | |
959 | pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", | |
960 | iwl_get_tx_fail_reason(TX_STATUS_FAIL_FIFO_FLUSHED), | |
961 | priv->_agn.reply_tx_stats.fifo_flush); | |
962 | pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t%u\n", | |
963 | iwl_get_tx_fail_reason( | |
964 | TX_STATUS_FAIL_INSUFFICIENT_CF_POLL), | |
965 | priv->_agn.reply_tx_stats.insuff_cf_poll); | |
966 | pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", | |
1d270075 | 967 | iwl_get_tx_fail_reason(TX_STATUS_FAIL_PASSIVE_NO_RX), |
54a9aa65 | 968 | priv->_agn.reply_tx_stats.fail_hw_drop); |
1d270075 | 969 | pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t%u\n", |
54a9aa65 | 970 | iwl_get_tx_fail_reason( |
1d270075 | 971 | TX_STATUS_FAIL_NO_BEACON_ON_RADAR), |
54a9aa65 WYG |
972 | priv->_agn.reply_tx_stats.sta_color_mismatch); |
973 | pos += scnprintf(buf + pos, bufsz - pos, "UNKNOWN:\t\t\t%u\n", | |
974 | priv->_agn.reply_tx_stats.unknown); | |
975 | ||
95b49ed0 WYG |
976 | pos += scnprintf(buf + pos, bufsz - pos, |
977 | "\nStatistics_Agg_TX_Error:\n"); | |
978 | ||
979 | pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", | |
980 | iwl_get_agg_tx_fail_reason(AGG_TX_STATE_UNDERRUN_MSK), | |
981 | priv->_agn.reply_agg_tx_stats.underrun); | |
982 | pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", | |
983 | iwl_get_agg_tx_fail_reason(AGG_TX_STATE_BT_PRIO_MSK), | |
984 | priv->_agn.reply_agg_tx_stats.bt_prio); | |
985 | pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", | |
986 | iwl_get_agg_tx_fail_reason(AGG_TX_STATE_FEW_BYTES_MSK), | |
987 | priv->_agn.reply_agg_tx_stats.few_bytes); | |
988 | pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", | |
989 | iwl_get_agg_tx_fail_reason(AGG_TX_STATE_ABORT_MSK), | |
990 | priv->_agn.reply_agg_tx_stats.abort); | |
991 | pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t%u\n", | |
992 | iwl_get_agg_tx_fail_reason( | |
993 | AGG_TX_STATE_LAST_SENT_TTL_MSK), | |
994 | priv->_agn.reply_agg_tx_stats.last_sent_ttl); | |
995 | pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t%u\n", | |
996 | iwl_get_agg_tx_fail_reason( | |
997 | AGG_TX_STATE_LAST_SENT_TRY_CNT_MSK), | |
998 | priv->_agn.reply_agg_tx_stats.last_sent_try); | |
999 | pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t%u\n", | |
1000 | iwl_get_agg_tx_fail_reason( | |
1001 | AGG_TX_STATE_LAST_SENT_BT_KILL_MSK), | |
1002 | priv->_agn.reply_agg_tx_stats.last_sent_bt_kill); | |
1003 | pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", | |
1004 | iwl_get_agg_tx_fail_reason(AGG_TX_STATE_SCD_QUERY_MSK), | |
1005 | priv->_agn.reply_agg_tx_stats.scd_query); | |
1006 | pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t%u\n", | |
1007 | iwl_get_agg_tx_fail_reason( | |
1008 | AGG_TX_STATE_TEST_BAD_CRC32_MSK), | |
1009 | priv->_agn.reply_agg_tx_stats.bad_crc32); | |
1010 | pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", | |
1011 | iwl_get_agg_tx_fail_reason(AGG_TX_STATE_RESPONSE_MSK), | |
1012 | priv->_agn.reply_agg_tx_stats.response); | |
1013 | pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", | |
1014 | iwl_get_agg_tx_fail_reason(AGG_TX_STATE_DUMP_TX_MSK), | |
1015 | priv->_agn.reply_agg_tx_stats.dump_tx); | |
1016 | pos += scnprintf(buf + pos, bufsz - pos, "%s:\t\t\t%u\n", | |
1017 | iwl_get_agg_tx_fail_reason(AGG_TX_STATE_DELAY_TX_MSK), | |
1018 | priv->_agn.reply_agg_tx_stats.delay_tx); | |
1019 | pos += scnprintf(buf + pos, bufsz - pos, "UNKNOWN:\t\t\t%u\n", | |
1020 | priv->_agn.reply_agg_tx_stats.unknown); | |
1021 | ||
54a9aa65 WYG |
1022 | ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); |
1023 | kfree(buf); | |
1024 | return ret; | |
1025 | } |