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