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