brintos

brintos / linux-shallow public Read only

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