1 /******************************************************************************
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.
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 * Copyright (C) 2018 Intel Corporation
13 * This program is free software; you can redistribute it and/or modify
14 * it under the terms of version 2 of the GNU General Public License as
15 * published by the Free Software Foundation.
17 * This program is distributed in the hope that it will be useful, but
18 * WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20 * General Public License for more details.
22 * The full GNU General Public License is included in this distribution
23 * in the file called COPYING.
25 * Contact Information:
26 * Intel Linux Wireless <linuxwifi@intel.com>
27 * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
31 * Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved.
32 * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH
33 * Copyright (C) 2018 Intel Corporation
34 * All rights reserved.
36 * Redistribution and use in source and binary forms, with or without
37 * modification, are permitted provided that the following conditions
40 * * Redistributions of source code must retain the above copyright
41 * notice, this list of conditions and the following disclaimer.
42 * * Redistributions in binary form must reproduce the above copyright
43 * notice, this list of conditions and the following disclaimer in
44 * the documentation and/or other materials provided with the
46 * * Neither the name Intel Corporation nor the names of its
47 * contributors may be used to endorse or promote products derived
48 * from this software without specific prior written permission.
50 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
51 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
52 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
53 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
54 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
55 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
56 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
57 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
58 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
59 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
60 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
62 *****************************************************************************/
64 #ifndef __iwl_fw_api_stats_h__
65 #define __iwl_fw_api_stats_h__
68 struct mvm_statistics_dbg
{
71 __le32 wait_for_silence_timeout_cnt
;
73 } __packed
; /* STATISTICS_DEBUG_API_S_VER_2 */
75 struct mvm_statistics_div
{
82 } __packed
; /* STATISTICS_SLOW_DIV_API_S_VER_2 */
85 * struct mvm_statistics_rx_non_phy
86 * @bogus_cts: CTS received when not expecting CTS
87 * @bogus_ack: ACK received when not expecting ACK
88 * @non_channel_beacons: beacons with our bss id but not on our serving channel
89 * @channel_beacons: beacons with our bss id and in our serving channel
90 * @num_missed_bcon: number of missed beacons
91 * @adc_rx_saturation_time: count in 0.8us units the time the ADC was in
93 * @ina_detection_search_time: total time (in 0.8us) searched for INA
94 * @beacon_silence_rssi_a: RSSI silence after beacon frame
95 * @beacon_silence_rssi_b: RSSI silence after beacon frame
96 * @beacon_silence_rssi_c: RSSI silence after beacon frame
97 * @interference_data_flag: flag for interference data availability. 1 when data
99 * @channel_load: counts RX Enable time in uSec
100 * @beacon_rssi_a: beacon RSSI on anntena A
101 * @beacon_rssi_b: beacon RSSI on antenna B
102 * @beacon_rssi_c: beacon RSSI on antenna C
103 * @beacon_energy_a: beacon energy on antenna A
104 * @beacon_energy_b: beacon energy on antenna B
105 * @beacon_energy_c: beacon energy on antenna C
106 * @num_bt_kills: number of BT "kills" (frame TX aborts)
109 struct mvm_statistics_rx_non_phy
{
112 __le32 non_channel_beacons
;
113 __le32 channel_beacons
;
114 __le32 num_missed_bcon
;
115 __le32 adc_rx_saturation_time
;
116 __le32 ina_detection_search_time
;
117 __le32 beacon_silence_rssi_a
;
118 __le32 beacon_silence_rssi_b
;
119 __le32 beacon_silence_rssi_c
;
120 __le32 interference_data_flag
;
122 __le32 beacon_rssi_a
;
123 __le32 beacon_rssi_b
;
124 __le32 beacon_rssi_c
;
125 __le32 beacon_energy_a
;
126 __le32 beacon_energy_b
;
127 __le32 beacon_energy_c
;
130 } __packed
; /* STATISTICS_RX_NON_PHY_API_S_VER_4 */
132 struct mvm_statistics_rx_non_phy_v3
{
133 __le32 bogus_cts
; /* CTS received when not expecting CTS */
134 __le32 bogus_ack
; /* ACK received when not expecting ACK */
135 __le32 non_bssid_frames
; /* number of frames with BSSID that
136 * doesn't belong to the STA BSSID */
137 __le32 filtered_frames
; /* count frames that were dumped in the
138 * filtering process */
139 __le32 non_channel_beacons
; /* beacons with our bss id but not on
140 * our serving channel */
141 __le32 channel_beacons
; /* beacons with our bss id and in our
143 __le32 num_missed_bcon
; /* number of missed beacons */
144 __le32 adc_rx_saturation_time
; /* count in 0.8us units the time the
145 * ADC was in saturation */
146 __le32 ina_detection_search_time
;/* total time (in 0.8us) searched
148 __le32 beacon_silence_rssi_a
; /* RSSI silence after beacon frame */
149 __le32 beacon_silence_rssi_b
; /* RSSI silence after beacon frame */
150 __le32 beacon_silence_rssi_c
; /* RSSI silence after beacon frame */
151 __le32 interference_data_flag
; /* flag for interference data
152 * availability. 1 when data is
154 __le32 channel_load
; /* counts RX Enable time in uSec */
155 __le32 dsp_false_alarms
; /* DSP false alarm (both OFDM
156 * and CCK) counter */
157 __le32 beacon_rssi_a
;
158 __le32 beacon_rssi_b
;
159 __le32 beacon_rssi_c
;
160 __le32 beacon_energy_a
;
161 __le32 beacon_energy_b
;
162 __le32 beacon_energy_c
;
165 __le32 directed_data_mpdu
;
166 } __packed
; /* STATISTICS_RX_NON_PHY_API_S_VER_3 */
168 struct mvm_statistics_rx_phy
{
169 __le32 unresponded_rts
;
170 __le32 rxe_frame_lmt_overrun
;
171 __le32 sent_ba_rsp_cnt
;
172 __le32 dsp_self_kill
;
174 } __packed
; /* STATISTICS_RX_PHY_API_S_VER_3 */
176 struct mvm_statistics_rx_phy_v2
{
182 __le32 early_overrun_err
;
184 __le32 false_alarm_cnt
;
185 __le32 fina_sync_err_cnt
;
188 __le32 unresponded_rts
;
189 __le32 rxe_frame_lmt_overrun
;
192 __le32 sent_ba_rsp_cnt
;
193 __le32 dsp_self_kill
;
194 __le32 mh_format_err
;
195 __le32 re_acq_main_rssi_sum
;
197 } __packed
; /* STATISTICS_RX_PHY_API_S_VER_2 */
199 struct mvm_statistics_rx_ht_phy_v1
{
202 __le32 early_overrun_err
;
205 __le32 mh_format_err
;
206 __le32 agg_crc32_good
;
209 __le32 unsupport_mcs
;
210 } __packed
; /* STATISTICS_HT_RX_PHY_API_S_VER_1 */
212 struct mvm_statistics_rx_ht_phy
{
213 __le32 mh_format_err
;
216 __le32 unsupport_mcs
;
217 } __packed
; /* STATISTICS_HT_RX_PHY_API_S_VER_2 */
219 struct mvm_statistics_tx_non_phy_v3
{
221 __le32 rx_detected_cnt
;
222 __le32 bt_prio_defer_cnt
;
223 __le32 bt_prio_kill_cnt
;
224 __le32 few_bytes_cnt
;
227 __le32 expected_ack_cnt
;
228 __le32 actual_ack_cnt
;
229 __le32 dump_msdu_cnt
;
230 __le32 burst_abort_next_frame_mismatch_cnt
;
231 __le32 burst_abort_missing_next_frame_cnt
;
232 __le32 cts_timeout_collision
;
233 __le32 ack_or_ba_timeout_collision
;
234 } __packed
; /* STATISTICS_TX_NON_PHY_API_S_VER_3 */
236 struct mvm_statistics_tx_non_phy
{
237 __le32 bt_prio_defer_cnt
;
238 __le32 bt_prio_kill_cnt
;
239 __le32 few_bytes_cnt
;
242 __le32 dump_msdu_cnt
;
243 __le32 burst_abort_next_frame_mismatch_cnt
;
244 __le32 burst_abort_missing_next_frame_cnt
;
245 __le32 cts_timeout_collision
;
246 __le32 ack_or_ba_timeout_collision
;
247 } __packed
; /* STATISTICS_TX_NON_PHY_API_S_VER_4 */
251 struct mvm_statistics_tx_non_phy_agg
{
253 __le32 ba_reschedule_frames
;
254 __le32 scd_query_agg_frame_cnt
;
255 __le32 scd_query_no_agg
;
256 __le32 scd_query_agg
;
257 __le32 scd_query_mismatch
;
258 __le32 frame_not_ready
;
261 __le32 rx_ba_rsp_cnt
;
262 __s8 txpower
[MAX_CHAINS
];
265 } __packed
; /* STATISTICS_TX_NON_PHY_AGG_API_S_VER_1 */
267 struct mvm_statistics_tx_channel_width
{
268 __le32 ext_cca_narrow_ch20
[1];
269 __le32 ext_cca_narrow_ch40
[2];
270 __le32 ext_cca_narrow_ch80
[3];
271 __le32 ext_cca_narrow_ch160
[4];
272 __le32 last_tx_ch_width_indx
;
273 __le32 rx_detected_per_ch_width
[4];
274 __le32 success_per_ch_width
[4];
275 __le32 fail_per_ch_width
[4];
276 }; /* STATISTICS_TX_CHANNEL_WIDTH_API_S_VER_1 */
278 struct mvm_statistics_tx_v4
{
279 struct mvm_statistics_tx_non_phy_v3 general
;
280 struct mvm_statistics_tx_non_phy_agg agg
;
281 struct mvm_statistics_tx_channel_width channel_width
;
282 } __packed
; /* STATISTICS_TX_API_S_VER_4 */
284 struct mvm_statistics_tx
{
285 struct mvm_statistics_tx_non_phy general
;
286 struct mvm_statistics_tx_non_phy_agg agg
;
287 struct mvm_statistics_tx_channel_width channel_width
;
288 } __packed
; /* STATISTICS_TX_API_S_VER_5 */
291 struct mvm_statistics_bt_activity
{
292 __le32 hi_priority_tx_req_cnt
;
293 __le32 hi_priority_tx_denied_cnt
;
294 __le32 lo_priority_tx_req_cnt
;
295 __le32 lo_priority_tx_denied_cnt
;
296 __le32 hi_priority_rx_req_cnt
;
297 __le32 hi_priority_rx_denied_cnt
;
298 __le32 lo_priority_rx_req_cnt
;
299 __le32 lo_priority_rx_denied_cnt
;
300 } __packed
; /* STATISTICS_BT_ACTIVITY_API_S_VER_1 */
302 struct mvm_statistics_general_common_v19
{
303 __le32 radio_temperature
;
304 __le32 radio_voltage
;
305 struct mvm_statistics_dbg dbg
;
309 __le32 ttl_timestamp
;
310 struct mvm_statistics_div slow_div
;
311 __le32 rx_enable_counter
;
314 * count the number of times we have to re-tune
315 * in order to get out of bad PHY status
317 __le32 num_of_sos_states
;
318 __le32 beacon_filtered
;
319 __le32 missed_beacons
;
320 u8 beacon_filter_average_energy
;
321 u8 beacon_filter_reason
;
322 u8 beacon_filter_current_energy
;
323 u8 beacon_filter_reserved
;
324 __le32 beacon_filter_delta_time
;
325 struct mvm_statistics_bt_activity bt_activity
;
332 struct mvm_statistics_general_common
{
333 __le32 radio_temperature
;
334 struct mvm_statistics_dbg dbg
;
338 __le32 ttl_timestamp
;
339 struct mvm_statistics_div slow_div
;
340 __le32 rx_enable_counter
;
343 * count the number of times we have to re-tune
344 * in order to get out of bad PHY status
346 __le32 num_of_sos_states
;
347 __le32 beacon_filtered
;
348 __le32 missed_beacons
;
349 u8 beacon_filter_average_energy
;
350 u8 beacon_filter_reason
;
351 u8 beacon_filter_current_energy
;
352 u8 beacon_filter_reserved
;
353 __le32 beacon_filter_delta_time
;
354 struct mvm_statistics_bt_activity bt_activity
;
359 } __packed
; /* STATISTICS_GENERAL_API_S_VER_10 */
361 struct mvm_statistics_general_v8
{
362 struct mvm_statistics_general_common_v19 common
;
363 __le32 beacon_counter
[NUM_MAC_INDEX
];
364 u8 beacon_average_energy
[NUM_MAC_INDEX
];
365 u8 reserved
[4 - (NUM_MAC_INDEX
% 4)];
366 } __packed
; /* STATISTICS_GENERAL_API_S_VER_8 */
368 struct mvm_statistics_general
{
369 struct mvm_statistics_general_common common
;
370 __le32 beacon_counter
[MAC_INDEX_AUX
];
371 u8 beacon_average_energy
[MAC_INDEX_AUX
];
372 u8 reserved
[8 - MAC_INDEX_AUX
];
373 } __packed
; /* STATISTICS_GENERAL_API_S_VER_10 */
376 * struct mvm_statistics_load - RX statistics for multi-queue devices
377 * @air_time: accumulated air time, per mac
378 * @byte_count: accumulated byte count, per mac
379 * @pkt_count: accumulated packet count, per mac
380 * @avg_energy: average RSSI, per station
382 struct mvm_statistics_load
{
383 __le32 air_time
[MAC_INDEX_AUX
];
384 __le32 byte_count
[MAC_INDEX_AUX
];
385 __le32 pkt_count
[MAC_INDEX_AUX
];
386 u8 avg_energy
[IWL_MVM_STATION_COUNT
];
387 } __packed
; /* STATISTICS_RX_MAC_STATION_S_VER_3 */
389 struct mvm_statistics_load_v1
{
390 __le32 air_time
[NUM_MAC_INDEX
];
391 __le32 byte_count
[NUM_MAC_INDEX
];
392 __le32 pkt_count
[NUM_MAC_INDEX
];
393 u8 avg_energy
[IWL_MVM_STATION_COUNT
];
394 } __packed
; /* STATISTICS_RX_MAC_STATION_S_VER_1 */
396 struct mvm_statistics_rx
{
397 struct mvm_statistics_rx_phy ofdm
;
398 struct mvm_statistics_rx_phy cck
;
399 struct mvm_statistics_rx_non_phy general
;
400 struct mvm_statistics_rx_ht_phy ofdm_ht
;
401 } __packed
; /* STATISTICS_RX_API_S_VER_4 */
403 struct mvm_statistics_rx_v3
{
404 struct mvm_statistics_rx_phy_v2 ofdm
;
405 struct mvm_statistics_rx_phy_v2 cck
;
406 struct mvm_statistics_rx_non_phy_v3 general
;
407 struct mvm_statistics_rx_ht_phy_v1 ofdm_ht
;
408 } __packed
; /* STATISTICS_RX_API_S_VER_3 */
411 * STATISTICS_NOTIFICATION = 0x9d (notification only, not a command)
413 * By default, uCode issues this notification after receiving a beacon
414 * while associated. To disable this behavior, set DISABLE_NOTIF flag in the
415 * STATISTICS_CMD (0x9c), below.
418 struct iwl_notif_statistics_v10
{
420 struct mvm_statistics_rx_v3 rx
;
421 struct mvm_statistics_tx_v4 tx
;
422 struct mvm_statistics_general_v8 general
;
423 } __packed
; /* STATISTICS_NTFY_API_S_VER_10 */
425 struct iwl_notif_statistics_v11
{
427 struct mvm_statistics_rx_v3 rx
;
428 struct mvm_statistics_tx_v4 tx
;
429 struct mvm_statistics_general_v8 general
;
430 struct mvm_statistics_load_v1 load_stats
;
431 } __packed
; /* STATISTICS_NTFY_API_S_VER_11 */
433 struct iwl_notif_statistics
{
435 struct mvm_statistics_rx rx
;
436 struct mvm_statistics_tx tx
;
437 struct mvm_statistics_general general
;
438 struct mvm_statistics_load load_stats
;
439 } __packed
; /* STATISTICS_NTFY_API_S_VER_13 */
442 * enum iwl_statistics_notif_flags - flags used in statistics notification
443 * @IWL_STATISTICS_REPLY_FLG_CLEAR: statistics were cleared after this report
445 enum iwl_statistics_notif_flags
{
446 IWL_STATISTICS_REPLY_FLG_CLEAR
= 0x1,
450 * enum iwl_statistics_cmd_flags - flags used in statistics command
451 * @IWL_STATISTICS_FLG_CLEAR: request to clear statistics after the report
452 * that's sent after this command
453 * @IWL_STATISTICS_FLG_DISABLE_NOTIF: disable unilateral statistics
456 enum iwl_statistics_cmd_flags
{
457 IWL_STATISTICS_FLG_CLEAR
= 0x1,
458 IWL_STATISTICS_FLG_DISABLE_NOTIF
= 0x2,
462 * struct iwl_statistics_cmd - statistics config command
463 * @flags: flags from &enum iwl_statistics_cmd_flags
465 struct iwl_statistics_cmd
{
467 } __packed
; /* STATISTICS_CMD_API_S_VER_1 */
469 #endif /* __iwl_fw_api_stats_h__ */