735 lines · c
1// SPDX-License-Identifier: GPL-2.0-only2/******************************************************************************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-64979*****************************************************************************/10#include "common.h"11#include "4965.h"12 13static const char *fmt_value = " %-30s %10u\n";14static const char *fmt_table = " %-30s %10u %10u %10u %10u\n";15static const char *fmt_header =16 "%-32s current cumulative delta max\n";17 18static int19il4965_stats_flag(struct il_priv *il, char *buf, int bufsz)20{21 int p = 0;22 u32 flag;23 24 flag = le32_to_cpu(il->_4965.stats.flag);25 26 p += scnprintf(buf + p, bufsz - p, "Statistics Flag(0x%X):\n", flag);27 if (flag & UCODE_STATS_CLEAR_MSK)28 p += scnprintf(buf + p, bufsz - p,29 "\tStatistics have been cleared\n");30 p += scnprintf(buf + p, bufsz - p, "\tOperational Frequency: %s\n",31 (flag & UCODE_STATS_FREQUENCY_MSK) ? "2.4 GHz" :32 "5.2 GHz");33 p += scnprintf(buf + p, bufsz - p, "\tTGj Narrow Band: %s\n",34 (flag & UCODE_STATS_NARROW_BAND_MSK) ? "enabled" :35 "disabled");36 37 return p;38}39 40static ssize_t41il4965_ucode_rx_stats_read(struct file *file, char __user *user_buf,42 size_t count, loff_t *ppos)43{44 struct il_priv *il = file->private_data;45 int pos = 0;46 char *buf;47 int bufsz =48 sizeof(struct stats_rx_phy) * 40 +49 sizeof(struct stats_rx_non_phy) * 40 +50 sizeof(struct stats_rx_ht_phy) * 40 + 400;51 ssize_t ret;52 struct stats_rx_phy *ofdm, *accum_ofdm, *delta_ofdm, *max_ofdm;53 struct stats_rx_phy *cck, *accum_cck, *delta_cck, *max_cck;54 struct stats_rx_non_phy *general, *accum_general;55 struct stats_rx_non_phy *delta_general, *max_general;56 struct stats_rx_ht_phy *ht, *accum_ht, *delta_ht, *max_ht;57 58 if (!il_is_alive(il))59 return -EAGAIN;60 61 buf = kzalloc(bufsz, GFP_KERNEL);62 if (!buf) {63 IL_ERR("Can not allocate Buffer\n");64 return -ENOMEM;65 }66 67 /*68 * the statistic information display here is based on69 * the last stats notification from uCode70 * might not reflect the current uCode activity71 */72 ofdm = &il->_4965.stats.rx.ofdm;73 cck = &il->_4965.stats.rx.cck;74 general = &il->_4965.stats.rx.general;75 ht = &il->_4965.stats.rx.ofdm_ht;76 accum_ofdm = &il->_4965.accum_stats.rx.ofdm;77 accum_cck = &il->_4965.accum_stats.rx.cck;78 accum_general = &il->_4965.accum_stats.rx.general;79 accum_ht = &il->_4965.accum_stats.rx.ofdm_ht;80 delta_ofdm = &il->_4965.delta_stats.rx.ofdm;81 delta_cck = &il->_4965.delta_stats.rx.cck;82 delta_general = &il->_4965.delta_stats.rx.general;83 delta_ht = &il->_4965.delta_stats.rx.ofdm_ht;84 max_ofdm = &il->_4965.max_delta.rx.ofdm;85 max_cck = &il->_4965.max_delta.rx.cck;86 max_general = &il->_4965.max_delta.rx.general;87 max_ht = &il->_4965.max_delta.rx.ofdm_ht;88 89 pos += il4965_stats_flag(il, buf, bufsz);90 pos +=91 scnprintf(buf + pos, bufsz - pos, fmt_header,92 "Statistics_Rx - OFDM:");93 pos +=94 scnprintf(buf + pos, bufsz - pos, fmt_table, "ina_cnt:",95 le32_to_cpu(ofdm->ina_cnt), accum_ofdm->ina_cnt,96 delta_ofdm->ina_cnt, max_ofdm->ina_cnt);97 pos +=98 scnprintf(buf + pos, bufsz - pos, fmt_table, "fina_cnt:",99 le32_to_cpu(ofdm->fina_cnt), accum_ofdm->fina_cnt,100 delta_ofdm->fina_cnt, max_ofdm->fina_cnt);101 pos +=102 scnprintf(buf + pos, bufsz - pos, fmt_table, "plcp_err:",103 le32_to_cpu(ofdm->plcp_err), accum_ofdm->plcp_err,104 delta_ofdm->plcp_err, max_ofdm->plcp_err);105 pos +=106 scnprintf(buf + pos, bufsz - pos, fmt_table, "crc32_err:",107 le32_to_cpu(ofdm->crc32_err), accum_ofdm->crc32_err,108 delta_ofdm->crc32_err, max_ofdm->crc32_err);109 pos +=110 scnprintf(buf + pos, bufsz - pos, fmt_table, "overrun_err:",111 le32_to_cpu(ofdm->overrun_err), accum_ofdm->overrun_err,112 delta_ofdm->overrun_err, max_ofdm->overrun_err);113 pos +=114 scnprintf(buf + pos, bufsz - pos, fmt_table, "early_overrun_err:",115 le32_to_cpu(ofdm->early_overrun_err),116 accum_ofdm->early_overrun_err,117 delta_ofdm->early_overrun_err,118 max_ofdm->early_overrun_err);119 pos +=120 scnprintf(buf + pos, bufsz - pos, fmt_table, "crc32_good:",121 le32_to_cpu(ofdm->crc32_good), accum_ofdm->crc32_good,122 delta_ofdm->crc32_good, max_ofdm->crc32_good);123 pos +=124 scnprintf(buf + pos, bufsz - pos, fmt_table, "false_alarm_cnt:",125 le32_to_cpu(ofdm->false_alarm_cnt),126 accum_ofdm->false_alarm_cnt, delta_ofdm->false_alarm_cnt,127 max_ofdm->false_alarm_cnt);128 pos +=129 scnprintf(buf + pos, bufsz - pos, fmt_table, "fina_sync_err_cnt:",130 le32_to_cpu(ofdm->fina_sync_err_cnt),131 accum_ofdm->fina_sync_err_cnt,132 delta_ofdm->fina_sync_err_cnt,133 max_ofdm->fina_sync_err_cnt);134 pos +=135 scnprintf(buf + pos, bufsz - pos, fmt_table, "sfd_timeout:",136 le32_to_cpu(ofdm->sfd_timeout), accum_ofdm->sfd_timeout,137 delta_ofdm->sfd_timeout, max_ofdm->sfd_timeout);138 pos +=139 scnprintf(buf + pos, bufsz - pos, fmt_table, "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, fmt_table, "unresponded_rts:",144 le32_to_cpu(ofdm->unresponded_rts),145 accum_ofdm->unresponded_rts, delta_ofdm->unresponded_rts,146 max_ofdm->unresponded_rts);147 pos +=148 scnprintf(buf + pos, bufsz - pos, fmt_table, "rxe_frame_lmt_ovrun:",149 le32_to_cpu(ofdm->rxe_frame_limit_overrun),150 accum_ofdm->rxe_frame_limit_overrun,151 delta_ofdm->rxe_frame_limit_overrun,152 max_ofdm->rxe_frame_limit_overrun);153 pos +=154 scnprintf(buf + pos, bufsz - pos, fmt_table, "sent_ack_cnt:",155 le32_to_cpu(ofdm->sent_ack_cnt), accum_ofdm->sent_ack_cnt,156 delta_ofdm->sent_ack_cnt, max_ofdm->sent_ack_cnt);157 pos +=158 scnprintf(buf + pos, bufsz - pos, fmt_table, "sent_cts_cnt:",159 le32_to_cpu(ofdm->sent_cts_cnt), accum_ofdm->sent_cts_cnt,160 delta_ofdm->sent_cts_cnt, max_ofdm->sent_cts_cnt);161 pos +=162 scnprintf(buf + pos, bufsz - pos, fmt_table, "sent_ba_rsp_cnt:",163 le32_to_cpu(ofdm->sent_ba_rsp_cnt),164 accum_ofdm->sent_ba_rsp_cnt, delta_ofdm->sent_ba_rsp_cnt,165 max_ofdm->sent_ba_rsp_cnt);166 pos +=167 scnprintf(buf + pos, bufsz - pos, fmt_table, "dsp_self_kill:",168 le32_to_cpu(ofdm->dsp_self_kill),169 accum_ofdm->dsp_self_kill, delta_ofdm->dsp_self_kill,170 max_ofdm->dsp_self_kill);171 pos +=172 scnprintf(buf + pos, bufsz - pos, fmt_table, "mh_format_err:",173 le32_to_cpu(ofdm->mh_format_err),174 accum_ofdm->mh_format_err, delta_ofdm->mh_format_err,175 max_ofdm->mh_format_err);176 pos +=177 scnprintf(buf + pos, bufsz - pos, fmt_table,178 "re_acq_main_rssi_sum:",179 le32_to_cpu(ofdm->re_acq_main_rssi_sum),180 accum_ofdm->re_acq_main_rssi_sum,181 delta_ofdm->re_acq_main_rssi_sum,182 max_ofdm->re_acq_main_rssi_sum);183 184 pos +=185 scnprintf(buf + pos, bufsz - pos, fmt_header,186 "Statistics_Rx - CCK:");187 pos +=188 scnprintf(buf + pos, bufsz - pos, fmt_table, "ina_cnt:",189 le32_to_cpu(cck->ina_cnt), accum_cck->ina_cnt,190 delta_cck->ina_cnt, max_cck->ina_cnt);191 pos +=192 scnprintf(buf + pos, bufsz - pos, fmt_table, "fina_cnt:",193 le32_to_cpu(cck->fina_cnt), accum_cck->fina_cnt,194 delta_cck->fina_cnt, max_cck->fina_cnt);195 pos +=196 scnprintf(buf + pos, bufsz - pos, fmt_table, "plcp_err:",197 le32_to_cpu(cck->plcp_err), accum_cck->plcp_err,198 delta_cck->plcp_err, max_cck->plcp_err);199 pos +=200 scnprintf(buf + pos, bufsz - pos, fmt_table, "crc32_err:",201 le32_to_cpu(cck->crc32_err), accum_cck->crc32_err,202 delta_cck->crc32_err, max_cck->crc32_err);203 pos +=204 scnprintf(buf + pos, bufsz - pos, fmt_table, "overrun_err:",205 le32_to_cpu(cck->overrun_err), accum_cck->overrun_err,206 delta_cck->overrun_err, max_cck->overrun_err);207 pos +=208 scnprintf(buf + pos, bufsz - pos, fmt_table, "early_overrun_err:",209 le32_to_cpu(cck->early_overrun_err),210 accum_cck->early_overrun_err,211 delta_cck->early_overrun_err, max_cck->early_overrun_err);212 pos +=213 scnprintf(buf + pos, bufsz - pos, fmt_table, "crc32_good:",214 le32_to_cpu(cck->crc32_good), accum_cck->crc32_good,215 delta_cck->crc32_good, max_cck->crc32_good);216 pos +=217 scnprintf(buf + pos, bufsz - pos, fmt_table, "false_alarm_cnt:",218 le32_to_cpu(cck->false_alarm_cnt),219 accum_cck->false_alarm_cnt, delta_cck->false_alarm_cnt,220 max_cck->false_alarm_cnt);221 pos +=222 scnprintf(buf + pos, bufsz - pos, fmt_table, "fina_sync_err_cnt:",223 le32_to_cpu(cck->fina_sync_err_cnt),224 accum_cck->fina_sync_err_cnt,225 delta_cck->fina_sync_err_cnt, max_cck->fina_sync_err_cnt);226 pos +=227 scnprintf(buf + pos, bufsz - pos, fmt_table, "sfd_timeout:",228 le32_to_cpu(cck->sfd_timeout), accum_cck->sfd_timeout,229 delta_cck->sfd_timeout, max_cck->sfd_timeout);230 pos +=231 scnprintf(buf + pos, bufsz - pos, fmt_table, "fina_timeout:",232 le32_to_cpu(cck->fina_timeout), accum_cck->fina_timeout,233 delta_cck->fina_timeout, max_cck->fina_timeout);234 pos +=235 scnprintf(buf + pos, bufsz - pos, fmt_table, "unresponded_rts:",236 le32_to_cpu(cck->unresponded_rts),237 accum_cck->unresponded_rts, delta_cck->unresponded_rts,238 max_cck->unresponded_rts);239 pos +=240 scnprintf(buf + pos, bufsz - pos, fmt_table, "rxe_frame_lmt_ovrun:",241 le32_to_cpu(cck->rxe_frame_limit_overrun),242 accum_cck->rxe_frame_limit_overrun,243 delta_cck->rxe_frame_limit_overrun,244 max_cck->rxe_frame_limit_overrun);245 pos +=246 scnprintf(buf + pos, bufsz - pos, fmt_table, "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, fmt_table, "sent_cts_cnt:",251 le32_to_cpu(cck->sent_cts_cnt), accum_cck->sent_cts_cnt,252 delta_cck->sent_cts_cnt, max_cck->sent_cts_cnt);253 pos +=254 scnprintf(buf + pos, bufsz - pos, fmt_table, "sent_ba_rsp_cnt:",255 le32_to_cpu(cck->sent_ba_rsp_cnt),256 accum_cck->sent_ba_rsp_cnt, delta_cck->sent_ba_rsp_cnt,257 max_cck->sent_ba_rsp_cnt);258 pos +=259 scnprintf(buf + pos, bufsz - pos, fmt_table, "dsp_self_kill:",260 le32_to_cpu(cck->dsp_self_kill), accum_cck->dsp_self_kill,261 delta_cck->dsp_self_kill, max_cck->dsp_self_kill);262 pos +=263 scnprintf(buf + pos, bufsz - pos, fmt_table, "mh_format_err:",264 le32_to_cpu(cck->mh_format_err), accum_cck->mh_format_err,265 delta_cck->mh_format_err, max_cck->mh_format_err);266 pos +=267 scnprintf(buf + pos, bufsz - pos, fmt_table,268 "re_acq_main_rssi_sum:",269 le32_to_cpu(cck->re_acq_main_rssi_sum),270 accum_cck->re_acq_main_rssi_sum,271 delta_cck->re_acq_main_rssi_sum,272 max_cck->re_acq_main_rssi_sum);273 274 pos +=275 scnprintf(buf + pos, bufsz - pos, fmt_header,276 "Statistics_Rx - GENERAL:");277 pos +=278 scnprintf(buf + pos, bufsz - pos, fmt_table, "bogus_cts:",279 le32_to_cpu(general->bogus_cts), accum_general->bogus_cts,280 delta_general->bogus_cts, max_general->bogus_cts);281 pos +=282 scnprintf(buf + pos, bufsz - pos, fmt_table, "bogus_ack:",283 le32_to_cpu(general->bogus_ack), accum_general->bogus_ack,284 delta_general->bogus_ack, max_general->bogus_ack);285 pos +=286 scnprintf(buf + pos, bufsz - pos, fmt_table, "non_bssid_frames:",287 le32_to_cpu(general->non_bssid_frames),288 accum_general->non_bssid_frames,289 delta_general->non_bssid_frames,290 max_general->non_bssid_frames);291 pos +=292 scnprintf(buf + pos, bufsz - pos, fmt_table, "filtered_frames:",293 le32_to_cpu(general->filtered_frames),294 accum_general->filtered_frames,295 delta_general->filtered_frames,296 max_general->filtered_frames);297 pos +=298 scnprintf(buf + pos, bufsz - pos, fmt_table, "non_channel_beacons:",299 le32_to_cpu(general->non_channel_beacons),300 accum_general->non_channel_beacons,301 delta_general->non_channel_beacons,302 max_general->non_channel_beacons);303 pos +=304 scnprintf(buf + pos, bufsz - pos, fmt_table, "channel_beacons:",305 le32_to_cpu(general->channel_beacons),306 accum_general->channel_beacons,307 delta_general->channel_beacons,308 max_general->channel_beacons);309 pos +=310 scnprintf(buf + pos, bufsz - pos, fmt_table, "num_missed_bcon:",311 le32_to_cpu(general->num_missed_bcon),312 accum_general->num_missed_bcon,313 delta_general->num_missed_bcon,314 max_general->num_missed_bcon);315 pos +=316 scnprintf(buf + pos, bufsz - pos, fmt_table,317 "adc_rx_saturation_time:",318 le32_to_cpu(general->adc_rx_saturation_time),319 accum_general->adc_rx_saturation_time,320 delta_general->adc_rx_saturation_time,321 max_general->adc_rx_saturation_time);322 pos +=323 scnprintf(buf + pos, bufsz - pos, fmt_table,324 "ina_detect_search_tm:",325 le32_to_cpu(general->ina_detection_search_time),326 accum_general->ina_detection_search_time,327 delta_general->ina_detection_search_time,328 max_general->ina_detection_search_time);329 pos +=330 scnprintf(buf + pos, bufsz - pos, fmt_table,331 "beacon_silence_rssi_a:",332 le32_to_cpu(general->beacon_silence_rssi_a),333 accum_general->beacon_silence_rssi_a,334 delta_general->beacon_silence_rssi_a,335 max_general->beacon_silence_rssi_a);336 pos +=337 scnprintf(buf + pos, bufsz - pos, fmt_table,338 "beacon_silence_rssi_b:",339 le32_to_cpu(general->beacon_silence_rssi_b),340 accum_general->beacon_silence_rssi_b,341 delta_general->beacon_silence_rssi_b,342 max_general->beacon_silence_rssi_b);343 pos +=344 scnprintf(buf + pos, bufsz - pos, fmt_table,345 "beacon_silence_rssi_c:",346 le32_to_cpu(general->beacon_silence_rssi_c),347 accum_general->beacon_silence_rssi_c,348 delta_general->beacon_silence_rssi_c,349 max_general->beacon_silence_rssi_c);350 pos +=351 scnprintf(buf + pos, bufsz - pos, fmt_table,352 "interference_data_flag:",353 le32_to_cpu(general->interference_data_flag),354 accum_general->interference_data_flag,355 delta_general->interference_data_flag,356 max_general->interference_data_flag);357 pos +=358 scnprintf(buf + pos, bufsz - pos, fmt_table, "channel_load:",359 le32_to_cpu(general->channel_load),360 accum_general->channel_load, delta_general->channel_load,361 max_general->channel_load);362 pos +=363 scnprintf(buf + pos, bufsz - pos, fmt_table, "dsp_false_alarms:",364 le32_to_cpu(general->dsp_false_alarms),365 accum_general->dsp_false_alarms,366 delta_general->dsp_false_alarms,367 max_general->dsp_false_alarms);368 pos +=369 scnprintf(buf + pos, bufsz - pos, fmt_table, "beacon_rssi_a:",370 le32_to_cpu(general->beacon_rssi_a),371 accum_general->beacon_rssi_a,372 delta_general->beacon_rssi_a, max_general->beacon_rssi_a);373 pos +=374 scnprintf(buf + pos, bufsz - pos, fmt_table, "beacon_rssi_b:",375 le32_to_cpu(general->beacon_rssi_b),376 accum_general->beacon_rssi_b,377 delta_general->beacon_rssi_b, max_general->beacon_rssi_b);378 pos +=379 scnprintf(buf + pos, bufsz - pos, fmt_table, "beacon_rssi_c:",380 le32_to_cpu(general->beacon_rssi_c),381 accum_general->beacon_rssi_c,382 delta_general->beacon_rssi_c, max_general->beacon_rssi_c);383 pos +=384 scnprintf(buf + pos, bufsz - pos, fmt_table, "beacon_energy_a:",385 le32_to_cpu(general->beacon_energy_a),386 accum_general->beacon_energy_a,387 delta_general->beacon_energy_a,388 max_general->beacon_energy_a);389 pos +=390 scnprintf(buf + pos, bufsz - pos, fmt_table, "beacon_energy_b:",391 le32_to_cpu(general->beacon_energy_b),392 accum_general->beacon_energy_b,393 delta_general->beacon_energy_b,394 max_general->beacon_energy_b);395 pos +=396 scnprintf(buf + pos, bufsz - pos, fmt_table, "beacon_energy_c:",397 le32_to_cpu(general->beacon_energy_c),398 accum_general->beacon_energy_c,399 delta_general->beacon_energy_c,400 max_general->beacon_energy_c);401 402 pos +=403 scnprintf(buf + pos, bufsz - pos, fmt_header,404 "Statistics_Rx - OFDM_HT:");405 pos +=406 scnprintf(buf + pos, bufsz - pos, fmt_table, "plcp_err:",407 le32_to_cpu(ht->plcp_err), accum_ht->plcp_err,408 delta_ht->plcp_err, max_ht->plcp_err);409 pos +=410 scnprintf(buf + pos, bufsz - pos, fmt_table, "overrun_err:",411 le32_to_cpu(ht->overrun_err), accum_ht->overrun_err,412 delta_ht->overrun_err, max_ht->overrun_err);413 pos +=414 scnprintf(buf + pos, bufsz - pos, fmt_table, "early_overrun_err:",415 le32_to_cpu(ht->early_overrun_err),416 accum_ht->early_overrun_err, delta_ht->early_overrun_err,417 max_ht->early_overrun_err);418 pos +=419 scnprintf(buf + pos, bufsz - pos, fmt_table, "crc32_good:",420 le32_to_cpu(ht->crc32_good), accum_ht->crc32_good,421 delta_ht->crc32_good, max_ht->crc32_good);422 pos +=423 scnprintf(buf + pos, bufsz - pos, fmt_table, "crc32_err:",424 le32_to_cpu(ht->crc32_err), accum_ht->crc32_err,425 delta_ht->crc32_err, max_ht->crc32_err);426 pos +=427 scnprintf(buf + pos, bufsz - pos, fmt_table, "mh_format_err:",428 le32_to_cpu(ht->mh_format_err), accum_ht->mh_format_err,429 delta_ht->mh_format_err, max_ht->mh_format_err);430 pos +=431 scnprintf(buf + pos, bufsz - pos, fmt_table, "agg_crc32_good:",432 le32_to_cpu(ht->agg_crc32_good), accum_ht->agg_crc32_good,433 delta_ht->agg_crc32_good, max_ht->agg_crc32_good);434 pos +=435 scnprintf(buf + pos, bufsz - pos, fmt_table, "agg_mpdu_cnt:",436 le32_to_cpu(ht->agg_mpdu_cnt), accum_ht->agg_mpdu_cnt,437 delta_ht->agg_mpdu_cnt, max_ht->agg_mpdu_cnt);438 pos +=439 scnprintf(buf + pos, bufsz - pos, fmt_table, "agg_cnt:",440 le32_to_cpu(ht->agg_cnt), accum_ht->agg_cnt,441 delta_ht->agg_cnt, max_ht->agg_cnt);442 pos +=443 scnprintf(buf + pos, bufsz - pos, fmt_table, "unsupport_mcs:",444 le32_to_cpu(ht->unsupport_mcs), accum_ht->unsupport_mcs,445 delta_ht->unsupport_mcs, max_ht->unsupport_mcs);446 447 ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos);448 kfree(buf);449 return ret;450}451 452static ssize_t453il4965_ucode_tx_stats_read(struct file *file, char __user *user_buf,454 size_t count, loff_t *ppos)455{456 struct il_priv *il = file->private_data;457 int pos = 0;458 char *buf;459 int bufsz = (sizeof(struct stats_tx) * 48) + 250;460 ssize_t ret;461 struct stats_tx *tx, *accum_tx, *delta_tx, *max_tx;462 463 if (!il_is_alive(il))464 return -EAGAIN;465 466 buf = kzalloc(bufsz, GFP_KERNEL);467 if (!buf) {468 IL_ERR("Can not allocate Buffer\n");469 return -ENOMEM;470 }471 472 /* the statistic information display here is based on473 * the last stats notification from uCode474 * might not reflect the current uCode activity475 */476 tx = &il->_4965.stats.tx;477 accum_tx = &il->_4965.accum_stats.tx;478 delta_tx = &il->_4965.delta_stats.tx;479 max_tx = &il->_4965.max_delta.tx;480 481 pos += il4965_stats_flag(il, buf, bufsz);482 pos += scnprintf(buf + pos, bufsz - pos, fmt_header, "Statistics_Tx:");483 pos +=484 scnprintf(buf + pos, bufsz - pos, fmt_table, "preamble:",485 le32_to_cpu(tx->preamble_cnt), accum_tx->preamble_cnt,486 delta_tx->preamble_cnt, max_tx->preamble_cnt);487 pos +=488 scnprintf(buf + pos, bufsz - pos, fmt_table, "rx_detected_cnt:",489 le32_to_cpu(tx->rx_detected_cnt),490 accum_tx->rx_detected_cnt, delta_tx->rx_detected_cnt,491 max_tx->rx_detected_cnt);492 pos +=493 scnprintf(buf + pos, bufsz - pos, fmt_table, "bt_prio_defer_cnt:",494 le32_to_cpu(tx->bt_prio_defer_cnt),495 accum_tx->bt_prio_defer_cnt, delta_tx->bt_prio_defer_cnt,496 max_tx->bt_prio_defer_cnt);497 pos +=498 scnprintf(buf + pos, bufsz - pos, fmt_table, "bt_prio_kill_cnt:",499 le32_to_cpu(tx->bt_prio_kill_cnt),500 accum_tx->bt_prio_kill_cnt, delta_tx->bt_prio_kill_cnt,501 max_tx->bt_prio_kill_cnt);502 pos +=503 scnprintf(buf + pos, bufsz - pos, fmt_table, "few_bytes_cnt:",504 le32_to_cpu(tx->few_bytes_cnt), accum_tx->few_bytes_cnt,505 delta_tx->few_bytes_cnt, max_tx->few_bytes_cnt);506 pos +=507 scnprintf(buf + pos, bufsz - pos, fmt_table, "cts_timeout:",508 le32_to_cpu(tx->cts_timeout), accum_tx->cts_timeout,509 delta_tx->cts_timeout, max_tx->cts_timeout);510 pos +=511 scnprintf(buf + pos, bufsz - pos, fmt_table, "ack_timeout:",512 le32_to_cpu(tx->ack_timeout), accum_tx->ack_timeout,513 delta_tx->ack_timeout, max_tx->ack_timeout);514 pos +=515 scnprintf(buf + pos, bufsz - pos, fmt_table, "expected_ack_cnt:",516 le32_to_cpu(tx->expected_ack_cnt),517 accum_tx->expected_ack_cnt, delta_tx->expected_ack_cnt,518 max_tx->expected_ack_cnt);519 pos +=520 scnprintf(buf + pos, bufsz - pos, fmt_table, "actual_ack_cnt:",521 le32_to_cpu(tx->actual_ack_cnt), accum_tx->actual_ack_cnt,522 delta_tx->actual_ack_cnt, max_tx->actual_ack_cnt);523 pos +=524 scnprintf(buf + pos, bufsz - pos, fmt_table, "dump_msdu_cnt:",525 le32_to_cpu(tx->dump_msdu_cnt), accum_tx->dump_msdu_cnt,526 delta_tx->dump_msdu_cnt, max_tx->dump_msdu_cnt);527 pos +=528 scnprintf(buf + pos, bufsz - pos, fmt_table,529 "abort_nxt_frame_mismatch:",530 le32_to_cpu(tx->burst_abort_next_frame_mismatch_cnt),531 accum_tx->burst_abort_next_frame_mismatch_cnt,532 delta_tx->burst_abort_next_frame_mismatch_cnt,533 max_tx->burst_abort_next_frame_mismatch_cnt);534 pos +=535 scnprintf(buf + pos, bufsz - pos, fmt_table,536 "abort_missing_nxt_frame:",537 le32_to_cpu(tx->burst_abort_missing_next_frame_cnt),538 accum_tx->burst_abort_missing_next_frame_cnt,539 delta_tx->burst_abort_missing_next_frame_cnt,540 max_tx->burst_abort_missing_next_frame_cnt);541 pos +=542 scnprintf(buf + pos, bufsz - pos, fmt_table,543 "cts_timeout_collision:",544 le32_to_cpu(tx->cts_timeout_collision),545 accum_tx->cts_timeout_collision,546 delta_tx->cts_timeout_collision,547 max_tx->cts_timeout_collision);548 pos +=549 scnprintf(buf + pos, bufsz - pos, fmt_table,550 "ack_ba_timeout_collision:",551 le32_to_cpu(tx->ack_or_ba_timeout_collision),552 accum_tx->ack_or_ba_timeout_collision,553 delta_tx->ack_or_ba_timeout_collision,554 max_tx->ack_or_ba_timeout_collision);555 pos +=556 scnprintf(buf + pos, bufsz - pos, fmt_table, "agg ba_timeout:",557 le32_to_cpu(tx->agg.ba_timeout), accum_tx->agg.ba_timeout,558 delta_tx->agg.ba_timeout, max_tx->agg.ba_timeout);559 pos +=560 scnprintf(buf + pos, bufsz - pos, fmt_table,561 "agg ba_resched_frames:",562 le32_to_cpu(tx->agg.ba_reschedule_frames),563 accum_tx->agg.ba_reschedule_frames,564 delta_tx->agg.ba_reschedule_frames,565 max_tx->agg.ba_reschedule_frames);566 pos +=567 scnprintf(buf + pos, bufsz - pos, fmt_table,568 "agg scd_query_agg_frame:",569 le32_to_cpu(tx->agg.scd_query_agg_frame_cnt),570 accum_tx->agg.scd_query_agg_frame_cnt,571 delta_tx->agg.scd_query_agg_frame_cnt,572 max_tx->agg.scd_query_agg_frame_cnt);573 pos +=574 scnprintf(buf + pos, bufsz - pos, fmt_table,575 "agg scd_query_no_agg:",576 le32_to_cpu(tx->agg.scd_query_no_agg),577 accum_tx->agg.scd_query_no_agg,578 delta_tx->agg.scd_query_no_agg,579 max_tx->agg.scd_query_no_agg);580 pos +=581 scnprintf(buf + pos, bufsz - pos, fmt_table, "agg scd_query_agg:",582 le32_to_cpu(tx->agg.scd_query_agg),583 accum_tx->agg.scd_query_agg, delta_tx->agg.scd_query_agg,584 max_tx->agg.scd_query_agg);585 pos +=586 scnprintf(buf + pos, bufsz - pos, fmt_table,587 "agg scd_query_mismatch:",588 le32_to_cpu(tx->agg.scd_query_mismatch),589 accum_tx->agg.scd_query_mismatch,590 delta_tx->agg.scd_query_mismatch,591 max_tx->agg.scd_query_mismatch);592 pos +=593 scnprintf(buf + pos, bufsz - pos, fmt_table, "agg frame_not_ready:",594 le32_to_cpu(tx->agg.frame_not_ready),595 accum_tx->agg.frame_not_ready,596 delta_tx->agg.frame_not_ready,597 max_tx->agg.frame_not_ready);598 pos +=599 scnprintf(buf + pos, bufsz - pos, fmt_table, "agg underrun:",600 le32_to_cpu(tx->agg.underrun), accum_tx->agg.underrun,601 delta_tx->agg.underrun, max_tx->agg.underrun);602 pos +=603 scnprintf(buf + pos, bufsz - pos, fmt_table, "agg bt_prio_kill:",604 le32_to_cpu(tx->agg.bt_prio_kill),605 accum_tx->agg.bt_prio_kill, delta_tx->agg.bt_prio_kill,606 max_tx->agg.bt_prio_kill);607 pos +=608 scnprintf(buf + pos, bufsz - pos, fmt_table, "agg rx_ba_rsp_cnt:",609 le32_to_cpu(tx->agg.rx_ba_rsp_cnt),610 accum_tx->agg.rx_ba_rsp_cnt, delta_tx->agg.rx_ba_rsp_cnt,611 max_tx->agg.rx_ba_rsp_cnt);612 613 ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos);614 kfree(buf);615 return ret;616}617 618static ssize_t619il4965_ucode_general_stats_read(struct file *file, char __user *user_buf,620 size_t count, loff_t *ppos)621{622 struct il_priv *il = file->private_data;623 int pos = 0;624 char *buf;625 int bufsz = sizeof(struct stats_general) * 10 + 300;626 ssize_t ret;627 struct stats_general_common *general, *accum_general;628 struct stats_general_common *delta_general, *max_general;629 struct stats_dbg *dbg, *accum_dbg, *delta_dbg, *max_dbg;630 struct stats_div *div, *accum_div, *delta_div, *max_div;631 632 if (!il_is_alive(il))633 return -EAGAIN;634 635 buf = kzalloc(bufsz, GFP_KERNEL);636 if (!buf) {637 IL_ERR("Can not allocate Buffer\n");638 return -ENOMEM;639 }640 641 /* the statistic information display here is based on642 * the last stats notification from uCode643 * might not reflect the current uCode activity644 */645 general = &il->_4965.stats.general.common;646 dbg = &il->_4965.stats.general.common.dbg;647 div = &il->_4965.stats.general.common.div;648 accum_general = &il->_4965.accum_stats.general.common;649 accum_dbg = &il->_4965.accum_stats.general.common.dbg;650 accum_div = &il->_4965.accum_stats.general.common.div;651 delta_general = &il->_4965.delta_stats.general.common;652 max_general = &il->_4965.max_delta.general.common;653 delta_dbg = &il->_4965.delta_stats.general.common.dbg;654 max_dbg = &il->_4965.max_delta.general.common.dbg;655 delta_div = &il->_4965.delta_stats.general.common.div;656 max_div = &il->_4965.max_delta.general.common.div;657 658 pos += il4965_stats_flag(il, buf, bufsz);659 pos +=660 scnprintf(buf + pos, bufsz - pos, fmt_header,661 "Statistics_General:");662 pos +=663 scnprintf(buf + pos, bufsz - pos, fmt_value, "temperature:",664 le32_to_cpu(general->temperature));665 pos +=666 scnprintf(buf + pos, bufsz - pos, fmt_value, "ttl_timestamp:",667 le32_to_cpu(general->ttl_timestamp));668 pos +=669 scnprintf(buf + pos, bufsz - pos, fmt_table, "burst_check:",670 le32_to_cpu(dbg->burst_check), accum_dbg->burst_check,671 delta_dbg->burst_check, max_dbg->burst_check);672 pos +=673 scnprintf(buf + pos, bufsz - pos, fmt_table, "burst_count:",674 le32_to_cpu(dbg->burst_count), accum_dbg->burst_count,675 delta_dbg->burst_count, max_dbg->burst_count);676 pos +=677 scnprintf(buf + pos, bufsz - pos, fmt_table,678 "wait_for_silence_timeout_count:",679 le32_to_cpu(dbg->wait_for_silence_timeout_cnt),680 accum_dbg->wait_for_silence_timeout_cnt,681 delta_dbg->wait_for_silence_timeout_cnt,682 max_dbg->wait_for_silence_timeout_cnt);683 pos +=684 scnprintf(buf + pos, bufsz - pos, fmt_table, "sleep_time:",685 le32_to_cpu(general->sleep_time),686 accum_general->sleep_time, delta_general->sleep_time,687 max_general->sleep_time);688 pos +=689 scnprintf(buf + pos, bufsz - pos, fmt_table, "slots_out:",690 le32_to_cpu(general->slots_out), accum_general->slots_out,691 delta_general->slots_out, max_general->slots_out);692 pos +=693 scnprintf(buf + pos, bufsz - pos, fmt_table, "slots_idle:",694 le32_to_cpu(general->slots_idle),695 accum_general->slots_idle, delta_general->slots_idle,696 max_general->slots_idle);697 pos +=698 scnprintf(buf + pos, bufsz - pos, fmt_table, "tx_on_a:",699 le32_to_cpu(div->tx_on_a), accum_div->tx_on_a,700 delta_div->tx_on_a, max_div->tx_on_a);701 pos +=702 scnprintf(buf + pos, bufsz - pos, fmt_table, "tx_on_b:",703 le32_to_cpu(div->tx_on_b), accum_div->tx_on_b,704 delta_div->tx_on_b, max_div->tx_on_b);705 pos +=706 scnprintf(buf + pos, bufsz - pos, fmt_table, "exec_time:",707 le32_to_cpu(div->exec_time), accum_div->exec_time,708 delta_div->exec_time, max_div->exec_time);709 pos +=710 scnprintf(buf + pos, bufsz - pos, fmt_table, "probe_time:",711 le32_to_cpu(div->probe_time), accum_div->probe_time,712 delta_div->probe_time, max_div->probe_time);713 pos +=714 scnprintf(buf + pos, bufsz - pos, fmt_table, "rx_enable_counter:",715 le32_to_cpu(general->rx_enable_counter),716 accum_general->rx_enable_counter,717 delta_general->rx_enable_counter,718 max_general->rx_enable_counter);719 pos +=720 scnprintf(buf + pos, bufsz - pos, fmt_table, "num_of_sos_states:",721 le32_to_cpu(general->num_of_sos_states),722 accum_general->num_of_sos_states,723 delta_general->num_of_sos_states,724 max_general->num_of_sos_states);725 ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos);726 kfree(buf);727 return ret;728}729 730const struct il_debugfs_ops il4965_debugfs_ops = {731 .rx_stats_read = il4965_ucode_rx_stats_read,732 .tx_stats_read = il4965_ucode_tx_stats_read,733 .general_stats_read = il4965_ucode_general_stats_read,734};735