linux/drivers/net/wireless/intel/iwlwifi/fw/api/stats.h
<<
>>
Prefs
   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 *
  12 * This program is free software; you can redistribute it and/or modify
  13 * it under the terms of version 2 of the GNU General Public License as
  14 * published by the Free Software Foundation.
  15 *
  16 * This program is distributed in the hope that it will be useful, but
  17 * WITHOUT ANY WARRANTY; without even the implied warranty of
  18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  19 * General Public License for more details.
  20 *
  21 * The full GNU General Public License is included in this distribution
  22 * in the file called COPYING.
  23 *
  24 * Contact Information:
  25 *  Intel Linux Wireless <linuxwifi@intel.com>
  26 * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
  27 *
  28 * BSD LICENSE
  29 *
  30 * Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved.
  31 * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH
  32 * All rights reserved.
  33 *
  34 * Redistribution and use in source and binary forms, with or without
  35 * modification, are permitted provided that the following conditions
  36 * are met:
  37 *
  38 *  * Redistributions of source code must retain the above copyright
  39 *    notice, this list of conditions and the following disclaimer.
  40 *  * Redistributions in binary form must reproduce the above copyright
  41 *    notice, this list of conditions and the following disclaimer in
  42 *    the documentation and/or other materials provided with the
  43 *    distribution.
  44 *  * Neither the name Intel Corporation nor the names of its
  45 *    contributors may be used to endorse or promote products derived
  46 *    from this software without specific prior written permission.
  47 *
  48 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  49 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  50 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  51 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  52 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  53 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  54 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  55 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  56 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  57 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  58 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  59 *
  60 *****************************************************************************/
  61
  62#ifndef __iwl_fw_api_stats_h__
  63#define __iwl_fw_api_stats_h__
  64#include "mac.h"
  65
  66struct mvm_statistics_dbg {
  67        __le32 burst_check;
  68        __le32 burst_count;
  69        __le32 wait_for_silence_timeout_cnt;
  70        u8 reserved[12];
  71} __packed; /* STATISTICS_DEBUG_API_S_VER_2 */
  72
  73struct mvm_statistics_div {
  74        __le32 tx_on_a;
  75        __le32 tx_on_b;
  76        __le32 exec_time;
  77        __le32 probe_time;
  78        __le32 rssi_ant;
  79        __le32 reserved2;
  80} __packed; /* STATISTICS_SLOW_DIV_API_S_VER_2 */
  81
  82/**
  83 * struct mvm_statistics_rx_non_phy
  84 * @bogus_cts: CTS received when not expecting CTS
  85 * @bogus_ack: ACK received when not expecting ACK
  86 * @non_channel_beacons: beacons with our bss id but not on our serving channel
  87 * @channel_beacons: beacons with our bss id and in our serving channel
  88 * @num_missed_bcon: number of missed beacons
  89 * @adc_rx_saturation_time: count in 0.8us units the time the ADC was in
  90 *      saturation
  91 * @ina_detection_search_time: total time (in 0.8us) searched for INA
  92 * @beacon_silence_rssi_a: RSSI silence after beacon frame
  93 * @beacon_silence_rssi_b: RSSI silence after beacon frame
  94 * @beacon_silence_rssi_c: RSSI silence after beacon frame
  95 * @interference_data_flag: flag for interference data availability. 1 when data
  96 *      is available.
  97 * @channel_load: counts RX Enable time in uSec
  98 * @beacon_rssi_a: beacon RSSI on anntena A
  99 * @beacon_rssi_b: beacon RSSI on antenna B
 100 * @beacon_rssi_c: beacon RSSI on antenna C
 101 * @beacon_energy_a: beacon energy on antenna A
 102 * @beacon_energy_b: beacon energy on antenna B
 103 * @beacon_energy_c: beacon energy on antenna C
 104 * @num_bt_kills: number of BT "kills" (frame TX aborts)
 105 * @mac_id: mac ID
 106 */
 107struct mvm_statistics_rx_non_phy {
 108        __le32 bogus_cts;
 109        __le32 bogus_ack;
 110        __le32 non_channel_beacons;
 111        __le32 channel_beacons;
 112        __le32 num_missed_bcon;
 113        __le32 adc_rx_saturation_time;
 114        __le32 ina_detection_search_time;
 115        __le32 beacon_silence_rssi_a;
 116        __le32 beacon_silence_rssi_b;
 117        __le32 beacon_silence_rssi_c;
 118        __le32 interference_data_flag;
 119        __le32 channel_load;
 120        __le32 beacon_rssi_a;
 121        __le32 beacon_rssi_b;
 122        __le32 beacon_rssi_c;
 123        __le32 beacon_energy_a;
 124        __le32 beacon_energy_b;
 125        __le32 beacon_energy_c;
 126        __le32 num_bt_kills;
 127        __le32 mac_id;
 128} __packed; /* STATISTICS_RX_NON_PHY_API_S_VER_4 */
 129
 130struct mvm_statistics_rx_non_phy_v3 {
 131        __le32 bogus_cts;       /* CTS received when not expecting CTS */
 132        __le32 bogus_ack;       /* ACK received when not expecting ACK */
 133        __le32 non_bssid_frames;        /* number of frames with BSSID that
 134                                         * doesn't belong to the STA BSSID */
 135        __le32 filtered_frames; /* count frames that were dumped in the
 136                                 * filtering process */
 137        __le32 non_channel_beacons;     /* beacons with our bss id but not on
 138                                         * our serving channel */
 139        __le32 channel_beacons; /* beacons with our bss id and in our
 140                                 * serving channel */
 141        __le32 num_missed_bcon; /* number of missed beacons */
 142        __le32 adc_rx_saturation_time;  /* count in 0.8us units the time the
 143                                         * ADC was in saturation */
 144        __le32 ina_detection_search_time;/* total time (in 0.8us) searched
 145                                          * for INA */
 146        __le32 beacon_silence_rssi_a;   /* RSSI silence after beacon frame */
 147        __le32 beacon_silence_rssi_b;   /* RSSI silence after beacon frame */
 148        __le32 beacon_silence_rssi_c;   /* RSSI silence after beacon frame */
 149        __le32 interference_data_flag;  /* flag for interference data
 150                                         * availability. 1 when data is
 151                                         * available. */
 152        __le32 channel_load;            /* counts RX Enable time in uSec */
 153        __le32 dsp_false_alarms;        /* DSP false alarm (both OFDM
 154                                         * and CCK) counter */
 155        __le32 beacon_rssi_a;
 156        __le32 beacon_rssi_b;
 157        __le32 beacon_rssi_c;
 158        __le32 beacon_energy_a;
 159        __le32 beacon_energy_b;
 160        __le32 beacon_energy_c;
 161        __le32 num_bt_kills;
 162        __le32 mac_id;
 163        __le32 directed_data_mpdu;
 164} __packed; /* STATISTICS_RX_NON_PHY_API_S_VER_3 */
 165
 166struct mvm_statistics_rx_phy {
 167        __le32 unresponded_rts;
 168        __le32 rxe_frame_lmt_overrun;
 169        __le32 sent_ba_rsp_cnt;
 170        __le32 dsp_self_kill;
 171        __le32 reserved;
 172} __packed; /* STATISTICS_RX_PHY_API_S_VER_3 */
 173
 174struct mvm_statistics_rx_phy_v2 {
 175        __le32 ina_cnt;
 176        __le32 fina_cnt;
 177        __le32 plcp_err;
 178        __le32 crc32_err;
 179        __le32 overrun_err;
 180        __le32 early_overrun_err;
 181        __le32 crc32_good;
 182        __le32 false_alarm_cnt;
 183        __le32 fina_sync_err_cnt;
 184        __le32 sfd_timeout;
 185        __le32 fina_timeout;
 186        __le32 unresponded_rts;
 187        __le32 rxe_frame_lmt_overrun;
 188        __le32 sent_ack_cnt;
 189        __le32 sent_cts_cnt;
 190        __le32 sent_ba_rsp_cnt;
 191        __le32 dsp_self_kill;
 192        __le32 mh_format_err;
 193        __le32 re_acq_main_rssi_sum;
 194        __le32 reserved;
 195} __packed; /* STATISTICS_RX_PHY_API_S_VER_2 */
 196
 197struct mvm_statistics_rx_ht_phy_v1 {
 198        __le32 plcp_err;
 199        __le32 overrun_err;
 200        __le32 early_overrun_err;
 201        __le32 crc32_good;
 202        __le32 crc32_err;
 203        __le32 mh_format_err;
 204        __le32 agg_crc32_good;
 205        __le32 agg_mpdu_cnt;
 206        __le32 agg_cnt;
 207        __le32 unsupport_mcs;
 208} __packed;  /* STATISTICS_HT_RX_PHY_API_S_VER_1 */
 209
 210struct mvm_statistics_rx_ht_phy {
 211        __le32 mh_format_err;
 212        __le32 agg_mpdu_cnt;
 213        __le32 agg_cnt;
 214        __le32 unsupport_mcs;
 215} __packed;  /* STATISTICS_HT_RX_PHY_API_S_VER_2 */
 216
 217struct mvm_statistics_tx_non_phy_v3 {
 218        __le32 preamble_cnt;
 219        __le32 rx_detected_cnt;
 220        __le32 bt_prio_defer_cnt;
 221        __le32 bt_prio_kill_cnt;
 222        __le32 few_bytes_cnt;
 223        __le32 cts_timeout;
 224        __le32 ack_timeout;
 225        __le32 expected_ack_cnt;
 226        __le32 actual_ack_cnt;
 227        __le32 dump_msdu_cnt;
 228        __le32 burst_abort_next_frame_mismatch_cnt;
 229        __le32 burst_abort_missing_next_frame_cnt;
 230        __le32 cts_timeout_collision;
 231        __le32 ack_or_ba_timeout_collision;
 232} __packed; /* STATISTICS_TX_NON_PHY_API_S_VER_3 */
 233
 234struct mvm_statistics_tx_non_phy {
 235        __le32 bt_prio_defer_cnt;
 236        __le32 bt_prio_kill_cnt;
 237        __le32 few_bytes_cnt;
 238        __le32 cts_timeout;
 239        __le32 ack_timeout;
 240        __le32 dump_msdu_cnt;
 241        __le32 burst_abort_next_frame_mismatch_cnt;
 242        __le32 burst_abort_missing_next_frame_cnt;
 243        __le32 cts_timeout_collision;
 244        __le32 ack_or_ba_timeout_collision;
 245} __packed; /* STATISTICS_TX_NON_PHY_API_S_VER_4 */
 246
 247#define MAX_CHAINS 3
 248
 249struct mvm_statistics_tx_non_phy_agg {
 250        __le32 ba_timeout;
 251        __le32 ba_reschedule_frames;
 252        __le32 scd_query_agg_frame_cnt;
 253        __le32 scd_query_no_agg;
 254        __le32 scd_query_agg;
 255        __le32 scd_query_mismatch;
 256        __le32 frame_not_ready;
 257        __le32 underrun;
 258        __le32 bt_prio_kill;
 259        __le32 rx_ba_rsp_cnt;
 260        __s8 txpower[MAX_CHAINS];
 261        __s8 reserved;
 262        __le32 reserved2;
 263} __packed; /* STATISTICS_TX_NON_PHY_AGG_API_S_VER_1 */
 264
 265struct mvm_statistics_tx_channel_width {
 266        __le32 ext_cca_narrow_ch20[1];
 267        __le32 ext_cca_narrow_ch40[2];
 268        __le32 ext_cca_narrow_ch80[3];
 269        __le32 ext_cca_narrow_ch160[4];
 270        __le32 last_tx_ch_width_indx;
 271        __le32 rx_detected_per_ch_width[4];
 272        __le32 success_per_ch_width[4];
 273        __le32 fail_per_ch_width[4];
 274}; /* STATISTICS_TX_CHANNEL_WIDTH_API_S_VER_1 */
 275
 276struct mvm_statistics_tx_v4 {
 277        struct mvm_statistics_tx_non_phy_v3 general;
 278        struct mvm_statistics_tx_non_phy_agg agg;
 279        struct mvm_statistics_tx_channel_width channel_width;
 280} __packed; /* STATISTICS_TX_API_S_VER_4 */
 281
 282struct mvm_statistics_tx {
 283        struct mvm_statistics_tx_non_phy general;
 284        struct mvm_statistics_tx_non_phy_agg agg;
 285        struct mvm_statistics_tx_channel_width channel_width;
 286} __packed; /* STATISTICS_TX_API_S_VER_5 */
 287
 288
 289struct mvm_statistics_bt_activity {
 290        __le32 hi_priority_tx_req_cnt;
 291        __le32 hi_priority_tx_denied_cnt;
 292        __le32 lo_priority_tx_req_cnt;
 293        __le32 lo_priority_tx_denied_cnt;
 294        __le32 hi_priority_rx_req_cnt;
 295        __le32 hi_priority_rx_denied_cnt;
 296        __le32 lo_priority_rx_req_cnt;
 297        __le32 lo_priority_rx_denied_cnt;
 298} __packed;  /* STATISTICS_BT_ACTIVITY_API_S_VER_1 */
 299
 300struct mvm_statistics_general_common_v19 {
 301        __le32 radio_temperature;
 302        __le32 radio_voltage;
 303        struct mvm_statistics_dbg dbg;
 304        __le32 sleep_time;
 305        __le32 slots_out;
 306        __le32 slots_idle;
 307        __le32 ttl_timestamp;
 308        struct mvm_statistics_div slow_div;
 309        __le32 rx_enable_counter;
 310        /*
 311         * num_of_sos_states:
 312         *  count the number of times we have to re-tune
 313         *  in order to get out of bad PHY status
 314         */
 315        __le32 num_of_sos_states;
 316        __le32 beacon_filtered;
 317        __le32 missed_beacons;
 318        u8 beacon_filter_average_energy;
 319        u8 beacon_filter_reason;
 320        u8 beacon_filter_current_energy;
 321        u8 beacon_filter_reserved;
 322        __le32 beacon_filter_delta_time;
 323        struct mvm_statistics_bt_activity bt_activity;
 324        __le64 rx_time;
 325        __le64 on_time_rf;
 326        __le64 on_time_scan;
 327        __le64 tx_time;
 328} __packed;
 329
 330struct mvm_statistics_general_common {
 331        __le32 radio_temperature;
 332        struct mvm_statistics_dbg dbg;
 333        __le32 sleep_time;
 334        __le32 slots_out;
 335        __le32 slots_idle;
 336        __le32 ttl_timestamp;
 337        struct mvm_statistics_div slow_div;
 338        __le32 rx_enable_counter;
 339        /*
 340         * num_of_sos_states:
 341         *  count the number of times we have to re-tune
 342         *  in order to get out of bad PHY status
 343         */
 344        __le32 num_of_sos_states;
 345        __le32 beacon_filtered;
 346        __le32 missed_beacons;
 347        u8 beacon_filter_average_energy;
 348        u8 beacon_filter_reason;
 349        u8 beacon_filter_current_energy;
 350        u8 beacon_filter_reserved;
 351        __le32 beacon_filter_delta_time;
 352        struct mvm_statistics_bt_activity bt_activity;
 353        __le64 rx_time;
 354        __le64 on_time_rf;
 355        __le64 on_time_scan;
 356        __le64 tx_time;
 357} __packed; /* STATISTICS_GENERAL_API_S_VER_10 */
 358
 359struct mvm_statistics_general_v8 {
 360        struct mvm_statistics_general_common_v19 common;
 361        __le32 beacon_counter[NUM_MAC_INDEX];
 362        u8 beacon_average_energy[NUM_MAC_INDEX];
 363        u8 reserved[4 - (NUM_MAC_INDEX % 4)];
 364} __packed; /* STATISTICS_GENERAL_API_S_VER_8 */
 365
 366struct mvm_statistics_general_cdb_v9 {
 367        struct mvm_statistics_general_common_v19 common;
 368        __le32 beacon_counter[NUM_MAC_INDEX_CDB];
 369        u8 beacon_average_energy[NUM_MAC_INDEX_CDB];
 370        u8 reserved[4 - (NUM_MAC_INDEX_CDB % 4)];
 371} __packed; /* STATISTICS_GENERAL_API_S_VER_9 */
 372
 373struct mvm_statistics_general_cdb {
 374        struct mvm_statistics_general_common common;
 375        __le32 beacon_counter[MAC_INDEX_AUX];
 376        u8 beacon_average_energy[MAC_INDEX_AUX];
 377        u8 reserved[8 - MAC_INDEX_AUX];
 378} __packed; /* STATISTICS_GENERAL_API_S_VER_10 */
 379
 380/**
 381 * struct mvm_statistics_load - RX statistics for multi-queue devices
 382 * @air_time: accumulated air time, per mac
 383 * @byte_count: accumulated byte count, per mac
 384 * @pkt_count: accumulated packet count, per mac
 385 * @avg_energy: average RSSI, per station
 386 */
 387struct mvm_statistics_load {
 388        __le32 air_time[MAC_INDEX_AUX];
 389        __le32 byte_count[MAC_INDEX_AUX];
 390        __le32 pkt_count[MAC_INDEX_AUX];
 391        u8 avg_energy[IWL_MVM_STATION_COUNT];
 392} __packed; /* STATISTICS_RX_MAC_STATION_S_VER_3 */
 393
 394struct mvm_statistics_load_v1 {
 395        __le32 air_time[NUM_MAC_INDEX];
 396        __le32 byte_count[NUM_MAC_INDEX];
 397        __le32 pkt_count[NUM_MAC_INDEX];
 398        u8 avg_energy[IWL_MVM_STATION_COUNT];
 399} __packed; /* STATISTICS_RX_MAC_STATION_S_VER_1 */
 400
 401struct mvm_statistics_rx {
 402        struct mvm_statistics_rx_phy ofdm;
 403        struct mvm_statistics_rx_phy cck;
 404        struct mvm_statistics_rx_non_phy general;
 405        struct mvm_statistics_rx_ht_phy ofdm_ht;
 406} __packed; /* STATISTICS_RX_API_S_VER_4 */
 407
 408struct mvm_statistics_rx_v3 {
 409        struct mvm_statistics_rx_phy_v2 ofdm;
 410        struct mvm_statistics_rx_phy_v2 cck;
 411        struct mvm_statistics_rx_non_phy_v3 general;
 412        struct mvm_statistics_rx_ht_phy_v1 ofdm_ht;
 413} __packed; /* STATISTICS_RX_API_S_VER_3 */
 414
 415/*
 416 * STATISTICS_NOTIFICATION = 0x9d (notification only, not a command)
 417 *
 418 * By default, uCode issues this notification after receiving a beacon
 419 * while associated.  To disable this behavior, set DISABLE_NOTIF flag in the
 420 * STATISTICS_CMD (0x9c), below.
 421 */
 422
 423struct iwl_notif_statistics_v10 {
 424        __le32 flag;
 425        struct mvm_statistics_rx_v3 rx;
 426        struct mvm_statistics_tx_v4 tx;
 427        struct mvm_statistics_general_v8 general;
 428} __packed; /* STATISTICS_NTFY_API_S_VER_10 */
 429
 430struct iwl_notif_statistics_v11 {
 431        __le32 flag;
 432        struct mvm_statistics_rx_v3 rx;
 433        struct mvm_statistics_tx_v4 tx;
 434        struct mvm_statistics_general_v8 general;
 435        struct mvm_statistics_load_v1 load_stats;
 436} __packed; /* STATISTICS_NTFY_API_S_VER_11 */
 437
 438struct iwl_notif_statistics_cdb {
 439        __le32 flag;
 440        struct mvm_statistics_rx rx;
 441        struct mvm_statistics_tx tx;
 442        struct mvm_statistics_general_cdb general;
 443        struct mvm_statistics_load load_stats;
 444} __packed; /* STATISTICS_NTFY_API_S_VER_13 */
 445
 446/**
 447 * enum iwl_statistics_notif_flags - flags used in statistics notification
 448 * @IWL_STATISTICS_REPLY_FLG_CLEAR: statistics were cleared after this report
 449 */
 450enum iwl_statistics_notif_flags {
 451        IWL_STATISTICS_REPLY_FLG_CLEAR          = 0x1,
 452};
 453
 454/**
 455 * enum iwl_statistics_cmd_flags - flags used in statistics command
 456 * @IWL_STATISTICS_FLG_CLEAR: request to clear statistics after the report
 457 *      that's sent after this command
 458 * @IWL_STATISTICS_FLG_DISABLE_NOTIF: disable unilateral statistics
 459 *      notifications
 460 */
 461enum iwl_statistics_cmd_flags {
 462        IWL_STATISTICS_FLG_CLEAR                = 0x1,
 463        IWL_STATISTICS_FLG_DISABLE_NOTIF        = 0x2,
 464};
 465
 466/**
 467 * struct iwl_statistics_cmd - statistics config command
 468 * @flags: flags from &enum iwl_statistics_cmd_flags
 469 */
 470struct iwl_statistics_cmd {
 471        __le32 flags;
 472} __packed; /* STATISTICS_CMD_API_S_VER_1 */
 473
 474#endif /* __iwl_fw_api_stats_h__ */
 475