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