Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-only
0002 /******************************************************************************
0003 *
0004 * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
0005 *
0006 * Contact Information:
0007 *  Intel Linux Wireless <ilw@linux.intel.com>
0008 * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
0009 *****************************************************************************/
0010 #include "common.h"
0011 #include "4965.h"
0012 
0013 static const char *fmt_value = "  %-30s %10u\n";
0014 static const char *fmt_table = "  %-30s %10u  %10u  %10u  %10u\n";
0015 static const char *fmt_header =
0016     "%-32s    current  cumulative       delta         max\n";
0017 
0018 static int
0019 il4965_stats_flag(struct il_priv *il, char *buf, int bufsz)
0020 {
0021     int p = 0;
0022     u32 flag;
0023 
0024     flag = le32_to_cpu(il->_4965.stats.flag);
0025 
0026     p += scnprintf(buf + p, bufsz - p, "Statistics Flag(0x%X):\n", flag);
0027     if (flag & UCODE_STATS_CLEAR_MSK)
0028         p += scnprintf(buf + p, bufsz - p,
0029                    "\tStatistics have been cleared\n");
0030     p += scnprintf(buf + p, bufsz - p, "\tOperational Frequency: %s\n",
0031                (flag & UCODE_STATS_FREQUENCY_MSK) ? "2.4 GHz" :
0032                "5.2 GHz");
0033     p += scnprintf(buf + p, bufsz - p, "\tTGj Narrow Band: %s\n",
0034                (flag & UCODE_STATS_NARROW_BAND_MSK) ? "enabled" :
0035                "disabled");
0036 
0037     return p;
0038 }
0039 
0040 static ssize_t
0041 il4965_ucode_rx_stats_read(struct file *file, char __user *user_buf,
0042                size_t count, loff_t *ppos)
0043 {
0044     struct il_priv *il = file->private_data;
0045     int pos = 0;
0046     char *buf;
0047     int bufsz =
0048         sizeof(struct stats_rx_phy) * 40 +
0049         sizeof(struct stats_rx_non_phy) * 40 +
0050         sizeof(struct stats_rx_ht_phy) * 40 + 400;
0051     ssize_t ret;
0052     struct stats_rx_phy *ofdm, *accum_ofdm, *delta_ofdm, *max_ofdm;
0053     struct stats_rx_phy *cck, *accum_cck, *delta_cck, *max_cck;
0054     struct stats_rx_non_phy *general, *accum_general;
0055     struct stats_rx_non_phy *delta_general, *max_general;
0056     struct stats_rx_ht_phy *ht, *accum_ht, *delta_ht, *max_ht;
0057 
0058     if (!il_is_alive(il))
0059         return -EAGAIN;
0060 
0061     buf = kzalloc(bufsz, GFP_KERNEL);
0062     if (!buf) {
0063         IL_ERR("Can not allocate Buffer\n");
0064         return -ENOMEM;
0065     }
0066 
0067     /*
0068      * the statistic information display here is based on
0069      * the last stats notification from uCode
0070      * might not reflect the current uCode activity
0071      */
0072     ofdm = &il->_4965.stats.rx.ofdm;
0073     cck = &il->_4965.stats.rx.cck;
0074     general = &il->_4965.stats.rx.general;
0075     ht = &il->_4965.stats.rx.ofdm_ht;
0076     accum_ofdm = &il->_4965.accum_stats.rx.ofdm;
0077     accum_cck = &il->_4965.accum_stats.rx.cck;
0078     accum_general = &il->_4965.accum_stats.rx.general;
0079     accum_ht = &il->_4965.accum_stats.rx.ofdm_ht;
0080     delta_ofdm = &il->_4965.delta_stats.rx.ofdm;
0081     delta_cck = &il->_4965.delta_stats.rx.cck;
0082     delta_general = &il->_4965.delta_stats.rx.general;
0083     delta_ht = &il->_4965.delta_stats.rx.ofdm_ht;
0084     max_ofdm = &il->_4965.max_delta.rx.ofdm;
0085     max_cck = &il->_4965.max_delta.rx.cck;
0086     max_general = &il->_4965.max_delta.rx.general;
0087     max_ht = &il->_4965.max_delta.rx.ofdm_ht;
0088 
0089     pos += il4965_stats_flag(il, buf, bufsz);
0090     pos +=
0091         scnprintf(buf + pos, bufsz - pos, fmt_header,
0092               "Statistics_Rx - OFDM:");
0093     pos +=
0094         scnprintf(buf + pos, bufsz - pos, fmt_table, "ina_cnt:",
0095               le32_to_cpu(ofdm->ina_cnt), accum_ofdm->ina_cnt,
0096               delta_ofdm->ina_cnt, max_ofdm->ina_cnt);
0097     pos +=
0098         scnprintf(buf + pos, bufsz - pos, fmt_table, "fina_cnt:",
0099               le32_to_cpu(ofdm->fina_cnt), accum_ofdm->fina_cnt,
0100               delta_ofdm->fina_cnt, max_ofdm->fina_cnt);
0101     pos +=
0102         scnprintf(buf + pos, bufsz - pos, fmt_table, "plcp_err:",
0103               le32_to_cpu(ofdm->plcp_err), accum_ofdm->plcp_err,
0104               delta_ofdm->plcp_err, max_ofdm->plcp_err);
0105     pos +=
0106         scnprintf(buf + pos, bufsz - pos, fmt_table, "crc32_err:",
0107               le32_to_cpu(ofdm->crc32_err), accum_ofdm->crc32_err,
0108               delta_ofdm->crc32_err, max_ofdm->crc32_err);
0109     pos +=
0110         scnprintf(buf + pos, bufsz - pos, fmt_table, "overrun_err:",
0111               le32_to_cpu(ofdm->overrun_err), accum_ofdm->overrun_err,
0112               delta_ofdm->overrun_err, max_ofdm->overrun_err);
0113     pos +=
0114         scnprintf(buf + pos, bufsz - pos, fmt_table, "early_overrun_err:",
0115               le32_to_cpu(ofdm->early_overrun_err),
0116               accum_ofdm->early_overrun_err,
0117               delta_ofdm->early_overrun_err,
0118               max_ofdm->early_overrun_err);
0119     pos +=
0120         scnprintf(buf + pos, bufsz - pos, fmt_table, "crc32_good:",
0121               le32_to_cpu(ofdm->crc32_good), accum_ofdm->crc32_good,
0122               delta_ofdm->crc32_good, max_ofdm->crc32_good);
0123     pos +=
0124         scnprintf(buf + pos, bufsz - pos, fmt_table, "false_alarm_cnt:",
0125               le32_to_cpu(ofdm->false_alarm_cnt),
0126               accum_ofdm->false_alarm_cnt, delta_ofdm->false_alarm_cnt,
0127               max_ofdm->false_alarm_cnt);
0128     pos +=
0129         scnprintf(buf + pos, bufsz - pos, fmt_table, "fina_sync_err_cnt:",
0130               le32_to_cpu(ofdm->fina_sync_err_cnt),
0131               accum_ofdm->fina_sync_err_cnt,
0132               delta_ofdm->fina_sync_err_cnt,
0133               max_ofdm->fina_sync_err_cnt);
0134     pos +=
0135         scnprintf(buf + pos, bufsz - pos, fmt_table, "sfd_timeout:",
0136               le32_to_cpu(ofdm->sfd_timeout), accum_ofdm->sfd_timeout,
0137               delta_ofdm->sfd_timeout, max_ofdm->sfd_timeout);
0138     pos +=
0139         scnprintf(buf + pos, bufsz - pos, fmt_table, "fina_timeout:",
0140               le32_to_cpu(ofdm->fina_timeout), accum_ofdm->fina_timeout,
0141               delta_ofdm->fina_timeout, max_ofdm->fina_timeout);
0142     pos +=
0143         scnprintf(buf + pos, bufsz - pos, fmt_table, "unresponded_rts:",
0144               le32_to_cpu(ofdm->unresponded_rts),
0145               accum_ofdm->unresponded_rts, delta_ofdm->unresponded_rts,
0146               max_ofdm->unresponded_rts);
0147     pos +=
0148         scnprintf(buf + pos, bufsz - pos, fmt_table, "rxe_frame_lmt_ovrun:",
0149               le32_to_cpu(ofdm->rxe_frame_limit_overrun),
0150               accum_ofdm->rxe_frame_limit_overrun,
0151               delta_ofdm->rxe_frame_limit_overrun,
0152               max_ofdm->rxe_frame_limit_overrun);
0153     pos +=
0154         scnprintf(buf + pos, bufsz - pos, fmt_table, "sent_ack_cnt:",
0155               le32_to_cpu(ofdm->sent_ack_cnt), accum_ofdm->sent_ack_cnt,
0156               delta_ofdm->sent_ack_cnt, max_ofdm->sent_ack_cnt);
0157     pos +=
0158         scnprintf(buf + pos, bufsz - pos, fmt_table, "sent_cts_cnt:",
0159               le32_to_cpu(ofdm->sent_cts_cnt), accum_ofdm->sent_cts_cnt,
0160               delta_ofdm->sent_cts_cnt, max_ofdm->sent_cts_cnt);
0161     pos +=
0162         scnprintf(buf + pos, bufsz - pos, fmt_table, "sent_ba_rsp_cnt:",
0163               le32_to_cpu(ofdm->sent_ba_rsp_cnt),
0164               accum_ofdm->sent_ba_rsp_cnt, delta_ofdm->sent_ba_rsp_cnt,
0165               max_ofdm->sent_ba_rsp_cnt);
0166     pos +=
0167         scnprintf(buf + pos, bufsz - pos, fmt_table, "dsp_self_kill:",
0168               le32_to_cpu(ofdm->dsp_self_kill),
0169               accum_ofdm->dsp_self_kill, delta_ofdm->dsp_self_kill,
0170               max_ofdm->dsp_self_kill);
0171     pos +=
0172         scnprintf(buf + pos, bufsz - pos, fmt_table, "mh_format_err:",
0173               le32_to_cpu(ofdm->mh_format_err),
0174               accum_ofdm->mh_format_err, delta_ofdm->mh_format_err,
0175               max_ofdm->mh_format_err);
0176     pos +=
0177         scnprintf(buf + pos, bufsz - pos, fmt_table,
0178               "re_acq_main_rssi_sum:",
0179               le32_to_cpu(ofdm->re_acq_main_rssi_sum),
0180               accum_ofdm->re_acq_main_rssi_sum,
0181               delta_ofdm->re_acq_main_rssi_sum,
0182               max_ofdm->re_acq_main_rssi_sum);
0183 
0184     pos +=
0185         scnprintf(buf + pos, bufsz - pos, fmt_header,
0186               "Statistics_Rx - CCK:");
0187     pos +=
0188         scnprintf(buf + pos, bufsz - pos, fmt_table, "ina_cnt:",
0189               le32_to_cpu(cck->ina_cnt), accum_cck->ina_cnt,
0190               delta_cck->ina_cnt, max_cck->ina_cnt);
0191     pos +=
0192         scnprintf(buf + pos, bufsz - pos, fmt_table, "fina_cnt:",
0193               le32_to_cpu(cck->fina_cnt), accum_cck->fina_cnt,
0194               delta_cck->fina_cnt, max_cck->fina_cnt);
0195     pos +=
0196         scnprintf(buf + pos, bufsz - pos, fmt_table, "plcp_err:",
0197               le32_to_cpu(cck->plcp_err), accum_cck->plcp_err,
0198               delta_cck->plcp_err, max_cck->plcp_err);
0199     pos +=
0200         scnprintf(buf + pos, bufsz - pos, fmt_table, "crc32_err:",
0201               le32_to_cpu(cck->crc32_err), accum_cck->crc32_err,
0202               delta_cck->crc32_err, max_cck->crc32_err);
0203     pos +=
0204         scnprintf(buf + pos, bufsz - pos, fmt_table, "overrun_err:",
0205               le32_to_cpu(cck->overrun_err), accum_cck->overrun_err,
0206               delta_cck->overrun_err, max_cck->overrun_err);
0207     pos +=
0208         scnprintf(buf + pos, bufsz - pos, fmt_table, "early_overrun_err:",
0209               le32_to_cpu(cck->early_overrun_err),
0210               accum_cck->early_overrun_err,
0211               delta_cck->early_overrun_err, max_cck->early_overrun_err);
0212     pos +=
0213         scnprintf(buf + pos, bufsz - pos, fmt_table, "crc32_good:",
0214               le32_to_cpu(cck->crc32_good), accum_cck->crc32_good,
0215               delta_cck->crc32_good, max_cck->crc32_good);
0216     pos +=
0217         scnprintf(buf + pos, bufsz - pos, fmt_table, "false_alarm_cnt:",
0218               le32_to_cpu(cck->false_alarm_cnt),
0219               accum_cck->false_alarm_cnt, delta_cck->false_alarm_cnt,
0220               max_cck->false_alarm_cnt);
0221     pos +=
0222         scnprintf(buf + pos, bufsz - pos, fmt_table, "fina_sync_err_cnt:",
0223               le32_to_cpu(cck->fina_sync_err_cnt),
0224               accum_cck->fina_sync_err_cnt,
0225               delta_cck->fina_sync_err_cnt, max_cck->fina_sync_err_cnt);
0226     pos +=
0227         scnprintf(buf + pos, bufsz - pos, fmt_table, "sfd_timeout:",
0228               le32_to_cpu(cck->sfd_timeout), accum_cck->sfd_timeout,
0229               delta_cck->sfd_timeout, max_cck->sfd_timeout);
0230     pos +=
0231         scnprintf(buf + pos, bufsz - pos, fmt_table, "fina_timeout:",
0232               le32_to_cpu(cck->fina_timeout), accum_cck->fina_timeout,
0233               delta_cck->fina_timeout, max_cck->fina_timeout);
0234     pos +=
0235         scnprintf(buf + pos, bufsz - pos, fmt_table, "unresponded_rts:",
0236               le32_to_cpu(cck->unresponded_rts),
0237               accum_cck->unresponded_rts, delta_cck->unresponded_rts,
0238               max_cck->unresponded_rts);
0239     pos +=
0240         scnprintf(buf + pos, bufsz - pos, fmt_table, "rxe_frame_lmt_ovrun:",
0241               le32_to_cpu(cck->rxe_frame_limit_overrun),
0242               accum_cck->rxe_frame_limit_overrun,
0243               delta_cck->rxe_frame_limit_overrun,
0244               max_cck->rxe_frame_limit_overrun);
0245     pos +=
0246         scnprintf(buf + pos, bufsz - pos, fmt_table, "sent_ack_cnt:",
0247               le32_to_cpu(cck->sent_ack_cnt), accum_cck->sent_ack_cnt,
0248               delta_cck->sent_ack_cnt, max_cck->sent_ack_cnt);
0249     pos +=
0250         scnprintf(buf + pos, bufsz - pos, fmt_table, "sent_cts_cnt:",
0251               le32_to_cpu(cck->sent_cts_cnt), accum_cck->sent_cts_cnt,
0252               delta_cck->sent_cts_cnt, max_cck->sent_cts_cnt);
0253     pos +=
0254         scnprintf(buf + pos, bufsz - pos, fmt_table, "sent_ba_rsp_cnt:",
0255               le32_to_cpu(cck->sent_ba_rsp_cnt),
0256               accum_cck->sent_ba_rsp_cnt, delta_cck->sent_ba_rsp_cnt,
0257               max_cck->sent_ba_rsp_cnt);
0258     pos +=
0259         scnprintf(buf + pos, bufsz - pos, fmt_table, "dsp_self_kill:",
0260               le32_to_cpu(cck->dsp_self_kill), accum_cck->dsp_self_kill,
0261               delta_cck->dsp_self_kill, max_cck->dsp_self_kill);
0262     pos +=
0263         scnprintf(buf + pos, bufsz - pos, fmt_table, "mh_format_err:",
0264               le32_to_cpu(cck->mh_format_err), accum_cck->mh_format_err,
0265               delta_cck->mh_format_err, max_cck->mh_format_err);
0266     pos +=
0267         scnprintf(buf + pos, bufsz - pos, fmt_table,
0268               "re_acq_main_rssi_sum:",
0269               le32_to_cpu(cck->re_acq_main_rssi_sum),
0270               accum_cck->re_acq_main_rssi_sum,
0271               delta_cck->re_acq_main_rssi_sum,
0272               max_cck->re_acq_main_rssi_sum);
0273 
0274     pos +=
0275         scnprintf(buf + pos, bufsz - pos, fmt_header,
0276               "Statistics_Rx - GENERAL:");
0277     pos +=
0278         scnprintf(buf + pos, bufsz - pos, fmt_table, "bogus_cts:",
0279               le32_to_cpu(general->bogus_cts), accum_general->bogus_cts,
0280               delta_general->bogus_cts, max_general->bogus_cts);
0281     pos +=
0282         scnprintf(buf + pos, bufsz - pos, fmt_table, "bogus_ack:",
0283               le32_to_cpu(general->bogus_ack), accum_general->bogus_ack,
0284               delta_general->bogus_ack, max_general->bogus_ack);
0285     pos +=
0286         scnprintf(buf + pos, bufsz - pos, fmt_table, "non_bssid_frames:",
0287               le32_to_cpu(general->non_bssid_frames),
0288               accum_general->non_bssid_frames,
0289               delta_general->non_bssid_frames,
0290               max_general->non_bssid_frames);
0291     pos +=
0292         scnprintf(buf + pos, bufsz - pos, fmt_table, "filtered_frames:",
0293               le32_to_cpu(general->filtered_frames),
0294               accum_general->filtered_frames,
0295               delta_general->filtered_frames,
0296               max_general->filtered_frames);
0297     pos +=
0298         scnprintf(buf + pos, bufsz - pos, fmt_table, "non_channel_beacons:",
0299               le32_to_cpu(general->non_channel_beacons),
0300               accum_general->non_channel_beacons,
0301               delta_general->non_channel_beacons,
0302               max_general->non_channel_beacons);
0303     pos +=
0304         scnprintf(buf + pos, bufsz - pos, fmt_table, "channel_beacons:",
0305               le32_to_cpu(general->channel_beacons),
0306               accum_general->channel_beacons,
0307               delta_general->channel_beacons,
0308               max_general->channel_beacons);
0309     pos +=
0310         scnprintf(buf + pos, bufsz - pos, fmt_table, "num_missed_bcon:",
0311               le32_to_cpu(general->num_missed_bcon),
0312               accum_general->num_missed_bcon,
0313               delta_general->num_missed_bcon,
0314               max_general->num_missed_bcon);
0315     pos +=
0316         scnprintf(buf + pos, bufsz - pos, fmt_table,
0317               "adc_rx_saturation_time:",
0318               le32_to_cpu(general->adc_rx_saturation_time),
0319               accum_general->adc_rx_saturation_time,
0320               delta_general->adc_rx_saturation_time,
0321               max_general->adc_rx_saturation_time);
0322     pos +=
0323         scnprintf(buf + pos, bufsz - pos, fmt_table,
0324               "ina_detect_search_tm:",
0325               le32_to_cpu(general->ina_detection_search_time),
0326               accum_general->ina_detection_search_time,
0327               delta_general->ina_detection_search_time,
0328               max_general->ina_detection_search_time);
0329     pos +=
0330         scnprintf(buf + pos, bufsz - pos, fmt_table,
0331               "beacon_silence_rssi_a:",
0332               le32_to_cpu(general->beacon_silence_rssi_a),
0333               accum_general->beacon_silence_rssi_a,
0334               delta_general->beacon_silence_rssi_a,
0335               max_general->beacon_silence_rssi_a);
0336     pos +=
0337         scnprintf(buf + pos, bufsz - pos, fmt_table,
0338               "beacon_silence_rssi_b:",
0339               le32_to_cpu(general->beacon_silence_rssi_b),
0340               accum_general->beacon_silence_rssi_b,
0341               delta_general->beacon_silence_rssi_b,
0342               max_general->beacon_silence_rssi_b);
0343     pos +=
0344         scnprintf(buf + pos, bufsz - pos, fmt_table,
0345               "beacon_silence_rssi_c:",
0346               le32_to_cpu(general->beacon_silence_rssi_c),
0347               accum_general->beacon_silence_rssi_c,
0348               delta_general->beacon_silence_rssi_c,
0349               max_general->beacon_silence_rssi_c);
0350     pos +=
0351         scnprintf(buf + pos, bufsz - pos, fmt_table,
0352               "interference_data_flag:",
0353               le32_to_cpu(general->interference_data_flag),
0354               accum_general->interference_data_flag,
0355               delta_general->interference_data_flag,
0356               max_general->interference_data_flag);
0357     pos +=
0358         scnprintf(buf + pos, bufsz - pos, fmt_table, "channel_load:",
0359               le32_to_cpu(general->channel_load),
0360               accum_general->channel_load, delta_general->channel_load,
0361               max_general->channel_load);
0362     pos +=
0363         scnprintf(buf + pos, bufsz - pos, fmt_table, "dsp_false_alarms:",
0364               le32_to_cpu(general->dsp_false_alarms),
0365               accum_general->dsp_false_alarms,
0366               delta_general->dsp_false_alarms,
0367               max_general->dsp_false_alarms);
0368     pos +=
0369         scnprintf(buf + pos, bufsz - pos, fmt_table, "beacon_rssi_a:",
0370               le32_to_cpu(general->beacon_rssi_a),
0371               accum_general->beacon_rssi_a,
0372               delta_general->beacon_rssi_a, max_general->beacon_rssi_a);
0373     pos +=
0374         scnprintf(buf + pos, bufsz - pos, fmt_table, "beacon_rssi_b:",
0375               le32_to_cpu(general->beacon_rssi_b),
0376               accum_general->beacon_rssi_b,
0377               delta_general->beacon_rssi_b, max_general->beacon_rssi_b);
0378     pos +=
0379         scnprintf(buf + pos, bufsz - pos, fmt_table, "beacon_rssi_c:",
0380               le32_to_cpu(general->beacon_rssi_c),
0381               accum_general->beacon_rssi_c,
0382               delta_general->beacon_rssi_c, max_general->beacon_rssi_c);
0383     pos +=
0384         scnprintf(buf + pos, bufsz - pos, fmt_table, "beacon_energy_a:",
0385               le32_to_cpu(general->beacon_energy_a),
0386               accum_general->beacon_energy_a,
0387               delta_general->beacon_energy_a,
0388               max_general->beacon_energy_a);
0389     pos +=
0390         scnprintf(buf + pos, bufsz - pos, fmt_table, "beacon_energy_b:",
0391               le32_to_cpu(general->beacon_energy_b),
0392               accum_general->beacon_energy_b,
0393               delta_general->beacon_energy_b,
0394               max_general->beacon_energy_b);
0395     pos +=
0396         scnprintf(buf + pos, bufsz - pos, fmt_table, "beacon_energy_c:",
0397               le32_to_cpu(general->beacon_energy_c),
0398               accum_general->beacon_energy_c,
0399               delta_general->beacon_energy_c,
0400               max_general->beacon_energy_c);
0401 
0402     pos +=
0403         scnprintf(buf + pos, bufsz - pos, fmt_header,
0404               "Statistics_Rx - OFDM_HT:");
0405     pos +=
0406         scnprintf(buf + pos, bufsz - pos, fmt_table, "plcp_err:",
0407               le32_to_cpu(ht->plcp_err), accum_ht->plcp_err,
0408               delta_ht->plcp_err, max_ht->plcp_err);
0409     pos +=
0410         scnprintf(buf + pos, bufsz - pos, fmt_table, "overrun_err:",
0411               le32_to_cpu(ht->overrun_err), accum_ht->overrun_err,
0412               delta_ht->overrun_err, max_ht->overrun_err);
0413     pos +=
0414         scnprintf(buf + pos, bufsz - pos, fmt_table, "early_overrun_err:",
0415               le32_to_cpu(ht->early_overrun_err),
0416               accum_ht->early_overrun_err, delta_ht->early_overrun_err,
0417               max_ht->early_overrun_err);
0418     pos +=
0419         scnprintf(buf + pos, bufsz - pos, fmt_table, "crc32_good:",
0420               le32_to_cpu(ht->crc32_good), accum_ht->crc32_good,
0421               delta_ht->crc32_good, max_ht->crc32_good);
0422     pos +=
0423         scnprintf(buf + pos, bufsz - pos, fmt_table, "crc32_err:",
0424               le32_to_cpu(ht->crc32_err), accum_ht->crc32_err,
0425               delta_ht->crc32_err, max_ht->crc32_err);
0426     pos +=
0427         scnprintf(buf + pos, bufsz - pos, fmt_table, "mh_format_err:",
0428               le32_to_cpu(ht->mh_format_err), accum_ht->mh_format_err,
0429               delta_ht->mh_format_err, max_ht->mh_format_err);
0430     pos +=
0431         scnprintf(buf + pos, bufsz - pos, fmt_table, "agg_crc32_good:",
0432               le32_to_cpu(ht->agg_crc32_good), accum_ht->agg_crc32_good,
0433               delta_ht->agg_crc32_good, max_ht->agg_crc32_good);
0434     pos +=
0435         scnprintf(buf + pos, bufsz - pos, fmt_table, "agg_mpdu_cnt:",
0436               le32_to_cpu(ht->agg_mpdu_cnt), accum_ht->agg_mpdu_cnt,
0437               delta_ht->agg_mpdu_cnt, max_ht->agg_mpdu_cnt);
0438     pos +=
0439         scnprintf(buf + pos, bufsz - pos, fmt_table, "agg_cnt:",
0440               le32_to_cpu(ht->agg_cnt), accum_ht->agg_cnt,
0441               delta_ht->agg_cnt, max_ht->agg_cnt);
0442     pos +=
0443         scnprintf(buf + pos, bufsz - pos, fmt_table, "unsupport_mcs:",
0444               le32_to_cpu(ht->unsupport_mcs), accum_ht->unsupport_mcs,
0445               delta_ht->unsupport_mcs, max_ht->unsupport_mcs);
0446 
0447     ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos);
0448     kfree(buf);
0449     return ret;
0450 }
0451 
0452 static ssize_t
0453 il4965_ucode_tx_stats_read(struct file *file, char __user *user_buf,
0454                size_t count, loff_t *ppos)
0455 {
0456     struct il_priv *il = file->private_data;
0457     int pos = 0;
0458     char *buf;
0459     int bufsz = (sizeof(struct stats_tx) * 48) + 250;
0460     ssize_t ret;
0461     struct stats_tx *tx, *accum_tx, *delta_tx, *max_tx;
0462 
0463     if (!il_is_alive(il))
0464         return -EAGAIN;
0465 
0466     buf = kzalloc(bufsz, GFP_KERNEL);
0467     if (!buf) {
0468         IL_ERR("Can not allocate Buffer\n");
0469         return -ENOMEM;
0470     }
0471 
0472     /* the statistic information display here is based on
0473      * the last stats notification from uCode
0474      * might not reflect the current uCode activity
0475      */
0476     tx = &il->_4965.stats.tx;
0477     accum_tx = &il->_4965.accum_stats.tx;
0478     delta_tx = &il->_4965.delta_stats.tx;
0479     max_tx = &il->_4965.max_delta.tx;
0480 
0481     pos += il4965_stats_flag(il, buf, bufsz);
0482     pos += scnprintf(buf + pos, bufsz - pos, fmt_header, "Statistics_Tx:");
0483     pos +=
0484         scnprintf(buf + pos, bufsz - pos, fmt_table, "preamble:",
0485               le32_to_cpu(tx->preamble_cnt), accum_tx->preamble_cnt,
0486               delta_tx->preamble_cnt, max_tx->preamble_cnt);
0487     pos +=
0488         scnprintf(buf + pos, bufsz - pos, fmt_table, "rx_detected_cnt:",
0489               le32_to_cpu(tx->rx_detected_cnt),
0490               accum_tx->rx_detected_cnt, delta_tx->rx_detected_cnt,
0491               max_tx->rx_detected_cnt);
0492     pos +=
0493         scnprintf(buf + pos, bufsz - pos, fmt_table, "bt_prio_defer_cnt:",
0494               le32_to_cpu(tx->bt_prio_defer_cnt),
0495               accum_tx->bt_prio_defer_cnt, delta_tx->bt_prio_defer_cnt,
0496               max_tx->bt_prio_defer_cnt);
0497     pos +=
0498         scnprintf(buf + pos, bufsz - pos, fmt_table, "bt_prio_kill_cnt:",
0499               le32_to_cpu(tx->bt_prio_kill_cnt),
0500               accum_tx->bt_prio_kill_cnt, delta_tx->bt_prio_kill_cnt,
0501               max_tx->bt_prio_kill_cnt);
0502     pos +=
0503         scnprintf(buf + pos, bufsz - pos, fmt_table, "few_bytes_cnt:",
0504               le32_to_cpu(tx->few_bytes_cnt), accum_tx->few_bytes_cnt,
0505               delta_tx->few_bytes_cnt, max_tx->few_bytes_cnt);
0506     pos +=
0507         scnprintf(buf + pos, bufsz - pos, fmt_table, "cts_timeout:",
0508               le32_to_cpu(tx->cts_timeout), accum_tx->cts_timeout,
0509               delta_tx->cts_timeout, max_tx->cts_timeout);
0510     pos +=
0511         scnprintf(buf + pos, bufsz - pos, fmt_table, "ack_timeout:",
0512               le32_to_cpu(tx->ack_timeout), accum_tx->ack_timeout,
0513               delta_tx->ack_timeout, max_tx->ack_timeout);
0514     pos +=
0515         scnprintf(buf + pos, bufsz - pos, fmt_table, "expected_ack_cnt:",
0516               le32_to_cpu(tx->expected_ack_cnt),
0517               accum_tx->expected_ack_cnt, delta_tx->expected_ack_cnt,
0518               max_tx->expected_ack_cnt);
0519     pos +=
0520         scnprintf(buf + pos, bufsz - pos, fmt_table, "actual_ack_cnt:",
0521               le32_to_cpu(tx->actual_ack_cnt), accum_tx->actual_ack_cnt,
0522               delta_tx->actual_ack_cnt, max_tx->actual_ack_cnt);
0523     pos +=
0524         scnprintf(buf + pos, bufsz - pos, fmt_table, "dump_msdu_cnt:",
0525               le32_to_cpu(tx->dump_msdu_cnt), accum_tx->dump_msdu_cnt,
0526               delta_tx->dump_msdu_cnt, max_tx->dump_msdu_cnt);
0527     pos +=
0528         scnprintf(buf + pos, bufsz - pos, fmt_table,
0529               "abort_nxt_frame_mismatch:",
0530               le32_to_cpu(tx->burst_abort_next_frame_mismatch_cnt),
0531               accum_tx->burst_abort_next_frame_mismatch_cnt,
0532               delta_tx->burst_abort_next_frame_mismatch_cnt,
0533               max_tx->burst_abort_next_frame_mismatch_cnt);
0534     pos +=
0535         scnprintf(buf + pos, bufsz - pos, fmt_table,
0536               "abort_missing_nxt_frame:",
0537               le32_to_cpu(tx->burst_abort_missing_next_frame_cnt),
0538               accum_tx->burst_abort_missing_next_frame_cnt,
0539               delta_tx->burst_abort_missing_next_frame_cnt,
0540               max_tx->burst_abort_missing_next_frame_cnt);
0541     pos +=
0542         scnprintf(buf + pos, bufsz - pos, fmt_table,
0543               "cts_timeout_collision:",
0544               le32_to_cpu(tx->cts_timeout_collision),
0545               accum_tx->cts_timeout_collision,
0546               delta_tx->cts_timeout_collision,
0547               max_tx->cts_timeout_collision);
0548     pos +=
0549         scnprintf(buf + pos, bufsz - pos, fmt_table,
0550               "ack_ba_timeout_collision:",
0551               le32_to_cpu(tx->ack_or_ba_timeout_collision),
0552               accum_tx->ack_or_ba_timeout_collision,
0553               delta_tx->ack_or_ba_timeout_collision,
0554               max_tx->ack_or_ba_timeout_collision);
0555     pos +=
0556         scnprintf(buf + pos, bufsz - pos, fmt_table, "agg ba_timeout:",
0557               le32_to_cpu(tx->agg.ba_timeout), accum_tx->agg.ba_timeout,
0558               delta_tx->agg.ba_timeout, max_tx->agg.ba_timeout);
0559     pos +=
0560         scnprintf(buf + pos, bufsz - pos, fmt_table,
0561               "agg ba_resched_frames:",
0562               le32_to_cpu(tx->agg.ba_reschedule_frames),
0563               accum_tx->agg.ba_reschedule_frames,
0564               delta_tx->agg.ba_reschedule_frames,
0565               max_tx->agg.ba_reschedule_frames);
0566     pos +=
0567         scnprintf(buf + pos, bufsz - pos, fmt_table,
0568               "agg scd_query_agg_frame:",
0569               le32_to_cpu(tx->agg.scd_query_agg_frame_cnt),
0570               accum_tx->agg.scd_query_agg_frame_cnt,
0571               delta_tx->agg.scd_query_agg_frame_cnt,
0572               max_tx->agg.scd_query_agg_frame_cnt);
0573     pos +=
0574         scnprintf(buf + pos, bufsz - pos, fmt_table,
0575               "agg scd_query_no_agg:",
0576               le32_to_cpu(tx->agg.scd_query_no_agg),
0577               accum_tx->agg.scd_query_no_agg,
0578               delta_tx->agg.scd_query_no_agg,
0579               max_tx->agg.scd_query_no_agg);
0580     pos +=
0581         scnprintf(buf + pos, bufsz - pos, fmt_table, "agg scd_query_agg:",
0582               le32_to_cpu(tx->agg.scd_query_agg),
0583               accum_tx->agg.scd_query_agg, delta_tx->agg.scd_query_agg,
0584               max_tx->agg.scd_query_agg);
0585     pos +=
0586         scnprintf(buf + pos, bufsz - pos, fmt_table,
0587               "agg scd_query_mismatch:",
0588               le32_to_cpu(tx->agg.scd_query_mismatch),
0589               accum_tx->agg.scd_query_mismatch,
0590               delta_tx->agg.scd_query_mismatch,
0591               max_tx->agg.scd_query_mismatch);
0592     pos +=
0593         scnprintf(buf + pos, bufsz - pos, fmt_table, "agg frame_not_ready:",
0594               le32_to_cpu(tx->agg.frame_not_ready),
0595               accum_tx->agg.frame_not_ready,
0596               delta_tx->agg.frame_not_ready,
0597               max_tx->agg.frame_not_ready);
0598     pos +=
0599         scnprintf(buf + pos, bufsz - pos, fmt_table, "agg underrun:",
0600               le32_to_cpu(tx->agg.underrun), accum_tx->agg.underrun,
0601               delta_tx->agg.underrun, max_tx->agg.underrun);
0602     pos +=
0603         scnprintf(buf + pos, bufsz - pos, fmt_table, "agg bt_prio_kill:",
0604               le32_to_cpu(tx->agg.bt_prio_kill),
0605               accum_tx->agg.bt_prio_kill, delta_tx->agg.bt_prio_kill,
0606               max_tx->agg.bt_prio_kill);
0607     pos +=
0608         scnprintf(buf + pos, bufsz - pos, fmt_table, "agg rx_ba_rsp_cnt:",
0609               le32_to_cpu(tx->agg.rx_ba_rsp_cnt),
0610               accum_tx->agg.rx_ba_rsp_cnt, delta_tx->agg.rx_ba_rsp_cnt,
0611               max_tx->agg.rx_ba_rsp_cnt);
0612 
0613     ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos);
0614     kfree(buf);
0615     return ret;
0616 }
0617 
0618 static ssize_t
0619 il4965_ucode_general_stats_read(struct file *file, char __user *user_buf,
0620                 size_t count, loff_t *ppos)
0621 {
0622     struct il_priv *il = file->private_data;
0623     int pos = 0;
0624     char *buf;
0625     int bufsz = sizeof(struct stats_general) * 10 + 300;
0626     ssize_t ret;
0627     struct stats_general_common *general, *accum_general;
0628     struct stats_general_common *delta_general, *max_general;
0629     struct stats_dbg *dbg, *accum_dbg, *delta_dbg, *max_dbg;
0630     struct stats_div *div, *accum_div, *delta_div, *max_div;
0631 
0632     if (!il_is_alive(il))
0633         return -EAGAIN;
0634 
0635     buf = kzalloc(bufsz, GFP_KERNEL);
0636     if (!buf) {
0637         IL_ERR("Can not allocate Buffer\n");
0638         return -ENOMEM;
0639     }
0640 
0641     /* the statistic information display here is based on
0642      * the last stats notification from uCode
0643      * might not reflect the current uCode activity
0644      */
0645     general = &il->_4965.stats.general.common;
0646     dbg = &il->_4965.stats.general.common.dbg;
0647     div = &il->_4965.stats.general.common.div;
0648     accum_general = &il->_4965.accum_stats.general.common;
0649     accum_dbg = &il->_4965.accum_stats.general.common.dbg;
0650     accum_div = &il->_4965.accum_stats.general.common.div;
0651     delta_general = &il->_4965.delta_stats.general.common;
0652     max_general = &il->_4965.max_delta.general.common;
0653     delta_dbg = &il->_4965.delta_stats.general.common.dbg;
0654     max_dbg = &il->_4965.max_delta.general.common.dbg;
0655     delta_div = &il->_4965.delta_stats.general.common.div;
0656     max_div = &il->_4965.max_delta.general.common.div;
0657 
0658     pos += il4965_stats_flag(il, buf, bufsz);
0659     pos +=
0660         scnprintf(buf + pos, bufsz - pos, fmt_header,
0661               "Statistics_General:");
0662     pos +=
0663         scnprintf(buf + pos, bufsz - pos, fmt_value, "temperature:",
0664               le32_to_cpu(general->temperature));
0665     pos +=
0666         scnprintf(buf + pos, bufsz - pos, fmt_value, "ttl_timestamp:",
0667               le32_to_cpu(general->ttl_timestamp));
0668     pos +=
0669         scnprintf(buf + pos, bufsz - pos, fmt_table, "burst_check:",
0670               le32_to_cpu(dbg->burst_check), accum_dbg->burst_check,
0671               delta_dbg->burst_check, max_dbg->burst_check);
0672     pos +=
0673         scnprintf(buf + pos, bufsz - pos, fmt_table, "burst_count:",
0674               le32_to_cpu(dbg->burst_count), accum_dbg->burst_count,
0675               delta_dbg->burst_count, max_dbg->burst_count);
0676     pos +=
0677         scnprintf(buf + pos, bufsz - pos, fmt_table,
0678               "wait_for_silence_timeout_count:",
0679               le32_to_cpu(dbg->wait_for_silence_timeout_cnt),
0680               accum_dbg->wait_for_silence_timeout_cnt,
0681               delta_dbg->wait_for_silence_timeout_cnt,
0682               max_dbg->wait_for_silence_timeout_cnt);
0683     pos +=
0684         scnprintf(buf + pos, bufsz - pos, fmt_table, "sleep_time:",
0685               le32_to_cpu(general->sleep_time),
0686               accum_general->sleep_time, delta_general->sleep_time,
0687               max_general->sleep_time);
0688     pos +=
0689         scnprintf(buf + pos, bufsz - pos, fmt_table, "slots_out:",
0690               le32_to_cpu(general->slots_out), accum_general->slots_out,
0691               delta_general->slots_out, max_general->slots_out);
0692     pos +=
0693         scnprintf(buf + pos, bufsz - pos, fmt_table, "slots_idle:",
0694               le32_to_cpu(general->slots_idle),
0695               accum_general->slots_idle, delta_general->slots_idle,
0696               max_general->slots_idle);
0697     pos +=
0698         scnprintf(buf + pos, bufsz - pos, fmt_table, "tx_on_a:",
0699               le32_to_cpu(div->tx_on_a), accum_div->tx_on_a,
0700               delta_div->tx_on_a, max_div->tx_on_a);
0701     pos +=
0702         scnprintf(buf + pos, bufsz - pos, fmt_table, "tx_on_b:",
0703               le32_to_cpu(div->tx_on_b), accum_div->tx_on_b,
0704               delta_div->tx_on_b, max_div->tx_on_b);
0705     pos +=
0706         scnprintf(buf + pos, bufsz - pos, fmt_table, "exec_time:",
0707               le32_to_cpu(div->exec_time), accum_div->exec_time,
0708               delta_div->exec_time, max_div->exec_time);
0709     pos +=
0710         scnprintf(buf + pos, bufsz - pos, fmt_table, "probe_time:",
0711               le32_to_cpu(div->probe_time), accum_div->probe_time,
0712               delta_div->probe_time, max_div->probe_time);
0713     pos +=
0714         scnprintf(buf + pos, bufsz - pos, fmt_table, "rx_enable_counter:",
0715               le32_to_cpu(general->rx_enable_counter),
0716               accum_general->rx_enable_counter,
0717               delta_general->rx_enable_counter,
0718               max_general->rx_enable_counter);
0719     pos +=
0720         scnprintf(buf + pos, bufsz - pos, fmt_table, "num_of_sos_states:",
0721               le32_to_cpu(general->num_of_sos_states),
0722               accum_general->num_of_sos_states,
0723               delta_general->num_of_sos_states,
0724               max_general->num_of_sos_states);
0725     ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos);
0726     kfree(buf);
0727     return ret;
0728 }
0729 
0730 const struct il_debugfs_ops il4965_debugfs_ops = {
0731     .rx_stats_read = il4965_ucode_rx_stats_read,
0732     .tx_stats_read = il4965_ucode_tx_stats_read,
0733     .general_stats_read = il4965_ucode_general_stats_read,
0734 };