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