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