c1b4441fb8b27a6cc817b1bbba5ce7cc4759117e
[cascardo/linux.git] / drivers / net / wireless / iwlegacy / 3945-debug.c
1 /******************************************************************************
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  *****************************************************************************/
28
29 #include "common.h"
30 #include "3945.h"
31
32 static int
33 il3945_stats_flag(struct il_priv *il, char *buf, int bufsz)
34 {
35         int p = 0;
36
37         p += scnprintf(buf + p, bufsz - p, "Statistics Flag(0x%X):\n",
38                        le32_to_cpu(il->_3945.stats.flag));
39         if (le32_to_cpu(il->_3945.stats.flag) & UCODE_STATS_CLEAR_MSK)
40                 p += scnprintf(buf + p, bufsz - p,
41                                "\tStatistics have been cleared\n");
42         p += scnprintf(buf + p, bufsz - p, "\tOperational Frequency: %s\n",
43                        (le32_to_cpu(il->_3945.stats.flag) &
44                         UCODE_STATS_FREQUENCY_MSK) ? "2.4 GHz" : "5.2 GHz");
45         p += scnprintf(buf + p, bufsz - p, "\tTGj Narrow Band: %s\n",
46                        (le32_to_cpu(il->_3945.stats.flag) &
47                         UCODE_STATS_NARROW_BAND_MSK) ? "enabled" : "disabled");
48         return p;
49 }
50
51 static ssize_t
52 il3945_ucode_rx_stats_read(struct file *file, char __user *user_buf,
53                            size_t count, loff_t *ppos)
54 {
55         struct il_priv *il = file->private_data;
56         int pos = 0;
57         char *buf;
58         int bufsz =
59             sizeof(struct iwl39_stats_rx_phy) * 40 +
60             sizeof(struct iwl39_stats_rx_non_phy) * 40 + 400;
61         ssize_t ret;
62         struct iwl39_stats_rx_phy *ofdm, *accum_ofdm, *delta_ofdm, *max_ofdm;
63         struct iwl39_stats_rx_phy *cck, *accum_cck, *delta_cck, *max_cck;
64         struct iwl39_stats_rx_non_phy *general, *accum_general;
65         struct iwl39_stats_rx_non_phy *delta_general, *max_general;
66
67         if (!il_is_alive(il))
68                 return -EAGAIN;
69
70         buf = kzalloc(bufsz, GFP_KERNEL);
71         if (!buf) {
72                 IL_ERR("Can not allocate Buffer\n");
73                 return -ENOMEM;
74         }
75
76         /*
77          * The statistic information display here is based on
78          * the last stats notification from uCode
79          * might not reflect the current uCode activity
80          */
81         ofdm = &il->_3945.stats.rx.ofdm;
82         cck = &il->_3945.stats.rx.cck;
83         general = &il->_3945.stats.rx.general;
84         accum_ofdm = &il->_3945.accum_stats.rx.ofdm;
85         accum_cck = &il->_3945.accum_stats.rx.cck;
86         accum_general = &il->_3945.accum_stats.rx.general;
87         delta_ofdm = &il->_3945.delta_stats.rx.ofdm;
88         delta_cck = &il->_3945.delta_stats.rx.cck;
89         delta_general = &il->_3945.delta_stats.rx.general;
90         max_ofdm = &il->_3945.max_delta.rx.ofdm;
91         max_cck = &il->_3945.max_delta.rx.cck;
92         max_general = &il->_3945.max_delta.rx.general;
93
94         pos += il3945_stats_flag(il, buf, bufsz);
95         pos +=
96             scnprintf(buf + pos, bufsz - pos,
97                       "%-32s     current"
98                       "acumulative       delta         max\n",
99                       "Statistics_Rx - OFDM:");
100         pos +=
101             scnprintf(buf + pos, bufsz - pos,
102                       "  %-30s %10u  %10u  %10u  %10u\n", "ina_cnt:",
103                       le32_to_cpu(ofdm->ina_cnt), accum_ofdm->ina_cnt,
104                       delta_ofdm->ina_cnt, max_ofdm->ina_cnt);
105         pos +=
106             scnprintf(buf + pos, bufsz - pos,
107                       "  %-30s %10u  %10u  %10u  %10u\n", "fina_cnt:",
108                       le32_to_cpu(ofdm->fina_cnt), accum_ofdm->fina_cnt,
109                       delta_ofdm->fina_cnt, max_ofdm->fina_cnt);
110         pos +=
111             scnprintf(buf + pos, bufsz - pos,
112                       "  %-30s %10u  %10u  %10u  %10u\n", "plcp_err:",
113                       le32_to_cpu(ofdm->plcp_err), accum_ofdm->plcp_err,
114                       delta_ofdm->plcp_err, max_ofdm->plcp_err);
115         pos +=
116             scnprintf(buf + pos, bufsz - pos,
117                       "  %-30s %10u  %10u  %10u  %10u\n", "crc32_err:",
118                       le32_to_cpu(ofdm->crc32_err), accum_ofdm->crc32_err,
119                       delta_ofdm->crc32_err, max_ofdm->crc32_err);
120         pos +=
121             scnprintf(buf + pos, bufsz - pos,
122                       "  %-30s %10u  %10u  %10u  %10u\n", "overrun_err:",
123                       le32_to_cpu(ofdm->overrun_err), accum_ofdm->overrun_err,
124                       delta_ofdm->overrun_err, max_ofdm->overrun_err);
125         pos +=
126             scnprintf(buf + pos, bufsz - pos,
127                       "  %-30s %10u  %10u  %10u  %10u\n", "early_overrun_err:",
128                       le32_to_cpu(ofdm->early_overrun_err),
129                       accum_ofdm->early_overrun_err,
130                       delta_ofdm->early_overrun_err,
131                       max_ofdm->early_overrun_err);
132         pos +=
133             scnprintf(buf + pos, bufsz - pos,
134                       "  %-30s %10u  %10u  %10u  %10u\n", "crc32_good:",
135                       le32_to_cpu(ofdm->crc32_good), accum_ofdm->crc32_good,
136                       delta_ofdm->crc32_good, max_ofdm->crc32_good);
137         pos +=
138             scnprintf(buf + pos, bufsz - pos,
139                       "  %-30s %10u  %10u  %10u  %10u\n", "false_alarm_cnt:",
140                       le32_to_cpu(ofdm->false_alarm_cnt),
141                       accum_ofdm->false_alarm_cnt, delta_ofdm->false_alarm_cnt,
142                       max_ofdm->false_alarm_cnt);
143         pos +=
144             scnprintf(buf + pos, bufsz - pos,
145                       "  %-30s %10u  %10u  %10u  %10u\n", "fina_sync_err_cnt:",
146                       le32_to_cpu(ofdm->fina_sync_err_cnt),
147                       accum_ofdm->fina_sync_err_cnt,
148                       delta_ofdm->fina_sync_err_cnt,
149                       max_ofdm->fina_sync_err_cnt);
150         pos +=
151             scnprintf(buf + pos, bufsz - pos,
152                       "  %-30s %10u  %10u  %10u  %10u\n", "sfd_timeout:",
153                       le32_to_cpu(ofdm->sfd_timeout), accum_ofdm->sfd_timeout,
154                       delta_ofdm->sfd_timeout, max_ofdm->sfd_timeout);
155         pos +=
156             scnprintf(buf + pos, bufsz - pos,
157                       "  %-30s %10u  %10u  %10u  %10u\n", "fina_timeout:",
158                       le32_to_cpu(ofdm->fina_timeout), accum_ofdm->fina_timeout,
159                       delta_ofdm->fina_timeout, max_ofdm->fina_timeout);
160         pos +=
161             scnprintf(buf + pos, bufsz - pos,
162                       "  %-30s %10u  %10u  %10u  %10u\n", "unresponded_rts:",
163                       le32_to_cpu(ofdm->unresponded_rts),
164                       accum_ofdm->unresponded_rts, delta_ofdm->unresponded_rts,
165                       max_ofdm->unresponded_rts);
166         pos +=
167             scnprintf(buf + pos, bufsz - pos,
168                       "  %-30s %10u  %10u  %10u  %10u\n",
169                       "rxe_frame_lmt_ovrun:",
170                       le32_to_cpu(ofdm->rxe_frame_limit_overrun),
171                       accum_ofdm->rxe_frame_limit_overrun,
172                       delta_ofdm->rxe_frame_limit_overrun,
173                       max_ofdm->rxe_frame_limit_overrun);
174         pos +=
175             scnprintf(buf + pos, bufsz - pos,
176                       "  %-30s %10u  %10u  %10u  %10u\n", "sent_ack_cnt:",
177                       le32_to_cpu(ofdm->sent_ack_cnt), accum_ofdm->sent_ack_cnt,
178                       delta_ofdm->sent_ack_cnt, max_ofdm->sent_ack_cnt);
179         pos +=
180             scnprintf(buf + pos, bufsz - pos,
181                       "  %-30s %10u  %10u  %10u  %10u\n", "sent_cts_cnt:",
182                       le32_to_cpu(ofdm->sent_cts_cnt), accum_ofdm->sent_cts_cnt,
183                       delta_ofdm->sent_cts_cnt, max_ofdm->sent_cts_cnt);
184
185         pos +=
186             scnprintf(buf + pos, bufsz - pos,
187                       "%-32s     current"
188                       "acumulative       delta         max\n",
189                       "Statistics_Rx - CCK:");
190         pos +=
191             scnprintf(buf + pos, bufsz - pos,
192                       "  %-30s %10u  %10u  %10u  %10u\n", "ina_cnt:",
193                       le32_to_cpu(cck->ina_cnt), accum_cck->ina_cnt,
194                       delta_cck->ina_cnt, max_cck->ina_cnt);
195         pos +=
196             scnprintf(buf + pos, bufsz - pos,
197                       "  %-30s %10u  %10u  %10u  %10u\n", "fina_cnt:",
198                       le32_to_cpu(cck->fina_cnt), accum_cck->fina_cnt,
199                       delta_cck->fina_cnt, max_cck->fina_cnt);
200         pos +=
201             scnprintf(buf + pos, bufsz - pos,
202                       "  %-30s %10u  %10u  %10u  %10u\n", "plcp_err:",
203                       le32_to_cpu(cck->plcp_err), accum_cck->plcp_err,
204                       delta_cck->plcp_err, max_cck->plcp_err);
205         pos +=
206             scnprintf(buf + pos, bufsz - pos,
207                       "  %-30s %10u  %10u  %10u  %10u\n", "crc32_err:",
208                       le32_to_cpu(cck->crc32_err), accum_cck->crc32_err,
209                       delta_cck->crc32_err, max_cck->crc32_err);
210         pos +=
211             scnprintf(buf + pos, bufsz - pos,
212                       "  %-30s %10u  %10u  %10u  %10u\n", "overrun_err:",
213                       le32_to_cpu(cck->overrun_err), accum_cck->overrun_err,
214                       delta_cck->overrun_err, max_cck->overrun_err);
215         pos +=
216             scnprintf(buf + pos, bufsz - pos,
217                       "  %-30s %10u  %10u  %10u  %10u\n", "early_overrun_err:",
218                       le32_to_cpu(cck->early_overrun_err),
219                       accum_cck->early_overrun_err,
220                       delta_cck->early_overrun_err, max_cck->early_overrun_err);
221         pos +=
222             scnprintf(buf + pos, bufsz - pos,
223                       "  %-30s %10u  %10u  %10u  %10u\n", "crc32_good:",
224                       le32_to_cpu(cck->crc32_good), accum_cck->crc32_good,
225                       delta_cck->crc32_good, max_cck->crc32_good);
226         pos +=
227             scnprintf(buf + pos, bufsz - pos,
228                       "  %-30s %10u  %10u  %10u  %10u\n", "false_alarm_cnt:",
229                       le32_to_cpu(cck->false_alarm_cnt),
230                       accum_cck->false_alarm_cnt, delta_cck->false_alarm_cnt,
231                       max_cck->false_alarm_cnt);
232         pos +=
233             scnprintf(buf + pos, bufsz - pos,
234                       "  %-30s %10u  %10u  %10u  %10u\n", "fina_sync_err_cnt:",
235                       le32_to_cpu(cck->fina_sync_err_cnt),
236                       accum_cck->fina_sync_err_cnt,
237                       delta_cck->fina_sync_err_cnt, max_cck->fina_sync_err_cnt);
238         pos +=
239             scnprintf(buf + pos, bufsz - pos,
240                       "  %-30s %10u  %10u  %10u  %10u\n", "sfd_timeout:",
241                       le32_to_cpu(cck->sfd_timeout), accum_cck->sfd_timeout,
242                       delta_cck->sfd_timeout, max_cck->sfd_timeout);
243         pos +=
244             scnprintf(buf + pos, bufsz - pos,
245                       "  %-30s %10u  %10u  %10u  %10u\n", "fina_timeout:",
246                       le32_to_cpu(cck->fina_timeout), accum_cck->fina_timeout,
247                       delta_cck->fina_timeout, max_cck->fina_timeout);
248         pos +=
249             scnprintf(buf + pos, bufsz - pos,
250                       "  %-30s %10u  %10u  %10u  %10u\n", "unresponded_rts:",
251                       le32_to_cpu(cck->unresponded_rts),
252                       accum_cck->unresponded_rts, delta_cck->unresponded_rts,
253                       max_cck->unresponded_rts);
254         pos +=
255             scnprintf(buf + pos, bufsz - pos,
256                       "  %-30s %10u  %10u  %10u  %10u\n",
257                       "rxe_frame_lmt_ovrun:",
258                       le32_to_cpu(cck->rxe_frame_limit_overrun),
259                       accum_cck->rxe_frame_limit_overrun,
260                       delta_cck->rxe_frame_limit_overrun,
261                       max_cck->rxe_frame_limit_overrun);
262         pos +=
263             scnprintf(buf + pos, bufsz - pos,
264                       "  %-30s %10u  %10u  %10u  %10u\n", "sent_ack_cnt:",
265                       le32_to_cpu(cck->sent_ack_cnt), accum_cck->sent_ack_cnt,
266                       delta_cck->sent_ack_cnt, max_cck->sent_ack_cnt);
267         pos +=
268             scnprintf(buf + pos, bufsz - pos,
269                       "  %-30s %10u  %10u  %10u  %10u\n", "sent_cts_cnt:",
270                       le32_to_cpu(cck->sent_cts_cnt), accum_cck->sent_cts_cnt,
271                       delta_cck->sent_cts_cnt, max_cck->sent_cts_cnt);
272
273         pos +=
274             scnprintf(buf + pos, bufsz - pos,
275                       "%-32s     current"
276                       "acumulative       delta         max\n",
277                       "Statistics_Rx - GENERAL:");
278         pos +=
279             scnprintf(buf + pos, bufsz - pos,
280                       "  %-30s %10u  %10u  %10u  %10u\n", "bogus_cts:",
281                       le32_to_cpu(general->bogus_cts), accum_general->bogus_cts,
282                       delta_general->bogus_cts, max_general->bogus_cts);
283         pos +=
284             scnprintf(buf + pos, bufsz - pos,
285                       "  %-30s %10u  %10u  %10u  %10u\n", "bogus_ack:",
286                       le32_to_cpu(general->bogus_ack), accum_general->bogus_ack,
287                       delta_general->bogus_ack, max_general->bogus_ack);
288         pos +=
289             scnprintf(buf + pos, bufsz - pos,
290                       "  %-30s %10u  %10u  %10u  %10u\n", "non_bssid_frames:",
291                       le32_to_cpu(general->non_bssid_frames),
292                       accum_general->non_bssid_frames,
293                       delta_general->non_bssid_frames,
294                       max_general->non_bssid_frames);
295         pos +=
296             scnprintf(buf + pos, bufsz - pos,
297                       "  %-30s %10u  %10u  %10u  %10u\n", "filtered_frames:",
298                       le32_to_cpu(general->filtered_frames),
299                       accum_general->filtered_frames,
300                       delta_general->filtered_frames,
301                       max_general->filtered_frames);
302         pos +=
303             scnprintf(buf + pos, bufsz - pos,
304                       "  %-30s %10u  %10u  %10u  %10u\n",
305                       "non_channel_beacons:",
306                       le32_to_cpu(general->non_channel_beacons),
307                       accum_general->non_channel_beacons,
308                       delta_general->non_channel_beacons,
309                       max_general->non_channel_beacons);
310
311         ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos);
312         kfree(buf);
313         return ret;
314 }
315
316 static ssize_t
317 il3945_ucode_tx_stats_read(struct file *file, char __user *user_buf,
318                            size_t count, loff_t *ppos)
319 {
320         struct il_priv *il = file->private_data;
321         int pos = 0;
322         char *buf;
323         int bufsz = (sizeof(struct iwl39_stats_tx) * 48) + 250;
324         ssize_t ret;
325         struct iwl39_stats_tx *tx, *accum_tx, *delta_tx, *max_tx;
326
327         if (!il_is_alive(il))
328                 return -EAGAIN;
329
330         buf = kzalloc(bufsz, GFP_KERNEL);
331         if (!buf) {
332                 IL_ERR("Can not allocate Buffer\n");
333                 return -ENOMEM;
334         }
335
336         /*
337          * The statistic information display here is based on
338          * the last stats notification from uCode
339          * might not reflect the current uCode activity
340          */
341         tx = &il->_3945.stats.tx;
342         accum_tx = &il->_3945.accum_stats.tx;
343         delta_tx = &il->_3945.delta_stats.tx;
344         max_tx = &il->_3945.max_delta.tx;
345         pos += il3945_stats_flag(il, buf, bufsz);
346         pos +=
347             scnprintf(buf + pos, bufsz - pos,
348                       "%-32s     current"
349                       "acumulative       delta         max\n",
350                       "Statistics_Tx:");
351         pos +=
352             scnprintf(buf + pos, bufsz - pos,
353                       "  %-30s %10u  %10u  %10u  %10u\n", "preamble:",
354                       le32_to_cpu(tx->preamble_cnt), accum_tx->preamble_cnt,
355                       delta_tx->preamble_cnt, max_tx->preamble_cnt);
356         pos +=
357             scnprintf(buf + pos, bufsz - pos,
358                       "  %-30s %10u  %10u  %10u  %10u\n", "rx_detected_cnt:",
359                       le32_to_cpu(tx->rx_detected_cnt),
360                       accum_tx->rx_detected_cnt, delta_tx->rx_detected_cnt,
361                       max_tx->rx_detected_cnt);
362         pos +=
363             scnprintf(buf + pos, bufsz - pos,
364                       "  %-30s %10u  %10u  %10u  %10u\n", "bt_prio_defer_cnt:",
365                       le32_to_cpu(tx->bt_prio_defer_cnt),
366                       accum_tx->bt_prio_defer_cnt, delta_tx->bt_prio_defer_cnt,
367                       max_tx->bt_prio_defer_cnt);
368         pos +=
369             scnprintf(buf + pos, bufsz - pos,
370                       "  %-30s %10u  %10u  %10u  %10u\n", "bt_prio_kill_cnt:",
371                       le32_to_cpu(tx->bt_prio_kill_cnt),
372                       accum_tx->bt_prio_kill_cnt, delta_tx->bt_prio_kill_cnt,
373                       max_tx->bt_prio_kill_cnt);
374         pos +=
375             scnprintf(buf + pos, bufsz - pos,
376                       "  %-30s %10u  %10u  %10u  %10u\n", "few_bytes_cnt:",
377                       le32_to_cpu(tx->few_bytes_cnt), accum_tx->few_bytes_cnt,
378                       delta_tx->few_bytes_cnt, max_tx->few_bytes_cnt);
379         pos +=
380             scnprintf(buf + pos, bufsz - pos,
381                       "  %-30s %10u  %10u  %10u  %10u\n", "cts_timeout:",
382                       le32_to_cpu(tx->cts_timeout), accum_tx->cts_timeout,
383                       delta_tx->cts_timeout, max_tx->cts_timeout);
384         pos +=
385             scnprintf(buf + pos, bufsz - pos,
386                       "  %-30s %10u  %10u  %10u  %10u\n", "ack_timeout:",
387                       le32_to_cpu(tx->ack_timeout), accum_tx->ack_timeout,
388                       delta_tx->ack_timeout, max_tx->ack_timeout);
389         pos +=
390             scnprintf(buf + pos, bufsz - pos,
391                       "  %-30s %10u  %10u  %10u  %10u\n", "expected_ack_cnt:",
392                       le32_to_cpu(tx->expected_ack_cnt),
393                       accum_tx->expected_ack_cnt, delta_tx->expected_ack_cnt,
394                       max_tx->expected_ack_cnt);
395         pos +=
396             scnprintf(buf + pos, bufsz - pos,
397                       "  %-30s %10u  %10u  %10u  %10u\n", "actual_ack_cnt:",
398                       le32_to_cpu(tx->actual_ack_cnt), accum_tx->actual_ack_cnt,
399                       delta_tx->actual_ack_cnt, max_tx->actual_ack_cnt);
400
401         ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos);
402         kfree(buf);
403         return ret;
404 }
405
406 static ssize_t
407 il3945_ucode_general_stats_read(struct file *file, char __user *user_buf,
408                                 size_t count, loff_t *ppos)
409 {
410         struct il_priv *il = file->private_data;
411         int pos = 0;
412         char *buf;
413         int bufsz = sizeof(struct iwl39_stats_general) * 10 + 300;
414         ssize_t ret;
415         struct iwl39_stats_general *general, *accum_general;
416         struct iwl39_stats_general *delta_general, *max_general;
417         struct stats_dbg *dbg, *accum_dbg, *delta_dbg, *max_dbg;
418         struct iwl39_stats_div *div, *accum_div, *delta_div, *max_div;
419
420         if (!il_is_alive(il))
421                 return -EAGAIN;
422
423         buf = kzalloc(bufsz, GFP_KERNEL);
424         if (!buf) {
425                 IL_ERR("Can not allocate Buffer\n");
426                 return -ENOMEM;
427         }
428
429         /*
430          * The statistic information display here is based on
431          * the last stats notification from uCode
432          * might not reflect the current uCode activity
433          */
434         general = &il->_3945.stats.general;
435         dbg = &il->_3945.stats.general.dbg;
436         div = &il->_3945.stats.general.div;
437         accum_general = &il->_3945.accum_stats.general;
438         delta_general = &il->_3945.delta_stats.general;
439         max_general = &il->_3945.max_delta.general;
440         accum_dbg = &il->_3945.accum_stats.general.dbg;
441         delta_dbg = &il->_3945.delta_stats.general.dbg;
442         max_dbg = &il->_3945.max_delta.general.dbg;
443         accum_div = &il->_3945.accum_stats.general.div;
444         delta_div = &il->_3945.delta_stats.general.div;
445         max_div = &il->_3945.max_delta.general.div;
446         pos += il3945_stats_flag(il, buf, bufsz);
447         pos +=
448             scnprintf(buf + pos, bufsz - pos,
449                       "%-32s     current"
450                       "acumulative       delta         max\n",
451                       "Statistics_General:");
452         pos +=
453             scnprintf(buf + pos, bufsz - pos,
454                       "  %-30s %10u  %10u  %10u  %10u\n", "burst_check:",
455                       le32_to_cpu(dbg->burst_check), accum_dbg->burst_check,
456                       delta_dbg->burst_check, max_dbg->burst_check);
457         pos +=
458             scnprintf(buf + pos, bufsz - pos,
459                       "  %-30s %10u  %10u  %10u  %10u\n", "burst_count:",
460                       le32_to_cpu(dbg->burst_count), accum_dbg->burst_count,
461                       delta_dbg->burst_count, max_dbg->burst_count);
462         pos +=
463             scnprintf(buf + pos, bufsz - pos,
464                       "  %-30s %10u  %10u  %10u  %10u\n", "sleep_time:",
465                       le32_to_cpu(general->sleep_time),
466                       accum_general->sleep_time, delta_general->sleep_time,
467                       max_general->sleep_time);
468         pos +=
469             scnprintf(buf + pos, bufsz - pos,
470                       "  %-30s %10u  %10u  %10u  %10u\n", "slots_out:",
471                       le32_to_cpu(general->slots_out), accum_general->slots_out,
472                       delta_general->slots_out, max_general->slots_out);
473         pos +=
474             scnprintf(buf + pos, bufsz - pos,
475                       "  %-30s %10u  %10u  %10u  %10u\n", "slots_idle:",
476                       le32_to_cpu(general->slots_idle),
477                       accum_general->slots_idle, delta_general->slots_idle,
478                       max_general->slots_idle);
479         pos +=
480             scnprintf(buf + pos, bufsz - pos, "ttl_timestamp:\t\t\t%u\n",
481                       le32_to_cpu(general->ttl_timestamp));
482         pos +=
483             scnprintf(buf + pos, bufsz - pos,
484                       "  %-30s %10u  %10u  %10u  %10u\n", "tx_on_a:",
485                       le32_to_cpu(div->tx_on_a), accum_div->tx_on_a,
486                       delta_div->tx_on_a, max_div->tx_on_a);
487         pos +=
488             scnprintf(buf + pos, bufsz - pos,
489                       "  %-30s %10u  %10u  %10u  %10u\n", "tx_on_b:",
490                       le32_to_cpu(div->tx_on_b), accum_div->tx_on_b,
491                       delta_div->tx_on_b, max_div->tx_on_b);
492         pos +=
493             scnprintf(buf + pos, bufsz - pos,
494                       "  %-30s %10u  %10u  %10u  %10u\n", "exec_time:",
495                       le32_to_cpu(div->exec_time), accum_div->exec_time,
496                       delta_div->exec_time, max_div->exec_time);
497         pos +=
498             scnprintf(buf + pos, bufsz - pos,
499                       "  %-30s %10u  %10u  %10u  %10u\n", "probe_time:",
500                       le32_to_cpu(div->probe_time), accum_div->probe_time,
501                       delta_div->probe_time, max_div->probe_time);
502         ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos);
503         kfree(buf);
504         return ret;
505 }
506
507 const struct il_debugfs_ops il3945_debugfs_ops = {
508         .rx_stats_read = il3945_ucode_rx_stats_read,
509         .tx_stats_read = il3945_ucode_tx_stats_read,
510         .general_stats_read = il3945_ucode_general_stats_read,
511 };