Linux Audio

Check our new training course

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