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