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 68 struct 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 75 struct 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 */ 109 struct 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 132 struct mvm_statistics_rx_non_phy_v3 { 133 __le32 bogus_cts; /* CTS received when not expecting CTS */ 134 __le32 bogus_ack; /* ACK received when not expecting ACK */ 135 __le32 non_bssid_frames; /* number of frames with BSSID that 136 * doesn't belong to the STA BSSID */ 137 __le32 filtered_frames; /* count frames that were dumped in the 138 * filtering process */ 139 __le32 non_channel_beacons; /* beacons with our bss id but not on 140 * our serving channel */ 141 __le32 channel_beacons; /* beacons with our bss id and in our 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 168 struct mvm_statistics_rx_phy { 169 __le32 unresponded_rts; 170 __le32 rxe_frame_lmt_overrun; 171 __le32 sent_ba_rsp_cnt; 172 __le32 dsp_self_kill; 173 __le32 reserved; 174 } __packed; /* STATISTICS_RX_PHY_API_S_VER_3 */ 175 176 struct 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 199 struct 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 212 struct 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 219 struct 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 236 struct 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 251 struct 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 267 struct mvm_statistics_tx_channel_width { 268 __le32 ext_cca_narrow_ch20[1]; 269 __le32 ext_cca_narrow_ch40[2]; 270 __le32 ext_cca_narrow_ch80[3]; 271 __le32 ext_cca_narrow_ch160[4]; 272 __le32 last_tx_ch_width_indx; 273 __le32 rx_detected_per_ch_width[4]; 274 __le32 success_per_ch_width[4]; 275 __le32 fail_per_ch_width[4]; 276 }; /* STATISTICS_TX_CHANNEL_WIDTH_API_S_VER_1 */ 277 278 struct mvm_statistics_tx_v4 { 279 struct mvm_statistics_tx_non_phy_v3 general; 280 struct mvm_statistics_tx_non_phy_agg agg; 281 struct mvm_statistics_tx_channel_width channel_width; 282 } __packed; /* STATISTICS_TX_API_S_VER_4 */ 283 284 struct mvm_statistics_tx { 285 struct mvm_statistics_tx_non_phy general; 286 struct mvm_statistics_tx_non_phy_agg agg; 287 struct mvm_statistics_tx_channel_width channel_width; 288 } __packed; /* STATISTICS_TX_API_S_VER_5 */ 289 290 291 struct mvm_statistics_bt_activity { 292 __le32 hi_priority_tx_req_cnt; 293 __le32 hi_priority_tx_denied_cnt; 294 __le32 lo_priority_tx_req_cnt; 295 __le32 lo_priority_tx_denied_cnt; 296 __le32 hi_priority_rx_req_cnt; 297 __le32 hi_priority_rx_denied_cnt; 298 __le32 lo_priority_rx_req_cnt; 299 __le32 lo_priority_rx_denied_cnt; 300 } __packed; /* STATISTICS_BT_ACTIVITY_API_S_VER_1 */ 301 302 struct 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 332 struct 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 361 struct mvm_statistics_general_v8 { 362 struct mvm_statistics_general_common_v19 common; 363 __le32 beacon_counter[NUM_MAC_INDEX]; 364 u8 beacon_average_energy[NUM_MAC_INDEX]; 365 u8 reserved[4 - (NUM_MAC_INDEX % 4)]; 366 } __packed; /* STATISTICS_GENERAL_API_S_VER_8 */ 367 368 struct mvm_statistics_general { 369 struct mvm_statistics_general_common common; 370 __le32 beacon_counter[MAC_INDEX_AUX]; 371 u8 beacon_average_energy[MAC_INDEX_AUX]; 372 u8 reserved[8 - MAC_INDEX_AUX]; 373 } __packed; /* STATISTICS_GENERAL_API_S_VER_10 */ 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 */ 382 struct mvm_statistics_load { 383 __le32 air_time[MAC_INDEX_AUX]; 384 __le32 byte_count[MAC_INDEX_AUX]; 385 __le32 pkt_count[MAC_INDEX_AUX]; 386 u8 avg_energy[IWL_MVM_STATION_COUNT]; 387 } __packed; /* STATISTICS_RX_MAC_STATION_S_VER_3 */ 388 389 struct mvm_statistics_load_v1 { 390 __le32 air_time[NUM_MAC_INDEX]; 391 __le32 byte_count[NUM_MAC_INDEX]; 392 __le32 pkt_count[NUM_MAC_INDEX]; 393 u8 avg_energy[IWL_MVM_STATION_COUNT]; 394 } __packed; /* STATISTICS_RX_MAC_STATION_S_VER_1 */ 395 396 struct mvm_statistics_rx { 397 struct mvm_statistics_rx_phy ofdm; 398 struct mvm_statistics_rx_phy cck; 399 struct mvm_statistics_rx_non_phy general; 400 struct mvm_statistics_rx_ht_phy ofdm_ht; 401 } __packed; /* STATISTICS_RX_API_S_VER_4 */ 402 403 struct mvm_statistics_rx_v3 { 404 struct mvm_statistics_rx_phy_v2 ofdm; 405 struct mvm_statistics_rx_phy_v2 cck; 406 struct mvm_statistics_rx_non_phy_v3 general; 407 struct mvm_statistics_rx_ht_phy_v1 ofdm_ht; 408 } __packed; /* STATISTICS_RX_API_S_VER_3 */ 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 418 struct 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 425 struct 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 433 struct 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 */ 445 enum 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 */ 456 enum 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 */ 465 struct iwl_statistics_cmd { 466 __le32 flags; 467 } __packed; /* STATISTICS_CMD_API_S_VER_1 */ 468 469 #endif /* __iwl_fw_api_stats_h__ */ 470