162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/****************************************************************************** 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * Copyright(c) 2003 - 2014, 2020 Intel Corporation. All rights reserved. 562306a36Sopenharmony_ci *****************************************************************************/ 662306a36Sopenharmony_ci/* 762306a36Sopenharmony_ci * Please use this file (dev.h) for driver implementation definitions. 862306a36Sopenharmony_ci * Please use commands.h for uCode API definitions. 962306a36Sopenharmony_ci */ 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#ifndef __iwl_dev_h__ 1262306a36Sopenharmony_ci#define __iwl_dev_h__ 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci#include <linux/interrupt.h> 1562306a36Sopenharmony_ci#include <linux/kernel.h> 1662306a36Sopenharmony_ci#include <linux/wait.h> 1762306a36Sopenharmony_ci#include <linux/leds.h> 1862306a36Sopenharmony_ci#include <linux/slab.h> 1962306a36Sopenharmony_ci#include <linux/mutex.h> 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ci#include "fw/img.h" 2262306a36Sopenharmony_ci#include "iwl-eeprom-parse.h" 2362306a36Sopenharmony_ci#include "iwl-csr.h" 2462306a36Sopenharmony_ci#include "iwl-debug.h" 2562306a36Sopenharmony_ci#include "iwl-agn-hw.h" 2662306a36Sopenharmony_ci#include "iwl-op-mode.h" 2762306a36Sopenharmony_ci#include "fw/notif-wait.h" 2862306a36Sopenharmony_ci#include "iwl-trans.h" 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ci#include "led.h" 3162306a36Sopenharmony_ci#include "power.h" 3262306a36Sopenharmony_ci#include "rs.h" 3362306a36Sopenharmony_ci#include "tt.h" 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci/* CT-KILL constants */ 3662306a36Sopenharmony_ci#define CT_KILL_THRESHOLD_LEGACY 110 /* in Celsius */ 3762306a36Sopenharmony_ci#define CT_KILL_THRESHOLD 114 /* in Celsius */ 3862306a36Sopenharmony_ci#define CT_KILL_EXIT_THRESHOLD 95 /* in Celsius */ 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ci/* Default noise level to report when noise measurement is not available. 4162306a36Sopenharmony_ci * This may be because we're: 4262306a36Sopenharmony_ci * 1) Not associated no beacon statistics being sent to driver) 4362306a36Sopenharmony_ci * 2) Scanning (noise measurement does not apply to associated channel) 4462306a36Sopenharmony_ci * Use default noise value of -127 ... this is below the range of measurable 4562306a36Sopenharmony_ci * Rx dBm for all agn devices, so it can indicate "unmeasurable" to user. 4662306a36Sopenharmony_ci * Also, -127 works better than 0 when averaging frames with/without 4762306a36Sopenharmony_ci * noise info (e.g. averaging might be done in app); measured dBm values are 4862306a36Sopenharmony_ci * always negative ... using a negative value as the default keeps all 4962306a36Sopenharmony_ci * averages within an s8's (used in some apps) range of negative values. */ 5062306a36Sopenharmony_ci#define IWL_NOISE_MEAS_NOT_AVAILABLE (-127) 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_ci/* 5362306a36Sopenharmony_ci * RTS threshold here is total size [2347] minus 4 FCS bytes 5462306a36Sopenharmony_ci * Per spec: 5562306a36Sopenharmony_ci * a value of 0 means RTS on all data/management packets 5662306a36Sopenharmony_ci * a value > max MSDU size means no RTS 5762306a36Sopenharmony_ci * else RTS for data/management frames where MPDU is larger 5862306a36Sopenharmony_ci * than RTS value. 5962306a36Sopenharmony_ci */ 6062306a36Sopenharmony_ci#define DEFAULT_RTS_THRESHOLD 2347U 6162306a36Sopenharmony_ci#define MIN_RTS_THRESHOLD 0U 6262306a36Sopenharmony_ci#define MAX_RTS_THRESHOLD 2347U 6362306a36Sopenharmony_ci#define MAX_MSDU_SIZE 2304U 6462306a36Sopenharmony_ci#define MAX_MPDU_SIZE 2346U 6562306a36Sopenharmony_ci#define DEFAULT_BEACON_INTERVAL 200U 6662306a36Sopenharmony_ci#define DEFAULT_SHORT_RETRY_LIMIT 7U 6762306a36Sopenharmony_ci#define DEFAULT_LONG_RETRY_LIMIT 4U 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_ci#define IWL_NUM_SCAN_RATES (2) 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_ci#define IEEE80211_DATA_LEN 2304 7362306a36Sopenharmony_ci#define IEEE80211_4ADDR_LEN 30 7462306a36Sopenharmony_ci#define IEEE80211_HLEN (IEEE80211_4ADDR_LEN) 7562306a36Sopenharmony_ci#define IEEE80211_FRAME_LEN (IEEE80211_DATA_LEN + IEEE80211_HLEN) 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_ci#define SUP_RATE_11A_MAX_NUM_CHANNELS 8 7862306a36Sopenharmony_ci#define SUP_RATE_11B_MAX_NUM_CHANNELS 4 7962306a36Sopenharmony_ci#define SUP_RATE_11G_MAX_NUM_CHANNELS 12 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_ci#define IWL_SUPPORTED_RATES_IE_LEN 8 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_ci#define IWL_INVALID_RATE 0xFF 8462306a36Sopenharmony_ci#define IWL_INVALID_VALUE -1 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_ciunion iwl_ht_rate_supp { 8762306a36Sopenharmony_ci u16 rates; 8862306a36Sopenharmony_ci struct { 8962306a36Sopenharmony_ci u8 siso_rate; 9062306a36Sopenharmony_ci u8 mimo_rate; 9162306a36Sopenharmony_ci }; 9262306a36Sopenharmony_ci}; 9362306a36Sopenharmony_ci 9462306a36Sopenharmony_cistruct iwl_ht_config { 9562306a36Sopenharmony_ci bool single_chain_sufficient; 9662306a36Sopenharmony_ci enum ieee80211_smps_mode smps; /* current smps mode */ 9762306a36Sopenharmony_ci}; 9862306a36Sopenharmony_ci 9962306a36Sopenharmony_ci/* QoS structures */ 10062306a36Sopenharmony_cistruct iwl_qos_info { 10162306a36Sopenharmony_ci int qos_active; 10262306a36Sopenharmony_ci struct iwl_qosparam_cmd def_qos_parm; 10362306a36Sopenharmony_ci}; 10462306a36Sopenharmony_ci 10562306a36Sopenharmony_ci/** 10662306a36Sopenharmony_ci * enum iwl_agg_state 10762306a36Sopenharmony_ci * 10862306a36Sopenharmony_ci * The state machine of the BA agreement establishment / tear down. 10962306a36Sopenharmony_ci * These states relate to a specific RA / TID. 11062306a36Sopenharmony_ci * 11162306a36Sopenharmony_ci * @IWL_AGG_OFF: aggregation is not used 11262306a36Sopenharmony_ci * @IWL_AGG_STARTING: aggregation are starting (between start and oper) 11362306a36Sopenharmony_ci * @IWL_AGG_ON: aggregation session is up 11462306a36Sopenharmony_ci * @IWL_EMPTYING_HW_QUEUE_ADDBA: establishing a BA session - waiting for the 11562306a36Sopenharmony_ci * HW queue to be empty from packets for this RA /TID. 11662306a36Sopenharmony_ci * @IWL_EMPTYING_HW_QUEUE_DELBA: tearing down a BA session - waiting for the 11762306a36Sopenharmony_ci * HW queue to be empty from packets for this RA /TID. 11862306a36Sopenharmony_ci */ 11962306a36Sopenharmony_cienum iwl_agg_state { 12062306a36Sopenharmony_ci IWL_AGG_OFF = 0, 12162306a36Sopenharmony_ci IWL_AGG_STARTING, 12262306a36Sopenharmony_ci IWL_AGG_ON, 12362306a36Sopenharmony_ci IWL_EMPTYING_HW_QUEUE_ADDBA, 12462306a36Sopenharmony_ci IWL_EMPTYING_HW_QUEUE_DELBA, 12562306a36Sopenharmony_ci}; 12662306a36Sopenharmony_ci 12762306a36Sopenharmony_ci/** 12862306a36Sopenharmony_ci * struct iwl_ht_agg - aggregation state machine 12962306a36Sopenharmony_ci 13062306a36Sopenharmony_ci * This structs holds the states for the BA agreement establishment and tear 13162306a36Sopenharmony_ci * down. It also holds the state during the BA session itself. This struct is 13262306a36Sopenharmony_ci * duplicated for each RA / TID. 13362306a36Sopenharmony_ci 13462306a36Sopenharmony_ci * @rate_n_flags: Rate at which Tx was attempted. Holds the data between the 13562306a36Sopenharmony_ci * Tx response (REPLY_TX), and the block ack notification 13662306a36Sopenharmony_ci * (REPLY_COMPRESSED_BA). 13762306a36Sopenharmony_ci * @state: state of the BA agreement establishment / tear down. 13862306a36Sopenharmony_ci * @txq_id: Tx queue used by the BA session 13962306a36Sopenharmony_ci * @ssn: the first packet to be sent in AGG HW queue in Tx AGG start flow, or 14062306a36Sopenharmony_ci * the first packet to be sent in legacy HW queue in Tx AGG stop flow. 14162306a36Sopenharmony_ci * Basically when next_reclaimed reaches ssn, we can tell mac80211 that 14262306a36Sopenharmony_ci * we are ready to finish the Tx AGG stop / start flow. 14362306a36Sopenharmony_ci * @wait_for_ba: Expect block-ack before next Tx reply 14462306a36Sopenharmony_ci */ 14562306a36Sopenharmony_cistruct iwl_ht_agg { 14662306a36Sopenharmony_ci u32 rate_n_flags; 14762306a36Sopenharmony_ci enum iwl_agg_state state; 14862306a36Sopenharmony_ci u16 txq_id; 14962306a36Sopenharmony_ci u16 ssn; 15062306a36Sopenharmony_ci bool wait_for_ba; 15162306a36Sopenharmony_ci}; 15262306a36Sopenharmony_ci 15362306a36Sopenharmony_ci/** 15462306a36Sopenharmony_ci * struct iwl_tid_data - one for each RA / TID 15562306a36Sopenharmony_ci 15662306a36Sopenharmony_ci * This structs holds the states for each RA / TID. 15762306a36Sopenharmony_ci 15862306a36Sopenharmony_ci * @seq_number: the next WiFi sequence number to use 15962306a36Sopenharmony_ci * @next_reclaimed: the WiFi sequence number of the next packet to be acked. 16062306a36Sopenharmony_ci * This is basically (last acked packet++). 16162306a36Sopenharmony_ci * @agg: aggregation state machine 16262306a36Sopenharmony_ci */ 16362306a36Sopenharmony_cistruct iwl_tid_data { 16462306a36Sopenharmony_ci u16 seq_number; 16562306a36Sopenharmony_ci u16 next_reclaimed; 16662306a36Sopenharmony_ci struct iwl_ht_agg agg; 16762306a36Sopenharmony_ci}; 16862306a36Sopenharmony_ci 16962306a36Sopenharmony_ci/* 17062306a36Sopenharmony_ci * Structure should be accessed with sta_lock held. When station addition 17162306a36Sopenharmony_ci * is in progress (IWL_STA_UCODE_INPROGRESS) it is possible to access only 17262306a36Sopenharmony_ci * the commands (iwl_addsta_cmd and iwl_link_quality_cmd) without sta_lock 17362306a36Sopenharmony_ci * held. 17462306a36Sopenharmony_ci */ 17562306a36Sopenharmony_cistruct iwl_station_entry { 17662306a36Sopenharmony_ci struct iwl_addsta_cmd sta; 17762306a36Sopenharmony_ci u8 used, ctxid; 17862306a36Sopenharmony_ci struct iwl_link_quality_cmd *lq; 17962306a36Sopenharmony_ci}; 18062306a36Sopenharmony_ci 18162306a36Sopenharmony_ci/* 18262306a36Sopenharmony_ci * iwl_station_priv: Driver's private station information 18362306a36Sopenharmony_ci * 18462306a36Sopenharmony_ci * When mac80211 creates a station it reserves some space (hw->sta_data_size) 18562306a36Sopenharmony_ci * in the structure for use by driver. This structure is places in that 18662306a36Sopenharmony_ci * space. 18762306a36Sopenharmony_ci */ 18862306a36Sopenharmony_cistruct iwl_station_priv { 18962306a36Sopenharmony_ci struct iwl_rxon_context *ctx; 19062306a36Sopenharmony_ci struct iwl_lq_sta lq_sta; 19162306a36Sopenharmony_ci atomic_t pending_frames; 19262306a36Sopenharmony_ci bool client; 19362306a36Sopenharmony_ci bool asleep; 19462306a36Sopenharmony_ci u8 max_agg_bufsize; 19562306a36Sopenharmony_ci u8 sta_id; 19662306a36Sopenharmony_ci}; 19762306a36Sopenharmony_ci 19862306a36Sopenharmony_ci/** 19962306a36Sopenharmony_ci * struct iwl_vif_priv - driver's private per-interface information 20062306a36Sopenharmony_ci * 20162306a36Sopenharmony_ci * When mac80211 allocates a virtual interface, it can allocate 20262306a36Sopenharmony_ci * space for us to put data into. 20362306a36Sopenharmony_ci */ 20462306a36Sopenharmony_cistruct iwl_vif_priv { 20562306a36Sopenharmony_ci struct iwl_rxon_context *ctx; 20662306a36Sopenharmony_ci u8 ibss_bssid_sta_id; 20762306a36Sopenharmony_ci}; 20862306a36Sopenharmony_ci 20962306a36Sopenharmony_cistruct iwl_sensitivity_ranges { 21062306a36Sopenharmony_ci u16 min_nrg_cck; 21162306a36Sopenharmony_ci 21262306a36Sopenharmony_ci u16 nrg_th_cck; 21362306a36Sopenharmony_ci u16 nrg_th_ofdm; 21462306a36Sopenharmony_ci 21562306a36Sopenharmony_ci u16 auto_corr_min_ofdm; 21662306a36Sopenharmony_ci u16 auto_corr_min_ofdm_mrc; 21762306a36Sopenharmony_ci u16 auto_corr_min_ofdm_x1; 21862306a36Sopenharmony_ci u16 auto_corr_min_ofdm_mrc_x1; 21962306a36Sopenharmony_ci 22062306a36Sopenharmony_ci u16 auto_corr_max_ofdm; 22162306a36Sopenharmony_ci u16 auto_corr_max_ofdm_mrc; 22262306a36Sopenharmony_ci u16 auto_corr_max_ofdm_x1; 22362306a36Sopenharmony_ci u16 auto_corr_max_ofdm_mrc_x1; 22462306a36Sopenharmony_ci 22562306a36Sopenharmony_ci u16 auto_corr_max_cck; 22662306a36Sopenharmony_ci u16 auto_corr_max_cck_mrc; 22762306a36Sopenharmony_ci u16 auto_corr_min_cck; 22862306a36Sopenharmony_ci u16 auto_corr_min_cck_mrc; 22962306a36Sopenharmony_ci 23062306a36Sopenharmony_ci u16 barker_corr_th_min; 23162306a36Sopenharmony_ci u16 barker_corr_th_min_mrc; 23262306a36Sopenharmony_ci u16 nrg_th_cca; 23362306a36Sopenharmony_ci}; 23462306a36Sopenharmony_ci 23562306a36Sopenharmony_ci/****************************************************************************** 23662306a36Sopenharmony_ci * 23762306a36Sopenharmony_ci * Functions implemented in core module which are forward declared here 23862306a36Sopenharmony_ci * for use by iwl-[4-5].c 23962306a36Sopenharmony_ci * 24062306a36Sopenharmony_ci * NOTE: The implementation of these functions are not hardware specific 24162306a36Sopenharmony_ci * which is why they are in the core module files. 24262306a36Sopenharmony_ci * 24362306a36Sopenharmony_ci * Naming convention -- 24462306a36Sopenharmony_ci * iwl_ <-- Is part of iwlwifi 24562306a36Sopenharmony_ci * iwlXXXX_ <-- Hardware specific (implemented in iwl-XXXX.c for XXXX) 24662306a36Sopenharmony_ci * 24762306a36Sopenharmony_ci ****************************************************************************/ 24862306a36Sopenharmony_civoid iwl_update_chain_flags(struct iwl_priv *priv); 24962306a36Sopenharmony_ciextern const u8 iwl_bcast_addr[ETH_ALEN]; 25062306a36Sopenharmony_ci 25162306a36Sopenharmony_ci#define IWL_OPERATION_MODE_AUTO 0 25262306a36Sopenharmony_ci#define IWL_OPERATION_MODE_HT_ONLY 1 25362306a36Sopenharmony_ci#define IWL_OPERATION_MODE_MIXED 2 25462306a36Sopenharmony_ci#define IWL_OPERATION_MODE_20MHZ 3 25562306a36Sopenharmony_ci 25662306a36Sopenharmony_ci#define TX_POWER_IWL_ILLEGAL_VOLTAGE -10000 25762306a36Sopenharmony_ci 25862306a36Sopenharmony_ci/* Sensitivity and chain noise calibration */ 25962306a36Sopenharmony_ci#define INITIALIZATION_VALUE 0xFFFF 26062306a36Sopenharmony_ci#define IWL_CAL_NUM_BEACONS 16 26162306a36Sopenharmony_ci#define MAXIMUM_ALLOWED_PATHLOSS 15 26262306a36Sopenharmony_ci 26362306a36Sopenharmony_ci#define CHAIN_NOISE_MAX_DELTA_GAIN_CODE 3 26462306a36Sopenharmony_ci 26562306a36Sopenharmony_ci#define MAX_FA_OFDM 50 26662306a36Sopenharmony_ci#define MIN_FA_OFDM 5 26762306a36Sopenharmony_ci#define MAX_FA_CCK 50 26862306a36Sopenharmony_ci#define MIN_FA_CCK 5 26962306a36Sopenharmony_ci 27062306a36Sopenharmony_ci#define AUTO_CORR_STEP_OFDM 1 27162306a36Sopenharmony_ci 27262306a36Sopenharmony_ci#define AUTO_CORR_STEP_CCK 3 27362306a36Sopenharmony_ci#define AUTO_CORR_MAX_TH_CCK 160 27462306a36Sopenharmony_ci 27562306a36Sopenharmony_ci#define NRG_DIFF 2 27662306a36Sopenharmony_ci#define NRG_STEP_CCK 2 27762306a36Sopenharmony_ci#define NRG_MARGIN 8 27862306a36Sopenharmony_ci#define MAX_NUMBER_CCK_NO_FA 100 27962306a36Sopenharmony_ci 28062306a36Sopenharmony_ci#define AUTO_CORR_CCK_MIN_VAL_DEF (125) 28162306a36Sopenharmony_ci 28262306a36Sopenharmony_ci#define CHAIN_A 0 28362306a36Sopenharmony_ci#define CHAIN_B 1 28462306a36Sopenharmony_ci#define CHAIN_C 2 28562306a36Sopenharmony_ci#define CHAIN_NOISE_DELTA_GAIN_INIT_VAL 4 28662306a36Sopenharmony_ci#define ALL_BAND_FILTER 0xFF00 28762306a36Sopenharmony_ci#define IN_BAND_FILTER 0xFF 28862306a36Sopenharmony_ci#define MIN_AVERAGE_NOISE_MAX_VALUE 0xFFFFFFFF 28962306a36Sopenharmony_ci 29062306a36Sopenharmony_ci#define NRG_NUM_PREV_STAT_L 20 29162306a36Sopenharmony_ci#define NUM_RX_CHAINS 3 29262306a36Sopenharmony_ci 29362306a36Sopenharmony_cienum iwlagn_false_alarm_state { 29462306a36Sopenharmony_ci IWL_FA_TOO_MANY = 0, 29562306a36Sopenharmony_ci IWL_FA_TOO_FEW = 1, 29662306a36Sopenharmony_ci IWL_FA_GOOD_RANGE = 2, 29762306a36Sopenharmony_ci}; 29862306a36Sopenharmony_ci 29962306a36Sopenharmony_cienum iwlagn_chain_noise_state { 30062306a36Sopenharmony_ci IWL_CHAIN_NOISE_ALIVE = 0, /* must be 0 */ 30162306a36Sopenharmony_ci IWL_CHAIN_NOISE_ACCUMULATE, 30262306a36Sopenharmony_ci IWL_CHAIN_NOISE_CALIBRATED, 30362306a36Sopenharmony_ci IWL_CHAIN_NOISE_DONE, 30462306a36Sopenharmony_ci}; 30562306a36Sopenharmony_ci 30662306a36Sopenharmony_ci/* Sensitivity calib data */ 30762306a36Sopenharmony_cistruct iwl_sensitivity_data { 30862306a36Sopenharmony_ci u32 auto_corr_ofdm; 30962306a36Sopenharmony_ci u32 auto_corr_ofdm_mrc; 31062306a36Sopenharmony_ci u32 auto_corr_ofdm_x1; 31162306a36Sopenharmony_ci u32 auto_corr_ofdm_mrc_x1; 31262306a36Sopenharmony_ci u32 auto_corr_cck; 31362306a36Sopenharmony_ci u32 auto_corr_cck_mrc; 31462306a36Sopenharmony_ci 31562306a36Sopenharmony_ci u32 last_bad_plcp_cnt_ofdm; 31662306a36Sopenharmony_ci u32 last_fa_cnt_ofdm; 31762306a36Sopenharmony_ci u32 last_bad_plcp_cnt_cck; 31862306a36Sopenharmony_ci u32 last_fa_cnt_cck; 31962306a36Sopenharmony_ci 32062306a36Sopenharmony_ci u32 nrg_curr_state; 32162306a36Sopenharmony_ci u32 nrg_prev_state; 32262306a36Sopenharmony_ci u32 nrg_value[10]; 32362306a36Sopenharmony_ci u8 nrg_silence_rssi[NRG_NUM_PREV_STAT_L]; 32462306a36Sopenharmony_ci u32 nrg_silence_ref; 32562306a36Sopenharmony_ci u32 nrg_energy_idx; 32662306a36Sopenharmony_ci u32 nrg_silence_idx; 32762306a36Sopenharmony_ci u32 nrg_th_cck; 32862306a36Sopenharmony_ci s32 nrg_auto_corr_silence_diff; 32962306a36Sopenharmony_ci u32 num_in_cck_no_fa; 33062306a36Sopenharmony_ci u32 nrg_th_ofdm; 33162306a36Sopenharmony_ci 33262306a36Sopenharmony_ci u16 barker_corr_th_min; 33362306a36Sopenharmony_ci u16 barker_corr_th_min_mrc; 33462306a36Sopenharmony_ci u16 nrg_th_cca; 33562306a36Sopenharmony_ci}; 33662306a36Sopenharmony_ci 33762306a36Sopenharmony_ci/* Chain noise (differential Rx gain) calib data */ 33862306a36Sopenharmony_cistruct iwl_chain_noise_data { 33962306a36Sopenharmony_ci u32 active_chains; 34062306a36Sopenharmony_ci u32 chain_noise_a; 34162306a36Sopenharmony_ci u32 chain_noise_b; 34262306a36Sopenharmony_ci u32 chain_noise_c; 34362306a36Sopenharmony_ci u32 chain_signal_a; 34462306a36Sopenharmony_ci u32 chain_signal_b; 34562306a36Sopenharmony_ci u32 chain_signal_c; 34662306a36Sopenharmony_ci u16 beacon_count; 34762306a36Sopenharmony_ci u8 disconn_array[NUM_RX_CHAINS]; 34862306a36Sopenharmony_ci u8 delta_gain_code[NUM_RX_CHAINS]; 34962306a36Sopenharmony_ci u8 radio_write; 35062306a36Sopenharmony_ci u8 state; 35162306a36Sopenharmony_ci}; 35262306a36Sopenharmony_ci 35362306a36Sopenharmony_cienum { 35462306a36Sopenharmony_ci MEASUREMENT_READY = (1 << 0), 35562306a36Sopenharmony_ci MEASUREMENT_ACTIVE = (1 << 1), 35662306a36Sopenharmony_ci}; 35762306a36Sopenharmony_ci 35862306a36Sopenharmony_ci/* reply_tx_statistics (for _agn devices) */ 35962306a36Sopenharmony_cistruct reply_tx_error_statistics { 36062306a36Sopenharmony_ci u32 pp_delay; 36162306a36Sopenharmony_ci u32 pp_few_bytes; 36262306a36Sopenharmony_ci u32 pp_bt_prio; 36362306a36Sopenharmony_ci u32 pp_quiet_period; 36462306a36Sopenharmony_ci u32 pp_calc_ttak; 36562306a36Sopenharmony_ci u32 int_crossed_retry; 36662306a36Sopenharmony_ci u32 short_limit; 36762306a36Sopenharmony_ci u32 long_limit; 36862306a36Sopenharmony_ci u32 fifo_underrun; 36962306a36Sopenharmony_ci u32 drain_flow; 37062306a36Sopenharmony_ci u32 rfkill_flush; 37162306a36Sopenharmony_ci u32 life_expire; 37262306a36Sopenharmony_ci u32 dest_ps; 37362306a36Sopenharmony_ci u32 host_abort; 37462306a36Sopenharmony_ci u32 bt_retry; 37562306a36Sopenharmony_ci u32 sta_invalid; 37662306a36Sopenharmony_ci u32 frag_drop; 37762306a36Sopenharmony_ci u32 tid_disable; 37862306a36Sopenharmony_ci u32 fifo_flush; 37962306a36Sopenharmony_ci u32 insuff_cf_poll; 38062306a36Sopenharmony_ci u32 fail_hw_drop; 38162306a36Sopenharmony_ci u32 sta_color_mismatch; 38262306a36Sopenharmony_ci u32 unknown; 38362306a36Sopenharmony_ci}; 38462306a36Sopenharmony_ci 38562306a36Sopenharmony_ci/* reply_agg_tx_statistics (for _agn devices) */ 38662306a36Sopenharmony_cistruct reply_agg_tx_error_statistics { 38762306a36Sopenharmony_ci u32 underrun; 38862306a36Sopenharmony_ci u32 bt_prio; 38962306a36Sopenharmony_ci u32 few_bytes; 39062306a36Sopenharmony_ci u32 abort; 39162306a36Sopenharmony_ci u32 last_sent_ttl; 39262306a36Sopenharmony_ci u32 last_sent_try; 39362306a36Sopenharmony_ci u32 last_sent_bt_kill; 39462306a36Sopenharmony_ci u32 scd_query; 39562306a36Sopenharmony_ci u32 bad_crc32; 39662306a36Sopenharmony_ci u32 response; 39762306a36Sopenharmony_ci u32 dump_tx; 39862306a36Sopenharmony_ci u32 delay_tx; 39962306a36Sopenharmony_ci u32 unknown; 40062306a36Sopenharmony_ci}; 40162306a36Sopenharmony_ci 40262306a36Sopenharmony_ci/* 40362306a36Sopenharmony_ci * schedule the timer to wake up every UCODE_TRACE_PERIOD milliseconds 40462306a36Sopenharmony_ci * to perform continuous uCode event logging operation if enabled 40562306a36Sopenharmony_ci */ 40662306a36Sopenharmony_ci#define UCODE_TRACE_PERIOD (10) 40762306a36Sopenharmony_ci 40862306a36Sopenharmony_ci/* 40962306a36Sopenharmony_ci * iwl_event_log: current uCode event log position 41062306a36Sopenharmony_ci * 41162306a36Sopenharmony_ci * @ucode_trace: enable/disable ucode continuous trace timer 41262306a36Sopenharmony_ci * @num_wraps: how many times the event buffer wraps 41362306a36Sopenharmony_ci * @next_entry: the entry just before the next one that uCode would fill 41462306a36Sopenharmony_ci * @non_wraps_count: counter for no wrap detected when dump ucode events 41562306a36Sopenharmony_ci * @wraps_once_count: counter for wrap once detected when dump ucode events 41662306a36Sopenharmony_ci * @wraps_more_count: counter for wrap more than once detected 41762306a36Sopenharmony_ci * when dump ucode events 41862306a36Sopenharmony_ci */ 41962306a36Sopenharmony_cistruct iwl_event_log { 42062306a36Sopenharmony_ci bool ucode_trace; 42162306a36Sopenharmony_ci u32 num_wraps; 42262306a36Sopenharmony_ci u32 next_entry; 42362306a36Sopenharmony_ci int non_wraps_count; 42462306a36Sopenharmony_ci int wraps_once_count; 42562306a36Sopenharmony_ci int wraps_more_count; 42662306a36Sopenharmony_ci}; 42762306a36Sopenharmony_ci 42862306a36Sopenharmony_ci#define IWL_DELAY_NEXT_FORCE_RF_RESET (HZ*3) 42962306a36Sopenharmony_ci 43062306a36Sopenharmony_ci/* BT Antenna Coupling Threshold (dB) */ 43162306a36Sopenharmony_ci#define IWL_BT_ANTENNA_COUPLING_THRESHOLD (35) 43262306a36Sopenharmony_ci 43362306a36Sopenharmony_ci/* Firmware reload counter and Timestamp */ 43462306a36Sopenharmony_ci#define IWL_MIN_RELOAD_DURATION 1000 /* 1000 ms */ 43562306a36Sopenharmony_ci#define IWL_MAX_CONTINUE_RELOAD_CNT 4 43662306a36Sopenharmony_ci 43762306a36Sopenharmony_ci 43862306a36Sopenharmony_cistruct iwl_rf_reset { 43962306a36Sopenharmony_ci int reset_request_count; 44062306a36Sopenharmony_ci int reset_success_count; 44162306a36Sopenharmony_ci int reset_reject_count; 44262306a36Sopenharmony_ci unsigned long last_reset_jiffies; 44362306a36Sopenharmony_ci}; 44462306a36Sopenharmony_ci 44562306a36Sopenharmony_cienum iwl_rxon_context_id { 44662306a36Sopenharmony_ci IWL_RXON_CTX_BSS, 44762306a36Sopenharmony_ci IWL_RXON_CTX_PAN, 44862306a36Sopenharmony_ci 44962306a36Sopenharmony_ci NUM_IWL_RXON_CTX 45062306a36Sopenharmony_ci}; 45162306a36Sopenharmony_ci 45262306a36Sopenharmony_ci/* extend beacon time format bit shifting */ 45362306a36Sopenharmony_ci/* 45462306a36Sopenharmony_ci * for _agn devices 45562306a36Sopenharmony_ci * bits 31:22 - extended 45662306a36Sopenharmony_ci * bits 21:0 - interval 45762306a36Sopenharmony_ci */ 45862306a36Sopenharmony_ci#define IWLAGN_EXT_BEACON_TIME_POS 22 45962306a36Sopenharmony_ci 46062306a36Sopenharmony_cistruct iwl_rxon_context { 46162306a36Sopenharmony_ci struct ieee80211_vif *vif; 46262306a36Sopenharmony_ci 46362306a36Sopenharmony_ci u8 mcast_queue; 46462306a36Sopenharmony_ci u8 ac_to_queue[IEEE80211_NUM_ACS]; 46562306a36Sopenharmony_ci u8 ac_to_fifo[IEEE80211_NUM_ACS]; 46662306a36Sopenharmony_ci 46762306a36Sopenharmony_ci /* 46862306a36Sopenharmony_ci * We could use the vif to indicate active, but we 46962306a36Sopenharmony_ci * also need it to be active during disabling when 47062306a36Sopenharmony_ci * we already removed the vif for type setting. 47162306a36Sopenharmony_ci */ 47262306a36Sopenharmony_ci bool always_active, is_active; 47362306a36Sopenharmony_ci 47462306a36Sopenharmony_ci bool ht_need_multiple_chains; 47562306a36Sopenharmony_ci 47662306a36Sopenharmony_ci enum iwl_rxon_context_id ctxid; 47762306a36Sopenharmony_ci 47862306a36Sopenharmony_ci u32 interface_modes, exclusive_interface_modes; 47962306a36Sopenharmony_ci u8 unused_devtype, ap_devtype, ibss_devtype, station_devtype; 48062306a36Sopenharmony_ci 48162306a36Sopenharmony_ci /* 48262306a36Sopenharmony_ci * We declare this const so it can only be 48362306a36Sopenharmony_ci * changed via explicit cast within the 48462306a36Sopenharmony_ci * routines that actually update the physical 48562306a36Sopenharmony_ci * hardware. 48662306a36Sopenharmony_ci */ 48762306a36Sopenharmony_ci const struct iwl_rxon_cmd active; 48862306a36Sopenharmony_ci struct iwl_rxon_cmd staging; 48962306a36Sopenharmony_ci 49062306a36Sopenharmony_ci struct iwl_rxon_time_cmd timing; 49162306a36Sopenharmony_ci 49262306a36Sopenharmony_ci struct iwl_qos_info qos_data; 49362306a36Sopenharmony_ci 49462306a36Sopenharmony_ci u8 bcast_sta_id, ap_sta_id; 49562306a36Sopenharmony_ci 49662306a36Sopenharmony_ci u8 rxon_cmd, rxon_assoc_cmd, rxon_timing_cmd; 49762306a36Sopenharmony_ci u8 qos_cmd; 49862306a36Sopenharmony_ci u8 wep_key_cmd; 49962306a36Sopenharmony_ci 50062306a36Sopenharmony_ci struct iwl_wep_key wep_keys[WEP_KEYS_MAX]; 50162306a36Sopenharmony_ci u8 key_mapping_keys; 50262306a36Sopenharmony_ci 50362306a36Sopenharmony_ci __le32 station_flags; 50462306a36Sopenharmony_ci 50562306a36Sopenharmony_ci int beacon_int; 50662306a36Sopenharmony_ci 50762306a36Sopenharmony_ci struct { 50862306a36Sopenharmony_ci bool non_gf_sta_present; 50962306a36Sopenharmony_ci u8 protection; 51062306a36Sopenharmony_ci bool enabled, is_40mhz; 51162306a36Sopenharmony_ci u8 extension_chan_offset; 51262306a36Sopenharmony_ci } ht; 51362306a36Sopenharmony_ci}; 51462306a36Sopenharmony_ci 51562306a36Sopenharmony_cienum iwl_scan_type { 51662306a36Sopenharmony_ci IWL_SCAN_NORMAL, 51762306a36Sopenharmony_ci IWL_SCAN_RADIO_RESET, 51862306a36Sopenharmony_ci}; 51962306a36Sopenharmony_ci 52062306a36Sopenharmony_ci/** 52162306a36Sopenharmony_ci * struct iwl_hw_params 52262306a36Sopenharmony_ci * 52362306a36Sopenharmony_ci * Holds the module parameters 52462306a36Sopenharmony_ci * 52562306a36Sopenharmony_ci * @tx_chains_num: Number of TX chains 52662306a36Sopenharmony_ci * @rx_chains_num: Number of RX chains 52762306a36Sopenharmony_ci * @ct_kill_threshold: temperature threshold - in hw dependent unit 52862306a36Sopenharmony_ci * @ct_kill_exit_threshold: when to reeable the device - in hw dependent unit 52962306a36Sopenharmony_ci * relevant for 1000, 6000 and up 53062306a36Sopenharmony_ci * @struct iwl_sensitivity_ranges: range of sensitivity values 53162306a36Sopenharmony_ci * @use_rts_for_aggregation: use rts/cts protection for HT traffic 53262306a36Sopenharmony_ci */ 53362306a36Sopenharmony_cistruct iwl_hw_params { 53462306a36Sopenharmony_ci u8 tx_chains_num; 53562306a36Sopenharmony_ci u8 rx_chains_num; 53662306a36Sopenharmony_ci bool use_rts_for_aggregation; 53762306a36Sopenharmony_ci u32 ct_kill_threshold; 53862306a36Sopenharmony_ci u32 ct_kill_exit_threshold; 53962306a36Sopenharmony_ci 54062306a36Sopenharmony_ci const struct iwl_sensitivity_ranges *sens; 54162306a36Sopenharmony_ci}; 54262306a36Sopenharmony_ci 54362306a36Sopenharmony_ci/** 54462306a36Sopenharmony_ci * struct iwl_dvm_bt_params - DVM specific BT (coex) parameters 54562306a36Sopenharmony_ci * @advanced_bt_coexist: support advanced bt coexist 54662306a36Sopenharmony_ci * @bt_init_traffic_load: specify initial bt traffic load 54762306a36Sopenharmony_ci * @bt_prio_boost: default bt priority boost value 54862306a36Sopenharmony_ci * @agg_time_limit: maximum number of uSec in aggregation 54962306a36Sopenharmony_ci * @bt_sco_disable: uCode should not response to BT in SCO/ESCO mode 55062306a36Sopenharmony_ci */ 55162306a36Sopenharmony_cistruct iwl_dvm_bt_params { 55262306a36Sopenharmony_ci bool advanced_bt_coexist; 55362306a36Sopenharmony_ci u8 bt_init_traffic_load; 55462306a36Sopenharmony_ci u32 bt_prio_boost; 55562306a36Sopenharmony_ci u16 agg_time_limit; 55662306a36Sopenharmony_ci bool bt_sco_disable; 55762306a36Sopenharmony_ci bool bt_session_2; 55862306a36Sopenharmony_ci}; 55962306a36Sopenharmony_ci 56062306a36Sopenharmony_ci/** 56162306a36Sopenharmony_ci * struct iwl_dvm_cfg - DVM firmware specific device configuration 56262306a36Sopenharmony_ci * @set_hw_params: set hardware parameters 56362306a36Sopenharmony_ci * @set_channel_switch: send channel switch command 56462306a36Sopenharmony_ci * @nic_config: apply device specific configuration 56562306a36Sopenharmony_ci * @temperature: read temperature 56662306a36Sopenharmony_ci * @adv_thermal_throttle: support advance thermal throttle 56762306a36Sopenharmony_ci * @support_ct_kill_exit: support ct kill exit condition 56862306a36Sopenharmony_ci * @plcp_delta_threshold: plcp error rate threshold used to trigger 56962306a36Sopenharmony_ci * radio tuning when there is a high receiving plcp error rate 57062306a36Sopenharmony_ci * @chain_noise_scale: default chain noise scale used for gain computation 57162306a36Sopenharmony_ci * @hd_v2: v2 of enhanced sensitivity value, used for 2000 series and up 57262306a36Sopenharmony_ci * @no_idle_support: do not support idle mode 57362306a36Sopenharmony_ci * @bt_params: pointer to BT parameters 57462306a36Sopenharmony_ci * @need_temp_offset_calib: need to perform temperature offset calibration 57562306a36Sopenharmony_ci * @no_xtal_calib: some devices do not need crystal calibration data, 57662306a36Sopenharmony_ci * don't send it to those 57762306a36Sopenharmony_ci * @temp_offset_v2: support v2 of temperature offset calibration 57862306a36Sopenharmony_ci * @adv_pm: advanced power management 57962306a36Sopenharmony_ci */ 58062306a36Sopenharmony_cistruct iwl_dvm_cfg { 58162306a36Sopenharmony_ci void (*set_hw_params)(struct iwl_priv *priv); 58262306a36Sopenharmony_ci int (*set_channel_switch)(struct iwl_priv *priv, 58362306a36Sopenharmony_ci struct ieee80211_channel_switch *ch_switch); 58462306a36Sopenharmony_ci void (*nic_config)(struct iwl_priv *priv); 58562306a36Sopenharmony_ci void (*temperature)(struct iwl_priv *priv); 58662306a36Sopenharmony_ci 58762306a36Sopenharmony_ci const struct iwl_dvm_bt_params *bt_params; 58862306a36Sopenharmony_ci s32 chain_noise_scale; 58962306a36Sopenharmony_ci u8 plcp_delta_threshold; 59062306a36Sopenharmony_ci bool adv_thermal_throttle; 59162306a36Sopenharmony_ci bool support_ct_kill_exit; 59262306a36Sopenharmony_ci bool hd_v2; 59362306a36Sopenharmony_ci bool no_idle_support; 59462306a36Sopenharmony_ci bool need_temp_offset_calib; 59562306a36Sopenharmony_ci bool no_xtal_calib; 59662306a36Sopenharmony_ci bool temp_offset_v2; 59762306a36Sopenharmony_ci bool adv_pm; 59862306a36Sopenharmony_ci}; 59962306a36Sopenharmony_ci 60062306a36Sopenharmony_cistruct iwl_wipan_noa_data { 60162306a36Sopenharmony_ci struct rcu_head rcu_head; 60262306a36Sopenharmony_ci u32 length; 60362306a36Sopenharmony_ci u8 data[]; 60462306a36Sopenharmony_ci}; 60562306a36Sopenharmony_ci 60662306a36Sopenharmony_ci/* Calibration disabling bit mask */ 60762306a36Sopenharmony_cienum { 60862306a36Sopenharmony_ci IWL_CALIB_ENABLE_ALL = 0, 60962306a36Sopenharmony_ci 61062306a36Sopenharmony_ci IWL_SENSITIVITY_CALIB_DISABLED = BIT(0), 61162306a36Sopenharmony_ci IWL_CHAIN_NOISE_CALIB_DISABLED = BIT(1), 61262306a36Sopenharmony_ci IWL_TX_POWER_CALIB_DISABLED = BIT(2), 61362306a36Sopenharmony_ci 61462306a36Sopenharmony_ci IWL_CALIB_DISABLE_ALL = 0xFFFFFFFF, 61562306a36Sopenharmony_ci}; 61662306a36Sopenharmony_ci 61762306a36Sopenharmony_ci#define IWL_OP_MODE_GET_DVM(_iwl_op_mode) \ 61862306a36Sopenharmony_ci ((struct iwl_priv *) ((_iwl_op_mode)->op_mode_specific)) 61962306a36Sopenharmony_ci 62062306a36Sopenharmony_ci#define IWL_MAC80211_GET_DVM(_hw) \ 62162306a36Sopenharmony_ci ((struct iwl_priv *) ((struct iwl_op_mode *) \ 62262306a36Sopenharmony_ci (_hw)->priv)->op_mode_specific) 62362306a36Sopenharmony_ci 62462306a36Sopenharmony_cistruct iwl_priv { 62562306a36Sopenharmony_ci 62662306a36Sopenharmony_ci struct iwl_trans *trans; 62762306a36Sopenharmony_ci struct device *dev; /* for debug prints only */ 62862306a36Sopenharmony_ci const struct iwl_cfg *cfg; 62962306a36Sopenharmony_ci const struct iwl_fw *fw; 63062306a36Sopenharmony_ci const struct iwl_dvm_cfg *lib; 63162306a36Sopenharmony_ci unsigned long status; 63262306a36Sopenharmony_ci 63362306a36Sopenharmony_ci spinlock_t sta_lock; 63462306a36Sopenharmony_ci struct mutex mutex; 63562306a36Sopenharmony_ci 63662306a36Sopenharmony_ci unsigned long transport_queue_stop; 63762306a36Sopenharmony_ci bool passive_no_rx; 63862306a36Sopenharmony_ci#define IWL_INVALID_MAC80211_QUEUE 0xff 63962306a36Sopenharmony_ci u8 queue_to_mac80211[IWL_MAX_HW_QUEUES]; 64062306a36Sopenharmony_ci atomic_t queue_stop_count[IWL_MAX_HW_QUEUES]; 64162306a36Sopenharmony_ci 64262306a36Sopenharmony_ci unsigned long agg_q_alloc[BITS_TO_LONGS(IWL_MAX_HW_QUEUES)]; 64362306a36Sopenharmony_ci 64462306a36Sopenharmony_ci /* ieee device used by generic ieee processing code */ 64562306a36Sopenharmony_ci struct ieee80211_hw *hw; 64662306a36Sopenharmony_ci 64762306a36Sopenharmony_ci struct napi_struct *napi; 64862306a36Sopenharmony_ci 64962306a36Sopenharmony_ci struct list_head calib_results; 65062306a36Sopenharmony_ci 65162306a36Sopenharmony_ci struct workqueue_struct *workqueue; 65262306a36Sopenharmony_ci 65362306a36Sopenharmony_ci struct iwl_hw_params hw_params; 65462306a36Sopenharmony_ci 65562306a36Sopenharmony_ci enum nl80211_band band; 65662306a36Sopenharmony_ci u8 valid_contexts; 65762306a36Sopenharmony_ci 65862306a36Sopenharmony_ci void (*rx_handlers[REPLY_MAX])(struct iwl_priv *priv, 65962306a36Sopenharmony_ci struct iwl_rx_cmd_buffer *rxb); 66062306a36Sopenharmony_ci 66162306a36Sopenharmony_ci struct iwl_notif_wait_data notif_wait; 66262306a36Sopenharmony_ci 66362306a36Sopenharmony_ci /* spectrum measurement report caching */ 66462306a36Sopenharmony_ci struct iwl_spectrum_notification measure_report; 66562306a36Sopenharmony_ci u8 measurement_status; 66662306a36Sopenharmony_ci 66762306a36Sopenharmony_ci /* ucode beacon time */ 66862306a36Sopenharmony_ci u32 ucode_beacon_time; 66962306a36Sopenharmony_ci int missed_beacon_threshold; 67062306a36Sopenharmony_ci 67162306a36Sopenharmony_ci /* track IBSS manager (last beacon) status */ 67262306a36Sopenharmony_ci u32 ibss_manager; 67362306a36Sopenharmony_ci 67462306a36Sopenharmony_ci /* jiffies when last recovery from statistics was performed */ 67562306a36Sopenharmony_ci unsigned long rx_statistics_jiffies; 67662306a36Sopenharmony_ci 67762306a36Sopenharmony_ci /*counters */ 67862306a36Sopenharmony_ci u32 rx_handlers_stats[REPLY_MAX]; 67962306a36Sopenharmony_ci 68062306a36Sopenharmony_ci /* rf reset */ 68162306a36Sopenharmony_ci struct iwl_rf_reset rf_reset; 68262306a36Sopenharmony_ci 68362306a36Sopenharmony_ci /* firmware reload counter and timestamp */ 68462306a36Sopenharmony_ci unsigned long reload_jiffies; 68562306a36Sopenharmony_ci int reload_count; 68662306a36Sopenharmony_ci bool ucode_loaded; 68762306a36Sopenharmony_ci 68862306a36Sopenharmony_ci u8 plcp_delta_threshold; 68962306a36Sopenharmony_ci 69062306a36Sopenharmony_ci /* thermal calibration */ 69162306a36Sopenharmony_ci s32 temperature; /* Celsius */ 69262306a36Sopenharmony_ci s32 last_temperature; 69362306a36Sopenharmony_ci 69462306a36Sopenharmony_ci struct iwl_wipan_noa_data __rcu *noa_data; 69562306a36Sopenharmony_ci 69662306a36Sopenharmony_ci /* Scan related variables */ 69762306a36Sopenharmony_ci unsigned long scan_start; 69862306a36Sopenharmony_ci unsigned long scan_start_tsf; 69962306a36Sopenharmony_ci size_t scan_cmd_size; 70062306a36Sopenharmony_ci void *scan_cmd; 70162306a36Sopenharmony_ci enum nl80211_band scan_band; 70262306a36Sopenharmony_ci struct cfg80211_scan_request *scan_request; 70362306a36Sopenharmony_ci struct ieee80211_vif *scan_vif; 70462306a36Sopenharmony_ci enum iwl_scan_type scan_type; 70562306a36Sopenharmony_ci u8 scan_tx_ant[NUM_NL80211_BANDS]; 70662306a36Sopenharmony_ci u8 mgmt_tx_ant; 70762306a36Sopenharmony_ci 70862306a36Sopenharmony_ci /* max number of station keys */ 70962306a36Sopenharmony_ci u8 sta_key_max_num; 71062306a36Sopenharmony_ci 71162306a36Sopenharmony_ci bool new_scan_threshold_behaviour; 71262306a36Sopenharmony_ci 71362306a36Sopenharmony_ci bool wowlan; 71462306a36Sopenharmony_ci 71562306a36Sopenharmony_ci /* EEPROM MAC addresses */ 71662306a36Sopenharmony_ci struct mac_address addresses[2]; 71762306a36Sopenharmony_ci 71862306a36Sopenharmony_ci struct iwl_rxon_context contexts[NUM_IWL_RXON_CTX]; 71962306a36Sopenharmony_ci 72062306a36Sopenharmony_ci __le16 switch_channel; 72162306a36Sopenharmony_ci 72262306a36Sopenharmony_ci u8 start_calib; 72362306a36Sopenharmony_ci struct iwl_sensitivity_data sensitivity_data; 72462306a36Sopenharmony_ci struct iwl_chain_noise_data chain_noise_data; 72562306a36Sopenharmony_ci __le16 sensitivity_tbl[HD_TABLE_SIZE]; 72662306a36Sopenharmony_ci __le16 enhance_sensitivity_tbl[ENHANCE_HD_TABLE_ENTRIES]; 72762306a36Sopenharmony_ci 72862306a36Sopenharmony_ci struct iwl_ht_config current_ht_config; 72962306a36Sopenharmony_ci 73062306a36Sopenharmony_ci /* Rate scaling data */ 73162306a36Sopenharmony_ci u8 retry_rate; 73262306a36Sopenharmony_ci 73362306a36Sopenharmony_ci int activity_timer_active; 73462306a36Sopenharmony_ci 73562306a36Sopenharmony_ci struct iwl_power_mgr power_data; 73662306a36Sopenharmony_ci struct iwl_tt_mgmt thermal_throttle; 73762306a36Sopenharmony_ci 73862306a36Sopenharmony_ci /* station table variables */ 73962306a36Sopenharmony_ci int num_stations; 74062306a36Sopenharmony_ci struct iwl_station_entry stations[IWLAGN_STATION_COUNT]; 74162306a36Sopenharmony_ci unsigned long ucode_key_table; 74262306a36Sopenharmony_ci struct iwl_tid_data tid_data[IWLAGN_STATION_COUNT][IWL_MAX_TID_COUNT]; 74362306a36Sopenharmony_ci atomic_t num_aux_in_flight; 74462306a36Sopenharmony_ci 74562306a36Sopenharmony_ci u8 mac80211_registered; 74662306a36Sopenharmony_ci 74762306a36Sopenharmony_ci /* Indication if ieee80211_ops->open has been called */ 74862306a36Sopenharmony_ci u8 is_open; 74962306a36Sopenharmony_ci 75062306a36Sopenharmony_ci enum nl80211_iftype iw_mode; 75162306a36Sopenharmony_ci 75262306a36Sopenharmony_ci /* Last Rx'd beacon timestamp */ 75362306a36Sopenharmony_ci u64 timestamp; 75462306a36Sopenharmony_ci 75562306a36Sopenharmony_ci struct { 75662306a36Sopenharmony_ci __le32 flag; 75762306a36Sopenharmony_ci struct statistics_general_common common; 75862306a36Sopenharmony_ci struct statistics_rx_non_phy rx_non_phy; 75962306a36Sopenharmony_ci struct statistics_rx_phy rx_ofdm; 76062306a36Sopenharmony_ci struct statistics_rx_ht_phy rx_ofdm_ht; 76162306a36Sopenharmony_ci struct statistics_rx_phy rx_cck; 76262306a36Sopenharmony_ci struct statistics_tx tx; 76362306a36Sopenharmony_ci#ifdef CONFIG_IWLWIFI_DEBUGFS 76462306a36Sopenharmony_ci struct statistics_bt_activity bt_activity; 76562306a36Sopenharmony_ci __le32 num_bt_kills, accum_num_bt_kills; 76662306a36Sopenharmony_ci#endif 76762306a36Sopenharmony_ci spinlock_t lock; 76862306a36Sopenharmony_ci } statistics; 76962306a36Sopenharmony_ci#ifdef CONFIG_IWLWIFI_DEBUGFS 77062306a36Sopenharmony_ci struct { 77162306a36Sopenharmony_ci struct statistics_general_common common; 77262306a36Sopenharmony_ci struct statistics_rx_non_phy rx_non_phy; 77362306a36Sopenharmony_ci struct statistics_rx_phy rx_ofdm; 77462306a36Sopenharmony_ci struct statistics_rx_ht_phy rx_ofdm_ht; 77562306a36Sopenharmony_ci struct statistics_rx_phy rx_cck; 77662306a36Sopenharmony_ci struct statistics_tx tx; 77762306a36Sopenharmony_ci struct statistics_bt_activity bt_activity; 77862306a36Sopenharmony_ci } accum_stats, delta_stats, max_delta_stats; 77962306a36Sopenharmony_ci#endif 78062306a36Sopenharmony_ci 78162306a36Sopenharmony_ci /* 78262306a36Sopenharmony_ci * reporting the number of tids has AGG on. 0 means 78362306a36Sopenharmony_ci * no AGGREGATION 78462306a36Sopenharmony_ci */ 78562306a36Sopenharmony_ci u8 agg_tids_count; 78662306a36Sopenharmony_ci 78762306a36Sopenharmony_ci struct iwl_rx_phy_res last_phy_res; 78862306a36Sopenharmony_ci u32 ampdu_ref; 78962306a36Sopenharmony_ci bool last_phy_res_valid; 79062306a36Sopenharmony_ci 79162306a36Sopenharmony_ci /* 79262306a36Sopenharmony_ci * chain noise reset and gain commands are the 79362306a36Sopenharmony_ci * two extra calibration commands follows the standard 79462306a36Sopenharmony_ci * phy calibration commands 79562306a36Sopenharmony_ci */ 79662306a36Sopenharmony_ci u8 phy_calib_chain_noise_reset_cmd; 79762306a36Sopenharmony_ci u8 phy_calib_chain_noise_gain_cmd; 79862306a36Sopenharmony_ci 79962306a36Sopenharmony_ci /* counts reply_tx error */ 80062306a36Sopenharmony_ci struct reply_tx_error_statistics reply_tx_stats; 80162306a36Sopenharmony_ci struct reply_agg_tx_error_statistics reply_agg_tx_stats; 80262306a36Sopenharmony_ci 80362306a36Sopenharmony_ci /* bt coex */ 80462306a36Sopenharmony_ci u8 bt_enable_flag; 80562306a36Sopenharmony_ci u8 bt_status; 80662306a36Sopenharmony_ci u8 bt_traffic_load, last_bt_traffic_load; 80762306a36Sopenharmony_ci bool bt_ch_announce; 80862306a36Sopenharmony_ci bool bt_full_concurrent; 80962306a36Sopenharmony_ci __le32 kill_ack_mask; 81062306a36Sopenharmony_ci __le32 kill_cts_mask; 81162306a36Sopenharmony_ci __le16 bt_valid; 81262306a36Sopenharmony_ci bool reduced_txpower; 81362306a36Sopenharmony_ci u16 bt_on_thresh; 81462306a36Sopenharmony_ci u16 bt_duration; 81562306a36Sopenharmony_ci u16 dynamic_frag_thresh; 81662306a36Sopenharmony_ci u8 bt_ci_compliance; 81762306a36Sopenharmony_ci struct work_struct bt_traffic_change_work; 81862306a36Sopenharmony_ci bool bt_enable_pspoll; 81962306a36Sopenharmony_ci struct iwl_rxon_context *cur_rssi_ctx; 82062306a36Sopenharmony_ci bool bt_is_sco; 82162306a36Sopenharmony_ci 82262306a36Sopenharmony_ci struct work_struct restart; 82362306a36Sopenharmony_ci struct work_struct scan_completed; 82462306a36Sopenharmony_ci struct work_struct abort_scan; 82562306a36Sopenharmony_ci 82662306a36Sopenharmony_ci struct work_struct beacon_update; 82762306a36Sopenharmony_ci struct iwl_rxon_context *beacon_ctx; 82862306a36Sopenharmony_ci struct sk_buff *beacon_skb; 82962306a36Sopenharmony_ci void *beacon_cmd; 83062306a36Sopenharmony_ci 83162306a36Sopenharmony_ci struct work_struct tt_work; 83262306a36Sopenharmony_ci struct work_struct ct_enter; 83362306a36Sopenharmony_ci struct work_struct ct_exit; 83462306a36Sopenharmony_ci struct work_struct start_internal_scan; 83562306a36Sopenharmony_ci struct work_struct tx_flush; 83662306a36Sopenharmony_ci struct work_struct bt_full_concurrency; 83762306a36Sopenharmony_ci struct work_struct bt_runtime_config; 83862306a36Sopenharmony_ci 83962306a36Sopenharmony_ci struct delayed_work scan_check; 84062306a36Sopenharmony_ci 84162306a36Sopenharmony_ci /* TX Power settings */ 84262306a36Sopenharmony_ci s8 tx_power_user_lmt; 84362306a36Sopenharmony_ci s8 tx_power_next; 84462306a36Sopenharmony_ci 84562306a36Sopenharmony_ci#ifdef CONFIG_IWLWIFI_DEBUGFS 84662306a36Sopenharmony_ci /* debugfs */ 84762306a36Sopenharmony_ci struct dentry *debugfs_dir; 84862306a36Sopenharmony_ci u32 dbgfs_sram_offset, dbgfs_sram_len; 84962306a36Sopenharmony_ci bool disable_ht40; 85062306a36Sopenharmony_ci void *wowlan_sram; 85162306a36Sopenharmony_ci#endif /* CONFIG_IWLWIFI_DEBUGFS */ 85262306a36Sopenharmony_ci 85362306a36Sopenharmony_ci struct iwl_nvm_data *nvm_data; 85462306a36Sopenharmony_ci /* eeprom blob for debugfs */ 85562306a36Sopenharmony_ci u8 *eeprom_blob; 85662306a36Sopenharmony_ci size_t eeprom_blob_size; 85762306a36Sopenharmony_ci 85862306a36Sopenharmony_ci struct work_struct txpower_work; 85962306a36Sopenharmony_ci u32 calib_disabled; 86062306a36Sopenharmony_ci struct work_struct run_time_calib_work; 86162306a36Sopenharmony_ci struct timer_list statistics_periodic; 86262306a36Sopenharmony_ci struct timer_list ucode_trace; 86362306a36Sopenharmony_ci 86462306a36Sopenharmony_ci struct iwl_event_log event_log; 86562306a36Sopenharmony_ci 86662306a36Sopenharmony_ci#ifdef CONFIG_IWLWIFI_LEDS 86762306a36Sopenharmony_ci struct led_classdev led; 86862306a36Sopenharmony_ci unsigned long blink_on, blink_off; 86962306a36Sopenharmony_ci bool led_registered; 87062306a36Sopenharmony_ci#endif 87162306a36Sopenharmony_ci 87262306a36Sopenharmony_ci /* WoWLAN GTK rekey data */ 87362306a36Sopenharmony_ci u8 kck[NL80211_KCK_LEN], kek[NL80211_KEK_LEN]; 87462306a36Sopenharmony_ci __le64 replay_ctr; 87562306a36Sopenharmony_ci __le16 last_seq_ctl; 87662306a36Sopenharmony_ci bool have_rekey_data; 87762306a36Sopenharmony_ci#ifdef CONFIG_PM_SLEEP 87862306a36Sopenharmony_ci struct wiphy_wowlan_support wowlan_support; 87962306a36Sopenharmony_ci#endif 88062306a36Sopenharmony_ci 88162306a36Sopenharmony_ci /* device_pointers: pointers to ucode event tables */ 88262306a36Sopenharmony_ci struct { 88362306a36Sopenharmony_ci u32 error_event_table; 88462306a36Sopenharmony_ci u32 log_event_table; 88562306a36Sopenharmony_ci } device_pointers; 88662306a36Sopenharmony_ci 88762306a36Sopenharmony_ci /* indicator of loaded ucode image */ 88862306a36Sopenharmony_ci enum iwl_ucode_type cur_ucode; 88962306a36Sopenharmony_ci}; /*iwl_priv */ 89062306a36Sopenharmony_ci 89162306a36Sopenharmony_cistatic inline struct iwl_rxon_context * 89262306a36Sopenharmony_ciiwl_rxon_ctx_from_vif(struct ieee80211_vif *vif) 89362306a36Sopenharmony_ci{ 89462306a36Sopenharmony_ci struct iwl_vif_priv *vif_priv = (void *)vif->drv_priv; 89562306a36Sopenharmony_ci 89662306a36Sopenharmony_ci return vif_priv->ctx; 89762306a36Sopenharmony_ci} 89862306a36Sopenharmony_ci 89962306a36Sopenharmony_ci#define for_each_context(priv, ctx) \ 90062306a36Sopenharmony_ci for (ctx = &priv->contexts[IWL_RXON_CTX_BSS]; \ 90162306a36Sopenharmony_ci ctx < &priv->contexts[NUM_IWL_RXON_CTX]; ctx++) \ 90262306a36Sopenharmony_ci if (priv->valid_contexts & BIT(ctx->ctxid)) 90362306a36Sopenharmony_ci 90462306a36Sopenharmony_cistatic inline int iwl_is_associated_ctx(struct iwl_rxon_context *ctx) 90562306a36Sopenharmony_ci{ 90662306a36Sopenharmony_ci return (ctx->active.filter_flags & RXON_FILTER_ASSOC_MSK) ? 1 : 0; 90762306a36Sopenharmony_ci} 90862306a36Sopenharmony_ci 90962306a36Sopenharmony_cistatic inline int iwl_is_associated(struct iwl_priv *priv, 91062306a36Sopenharmony_ci enum iwl_rxon_context_id ctxid) 91162306a36Sopenharmony_ci{ 91262306a36Sopenharmony_ci return iwl_is_associated_ctx(&priv->contexts[ctxid]); 91362306a36Sopenharmony_ci} 91462306a36Sopenharmony_ci 91562306a36Sopenharmony_cistatic inline int iwl_is_any_associated(struct iwl_priv *priv) 91662306a36Sopenharmony_ci{ 91762306a36Sopenharmony_ci struct iwl_rxon_context *ctx; 91862306a36Sopenharmony_ci for_each_context(priv, ctx) 91962306a36Sopenharmony_ci if (iwl_is_associated_ctx(ctx)) 92062306a36Sopenharmony_ci return true; 92162306a36Sopenharmony_ci return false; 92262306a36Sopenharmony_ci} 92362306a36Sopenharmony_ci 92462306a36Sopenharmony_ci#endif /* __iwl_dev_h__ */ 925