xref: /linux/drivers/net/wireless/intel/iwlwifi/fw/api/stats.h (revision 288440de9e5fdb4a3ff73864850f080c1250fc81)
1 /* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
2 /*
3  * Copyright (C) 2012-2014, 2018, 2020 - 2021 Intel Corporation
4  * Copyright (C) 2013-2015 Intel Mobile Communications GmbH
5  * Copyright (C) 2016-2017 Intel Deutschland GmbH
6  */
7 #ifndef __iwl_fw_api_stats_h__
8 #define __iwl_fw_api_stats_h__
9 #include "mac.h"
10 
11 struct mvm_statistics_dbg {
12 	__le32 burst_check;
13 	__le32 burst_count;
14 	__le32 wait_for_silence_timeout_cnt;
15 	u8 reserved[12];
16 } __packed; /* STATISTICS_DEBUG_API_S_VER_2 */
17 
18 struct mvm_statistics_div {
19 	__le32 tx_on_a;
20 	__le32 tx_on_b;
21 	__le32 exec_time;
22 	__le32 probe_time;
23 	__le32 rssi_ant;
24 	__le32 reserved2;
25 } __packed; /* STATISTICS_SLOW_DIV_API_S_VER_2 */
26 
27 /**
28  * struct mvm_statistics_rx_non_phy
29  * @bogus_cts: CTS received when not expecting CTS
30  * @bogus_ack: ACK received when not expecting ACK
31  * @non_channel_beacons: beacons with our bss id but not on our serving channel
32  * @channel_beacons: beacons with our bss id and in our serving channel
33  * @num_missed_bcon: number of missed beacons
34  * @adc_rx_saturation_time: count in 0.8us units the time the ADC was in
35  *	saturation
36  * @ina_detection_search_time: total time (in 0.8us) searched for INA
37  * @beacon_silence_rssi_a: RSSI silence after beacon frame
38  * @beacon_silence_rssi_b: RSSI silence after beacon frame
39  * @beacon_silence_rssi_c: RSSI silence after beacon frame
40  * @interference_data_flag: flag for interference data availability. 1 when data
41  *	is available.
42  * @channel_load: counts RX Enable time in uSec
43  * @beacon_rssi_a: beacon RSSI on antenna A
44  * @beacon_rssi_b: beacon RSSI on antenna B
45  * @beacon_rssi_c: beacon RSSI on antenna C
46  * @beacon_energy_a: beacon energy on antenna A
47  * @beacon_energy_b: beacon energy on antenna B
48  * @beacon_energy_c: beacon energy on antenna C
49  * @num_bt_kills: number of BT "kills" (frame TX aborts)
50  * @mac_id: mac ID
51  */
52 struct mvm_statistics_rx_non_phy {
53 	__le32 bogus_cts;
54 	__le32 bogus_ack;
55 	__le32 non_channel_beacons;
56 	__le32 channel_beacons;
57 	__le32 num_missed_bcon;
58 	__le32 adc_rx_saturation_time;
59 	__le32 ina_detection_search_time;
60 	__le32 beacon_silence_rssi_a;
61 	__le32 beacon_silence_rssi_b;
62 	__le32 beacon_silence_rssi_c;
63 	__le32 interference_data_flag;
64 	__le32 channel_load;
65 	__le32 beacon_rssi_a;
66 	__le32 beacon_rssi_b;
67 	__le32 beacon_rssi_c;
68 	__le32 beacon_energy_a;
69 	__le32 beacon_energy_b;
70 	__le32 beacon_energy_c;
71 	__le32 num_bt_kills;
72 	__le32 mac_id;
73 } __packed; /* STATISTICS_RX_NON_PHY_API_S_VER_4 */
74 
75 struct mvm_statistics_rx_non_phy_v3 {
76 	__le32 bogus_cts;	/* CTS received when not expecting CTS */
77 	__le32 bogus_ack;	/* ACK received when not expecting ACK */
78 	__le32 non_bssid_frames;	/* number of frames with BSSID that
79 					 * doesn't belong to the STA BSSID */
80 	__le32 filtered_frames;	/* count frames that were dumped in the
81 				 * filtering process */
82 	__le32 non_channel_beacons;	/* beacons with our bss id but not on
83 					 * our serving channel */
84 	__le32 channel_beacons;	/* beacons with our bss id and in our
85 				 * serving channel */
86 	__le32 num_missed_bcon;	/* number of missed beacons */
87 	__le32 adc_rx_saturation_time;	/* count in 0.8us units the time the
88 					 * ADC was in saturation */
89 	__le32 ina_detection_search_time;/* total time (in 0.8us) searched
90 					  * for INA */
91 	__le32 beacon_silence_rssi_a;	/* RSSI silence after beacon frame */
92 	__le32 beacon_silence_rssi_b;	/* RSSI silence after beacon frame */
93 	__le32 beacon_silence_rssi_c;	/* RSSI silence after beacon frame */
94 	__le32 interference_data_flag;	/* flag for interference data
95 					 * availability. 1 when data is
96 					 * available. */
97 	__le32 channel_load;		/* counts RX Enable time in uSec */
98 	__le32 dsp_false_alarms;	/* DSP false alarm (both OFDM
99 					 * and CCK) counter */
100 	__le32 beacon_rssi_a;
101 	__le32 beacon_rssi_b;
102 	__le32 beacon_rssi_c;
103 	__le32 beacon_energy_a;
104 	__le32 beacon_energy_b;
105 	__le32 beacon_energy_c;
106 	__le32 num_bt_kills;
107 	__le32 mac_id;
108 	__le32 directed_data_mpdu;
109 } __packed; /* STATISTICS_RX_NON_PHY_API_S_VER_3 */
110 
111 struct mvm_statistics_rx_phy {
112 	__le32 unresponded_rts;
113 	__le32 rxe_frame_lmt_overrun;
114 	__le32 sent_ba_rsp_cnt;
115 	__le32 dsp_self_kill;
116 	__le32 reserved;
117 } __packed; /* STATISTICS_RX_PHY_API_S_VER_3 */
118 
119 struct mvm_statistics_rx_phy_v2 {
120 	__le32 ina_cnt;
121 	__le32 fina_cnt;
122 	__le32 plcp_err;
123 	__le32 crc32_err;
124 	__le32 overrun_err;
125 	__le32 early_overrun_err;
126 	__le32 crc32_good;
127 	__le32 false_alarm_cnt;
128 	__le32 fina_sync_err_cnt;
129 	__le32 sfd_timeout;
130 	__le32 fina_timeout;
131 	__le32 unresponded_rts;
132 	__le32 rxe_frame_lmt_overrun;
133 	__le32 sent_ack_cnt;
134 	__le32 sent_cts_cnt;
135 	__le32 sent_ba_rsp_cnt;
136 	__le32 dsp_self_kill;
137 	__le32 mh_format_err;
138 	__le32 re_acq_main_rssi_sum;
139 	__le32 reserved;
140 } __packed; /* STATISTICS_RX_PHY_API_S_VER_2 */
141 
142 struct mvm_statistics_rx_ht_phy_v1 {
143 	__le32 plcp_err;
144 	__le32 overrun_err;
145 	__le32 early_overrun_err;
146 	__le32 crc32_good;
147 	__le32 crc32_err;
148 	__le32 mh_format_err;
149 	__le32 agg_crc32_good;
150 	__le32 agg_mpdu_cnt;
151 	__le32 agg_cnt;
152 	__le32 unsupport_mcs;
153 } __packed;  /* STATISTICS_HT_RX_PHY_API_S_VER_1 */
154 
155 struct mvm_statistics_rx_ht_phy {
156 	__le32 mh_format_err;
157 	__le32 agg_mpdu_cnt;
158 	__le32 agg_cnt;
159 	__le32 unsupport_mcs;
160 } __packed;  /* STATISTICS_HT_RX_PHY_API_S_VER_2 */
161 
162 struct mvm_statistics_tx_non_phy_v3 {
163 	__le32 preamble_cnt;
164 	__le32 rx_detected_cnt;
165 	__le32 bt_prio_defer_cnt;
166 	__le32 bt_prio_kill_cnt;
167 	__le32 few_bytes_cnt;
168 	__le32 cts_timeout;
169 	__le32 ack_timeout;
170 	__le32 expected_ack_cnt;
171 	__le32 actual_ack_cnt;
172 	__le32 dump_msdu_cnt;
173 	__le32 burst_abort_next_frame_mismatch_cnt;
174 	__le32 burst_abort_missing_next_frame_cnt;
175 	__le32 cts_timeout_collision;
176 	__le32 ack_or_ba_timeout_collision;
177 } __packed; /* STATISTICS_TX_NON_PHY_API_S_VER_3 */
178 
179 struct mvm_statistics_tx_non_phy {
180 	__le32 bt_prio_defer_cnt;
181 	__le32 bt_prio_kill_cnt;
182 	__le32 few_bytes_cnt;
183 	__le32 cts_timeout;
184 	__le32 ack_timeout;
185 	__le32 dump_msdu_cnt;
186 	__le32 burst_abort_next_frame_mismatch_cnt;
187 	__le32 burst_abort_missing_next_frame_cnt;
188 	__le32 cts_timeout_collision;
189 	__le32 ack_or_ba_timeout_collision;
190 } __packed; /* STATISTICS_TX_NON_PHY_API_S_VER_4 */
191 
192 #define MAX_CHAINS 3
193 
194 struct mvm_statistics_tx_non_phy_agg {
195 	__le32 ba_timeout;
196 	__le32 ba_reschedule_frames;
197 	__le32 scd_query_agg_frame_cnt;
198 	__le32 scd_query_no_agg;
199 	__le32 scd_query_agg;
200 	__le32 scd_query_mismatch;
201 	__le32 frame_not_ready;
202 	__le32 underrun;
203 	__le32 bt_prio_kill;
204 	__le32 rx_ba_rsp_cnt;
205 	__s8 txpower[MAX_CHAINS];
206 	__s8 reserved;
207 	__le32 reserved2;
208 } __packed; /* STATISTICS_TX_NON_PHY_AGG_API_S_VER_1 */
209 
210 struct mvm_statistics_tx_channel_width {
211 	__le32 ext_cca_narrow_ch20[1];
212 	__le32 ext_cca_narrow_ch40[2];
213 	__le32 ext_cca_narrow_ch80[3];
214 	__le32 ext_cca_narrow_ch160[4];
215 	__le32 last_tx_ch_width_indx;
216 	__le32 rx_detected_per_ch_width[4];
217 	__le32 success_per_ch_width[4];
218 	__le32 fail_per_ch_width[4];
219 }; /* STATISTICS_TX_CHANNEL_WIDTH_API_S_VER_1 */
220 
221 struct mvm_statistics_tx_v4 {
222 	struct mvm_statistics_tx_non_phy_v3 general;
223 	struct mvm_statistics_tx_non_phy_agg agg;
224 	struct mvm_statistics_tx_channel_width channel_width;
225 } __packed; /* STATISTICS_TX_API_S_VER_4 */
226 
227 struct mvm_statistics_tx {
228 	struct mvm_statistics_tx_non_phy general;
229 	struct mvm_statistics_tx_non_phy_agg agg;
230 	struct mvm_statistics_tx_channel_width channel_width;
231 } __packed; /* STATISTICS_TX_API_S_VER_5 */
232 
233 
234 struct mvm_statistics_bt_activity {
235 	__le32 hi_priority_tx_req_cnt;
236 	__le32 hi_priority_tx_denied_cnt;
237 	__le32 lo_priority_tx_req_cnt;
238 	__le32 lo_priority_tx_denied_cnt;
239 	__le32 hi_priority_rx_req_cnt;
240 	__le32 hi_priority_rx_denied_cnt;
241 	__le32 lo_priority_rx_req_cnt;
242 	__le32 lo_priority_rx_denied_cnt;
243 } __packed;  /* STATISTICS_BT_ACTIVITY_API_S_VER_1 */
244 
245 struct mvm_statistics_general_common_v19 {
246 	__le32 radio_temperature;
247 	__le32 radio_voltage;
248 	struct mvm_statistics_dbg dbg;
249 	__le32 sleep_time;
250 	__le32 slots_out;
251 	__le32 slots_idle;
252 	__le32 ttl_timestamp;
253 	struct mvm_statistics_div slow_div;
254 	__le32 rx_enable_counter;
255 	/*
256 	 * num_of_sos_states:
257 	 *  count the number of times we have to re-tune
258 	 *  in order to get out of bad PHY status
259 	 */
260 	__le32 num_of_sos_states;
261 	__le32 beacon_filtered;
262 	__le32 missed_beacons;
263 	u8 beacon_filter_average_energy;
264 	u8 beacon_filter_reason;
265 	u8 beacon_filter_current_energy;
266 	u8 beacon_filter_reserved;
267 	__le32 beacon_filter_delta_time;
268 	struct mvm_statistics_bt_activity bt_activity;
269 	__le64 rx_time;
270 	__le64 on_time_rf;
271 	__le64 on_time_scan;
272 	__le64 tx_time;
273 } __packed;
274 
275 struct mvm_statistics_general_common {
276 	__le32 radio_temperature;
277 	struct mvm_statistics_dbg dbg;
278 	__le32 sleep_time;
279 	__le32 slots_out;
280 	__le32 slots_idle;
281 	__le32 ttl_timestamp;
282 	struct mvm_statistics_div slow_div;
283 	__le32 rx_enable_counter;
284 	/*
285 	 * num_of_sos_states:
286 	 *  count the number of times we have to re-tune
287 	 *  in order to get out of bad PHY status
288 	 */
289 	__le32 num_of_sos_states;
290 	__le32 beacon_filtered;
291 	__le32 missed_beacons;
292 	u8 beacon_filter_average_energy;
293 	u8 beacon_filter_reason;
294 	u8 beacon_filter_current_energy;
295 	u8 beacon_filter_reserved;
296 	__le32 beacon_filter_delta_time;
297 	struct mvm_statistics_bt_activity bt_activity;
298 	__le64 rx_time;
299 	__le64 on_time_rf;
300 	__le64 on_time_scan;
301 	__le64 tx_time;
302 } __packed; /* STATISTICS_GENERAL_API_S_VER_10 */
303 
304 struct mvm_statistics_general_v8 {
305 	struct mvm_statistics_general_common_v19 common;
306 	__le32 beacon_counter[NUM_MAC_INDEX];
307 	u8 beacon_average_energy[NUM_MAC_INDEX];
308 	u8 reserved[4 - (NUM_MAC_INDEX % 4)];
309 } __packed; /* STATISTICS_GENERAL_API_S_VER_8 */
310 
311 struct mvm_statistics_general {
312 	struct mvm_statistics_general_common common;
313 	__le32 beacon_counter[MAC_INDEX_AUX];
314 	u8 beacon_average_energy[MAC_INDEX_AUX];
315 	u8 reserved[8 - MAC_INDEX_AUX];
316 } __packed; /* STATISTICS_GENERAL_API_S_VER_10 */
317 
318 /**
319  * struct mvm_statistics_load - RX statistics for multi-queue devices
320  * @air_time: accumulated air time, per mac
321  * @byte_count: accumulated byte count, per mac
322  * @pkt_count: accumulated packet count, per mac
323  * @avg_energy: average RSSI, per station
324  */
325 struct mvm_statistics_load {
326 	__le32 air_time[MAC_INDEX_AUX];
327 	__le32 byte_count[MAC_INDEX_AUX];
328 	__le32 pkt_count[MAC_INDEX_AUX];
329 	u8 avg_energy[IWL_MVM_STATION_COUNT_MAX];
330 } __packed; /* STATISTICS_RX_MAC_STATION_S_VER_3 */
331 
332 struct mvm_statistics_load_v1 {
333 	__le32 air_time[NUM_MAC_INDEX];
334 	__le32 byte_count[NUM_MAC_INDEX];
335 	__le32 pkt_count[NUM_MAC_INDEX];
336 	u8 avg_energy[IWL_MVM_STATION_COUNT_MAX];
337 } __packed; /* STATISTICS_RX_MAC_STATION_S_VER_1 */
338 
339 struct mvm_statistics_rx {
340 	struct mvm_statistics_rx_phy ofdm;
341 	struct mvm_statistics_rx_phy cck;
342 	struct mvm_statistics_rx_non_phy general;
343 	struct mvm_statistics_rx_ht_phy ofdm_ht;
344 } __packed; /* STATISTICS_RX_API_S_VER_4 */
345 
346 struct mvm_statistics_rx_v3 {
347 	struct mvm_statistics_rx_phy_v2 ofdm;
348 	struct mvm_statistics_rx_phy_v2 cck;
349 	struct mvm_statistics_rx_non_phy_v3 general;
350 	struct mvm_statistics_rx_ht_phy_v1 ofdm_ht;
351 } __packed; /* STATISTICS_RX_API_S_VER_3 */
352 
353 /*
354  * STATISTICS_NOTIFICATION = 0x9d (notification only, not a command)
355  *
356  * By default, uCode issues this notification after receiving a beacon
357  * while associated.  To disable this behavior, set DISABLE_NOTIF flag in the
358  * STATISTICS_CMD (0x9c), below.
359  */
360 
361 struct iwl_notif_statistics_v10 {
362 	__le32 flag;
363 	struct mvm_statistics_rx_v3 rx;
364 	struct mvm_statistics_tx_v4 tx;
365 	struct mvm_statistics_general_v8 general;
366 } __packed; /* STATISTICS_NTFY_API_S_VER_10 */
367 
368 struct iwl_notif_statistics_v11 {
369 	__le32 flag;
370 	struct mvm_statistics_rx_v3 rx;
371 	struct mvm_statistics_tx_v4 tx;
372 	struct mvm_statistics_general_v8 general;
373 	struct mvm_statistics_load_v1 load_stats;
374 } __packed; /* STATISTICS_NTFY_API_S_VER_11 */
375 
376 struct iwl_notif_statistics {
377 	__le32 flag;
378 	struct mvm_statistics_rx rx;
379 	struct mvm_statistics_tx tx;
380 	struct mvm_statistics_general general;
381 	struct mvm_statistics_load load_stats;
382 } __packed; /* STATISTICS_NTFY_API_S_VER_13 */
383 
384 /**
385  * enum iwl_statistics_notif_flags - flags used in statistics notification
386  * @IWL_STATISTICS_REPLY_FLG_CLEAR: statistics were cleared after this report
387  */
388 enum iwl_statistics_notif_flags {
389 	IWL_STATISTICS_REPLY_FLG_CLEAR		= 0x1,
390 };
391 
392 /**
393  * enum iwl_statistics_cmd_flags - flags used in statistics command
394  * @IWL_STATISTICS_FLG_CLEAR: request to clear statistics after the report
395  *	that's sent after this command
396  * @IWL_STATISTICS_FLG_DISABLE_NOTIF: disable unilateral statistics
397  *	notifications
398  */
399 enum iwl_statistics_cmd_flags {
400 	IWL_STATISTICS_FLG_CLEAR		= 0x1,
401 	IWL_STATISTICS_FLG_DISABLE_NOTIF	= 0x2,
402 };
403 
404 /**
405  * struct iwl_statistics_cmd - statistics config command
406  * @flags: flags from &enum iwl_statistics_cmd_flags
407  */
408 struct iwl_statistics_cmd {
409 	__le32 flags;
410 } __packed; /* STATISTICS_CMD_API_S_VER_1 */
411 
412 #define MAX_BCAST_FILTER_NUM		8
413 
414 /**
415  * enum iwl_fw_statistics_type
416  *
417  * @FW_STATISTICS_OPERATIONAL: operational statistics
418  * @FW_STATISTICS_PHY: phy statistics
419  * @FW_STATISTICS_MAC: mac statistics
420  * @FW_STATISTICS_RX: rx statistics
421  * @FW_STATISTICS_TX: tx statistics
422  * @FW_STATISTICS_DURATION: duration statistics
423  * @FW_STATISTICS_HE: he statistics
424  */
425 enum iwl_fw_statistics_type {
426 	FW_STATISTICS_OPERATIONAL,
427 	FW_STATISTICS_PHY,
428 	FW_STATISTICS_MAC,
429 	FW_STATISTICS_RX,
430 	FW_STATISTICS_TX,
431 	FW_STATISTICS_DURATION,
432 	FW_STATISTICS_HE,
433 }; /* FW_STATISTICS_TYPE_API_E_VER_1 */
434 
435 #define IWL_STATISTICS_TYPE_MSK 0x7f
436 /**
437  * struct iwl_statistics_ntfy_hdr
438  *
439  * @type: struct type
440  * @version: version of the struct
441  * @size: size in bytes
442  */
443 struct iwl_statistics_ntfy_hdr {
444 	u8 type;
445 	u8 version;
446 	__le16 size;
447 }; /* STATISTICS_NTFY_HDR_API_S_VER_1 */
448 
449 /**
450  * struct iwl_statistics_ntfy_per_mac
451  *
452  * @beacon_filter_average_energy: Average energy [-dBm] of the 2
453  *	 antennas.
454  * @air_time: air time
455  * @beacon_counter: all beacons (both filtered and not filtered)
456  * @beacon_average_energy: all beacons (both filtered and not
457  *	 filtered)
458  * @beacon_rssi_a: beacon RSSI on antenna A
459  * @beacon_rssi_b: beacon RSSI on antenna B
460  * @rx_bytes: RX byte count
461  */
462 struct iwl_statistics_ntfy_per_mac {
463 	__le32 beacon_filter_average_energy;
464 	__le32 air_time;
465 	__le32 beacon_counter;
466 	__le32 beacon_average_energy;
467 	__le32 beacon_rssi_a;
468 	__le32 beacon_rssi_b;
469 	__le32 rx_bytes;
470 } __packed; /* STATISTICS_NTFY_PER_MAC_API_S_VER_1 */
471 
472 #define IWL_STATS_MAX_BW_INDEX 5
473 /** struct iwl_statistics_ntfy_per_phy
474  * @channel_load: channel load
475  * @channel_load_by_us: device contribution to MCLM
476  * @channel_load_not_by_us: other devices' contribution to MCLM
477  * @clt: CLT HW timer (TIM_CH_LOAD2)
478  * @act: active accumulator SW
479  * @elp: elapsed time accumulator SW
480  * @rx_detected_per_ch_width: number of deferred TX per channel width,
481  *	0 - 20, 1/2/3 - 40/80/160
482  * @success_per_ch_width: number of frames that got ACK/BACK/CTS
483  *	per channel BW. note, BACK counted as 1
484  * @fail_per_ch_width: number of frames that didn't get ACK/BACK/CTS
485  *	per channel BW. note BACK counted as 1
486  * @last_tx_ch_width_indx: last txed frame channel width index
487  */
488 struct iwl_statistics_ntfy_per_phy {
489 	__le32 channel_load;
490 	__le32 channel_load_by_us;
491 	__le32 channel_load_not_by_us;
492 	__le32 clt;
493 	__le32 act;
494 	__le32 elp;
495 	__le32 rx_detected_per_ch_width[IWL_STATS_MAX_BW_INDEX];
496 	__le32 success_per_ch_width[IWL_STATS_MAX_BW_INDEX];
497 	__le32 fail_per_ch_width[IWL_STATS_MAX_BW_INDEX];
498 	__le32 last_tx_ch_width_indx;
499 } __packed; /* STATISTICS_NTFY_PER_PHY_API_S_VER_1 */
500 
501 /**
502  * struct iwl_statistics_ntfy_per_sta
503  *
504  * @average_energy: in fact it is minus the energy..
505  */
506 struct iwl_statistics_ntfy_per_sta {
507 	__le32 average_energy;
508 } __packed; /* STATISTICS_NTFY_PER_STA_API_S_VER_1 */
509 
510 #define IWL_STATS_MAX_PHY_OPERTINAL 3
511 /**
512  * struct iwl_statistics_operational_ntfy
513  *
514  * @hdr: general statistics header
515  * @flags: bitmap of possible notification structures
516  * @per_mac_stats: per mac statistics, &struct iwl_statistics_ntfy_per_mac
517  * @per_phy_stats: per phy statistics, &struct iwl_statistics_ntfy_per_phy
518  * @per_sta_stats: per sta statistics, &struct iwl_statistics_ntfy_per_sta
519  * @rx_time: rx time
520  * @tx_time: usec the radio is transmitting.
521  * @on_time_rf: The total time in usec the RF is awake.
522  * @on_time_scan: usec the radio is awake due to scan.
523  */
524 struct iwl_statistics_operational_ntfy {
525 	struct iwl_statistics_ntfy_hdr hdr;
526 	__le32 flags;
527 	struct iwl_statistics_ntfy_per_mac per_mac_stats[MAC_INDEX_AUX];
528 	struct iwl_statistics_ntfy_per_phy per_phy_stats[IWL_STATS_MAX_PHY_OPERTINAL];
529 	struct iwl_statistics_ntfy_per_sta per_sta_stats[IWL_MVM_STATION_COUNT_MAX];
530 	__le64 rx_time;
531 	__le64 tx_time;
532 	__le64 on_time_rf;
533 	__le64 on_time_scan;
534 } __packed; /* STATISTICS_OPERATIONAL_NTFY_API_S_VER_15 */
535 
536 /**
537  * struct iwl_statistics_operational_ntfy_ver_14
538  *
539  * @hdr: general statistics header
540  * @flags: bitmap of possible notification structures
541  * @mac_id: mac on which the beacon was received
542  * @beacon_filter_average_energy: Average energy [-dBm] of the 2
543  *	 antennas.
544  * @beacon_filter_reason: beacon filter reason
545  * @radio_temperature: radio temperature
546  * @air_time: air time
547  * @beacon_counter: all beacons (both filtered and not filtered)
548  * @beacon_average_energy: all beacons (both filtered and not
549  *	 filtered)
550  * @beacon_rssi_a: beacon RSSI on antenna A
551  * @beacon_rssi_b: beacon RSSI on antenna B
552  * @rx_bytes: per MAC RX byte count
553  * @rx_time: rx time
554  * @tx_time: usec the radio is transmitting.
555  * @on_time_rf: The total time in usec the RF is awake.
556  * @on_time_scan: usec the radio is awake due to scan.
557  * @average_energy: in fact it is minus the energy..
558  * @reserved: reserved
559  */
560 struct iwl_statistics_operational_ntfy_ver_14 {
561 	struct iwl_statistics_ntfy_hdr hdr;
562 	__le32 flags;
563 	__le32 mac_id;
564 	__le32 beacon_filter_average_energy;
565 	__le32 beacon_filter_reason;
566 	__le32 radio_temperature;
567 	__le32 air_time[MAC_INDEX_AUX];
568 	__le32 beacon_counter[MAC_INDEX_AUX];
569 	__le32 beacon_average_energy[MAC_INDEX_AUX];
570 	__le32 beacon_rssi_a;
571 	__le32 beacon_rssi_b;
572 	__le32 rx_bytes[MAC_INDEX_AUX];
573 	__le64 rx_time;
574 	__le64 tx_time;
575 	__le64 on_time_rf;
576 	__le64 on_time_scan;
577 	__le32 average_energy[IWL_MVM_STATION_COUNT_MAX];
578 	__le32 reserved;
579 } __packed; /* STATISTICS_OPERATIONAL_NTFY_API_S_VER_14 */
580 
581 /**
582  * struct iwl_statistics_phy_ntfy
583  *
584  * @hdr: general statistics header
585  * RX PHY related statistics
586  * @energy_and_config: ???
587  * @rssi_band: @31:24 rssiAllBand_B, 23:16 rssiInBand_B, 15:8
588  *	 rssiAllBand_A, 7:0 rssiInBand_A
589  * @agc_word: @31:16 agcWord_B, 15:0 agcWord_A
590  * @agc_gain: @19:10 agcGain_B, 9:0 agcGain_A
591  * @dfe_gain: @19:10 dfeGain_B, 9:0 dfeGain_A
592  * @snr_calc_main: @18:0 snrCalcMain
593  * @energy_calc_main: @18:0 energyCalcMain
594  * @snr_calc_aux: @18:0 snrCalcAux
595  * @dsp_dc_estim_a: @27:14 dspDcEstimQA, 13:0 dspDcEstimIA
596  * @dsp_dc_estim_b: @27:14 dspDcEstimQB, 13:0 dspDcEstimIB
597  * @ina_detec_type_and_ofdm_corr_comb: @31:31 inaDetectCckMrc,
598  *	 30:27 inaDetectType, 26:0 ofdmCorrComb
599  * @cw_corr_comb: @26:0 cwCorrComb
600  * @rssi_comb: @25:0 rssiComb
601  * @auto_corr_cck: @23:12 autoCck, 11:00 crossCck
602  * @ofdm_fine_freq_and_pina_freq_err: @18:7 ofdmFineFreq, 6:0
603  *	 ofdmPinaFreqErr
604  * @snrm_evm_main: @31:0 snrmEvmMain
605  * @snrm_evm_aux: @31:0 snrmEvmAux
606  * @rx_rate: @31:0 rate
607  * TX PHY related statistics
608  * @per_chain_enums_and_dsp_atten_a: @perChainEnumsAndDspAtten
609  *	 (per version)
610  * @target_power_and_power_meas_a: @31:16 targetPower_A, 15:0
611  *	 powerMeasuredCalc_A
612  * @tx_config_as_i_and_ac_a: @31:16 txConfigAsI_A, 15:0
613  *	 txConfigAc_A
614  * @predist_dcq_and_dci_a: @31:16 predist_dci_A, 15:0
615  *	 predist_dcq_A
616  * @per_chain_enums_and_dsp_atten_b: @perChainEnumsAndDspAtten
617  *	 (per version)
618  * @target_power_and_power_meas_b: @31:16 targetPower_B, 15:0
619  *	 powerMeasuredCalc_B
620  * @tx_config_as_i_and_ac_b: @31:16 txConfigAsI_B, 15:0
621  *	 txConfigAc_B
622  * @predist_dcq_and_dci_b: @31:16 predist_dci_B, 15:0
623  *	 predist_dcq_B
624  * @tx_rate: @31:0 rate
625  * @tlc_backoff: @31:0 tlcBackoff
626  * @mpapd_calib_mode_mpapd_calib_type_a: @31:16
627  *	 mpapdCalibMode_A, 15:0 mpapdCalibType_A
628  * @psat_and_phy_power_limit_a: @31:16 psat_A, 15:0
629  *	 phyPowerLimit_A
630  * @sar_and_regulatory_power_limit_a: @31:16 sarPowerLimit_A,
631  *	 15:0 regulatoryPowerLimit_A
632  * @mpapd_calib_mode_mpapd_calib_type_b: @31:16
633  *	 mpapdCalibMode_B, 15:0 mpapdCalibType_B
634  * @psat_and_phy_power_limit_b: @31:16 psat_B, 15:0
635  *	 phyPowerLimit_B
636  * @sar_and_regulatory_power_limit_b: @31:16 sarPowerLimit_B,
637  *	 15:0 regulatoryPowerLimit_B
638  * @srd_and_driver_power_limits: @31:16 srdPowerLimit, 15:0
639  *	 driverPowerLimit
640  * @reserved: reserved
641  */
642 struct iwl_statistics_phy_ntfy {
643 	struct iwl_statistics_ntfy_hdr hdr;
644 	__le32 energy_and_config;
645 	__le32 rssi_band;
646 	__le32 agc_word;
647 	__le32 agc_gain;
648 	__le32 dfe_gain;
649 	__le32 snr_calc_main;
650 	__le32 energy_calc_main;
651 	__le32 snr_calc_aux;
652 	__le32 dsp_dc_estim_a;
653 	__le32 dsp_dc_estim_b;
654 	__le32 ina_detec_type_and_ofdm_corr_comb;
655 	__le32 cw_corr_comb;
656 	__le32 rssi_comb;
657 	__le32 auto_corr_cck;
658 	__le32 ofdm_fine_freq_and_pina_freq_err;
659 	__le32 snrm_evm_main;
660 	__le32 snrm_evm_aux;
661 	__le32 rx_rate;
662 	__le32 per_chain_enums_and_dsp_atten_a;
663 	__le32 target_power_and_power_meas_a;
664 	__le32 tx_config_as_i_and_ac_a;
665 	__le32 predist_dcq_and_dci_a;
666 	__le32 per_chain_enums_and_dsp_atten_b;
667 	__le32 target_power_and_power_meas_b;
668 	__le32 tx_config_as_i_and_ac_b;
669 	__le32 predist_dcq_and_dci_b;
670 	__le32 tx_rate;
671 	__le32 tlc_backoff;
672 	__le32 mpapd_calib_mode_mpapd_calib_type_a;
673 	__le32 psat_and_phy_power_limit_a;
674 	__le32 sar_and_regulatory_power_limit_a;
675 	__le32 mpapd_calib_mode_mpapd_calib_type_b;
676 	__le32 psat_and_phy_power_limit_b;
677 	__le32 sar_and_regulatory_power_limit_b;
678 	__le32 srd_and_driver_power_limits;
679 	__le32 reserved;
680 } __packed; /* STATISTICS_PHY_NTFY_API_S_VER_1 */
681 
682 /**
683  * struct iwl_statistics_mac_ntfy
684  *
685  * @hdr: general statistics header
686  * @bcast_filter_passed_per_mac: bcast filter passed per mac
687  * @bcast_filter_dropped_per_mac: bcast filter dropped per mac
688  * @bcast_filter_passed_per_filter: bcast filter passed per filter
689  * @bcast_filter_dropped_per_filter: bcast filter dropped per filter
690  * @reserved: reserved
691  */
692 struct iwl_statistics_mac_ntfy {
693 	struct iwl_statistics_ntfy_hdr hdr;
694 	__le32 bcast_filter_passed_per_mac[NUM_MAC_INDEX_CDB];
695 	__le32 bcast_filter_dropped_per_mac[NUM_MAC_INDEX_CDB];
696 	__le32 bcast_filter_passed_per_filter[MAX_BCAST_FILTER_NUM];
697 	__le32 bcast_filter_dropped_per_filter[MAX_BCAST_FILTER_NUM];
698 	__le32 reserved;
699 } __packed; /* STATISTICS_MAC_NTFY_API_S_VER_1 */
700 
701 /**
702  * struct iwl_statistics_rx_ntfy
703  *
704  * @hdr: general statistics header
705  * @rx_agg_mpdu_cnt: aggregation frame count (number of
706  *	 delimiters)
707  * @rx_agg_cnt: number of RX Aggregations
708  * @unsupported_mcs: number of PLCP headers that have rate which
709  *	 is unsupported by DSP
710  * @bogus_cts: CTS received when not expecting CTS
711  * @bogus_ack: ACK received when not expecting ACK
712  * @rx_byte_count: ???
713  * @rx_packet_count: ???
714  * @missed_beacons: ???
715  * @unresponded_rts: un-responded RTS, due to NAV not zero
716  * @rxe_frame_limit_overrun: RXE got frame limit overrun
717  * @sent_ba_rsp_cnt: BA response TX count
718  * @late_rx_handle: count the number of times the RX path was
719  *	 aborted due to late entry
720  * @num_bt_kills: ???
721  * @reserved: reserved
722  */
723 struct iwl_statistics_rx_ntfy {
724 	struct iwl_statistics_ntfy_hdr hdr;
725 	__le32 rx_agg_mpdu_cnt;
726 	__le32 rx_agg_cnt;
727 	__le32 unsupported_mcs;
728 	__le32 bogus_cts;
729 	__le32 bogus_ack;
730 	__le32 rx_byte_count[MAC_INDEX_AUX];
731 	__le32 rx_packet_count[MAC_INDEX_AUX];
732 	__le32 missed_beacons;
733 	__le32 unresponded_rts;
734 	__le32 rxe_frame_limit_overrun;
735 	__le32 sent_ba_rsp_cnt;
736 	__le32 late_rx_handle;
737 	__le32 num_bt_kills;
738 	__le32 reserved;
739 } __packed; /* STATISTICS_RX_NTFY_API_S_VER_1 */
740 
741 /**
742  * struct iwl_statistics_tx_ntfy
743  *
744  * @hdr: general statistics header
745  * @cts_timeout: timeout when waiting for CTS
746  * @ack_timeout: timeout when waiting for ACK
747  * @dump_msdu_cnt: number of MSDUs that were dumped due to any
748  *	 reason
749  * @burst_abort_missing_next_frame_cnt: number of times a burst
750  *	 was aborted due to missing next frame bytes in txfifo
751  * number of times got timeout when waiting for CTS/ACK/BA and energy was
752  * detected just after sending the RTS/DATA. this statistics may help getting
753  * interesting indicators, like the likelihood of collision (so the benefit of
754  * protection may be estimated Vs. its cost). Or how many of the failures are
755  * due to collision and how many due to SNR.
756  * For Link-quality the CTS collision indication is more reliable then the ACK
757  * collision indication as the RTS frame is short and has more chance that the
758  * frame/s which caused the collision continue after the RTS was sent.
759  * @cts_timeout_collision: ???
760  * ACK/BA failed and energy as detected after DATA
761  * Note: to get the collision ratio need to:
762  * ackOrBaTimeoutCollision / (ack_timeout + ba_timeout)
763  * @ack_or_ba_timeout_collision: ???
764  * @ba_timeout: timeout when waiting for immediate BA response
765  * @ba_reschedule_frames: failed to get BA response and
766  *	 rescheduled all the non-ACKed frames
767  * gives the avarage number of frames inside aggregation
768  * @scd_query_agg_frame_cnt: ???
769  * @scd_query_no_agg: scheduler query prevented aggregation
770  * @scd_query_agg: scheduler query allowed aggregation
771  * @scd_query_mismatch: scheduler query inaccurate, either too
772  *	 short or too long
773  * @agg_terminated_underrun: aggregation was terminated due to
774  *	 underrun
775  * @agg_terminated_bt_prio_kill: aggregation was terminated due
776  *	 to BT
777  * @tx_kill_on_long_retry: count the tx frames dropped due to
778  *	 long retry limit (DATA frame failed)
779  * @tx_kill_on_short_retry: count the tx frames dropped due to
780  *	 short retry limit (RTS frame failed)
781  * TX deffer on energy. This counter is reset on each successful transmit.
782  * When timer exceed TX deffer limit than will be uCode assert.
783  * @tx_deffer_counter: ???
784  * @tx_deffer_base_time: Keep the time of the last successful
785  *	 transmit
786  * @tx_underrun: TX killed due to underrun
787  * @bt_defer: TX deferred due to BT priority, so probably TX was
788  *	 not started.
789  * @tx_kill_on_dsp_timeout: TX killed on DSP problem detected
790  * @tx_kill_on_immediate_quiet: TX killed due to immediate quiet
791  * @kill_ba_cnt: number of times sending BA failed
792  * @kill_ack_cnt: number of times sending ACK failed
793  * @kill_cts_cnt: number of times sending CTS failed
794  * @burst_terminated: Count burst or fragmentation termination
795  *	 occurrence
796  * @late_tx_vec_wr_cnt: ???
797  * TX is not sent because ucode failed to notify the TRM in SIFS-delta from
798  * ON_AIR deassertion.
799  * @late_rx2_tx_cnt: ???
800  * @scd_query_cnt: count the times SCD query was done to check
801  *	 for TX AGG
802  * @tx_frames_acked_in_agg: count the number of frames
803  *	 transmitted inside AGG and were successful
804  * @last_tx_ch_width_indx: ???
805  * number of deferred TX per channel width, 0 - 20, 1/2/3 - 40/80/160
806  * @rx_detected_per_ch_width: ???
807  * @success_per_ch_width: ???
808  * @fail_per_ch_width: ???
809  * @reserved: reserved
810  */
811 struct iwl_statistics_tx_ntfy {
812 	struct iwl_statistics_ntfy_hdr hdr;
813 	__le32 cts_timeout;
814 	__le32 ack_timeout;
815 	__le32 dump_msdu_cnt;
816 	__le32 burst_abort_missing_next_frame_cnt;
817 	__le32 cts_timeout_collision;
818 	__le32 ack_or_ba_timeout_collision;
819 	__le32 ba_timeout;
820 	__le32 ba_reschedule_frames;
821 	__le32 scd_query_agg_frame_cnt;
822 	__le32 scd_query_no_agg;
823 	__le32 scd_query_agg;
824 	__le32 scd_query_mismatch;
825 	__le32 agg_terminated_underrun;
826 	__le32 agg_terminated_bt_prio_kill;
827 	__le32 tx_kill_on_long_retry;
828 	__le32 tx_kill_on_short_retry;
829 	__le32 tx_deffer_counter;
830 	__le32 tx_deffer_base_time;
831 	__le32 tx_underrun;
832 	__le32 bt_defer;
833 	__le32 tx_kill_on_dsp_timeout;
834 	__le32 tx_kill_on_immediate_quiet;
835 	__le32 kill_ba_cnt;
836 	__le32 kill_ack_cnt;
837 	__le32 kill_cts_cnt;
838 	__le32 burst_terminated;
839 	__le32 late_tx_vec_wr_cnt;
840 	__le32 late_rx2_tx_cnt;
841 	__le32 scd_query_cnt;
842 	__le32 tx_frames_acked_in_agg;
843 	__le32 last_tx_ch_width_indx;
844 	__le32 rx_detected_per_ch_width[4];
845 	__le32 success_per_ch_width[4];
846 	__le32 fail_per_ch_width[4];
847 	__le32 reserved;
848 } __packed; /* STATISTICS_TX_NTFY_API_S_VER_1 */
849 
850 /**
851  * struct iwl_statistics_duration_ntfy
852  *
853  * @hdr: general statistics header
854  * @cont_burst_chk_cnt: number of times continuation or
855  *	 fragmentation or bursting was checked
856  * @cont_burst_cnt: number of times continuation or fragmentation
857  *	 or bursting was successful
858  * @wait_for_silence_timeout_cnt: ???
859  * @reserved: reserved
860  */
861 struct iwl_statistics_duration_ntfy {
862 	struct iwl_statistics_ntfy_hdr hdr;
863 	__le32 cont_burst_chk_cnt;
864 	__le32 cont_burst_cnt;
865 	__le32 wait_for_silence_timeout_cnt;
866 	__le32 reserved;
867 } __packed; /* STATISTICS_DURATION_NTFY_API_S_VER_1 */
868 
869 /**
870  * struct iwl_statistics_he_ntfy
871  *
872  * @hdr: general statistics header
873  * received HE frames
874  * @rx_siga_valid_cnt: rx HE SIG-A valid
875  * @rx_siga_invalid_cnt: rx HE SIG-A invalid
876  * received HE frames w/ valid Sig-A
877  * @rx_trig_based_frame_cnt: rx HE-TB (trig-based)
878  * @rx_su_frame_cnt: rx HE-SU
879  * @rx_sigb_invalid_cnt: rx (suspected) HE-MU w/ bad SIG-B
880  * @rx_our_bss_color_cnt: rx valid HE SIG-A w/ our BSS color
881  * @rx_other_bss_color_cnt: rx valid HE SIG-A w/ other BSS color
882  * @rx_zero_bss_color_cnt: ???
883  * received HE-MU frames w/ good Sig-B
884  * @rx_mu_for_us_cnt: match AID
885  * @rx_mu_not_for_us_cnt: no matched AID
886  * received HE-MU frames for us (w/ our AID)
887  * @rx_mu_nss_ar: 0 - SISO, 1 - MIMO2
888  * @rx_mu_mimo_cnt: full BW RU, compressed SIG-B
889  * @rx_mu_ru_bw_ar: MU alloc, MHz: 0 - 2, 1 - 5, 2 - 10, 3 - 20,
890  *	 4 - 40, 5 - 80, 6 - 160
891  * received trigger frames
892  * @rx_trig_for_us_cnt: ???
893  * @rx_trig_not_for_us_cnt: ???
894  * trigger for us
895  * @rx_trig_with_cs_req_cnt: ???
896  * @rx_trig_type_ar: ???
897  * @rx_trig_in_agg_cnt: ???
898  * basic trigger for us allocations
899  * @rx_basic_trig_alloc_nss_ar: ???
900  * @rx_basic_trig_alloc_mu_mimo_cnt: ???
901  * @rx_basic_trig_alloc_ru_bw_ar: ???
902  * @rx_basic_trig_total_byte_cnt: ???
903  * trig-based TX
904  * @tx_trig_based_cs_req_fail_cnt: ???
905  * @tx_trig_based_sifs_ok_cnt: ???
906  * @tx_trig_based_sifs_fail_cnt: ???
907  * @tx_trig_based_byte_cnt: ???
908  * @tx_trig_based_pad_byte_cnt: ???
909  * @tx_trig_based_frame_cnt: ???
910  * @tx_trig_based_acked_frame_cnt: ???
911  * @tx_trig_based_ack_timeout_cnt: ???
912  * HE-SU TX
913  * @tx_su_frame_cnt: ???
914  * EDCA <--> MU-EDCA transitions
915  * @tx_edca_to_mu_edca_cnt: ???
916  * @tx_mu_edca_to_edca_by_timeout_cnt: ???
917  * @tx_mu_edca_to_edca_by_ack_fail_cnt: ???
918  * @tx_mu_edca_to_edca_by_small_alloc_cnt: ???
919  * @reserved: reserved
920  */
921 struct iwl_statistics_he_ntfy {
922 	struct iwl_statistics_ntfy_hdr hdr;
923 	__le32 rx_siga_valid_cnt;
924 	__le32 rx_siga_invalid_cnt;
925 	__le32 rx_trig_based_frame_cnt;
926 	__le32 rx_su_frame_cnt;
927 	__le32 rx_sigb_invalid_cnt;
928 	__le32 rx_our_bss_color_cnt;
929 	__le32 rx_other_bss_color_cnt;
930 	__le32 rx_zero_bss_color_cnt;
931 	__le32 rx_mu_for_us_cnt;
932 	__le32 rx_mu_not_for_us_cnt;
933 	__le32 rx_mu_nss_ar[2];
934 	__le32 rx_mu_mimo_cnt;
935 	__le32 rx_mu_ru_bw_ar[7];
936 	__le32 rx_trig_for_us_cnt;
937 	__le32 rx_trig_not_for_us_cnt;
938 	__le32 rx_trig_with_cs_req_cnt;
939 	__le32 rx_trig_type_ar[8 + 1];
940 	__le32 rx_trig_in_agg_cnt;
941 	__le32 rx_basic_trig_alloc_nss_ar[2];
942 	__le32 rx_basic_trig_alloc_mu_mimo_cnt;
943 	__le32 rx_basic_trig_alloc_ru_bw_ar[7];
944 	__le32 rx_basic_trig_total_byte_cnt;
945 	__le32 tx_trig_based_cs_req_fail_cnt;
946 	__le32 tx_trig_based_sifs_ok_cnt;
947 	__le32 tx_trig_based_sifs_fail_cnt;
948 	__le32 tx_trig_based_byte_cnt;
949 	__le32 tx_trig_based_pad_byte_cnt;
950 	__le32 tx_trig_based_frame_cnt;
951 	__le32 tx_trig_based_acked_frame_cnt;
952 	__le32 tx_trig_based_ack_timeout_cnt;
953 	__le32 tx_su_frame_cnt;
954 	__le32 tx_edca_to_mu_edca_cnt;
955 	__le32 tx_mu_edca_to_edca_by_timeout_cnt;
956 	__le32 tx_mu_edca_to_edca_by_ack_fail_cnt;
957 	__le32 tx_mu_edca_to_edca_by_small_alloc_cnt;
958 	__le32 reserved;
959 } __packed; /* STATISTICS_HE_NTFY_API_S_VER_1 */
960 
961 #endif /* __iwl_fw_api_stats_h__ */
962