1 /******************************************************************************
2  *
3  * This file is provided under a dual BSD/GPLv2 license.  When using or
4  * redistributing this file, you may do so under either license.
5  *
6  * GPL LICENSE SUMMARY
7  *
8  * Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved.
9  * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH
10  * Copyright(c) 2016 - 2017 Intel Deutschland GmbH
11  *
12  * This program is free software; you can redistribute it and/or modify
13  * it under the terms of version 2 of the GNU General Public License as
14  * published by the Free Software Foundation.
15  *
16  * This program is distributed in the hope that it will be useful, but
17  * WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19  * General Public License for more details.
20  *
21  * The full GNU General Public License is included in this distribution
22  * in the file called COPYING.
23  *
24  * Contact Information:
25  *  Intel Linux Wireless <linuxwifi@intel.com>
26  * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
27  *
28  * BSD LICENSE
29  *
30  * Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved.
31  * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH
32  * All rights reserved.
33  *
34  * Redistribution and use in source and binary forms, with or without
35  * modification, are permitted provided that the following conditions
36  * are met:
37  *
38  *  * Redistributions of source code must retain the above copyright
39  *    notice, this list of conditions and the following disclaimer.
40  *  * Redistributions in binary form must reproduce the above copyright
41  *    notice, this list of conditions and the following disclaimer in
42  *    the documentation and/or other materials provided with the
43  *    distribution.
44  *  * Neither the name Intel Corporation nor the names of its
45  *    contributors may be used to endorse or promote products derived
46  *    from this software without specific prior written permission.
47  *
48  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
49  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
50  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
51  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
52  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
53  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
54  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
55  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
56  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
57  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
58  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
59  *
60  *****************************************************************************/
61 
62 #ifndef __iwl_fw_api_stats_h__
63 #define __iwl_fw_api_stats_h__
64 #include "mac.h"
65 
66 struct mvm_statistics_dbg {
67 	__le32 burst_check;
68 	__le32 burst_count;
69 	__le32 wait_for_silence_timeout_cnt;
70 	u8 reserved[12];
71 } __packed; /* STATISTICS_DEBUG_API_S_VER_2 */
72 
73 struct mvm_statistics_div {
74 	__le32 tx_on_a;
75 	__le32 tx_on_b;
76 	__le32 exec_time;
77 	__le32 probe_time;
78 	__le32 rssi_ant;
79 	__le32 reserved2;
80 } __packed; /* STATISTICS_SLOW_DIV_API_S_VER_2 */
81 
82 /**
83  * struct mvm_statistics_rx_non_phy
84  * @bogus_cts: CTS received when not expecting CTS
85  * @bogus_ack: ACK received when not expecting ACK
86  * @non_channel_beacons: beacons with our bss id but not on our serving channel
87  * @channel_beacons: beacons with our bss id and in our serving channel
88  * @num_missed_bcon: number of missed beacons
89  * @adc_rx_saturation_time: count in 0.8us units the time the ADC was in
90  *	saturation
91  * @ina_detection_search_time: total time (in 0.8us) searched for INA
92  * @beacon_silence_rssi_a: RSSI silence after beacon frame
93  * @beacon_silence_rssi_b: RSSI silence after beacon frame
94  * @beacon_silence_rssi_c: RSSI silence after beacon frame
95  * @interference_data_flag: flag for interference data availability. 1 when data
96  *	is available.
97  * @channel_load: counts RX Enable time in uSec
98  * @beacon_rssi_a: beacon RSSI on anntena A
99  * @beacon_rssi_b: beacon RSSI on antenna B
100  * @beacon_rssi_c: beacon RSSI on antenna C
101  * @beacon_energy_a: beacon energy on antenna A
102  * @beacon_energy_b: beacon energy on antenna B
103  * @beacon_energy_c: beacon energy on antenna C
104  * @num_bt_kills: number of BT "kills" (frame TX aborts)
105  * @mac_id: mac ID
106  */
107 struct mvm_statistics_rx_non_phy {
108 	__le32 bogus_cts;
109 	__le32 bogus_ack;
110 	__le32 non_channel_beacons;
111 	__le32 channel_beacons;
112 	__le32 num_missed_bcon;
113 	__le32 adc_rx_saturation_time;
114 	__le32 ina_detection_search_time;
115 	__le32 beacon_silence_rssi_a;
116 	__le32 beacon_silence_rssi_b;
117 	__le32 beacon_silence_rssi_c;
118 	__le32 interference_data_flag;
119 	__le32 channel_load;
120 	__le32 beacon_rssi_a;
121 	__le32 beacon_rssi_b;
122 	__le32 beacon_rssi_c;
123 	__le32 beacon_energy_a;
124 	__le32 beacon_energy_b;
125 	__le32 beacon_energy_c;
126 	__le32 num_bt_kills;
127 	__le32 mac_id;
128 } __packed; /* STATISTICS_RX_NON_PHY_API_S_VER_4 */
129 
130 struct mvm_statistics_rx_non_phy_v3 {
131 	__le32 bogus_cts;	/* CTS received when not expecting CTS */
132 	__le32 bogus_ack;	/* ACK received when not expecting ACK */
133 	__le32 non_bssid_frames;	/* number of frames with BSSID that
134 					 * doesn't belong to the STA BSSID */
135 	__le32 filtered_frames;	/* count frames that were dumped in the
136 				 * filtering process */
137 	__le32 non_channel_beacons;	/* beacons with our bss id but not on
138 					 * our serving channel */
139 	__le32 channel_beacons;	/* beacons with our bss id and in our
140 				 * serving channel */
141 	__le32 num_missed_bcon;	/* number of missed beacons */
142 	__le32 adc_rx_saturation_time;	/* count in 0.8us units the time the
143 					 * ADC was in saturation */
144 	__le32 ina_detection_search_time;/* total time (in 0.8us) searched
145 					  * for INA */
146 	__le32 beacon_silence_rssi_a;	/* RSSI silence after beacon frame */
147 	__le32 beacon_silence_rssi_b;	/* RSSI silence after beacon frame */
148 	__le32 beacon_silence_rssi_c;	/* RSSI silence after beacon frame */
149 	__le32 interference_data_flag;	/* flag for interference data
150 					 * availability. 1 when data is
151 					 * available. */
152 	__le32 channel_load;		/* counts RX Enable time in uSec */
153 	__le32 dsp_false_alarms;	/* DSP false alarm (both OFDM
154 					 * and CCK) counter */
155 	__le32 beacon_rssi_a;
156 	__le32 beacon_rssi_b;
157 	__le32 beacon_rssi_c;
158 	__le32 beacon_energy_a;
159 	__le32 beacon_energy_b;
160 	__le32 beacon_energy_c;
161 	__le32 num_bt_kills;
162 	__le32 mac_id;
163 	__le32 directed_data_mpdu;
164 } __packed; /* STATISTICS_RX_NON_PHY_API_S_VER_3 */
165 
166 struct mvm_statistics_rx_phy {
167 	__le32 unresponded_rts;
168 	__le32 rxe_frame_lmt_overrun;
169 	__le32 sent_ba_rsp_cnt;
170 	__le32 dsp_self_kill;
171 	__le32 reserved;
172 } __packed; /* STATISTICS_RX_PHY_API_S_VER_3 */
173 
174 struct mvm_statistics_rx_phy_v2 {
175 	__le32 ina_cnt;
176 	__le32 fina_cnt;
177 	__le32 plcp_err;
178 	__le32 crc32_err;
179 	__le32 overrun_err;
180 	__le32 early_overrun_err;
181 	__le32 crc32_good;
182 	__le32 false_alarm_cnt;
183 	__le32 fina_sync_err_cnt;
184 	__le32 sfd_timeout;
185 	__le32 fina_timeout;
186 	__le32 unresponded_rts;
187 	__le32 rxe_frame_lmt_overrun;
188 	__le32 sent_ack_cnt;
189 	__le32 sent_cts_cnt;
190 	__le32 sent_ba_rsp_cnt;
191 	__le32 dsp_self_kill;
192 	__le32 mh_format_err;
193 	__le32 re_acq_main_rssi_sum;
194 	__le32 reserved;
195 } __packed; /* STATISTICS_RX_PHY_API_S_VER_2 */
196 
197 struct mvm_statistics_rx_ht_phy_v1 {
198 	__le32 plcp_err;
199 	__le32 overrun_err;
200 	__le32 early_overrun_err;
201 	__le32 crc32_good;
202 	__le32 crc32_err;
203 	__le32 mh_format_err;
204 	__le32 agg_crc32_good;
205 	__le32 agg_mpdu_cnt;
206 	__le32 agg_cnt;
207 	__le32 unsupport_mcs;
208 } __packed;  /* STATISTICS_HT_RX_PHY_API_S_VER_1 */
209 
210 struct mvm_statistics_rx_ht_phy {
211 	__le32 mh_format_err;
212 	__le32 agg_mpdu_cnt;
213 	__le32 agg_cnt;
214 	__le32 unsupport_mcs;
215 } __packed;  /* STATISTICS_HT_RX_PHY_API_S_VER_2 */
216 
217 struct mvm_statistics_tx_non_phy_v3 {
218 	__le32 preamble_cnt;
219 	__le32 rx_detected_cnt;
220 	__le32 bt_prio_defer_cnt;
221 	__le32 bt_prio_kill_cnt;
222 	__le32 few_bytes_cnt;
223 	__le32 cts_timeout;
224 	__le32 ack_timeout;
225 	__le32 expected_ack_cnt;
226 	__le32 actual_ack_cnt;
227 	__le32 dump_msdu_cnt;
228 	__le32 burst_abort_next_frame_mismatch_cnt;
229 	__le32 burst_abort_missing_next_frame_cnt;
230 	__le32 cts_timeout_collision;
231 	__le32 ack_or_ba_timeout_collision;
232 } __packed; /* STATISTICS_TX_NON_PHY_API_S_VER_3 */
233 
234 struct mvm_statistics_tx_non_phy {
235 	__le32 bt_prio_defer_cnt;
236 	__le32 bt_prio_kill_cnt;
237 	__le32 few_bytes_cnt;
238 	__le32 cts_timeout;
239 	__le32 ack_timeout;
240 	__le32 dump_msdu_cnt;
241 	__le32 burst_abort_next_frame_mismatch_cnt;
242 	__le32 burst_abort_missing_next_frame_cnt;
243 	__le32 cts_timeout_collision;
244 	__le32 ack_or_ba_timeout_collision;
245 } __packed; /* STATISTICS_TX_NON_PHY_API_S_VER_4 */
246 
247 #define MAX_CHAINS 3
248 
249 struct mvm_statistics_tx_non_phy_agg {
250 	__le32 ba_timeout;
251 	__le32 ba_reschedule_frames;
252 	__le32 scd_query_agg_frame_cnt;
253 	__le32 scd_query_no_agg;
254 	__le32 scd_query_agg;
255 	__le32 scd_query_mismatch;
256 	__le32 frame_not_ready;
257 	__le32 underrun;
258 	__le32 bt_prio_kill;
259 	__le32 rx_ba_rsp_cnt;
260 	__s8 txpower[MAX_CHAINS];
261 	__s8 reserved;
262 	__le32 reserved2;
263 } __packed; /* STATISTICS_TX_NON_PHY_AGG_API_S_VER_1 */
264 
265 struct mvm_statistics_tx_channel_width {
266 	__le32 ext_cca_narrow_ch20[1];
267 	__le32 ext_cca_narrow_ch40[2];
268 	__le32 ext_cca_narrow_ch80[3];
269 	__le32 ext_cca_narrow_ch160[4];
270 	__le32 last_tx_ch_width_indx;
271 	__le32 rx_detected_per_ch_width[4];
272 	__le32 success_per_ch_width[4];
273 	__le32 fail_per_ch_width[4];
274 }; /* STATISTICS_TX_CHANNEL_WIDTH_API_S_VER_1 */
275 
276 struct mvm_statistics_tx_v4 {
277 	struct mvm_statistics_tx_non_phy_v3 general;
278 	struct mvm_statistics_tx_non_phy_agg agg;
279 	struct mvm_statistics_tx_channel_width channel_width;
280 } __packed; /* STATISTICS_TX_API_S_VER_4 */
281 
282 struct mvm_statistics_tx {
283 	struct mvm_statistics_tx_non_phy general;
284 	struct mvm_statistics_tx_non_phy_agg agg;
285 	struct mvm_statistics_tx_channel_width channel_width;
286 } __packed; /* STATISTICS_TX_API_S_VER_5 */
287 
288 
289 struct mvm_statistics_bt_activity {
290 	__le32 hi_priority_tx_req_cnt;
291 	__le32 hi_priority_tx_denied_cnt;
292 	__le32 lo_priority_tx_req_cnt;
293 	__le32 lo_priority_tx_denied_cnt;
294 	__le32 hi_priority_rx_req_cnt;
295 	__le32 hi_priority_rx_denied_cnt;
296 	__le32 lo_priority_rx_req_cnt;
297 	__le32 lo_priority_rx_denied_cnt;
298 } __packed;  /* STATISTICS_BT_ACTIVITY_API_S_VER_1 */
299 
300 struct mvm_statistics_general_common_v19 {
301 	__le32 radio_temperature;
302 	__le32 radio_voltage;
303 	struct mvm_statistics_dbg dbg;
304 	__le32 sleep_time;
305 	__le32 slots_out;
306 	__le32 slots_idle;
307 	__le32 ttl_timestamp;
308 	struct mvm_statistics_div slow_div;
309 	__le32 rx_enable_counter;
310 	/*
311 	 * num_of_sos_states:
312 	 *  count the number of times we have to re-tune
313 	 *  in order to get out of bad PHY status
314 	 */
315 	__le32 num_of_sos_states;
316 	__le32 beacon_filtered;
317 	__le32 missed_beacons;
318 	u8 beacon_filter_average_energy;
319 	u8 beacon_filter_reason;
320 	u8 beacon_filter_current_energy;
321 	u8 beacon_filter_reserved;
322 	__le32 beacon_filter_delta_time;
323 	struct mvm_statistics_bt_activity bt_activity;
324 	__le64 rx_time;
325 	__le64 on_time_rf;
326 	__le64 on_time_scan;
327 	__le64 tx_time;
328 } __packed;
329 
330 struct mvm_statistics_general_common {
331 	__le32 radio_temperature;
332 	struct mvm_statistics_dbg dbg;
333 	__le32 sleep_time;
334 	__le32 slots_out;
335 	__le32 slots_idle;
336 	__le32 ttl_timestamp;
337 	struct mvm_statistics_div slow_div;
338 	__le32 rx_enable_counter;
339 	/*
340 	 * num_of_sos_states:
341 	 *  count the number of times we have to re-tune
342 	 *  in order to get out of bad PHY status
343 	 */
344 	__le32 num_of_sos_states;
345 	__le32 beacon_filtered;
346 	__le32 missed_beacons;
347 	u8 beacon_filter_average_energy;
348 	u8 beacon_filter_reason;
349 	u8 beacon_filter_current_energy;
350 	u8 beacon_filter_reserved;
351 	__le32 beacon_filter_delta_time;
352 	struct mvm_statistics_bt_activity bt_activity;
353 	__le64 rx_time;
354 	__le64 on_time_rf;
355 	__le64 on_time_scan;
356 	__le64 tx_time;
357 } __packed; /* STATISTICS_GENERAL_API_S_VER_10 */
358 
359 struct mvm_statistics_general_v8 {
360 	struct mvm_statistics_general_common_v19 common;
361 	__le32 beacon_counter[NUM_MAC_INDEX];
362 	u8 beacon_average_energy[NUM_MAC_INDEX];
363 	u8 reserved[4 - (NUM_MAC_INDEX % 4)];
364 } __packed; /* STATISTICS_GENERAL_API_S_VER_8 */
365 
366 struct mvm_statistics_general_cdb_v9 {
367 	struct mvm_statistics_general_common_v19 common;
368 	__le32 beacon_counter[NUM_MAC_INDEX_CDB];
369 	u8 beacon_average_energy[NUM_MAC_INDEX_CDB];
370 	u8 reserved[4 - (NUM_MAC_INDEX_CDB % 4)];
371 } __packed; /* STATISTICS_GENERAL_API_S_VER_9 */
372 
373 struct mvm_statistics_general_cdb {
374 	struct mvm_statistics_general_common common;
375 	__le32 beacon_counter[MAC_INDEX_AUX];
376 	u8 beacon_average_energy[MAC_INDEX_AUX];
377 	u8 reserved[8 - MAC_INDEX_AUX];
378 } __packed; /* STATISTICS_GENERAL_API_S_VER_10 */
379 
380 /**
381  * struct mvm_statistics_load - RX statistics for multi-queue devices
382  * @air_time: accumulated air time, per mac
383  * @byte_count: accumulated byte count, per mac
384  * @pkt_count: accumulated packet count, per mac
385  * @avg_energy: average RSSI, per station
386  */
387 struct mvm_statistics_load {
388 	__le32 air_time[MAC_INDEX_AUX];
389 	__le32 byte_count[MAC_INDEX_AUX];
390 	__le32 pkt_count[MAC_INDEX_AUX];
391 	u8 avg_energy[IWL_MVM_STATION_COUNT];
392 } __packed; /* STATISTICS_RX_MAC_STATION_S_VER_3 */
393 
394 struct mvm_statistics_load_v1 {
395 	__le32 air_time[NUM_MAC_INDEX];
396 	__le32 byte_count[NUM_MAC_INDEX];
397 	__le32 pkt_count[NUM_MAC_INDEX];
398 	u8 avg_energy[IWL_MVM_STATION_COUNT];
399 } __packed; /* STATISTICS_RX_MAC_STATION_S_VER_1 */
400 
401 struct mvm_statistics_rx {
402 	struct mvm_statistics_rx_phy ofdm;
403 	struct mvm_statistics_rx_phy cck;
404 	struct mvm_statistics_rx_non_phy general;
405 	struct mvm_statistics_rx_ht_phy ofdm_ht;
406 } __packed; /* STATISTICS_RX_API_S_VER_4 */
407 
408 struct mvm_statistics_rx_v3 {
409 	struct mvm_statistics_rx_phy_v2 ofdm;
410 	struct mvm_statistics_rx_phy_v2 cck;
411 	struct mvm_statistics_rx_non_phy_v3 general;
412 	struct mvm_statistics_rx_ht_phy_v1 ofdm_ht;
413 } __packed; /* STATISTICS_RX_API_S_VER_3 */
414 
415 /*
416  * STATISTICS_NOTIFICATION = 0x9d (notification only, not a command)
417  *
418  * By default, uCode issues this notification after receiving a beacon
419  * while associated.  To disable this behavior, set DISABLE_NOTIF flag in the
420  * STATISTICS_CMD (0x9c), below.
421  */
422 
423 struct iwl_notif_statistics_v10 {
424 	__le32 flag;
425 	struct mvm_statistics_rx_v3 rx;
426 	struct mvm_statistics_tx_v4 tx;
427 	struct mvm_statistics_general_v8 general;
428 } __packed; /* STATISTICS_NTFY_API_S_VER_10 */
429 
430 struct iwl_notif_statistics_v11 {
431 	__le32 flag;
432 	struct mvm_statistics_rx_v3 rx;
433 	struct mvm_statistics_tx_v4 tx;
434 	struct mvm_statistics_general_v8 general;
435 	struct mvm_statistics_load_v1 load_stats;
436 } __packed; /* STATISTICS_NTFY_API_S_VER_11 */
437 
438 struct iwl_notif_statistics_cdb {
439 	__le32 flag;
440 	struct mvm_statistics_rx rx;
441 	struct mvm_statistics_tx tx;
442 	struct mvm_statistics_general_cdb general;
443 	struct mvm_statistics_load load_stats;
444 } __packed; /* STATISTICS_NTFY_API_S_VER_13 */
445 
446 /**
447  * enum iwl_statistics_notif_flags - flags used in statistics notification
448  * @IWL_STATISTICS_REPLY_FLG_CLEAR: statistics were cleared after this report
449  */
450 enum iwl_statistics_notif_flags {
451 	IWL_STATISTICS_REPLY_FLG_CLEAR		= 0x1,
452 };
453 
454 /**
455  * enum iwl_statistics_cmd_flags - flags used in statistics command
456  * @IWL_STATISTICS_FLG_CLEAR: request to clear statistics after the report
457  *	that's sent after this command
458  * @IWL_STATISTICS_FLG_DISABLE_NOTIF: disable unilateral statistics
459  *	notifications
460  */
461 enum iwl_statistics_cmd_flags {
462 	IWL_STATISTICS_FLG_CLEAR		= 0x1,
463 	IWL_STATISTICS_FLG_DISABLE_NOTIF	= 0x2,
464 };
465 
466 /**
467  * struct iwl_statistics_cmd - statistics config command
468  * @flags: flags from &enum iwl_statistics_cmd_flags
469  */
470 struct iwl_statistics_cmd {
471 	__le32 flags;
472 } __packed; /* STATISTICS_CMD_API_S_VER_1 */
473 
474 #endif /* __iwl_fw_api_stats_h__ */
475