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