cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

mvm.h (68424B)


      1/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
      2/*
      3 * Copyright (C) 2012-2014, 2018-2022 Intel Corporation
      4 * Copyright (C) 2013-2015 Intel Mobile Communications GmbH
      5 * Copyright (C) 2016-2017 Intel Deutschland GmbH
      6 */
      7#ifndef __IWL_MVM_H__
      8#define __IWL_MVM_H__
      9
     10#include <linux/list.h>
     11#include <linux/spinlock.h>
     12#include <linux/leds.h>
     13#include <linux/in6.h>
     14
     15#ifdef CONFIG_THERMAL
     16#include <linux/thermal.h>
     17#endif
     18
     19#include <linux/ktime.h>
     20
     21#include "iwl-op-mode.h"
     22#include "iwl-trans.h"
     23#include "fw/notif-wait.h"
     24#include "iwl-eeprom-parse.h"
     25#include "fw/file.h"
     26#include "iwl-config.h"
     27#include "sta.h"
     28#include "fw-api.h"
     29#include "constants.h"
     30#include "fw/runtime.h"
     31#include "fw/dbg.h"
     32#include "fw/acpi.h"
     33#include "mei/iwl-mei.h"
     34#include "iwl-nvm-parse.h"
     35
     36#include <linux/average.h>
     37
     38#define IWL_MVM_MAX_ADDRESSES		5
     39/* RSSI offset for WkP */
     40#define IWL_RSSI_OFFSET 50
     41#define IWL_MVM_MISSED_BEACONS_THRESHOLD 8
     42#define IWL_MVM_MISSED_BEACONS_THRESHOLD_LONG 16
     43
     44/* A TimeUnit is 1024 microsecond */
     45#define MSEC_TO_TU(_msec)	(_msec*1000/1024)
     46
     47/* For GO, this value represents the number of TUs before CSA "beacon
     48 * 0" TBTT when the CSA time-event needs to be scheduled to start.  It
     49 * must be big enough to ensure that we switch in time.
     50 */
     51#define IWL_MVM_CHANNEL_SWITCH_TIME_GO		40
     52
     53/* For client, this value represents the number of TUs before CSA
     54 * "beacon 1" TBTT, instead.  This is because we don't know when the
     55 * GO/AP will be in the new channel, so we switch early enough.
     56 */
     57#define IWL_MVM_CHANNEL_SWITCH_TIME_CLIENT	10
     58
     59/*
     60 * This value (in TUs) is used to fine tune the CSA NoA end time which should
     61 * be just before "beacon 0" TBTT.
     62 */
     63#define IWL_MVM_CHANNEL_SWITCH_MARGIN 4
     64
     65/*
     66 * Number of beacons to transmit on a new channel until we unblock tx to
     67 * the stations, even if we didn't identify them on a new channel
     68 */
     69#define IWL_MVM_CS_UNBLOCK_TX_TIMEOUT 3
     70
     71/* offchannel queue towards mac80211 */
     72#define IWL_MVM_OFFCHANNEL_QUEUE 0
     73
     74extern const struct ieee80211_ops iwl_mvm_hw_ops;
     75
     76/**
     77 * struct iwl_mvm_mod_params - module parameters for iwlmvm
     78 * @init_dbg: if true, then the NIC won't be stopped if the INIT fw asserted.
     79 *	We will register to mac80211 to have testmode working. The NIC must not
     80 *	be up'ed after the INIT fw asserted. This is useful to be able to use
     81 *	proprietary tools over testmode to debug the INIT fw.
     82 * @power_scheme: one of enum iwl_power_scheme
     83 */
     84struct iwl_mvm_mod_params {
     85	bool init_dbg;
     86	int power_scheme;
     87};
     88extern struct iwl_mvm_mod_params iwlmvm_mod_params;
     89
     90struct iwl_mvm_phy_ctxt {
     91	u16 id;
     92	u16 color;
     93	u32 ref;
     94
     95	enum nl80211_chan_width width;
     96
     97	struct ieee80211_channel *channel;
     98
     99	/* track for RLC config command */
    100	u32 center_freq1;
    101};
    102
    103struct iwl_mvm_time_event_data {
    104	struct ieee80211_vif *vif;
    105	struct list_head list;
    106	unsigned long end_jiffies;
    107	u32 duration;
    108	bool running;
    109	u32 uid;
    110
    111	/*
    112	 * The access to the 'id' field must be done when the
    113	 * mvm->time_event_lock is held, as it value is used to indicate
    114	 * if the te is in the time event list or not (when id == TE_MAX)
    115	 */
    116	u32 id;
    117};
    118
    119 /* Power management */
    120
    121/**
    122 * enum iwl_power_scheme
    123 * @IWL_POWER_LEVEL_CAM - Continuously Active Mode
    124 * @IWL_POWER_LEVEL_BPS - Balanced Power Save (default)
    125 * @IWL_POWER_LEVEL_LP  - Low Power
    126 */
    127enum iwl_power_scheme {
    128	IWL_POWER_SCHEME_CAM = 1,
    129	IWL_POWER_SCHEME_BPS,
    130	IWL_POWER_SCHEME_LP
    131};
    132
    133#define IWL_CONN_MAX_LISTEN_INTERVAL	10
    134#define IWL_UAPSD_MAX_SP		IEEE80211_WMM_IE_STA_QOSINFO_SP_ALL
    135
    136#ifdef CONFIG_IWLWIFI_DEBUGFS
    137enum iwl_dbgfs_pm_mask {
    138	MVM_DEBUGFS_PM_KEEP_ALIVE = BIT(0),
    139	MVM_DEBUGFS_PM_SKIP_OVER_DTIM = BIT(1),
    140	MVM_DEBUGFS_PM_SKIP_DTIM_PERIODS = BIT(2),
    141	MVM_DEBUGFS_PM_RX_DATA_TIMEOUT = BIT(3),
    142	MVM_DEBUGFS_PM_TX_DATA_TIMEOUT = BIT(4),
    143	MVM_DEBUGFS_PM_LPRX_ENA = BIT(6),
    144	MVM_DEBUGFS_PM_LPRX_RSSI_THRESHOLD = BIT(7),
    145	MVM_DEBUGFS_PM_SNOOZE_ENABLE = BIT(8),
    146	MVM_DEBUGFS_PM_UAPSD_MISBEHAVING = BIT(9),
    147	MVM_DEBUGFS_PM_USE_PS_POLL = BIT(10),
    148};
    149
    150struct iwl_dbgfs_pm {
    151	u16 keep_alive_seconds;
    152	u32 rx_data_timeout;
    153	u32 tx_data_timeout;
    154	bool skip_over_dtim;
    155	u8 skip_dtim_periods;
    156	bool lprx_ena;
    157	u32 lprx_rssi_threshold;
    158	bool snooze_ena;
    159	bool uapsd_misbehaving;
    160	bool use_ps_poll;
    161	int mask;
    162};
    163
    164/* beacon filtering */
    165
    166enum iwl_dbgfs_bf_mask {
    167	MVM_DEBUGFS_BF_ENERGY_DELTA = BIT(0),
    168	MVM_DEBUGFS_BF_ROAMING_ENERGY_DELTA = BIT(1),
    169	MVM_DEBUGFS_BF_ROAMING_STATE = BIT(2),
    170	MVM_DEBUGFS_BF_TEMP_THRESHOLD = BIT(3),
    171	MVM_DEBUGFS_BF_TEMP_FAST_FILTER = BIT(4),
    172	MVM_DEBUGFS_BF_TEMP_SLOW_FILTER = BIT(5),
    173	MVM_DEBUGFS_BF_ENABLE_BEACON_FILTER = BIT(6),
    174	MVM_DEBUGFS_BF_DEBUG_FLAG = BIT(7),
    175	MVM_DEBUGFS_BF_ESCAPE_TIMER = BIT(8),
    176	MVM_DEBUGFS_BA_ESCAPE_TIMER = BIT(9),
    177	MVM_DEBUGFS_BA_ENABLE_BEACON_ABORT = BIT(10),
    178};
    179
    180struct iwl_dbgfs_bf {
    181	u32 bf_energy_delta;
    182	u32 bf_roaming_energy_delta;
    183	u32 bf_roaming_state;
    184	u32 bf_temp_threshold;
    185	u32 bf_temp_fast_filter;
    186	u32 bf_temp_slow_filter;
    187	u32 bf_enable_beacon_filter;
    188	u32 bf_debug_flag;
    189	u32 bf_escape_timer;
    190	u32 ba_escape_timer;
    191	u32 ba_enable_beacon_abort;
    192	int mask;
    193};
    194#endif
    195
    196enum iwl_mvm_smps_type_request {
    197	IWL_MVM_SMPS_REQ_BT_COEX,
    198	IWL_MVM_SMPS_REQ_TT,
    199	IWL_MVM_SMPS_REQ_PROT,
    200	IWL_MVM_SMPS_REQ_FW,
    201	NUM_IWL_MVM_SMPS_REQ,
    202};
    203
    204enum iwl_bt_force_ant_mode {
    205	BT_FORCE_ANT_DIS = 0,
    206	BT_FORCE_ANT_AUTO,
    207	BT_FORCE_ANT_BT,
    208	BT_FORCE_ANT_WIFI,
    209
    210	BT_FORCE_ANT_MAX,
    211};
    212
    213/**
    214 * struct iwl_mvm_low_latency_force - low latency force mode set by debugfs
    215 * @LOW_LATENCY_FORCE_UNSET: unset force mode
    216 * @LOW_LATENCY_FORCE_ON: for low latency on
    217 * @LOW_LATENCY_FORCE_OFF: for low latency off
    218 * @NUM_LOW_LATENCY_FORCE: max num of modes
    219 */
    220enum iwl_mvm_low_latency_force {
    221	LOW_LATENCY_FORCE_UNSET,
    222	LOW_LATENCY_FORCE_ON,
    223	LOW_LATENCY_FORCE_OFF,
    224	NUM_LOW_LATENCY_FORCE
    225};
    226
    227/**
    228* struct iwl_mvm_low_latency_cause - low latency set causes
    229* @LOW_LATENCY_TRAFFIC: indicates low latency traffic was detected
    230* @LOW_LATENCY_DEBUGFS: low latency mode set from debugfs
    231* @LOW_LATENCY_VCMD: low latency mode set from vendor command
    232* @LOW_LATENCY_VIF_TYPE: low latency mode set because of vif type (ap)
    233* @LOW_LATENCY_DEBUGFS_FORCE_ENABLE: indicate that force mode is enabled
    234*	the actual set/unset is done with LOW_LATENCY_DEBUGFS_FORCE
    235* @LOW_LATENCY_DEBUGFS_FORCE: low latency force mode from debugfs
    236*	set this with LOW_LATENCY_DEBUGFS_FORCE_ENABLE flag
    237*	in low_latency.
    238*/
    239enum iwl_mvm_low_latency_cause {
    240	LOW_LATENCY_TRAFFIC = BIT(0),
    241	LOW_LATENCY_DEBUGFS = BIT(1),
    242	LOW_LATENCY_VCMD = BIT(2),
    243	LOW_LATENCY_VIF_TYPE = BIT(3),
    244	LOW_LATENCY_DEBUGFS_FORCE_ENABLE = BIT(4),
    245	LOW_LATENCY_DEBUGFS_FORCE = BIT(5),
    246};
    247
    248/**
    249* struct iwl_mvm_vif_bf_data - beacon filtering related data
    250* @bf_enabled: indicates if beacon filtering is enabled
    251* @ba_enabled: indicated if beacon abort is enabled
    252* @ave_beacon_signal: average beacon signal
    253* @last_cqm_event: rssi of the last cqm event
    254* @bt_coex_min_thold: minimum threshold for BT coex
    255* @bt_coex_max_thold: maximum threshold for BT coex
    256* @last_bt_coex_event: rssi of the last BT coex event
    257*/
    258struct iwl_mvm_vif_bf_data {
    259	bool bf_enabled;
    260	bool ba_enabled;
    261	int ave_beacon_signal;
    262	int last_cqm_event;
    263	int bt_coex_min_thold;
    264	int bt_coex_max_thold;
    265	int last_bt_coex_event;
    266};
    267
    268/**
    269 * struct iwl_probe_resp_data - data for NoA/CSA updates
    270 * @rcu_head: used for freeing the data on update
    271 * @notif: notification data
    272 * @noa_len: length of NoA attribute, calculated from the notification
    273 */
    274struct iwl_probe_resp_data {
    275	struct rcu_head rcu_head;
    276	struct iwl_probe_resp_data_notif notif;
    277	int noa_len;
    278};
    279
    280/**
    281 * struct iwl_mvm_vif - data per Virtual Interface, it is a MAC context
    282 * @id: between 0 and 3
    283 * @color: to solve races upon MAC addition and removal
    284 * @ap_sta_id: the sta_id of the AP - valid only if VIF type is STA
    285 * @bssid: BSSID for this (client) interface
    286 * @associated: indicates that we're currently associated, used only for
    287 *	managing the firmware state in iwl_mvm_bss_info_changed_station()
    288 * @ap_assoc_sta_count: count of stations associated to us - valid only
    289 *	if VIF type is AP
    290 * @uploaded: indicates the MAC context has been added to the device
    291 * @ap_ibss_active: indicates that AP/IBSS is configured and that the interface
    292 *	should get quota etc.
    293 * @pm_enabled - Indicate if MAC power management is allowed
    294 * @monitor_active: indicates that monitor context is configured, and that the
    295 *	interface should get quota etc.
    296 * @low_latency: bit flags for low latency
    297 *	see enum &iwl_mvm_low_latency_cause for causes.
    298 * @low_latency_actual: boolean, indicates low latency is set,
    299 *	as a result from low_latency bit flags and takes force into account.
    300 * @authorized: indicates the AP station was set to authorized
    301 * @ps_disabled: indicates that this interface requires PS to be disabled
    302 * @queue_params: QoS params for this MAC
    303 * @bcast_sta: station used for broadcast packets. Used by the following
    304 *  vifs: P2P_DEVICE, GO and AP.
    305 * @beacon_skb: the skb used to hold the AP/GO beacon template
    306 * @smps_requests: the SMPS requests of different parts of the driver,
    307 *	combined on update to yield the overall request to mac80211.
    308 * @beacon_stats: beacon statistics, containing the # of received beacons,
    309 *	# of received beacons accumulated over FW restart, and the current
    310 *	average signal of beacons retrieved from the firmware
    311 * @csa_failed: CSA failed to schedule time event, report an error later
    312 * @features: hw features active for this vif
    313 * @probe_resp_data: data from FW notification to store NOA and CSA related
    314 *	data to be inserted into probe response.
    315 */
    316struct iwl_mvm_vif {
    317	struct iwl_mvm *mvm;
    318	u16 id;
    319	u16 color;
    320	u8 ap_sta_id;
    321
    322	u8 bssid[ETH_ALEN];
    323	bool associated;
    324	u8 ap_assoc_sta_count;
    325
    326	u16 cab_queue;
    327
    328	bool uploaded;
    329	bool ap_ibss_active;
    330	bool pm_enabled;
    331	bool monitor_active;
    332	u8 low_latency: 6;
    333	u8 low_latency_actual: 1;
    334	u8 authorized:1;
    335	bool ps_disabled;
    336	struct iwl_mvm_vif_bf_data bf_data;
    337
    338	struct {
    339		u32 num_beacons, accu_num_beacons;
    340		u8 avg_signal;
    341	} beacon_stats;
    342
    343	u32 ap_beacon_time;
    344
    345	enum iwl_tsf_id tsf_id;
    346
    347	/*
    348	 * QoS data from mac80211, need to store this here
    349	 * as mac80211 has a separate callback but we need
    350	 * to have the data for the MAC context
    351	 */
    352	struct ieee80211_tx_queue_params queue_params[IEEE80211_NUM_ACS];
    353	struct iwl_mvm_time_event_data time_event_data;
    354	struct iwl_mvm_time_event_data hs_time_event_data;
    355
    356	struct iwl_mvm_int_sta bcast_sta;
    357	struct iwl_mvm_int_sta mcast_sta;
    358
    359	/*
    360	 * Assigned while mac80211 has the interface in a channel context,
    361	 * or, for P2P Device, while it exists.
    362	 */
    363	struct iwl_mvm_phy_ctxt *phy_ctxt;
    364
    365#ifdef CONFIG_PM
    366	/* WoWLAN GTK rekey data */
    367	struct {
    368		u8 kck[NL80211_KCK_EXT_LEN];
    369		u8 kek[NL80211_KEK_EXT_LEN];
    370		size_t kek_len;
    371		size_t kck_len;
    372		u32 akm;
    373		__le64 replay_ctr;
    374		bool valid;
    375	} rekey_data;
    376
    377	int tx_key_idx;
    378
    379	bool seqno_valid;
    380	u16 seqno;
    381#endif
    382
    383#if IS_ENABLED(CONFIG_IPV6)
    384	/* IPv6 addresses for WoWLAN */
    385	struct in6_addr target_ipv6_addrs[IWL_PROTO_OFFLOAD_NUM_IPV6_ADDRS_MAX];
    386	unsigned long tentative_addrs[BITS_TO_LONGS(IWL_PROTO_OFFLOAD_NUM_IPV6_ADDRS_MAX)];
    387	int num_target_ipv6_addrs;
    388#endif
    389
    390#ifdef CONFIG_IWLWIFI_DEBUGFS
    391	struct dentry *dbgfs_dir;
    392	struct dentry *dbgfs_slink;
    393	struct iwl_dbgfs_pm dbgfs_pm;
    394	struct iwl_dbgfs_bf dbgfs_bf;
    395	struct iwl_mac_power_cmd mac_pwr_cmd;
    396	int dbgfs_quota_min;
    397#endif
    398
    399	enum ieee80211_smps_mode smps_requests[NUM_IWL_MVM_SMPS_REQ];
    400
    401	/* FW identified misbehaving AP */
    402	u8 uapsd_misbehaving_bssid[ETH_ALEN];
    403
    404	struct delayed_work uapsd_nonagg_detected_wk;
    405
    406	/* Indicates that CSA countdown may be started */
    407	bool csa_countdown;
    408	bool csa_failed;
    409	u16 csa_target_freq;
    410	u16 csa_count;
    411	u16 csa_misbehave;
    412	struct delayed_work csa_work;
    413
    414	/* Indicates that we are waiting for a beacon on a new channel */
    415	bool csa_bcn_pending;
    416
    417	/* TCP Checksum Offload */
    418	netdev_features_t features;
    419
    420	struct iwl_probe_resp_data __rcu *probe_resp_data;
    421
    422	/* we can only have 2 GTK + 2 IGTK active at a time */
    423	struct ieee80211_key_conf *ap_early_keys[4];
    424
    425	/* 26-tone RU OFDMA transmissions should be blocked */
    426	bool he_ru_2mhz_block;
    427
    428	struct {
    429		struct ieee80211_key_conf __rcu *keys[2];
    430	} bcn_prot;
    431};
    432
    433static inline struct iwl_mvm_vif *
    434iwl_mvm_vif_from_mac80211(struct ieee80211_vif *vif)
    435{
    436	return (void *)vif->drv_priv;
    437}
    438
    439extern const u8 tid_to_mac80211_ac[];
    440
    441#define IWL_MVM_SCAN_STOPPING_SHIFT	8
    442
    443enum iwl_scan_status {
    444	IWL_MVM_SCAN_REGULAR		= BIT(0),
    445	IWL_MVM_SCAN_SCHED		= BIT(1),
    446	IWL_MVM_SCAN_NETDETECT		= BIT(2),
    447
    448	IWL_MVM_SCAN_STOPPING_REGULAR	= BIT(8),
    449	IWL_MVM_SCAN_STOPPING_SCHED	= BIT(9),
    450	IWL_MVM_SCAN_STOPPING_NETDETECT	= BIT(10),
    451
    452	IWL_MVM_SCAN_REGULAR_MASK	= IWL_MVM_SCAN_REGULAR |
    453					  IWL_MVM_SCAN_STOPPING_REGULAR,
    454	IWL_MVM_SCAN_SCHED_MASK		= IWL_MVM_SCAN_SCHED |
    455					  IWL_MVM_SCAN_STOPPING_SCHED,
    456	IWL_MVM_SCAN_NETDETECT_MASK	= IWL_MVM_SCAN_NETDETECT |
    457					  IWL_MVM_SCAN_STOPPING_NETDETECT,
    458
    459	IWL_MVM_SCAN_STOPPING_MASK	= 0xff << IWL_MVM_SCAN_STOPPING_SHIFT,
    460	IWL_MVM_SCAN_MASK		= 0xff,
    461};
    462
    463enum iwl_mvm_scan_type {
    464	IWL_SCAN_TYPE_NOT_SET,
    465	IWL_SCAN_TYPE_UNASSOC,
    466	IWL_SCAN_TYPE_WILD,
    467	IWL_SCAN_TYPE_MILD,
    468	IWL_SCAN_TYPE_FRAGMENTED,
    469	IWL_SCAN_TYPE_FAST_BALANCE,
    470};
    471
    472enum iwl_mvm_sched_scan_pass_all_states {
    473	SCHED_SCAN_PASS_ALL_DISABLED,
    474	SCHED_SCAN_PASS_ALL_ENABLED,
    475	SCHED_SCAN_PASS_ALL_FOUND,
    476};
    477
    478/**
    479 * struct iwl_mvm_tt_mgnt - Thermal Throttling Management structure
    480 * @ct_kill_exit: worker to exit thermal kill
    481 * @dynamic_smps: Is thermal throttling enabled dynamic_smps?
    482 * @tx_backoff: The current thremal throttling tx backoff in uSec.
    483 * @min_backoff: The minimal tx backoff due to power restrictions
    484 * @params: Parameters to configure the thermal throttling algorithm.
    485 * @throttle: Is thermal throttling is active?
    486 */
    487struct iwl_mvm_tt_mgmt {
    488	struct delayed_work ct_kill_exit;
    489	bool dynamic_smps;
    490	u32 tx_backoff;
    491	u32 min_backoff;
    492	struct iwl_tt_params params;
    493	bool throttle;
    494};
    495
    496#ifdef CONFIG_THERMAL
    497/**
    498 *struct iwl_mvm_thermal_device - thermal zone related data
    499 * @temp_trips: temperature thresholds for report
    500 * @fw_trips_index: keep indexes to original array - temp_trips
    501 * @tzone: thermal zone device data
    502*/
    503struct iwl_mvm_thermal_device {
    504	s16 temp_trips[IWL_MAX_DTS_TRIPS];
    505	u8 fw_trips_index[IWL_MAX_DTS_TRIPS];
    506	struct thermal_zone_device *tzone;
    507};
    508
    509/*
    510 * struct iwl_mvm_cooling_device
    511 * @cur_state: current state
    512 * @cdev: struct thermal cooling device
    513 */
    514struct iwl_mvm_cooling_device {
    515	u32 cur_state;
    516	struct thermal_cooling_device *cdev;
    517};
    518#endif
    519
    520#define IWL_MVM_NUM_LAST_FRAMES_UCODE_RATES 8
    521
    522struct iwl_mvm_frame_stats {
    523	u32 legacy_frames;
    524	u32 ht_frames;
    525	u32 vht_frames;
    526	u32 bw_20_frames;
    527	u32 bw_40_frames;
    528	u32 bw_80_frames;
    529	u32 bw_160_frames;
    530	u32 sgi_frames;
    531	u32 ngi_frames;
    532	u32 siso_frames;
    533	u32 mimo2_frames;
    534	u32 agg_frames;
    535	u32 ampdu_count;
    536	u32 success_frames;
    537	u32 fail_frames;
    538	u32 last_rates[IWL_MVM_NUM_LAST_FRAMES_UCODE_RATES];
    539	int last_frame_idx;
    540};
    541
    542#define IWL_MVM_DEBUG_SET_TEMPERATURE_DISABLE 0xff
    543#define IWL_MVM_DEBUG_SET_TEMPERATURE_MIN -100
    544#define IWL_MVM_DEBUG_SET_TEMPERATURE_MAX 200
    545
    546enum iwl_mvm_tdls_cs_state {
    547	IWL_MVM_TDLS_SW_IDLE = 0,
    548	IWL_MVM_TDLS_SW_REQ_SENT,
    549	IWL_MVM_TDLS_SW_RESP_RCVD,
    550	IWL_MVM_TDLS_SW_REQ_RCVD,
    551	IWL_MVM_TDLS_SW_ACTIVE,
    552};
    553
    554enum iwl_mvm_traffic_load {
    555	IWL_MVM_TRAFFIC_LOW,
    556	IWL_MVM_TRAFFIC_MEDIUM,
    557	IWL_MVM_TRAFFIC_HIGH,
    558};
    559
    560DECLARE_EWMA(rate, 16, 16)
    561
    562struct iwl_mvm_tcm_mac {
    563	struct {
    564		u32 pkts[IEEE80211_NUM_ACS];
    565		u32 airtime;
    566	} tx;
    567	struct {
    568		u32 pkts[IEEE80211_NUM_ACS];
    569		u32 airtime;
    570		u32 last_ampdu_ref;
    571	} rx;
    572	struct {
    573		/* track AP's transfer in client mode */
    574		u64 rx_bytes;
    575		struct ewma_rate rate;
    576		bool detected;
    577	} uapsd_nonagg_detect;
    578	bool opened_rx_ba_sessions;
    579};
    580
    581struct iwl_mvm_tcm {
    582	struct delayed_work work;
    583	spinlock_t lock; /* used when time elapsed */
    584	unsigned long ts; /* timestamp when period ends */
    585	unsigned long ll_ts;
    586	unsigned long uapsd_nonagg_ts;
    587	bool paused;
    588	struct iwl_mvm_tcm_mac data[NUM_MAC_INDEX_DRIVER];
    589	struct {
    590		u32 elapsed; /* milliseconds for this TCM period */
    591		u32 airtime[NUM_MAC_INDEX_DRIVER];
    592		enum iwl_mvm_traffic_load load[NUM_MAC_INDEX_DRIVER];
    593		enum iwl_mvm_traffic_load band_load[NUM_NL80211_BANDS];
    594		enum iwl_mvm_traffic_load global_load;
    595		bool low_latency[NUM_MAC_INDEX_DRIVER];
    596		bool change[NUM_MAC_INDEX_DRIVER];
    597	} result;
    598};
    599
    600/**
    601 * struct iwl_mvm_reorder_buffer - per ra/tid/queue reorder buffer
    602 * @head_sn: reorder window head sn
    603 * @num_stored: number of mpdus stored in the buffer
    604 * @buf_size: the reorder buffer size as set by the last addba request
    605 * @queue: queue of this reorder buffer
    606 * @last_amsdu: track last ASMDU SN for duplication detection
    607 * @last_sub_index: track ASMDU sub frame index for duplication detection
    608 * @reorder_timer: timer for frames are in the reorder buffer. For AMSDU
    609 *	it is the time of last received sub-frame
    610 * @removed: prevent timer re-arming
    611 * @valid: reordering is valid for this queue
    612 * @lock: protect reorder buffer internal state
    613 * @mvm: mvm pointer, needed for frame timer context
    614 * @consec_oldsn_drops: consecutive drops due to old SN
    615 * @consec_oldsn_ampdu_gp2: A-MPDU GP2 timestamp to track
    616 *	when to apply old SN consecutive drop workaround
    617 * @consec_oldsn_prev_drop: track whether or not an MPDU
    618 *	that was single/part of the previous A-MPDU was
    619 *	dropped due to old SN
    620 */
    621struct iwl_mvm_reorder_buffer {
    622	u16 head_sn;
    623	u16 num_stored;
    624	u16 buf_size;
    625	int queue;
    626	u16 last_amsdu;
    627	u8 last_sub_index;
    628	struct timer_list reorder_timer;
    629	bool removed;
    630	bool valid;
    631	spinlock_t lock;
    632	struct iwl_mvm *mvm;
    633	unsigned int consec_oldsn_drops;
    634	u32 consec_oldsn_ampdu_gp2;
    635	unsigned int consec_oldsn_prev_drop:1;
    636} ____cacheline_aligned_in_smp;
    637
    638/**
    639 * struct _iwl_mvm_reorder_buf_entry - reorder buffer entry per-queue/per-seqno
    640 * @frames: list of skbs stored
    641 * @reorder_time: time the packet was stored in the reorder buffer
    642 */
    643struct _iwl_mvm_reorder_buf_entry {
    644	struct sk_buff_head frames;
    645	unsigned long reorder_time;
    646};
    647
    648/* make this indirection to get the aligned thing */
    649struct iwl_mvm_reorder_buf_entry {
    650	struct _iwl_mvm_reorder_buf_entry e;
    651}
    652#ifndef __CHECKER__
    653/* sparse doesn't like this construct: "bad integer constant expression" */
    654__aligned(roundup_pow_of_two(sizeof(struct _iwl_mvm_reorder_buf_entry)))
    655#endif
    656;
    657
    658/**
    659 * struct iwl_mvm_baid_data - BA session data
    660 * @sta_id: station id
    661 * @tid: tid of the session
    662 * @baid baid of the session
    663 * @timeout: the timeout set in the addba request
    664 * @entries_per_queue: # of buffers per queue, this actually gets
    665 *	aligned up to avoid cache line sharing between queues
    666 * @last_rx: last rx jiffies, updated only if timeout passed from last update
    667 * @session_timer: timer to check if BA session expired, runs at 2 * timeout
    668 * @mvm: mvm pointer, needed for timer context
    669 * @reorder_buf: reorder buffer, allocated per queue
    670 * @reorder_buf_data: data
    671 */
    672struct iwl_mvm_baid_data {
    673	struct rcu_head rcu_head;
    674	u8 sta_id;
    675	u8 tid;
    676	u8 baid;
    677	u16 timeout;
    678	u16 entries_per_queue;
    679	unsigned long last_rx;
    680	struct timer_list session_timer;
    681	struct iwl_mvm_baid_data __rcu **rcu_ptr;
    682	struct iwl_mvm *mvm;
    683	struct iwl_mvm_reorder_buffer reorder_buf[IWL_MAX_RX_HW_QUEUES];
    684	struct iwl_mvm_reorder_buf_entry entries[];
    685};
    686
    687static inline struct iwl_mvm_baid_data *
    688iwl_mvm_baid_data_from_reorder_buf(struct iwl_mvm_reorder_buffer *buf)
    689{
    690	return (void *)((u8 *)buf -
    691			offsetof(struct iwl_mvm_baid_data, reorder_buf) -
    692			sizeof(*buf) * buf->queue);
    693}
    694
    695/*
    696 * enum iwl_mvm_queue_status - queue status
    697 * @IWL_MVM_QUEUE_FREE: the queue is not allocated nor reserved
    698 *	Basically, this means that this queue can be used for any purpose
    699 * @IWL_MVM_QUEUE_RESERVED: queue is reserved but not yet in use
    700 *	This is the state of a queue that has been dedicated for some RATID
    701 *	(agg'd or not), but that hasn't yet gone through the actual enablement
    702 *	of iwl_mvm_enable_txq(), and therefore no traffic can go through it yet.
    703 *	Note that in this state there is no requirement to already know what TID
    704 *	should be used with this queue, it is just marked as a queue that will
    705 *	be used, and shouldn't be allocated to anyone else.
    706 * @IWL_MVM_QUEUE_READY: queue is ready to be used
    707 *	This is the state of a queue that has been fully configured (including
    708 *	SCD pointers, etc), has a specific RA/TID assigned to it, and can be
    709 *	used to send traffic.
    710 * @IWL_MVM_QUEUE_SHARED: queue is shared, or in a process of becoming shared
    711 *	This is a state in which a single queue serves more than one TID, all of
    712 *	which are not aggregated. Note that the queue is only associated to one
    713 *	RA.
    714 */
    715enum iwl_mvm_queue_status {
    716	IWL_MVM_QUEUE_FREE,
    717	IWL_MVM_QUEUE_RESERVED,
    718	IWL_MVM_QUEUE_READY,
    719	IWL_MVM_QUEUE_SHARED,
    720};
    721
    722#define IWL_MVM_DQA_QUEUE_TIMEOUT	(5 * HZ)
    723#define IWL_MVM_INVALID_QUEUE		0xFFFF
    724
    725#define IWL_MVM_NUM_CIPHERS             10
    726
    727
    728struct iwl_mvm_txq {
    729	struct list_head list;
    730	u16 txq_id;
    731	atomic_t tx_request;
    732	bool stopped;
    733};
    734
    735static inline struct iwl_mvm_txq *
    736iwl_mvm_txq_from_mac80211(struct ieee80211_txq *txq)
    737{
    738	return (void *)txq->drv_priv;
    739}
    740
    741static inline struct iwl_mvm_txq *
    742iwl_mvm_txq_from_tid(struct ieee80211_sta *sta, u8 tid)
    743{
    744	if (tid == IWL_MAX_TID_COUNT)
    745		tid = IEEE80211_NUM_TIDS;
    746
    747	return (void *)sta->txq[tid]->drv_priv;
    748}
    749
    750/**
    751 * struct iwl_mvm_tvqm_txq_info - maps TVQM hw queue to tid
    752 *
    753 * @sta_id: sta id
    754 * @txq_tid: txq tid
    755 */
    756struct iwl_mvm_tvqm_txq_info {
    757	u8 sta_id;
    758	u8 txq_tid;
    759};
    760
    761struct iwl_mvm_dqa_txq_info {
    762	u8 ra_sta_id; /* The RA this queue is mapped to, if exists */
    763	bool reserved; /* Is this the TXQ reserved for a STA */
    764	u8 mac80211_ac; /* The mac80211 AC this queue is mapped to */
    765	u8 txq_tid; /* The TID "owner" of this queue*/
    766	u16 tid_bitmap; /* Bitmap of the TIDs mapped to this queue */
    767	/* Timestamp for inactivation per TID of this queue */
    768	unsigned long last_frame_time[IWL_MAX_TID_COUNT + 1];
    769	enum iwl_mvm_queue_status status;
    770};
    771
    772struct iwl_mvm {
    773	/* for logger access */
    774	struct device *dev;
    775
    776	struct iwl_trans *trans;
    777	const struct iwl_fw *fw;
    778	const struct iwl_cfg *cfg;
    779	struct iwl_phy_db *phy_db;
    780	struct ieee80211_hw *hw;
    781
    782	/* for protecting access to iwl_mvm */
    783	struct mutex mutex;
    784	struct list_head async_handlers_list;
    785	spinlock_t async_handlers_lock;
    786	struct work_struct async_handlers_wk;
    787
    788	struct work_struct roc_done_wk;
    789
    790	unsigned long init_status;
    791
    792	unsigned long status;
    793
    794	u32 queue_sync_cookie;
    795	unsigned long queue_sync_state;
    796	/*
    797	 * for beacon filtering -
    798	 * currently only one interface can be supported
    799	 */
    800	struct iwl_mvm_vif *bf_allowed_vif;
    801
    802	bool hw_registered;
    803	bool rfkill_safe_init_done;
    804
    805	u8 cca_40mhz_workaround;
    806
    807	u32 ampdu_ref;
    808	bool ampdu_toggle;
    809
    810	struct iwl_notif_wait_data notif_wait;
    811
    812	union {
    813		struct mvm_statistics_rx_v3 rx_stats_v3;
    814		struct mvm_statistics_rx rx_stats;
    815	};
    816
    817	struct {
    818		u64 rx_time;
    819		u64 tx_time;
    820		u64 on_time_rf;
    821		u64 on_time_scan;
    822	} radio_stats, accu_radio_stats;
    823
    824	struct list_head add_stream_txqs;
    825	union {
    826		struct iwl_mvm_dqa_txq_info queue_info[IWL_MAX_HW_QUEUES];
    827		struct iwl_mvm_tvqm_txq_info tvqm_info[IWL_MAX_TVQM_QUEUES];
    828	};
    829	struct work_struct add_stream_wk; /* To add streams to queues */
    830
    831	const char *nvm_file_name;
    832	struct iwl_nvm_data *nvm_data;
    833	struct iwl_mei_nvm *mei_nvm_data;
    834	struct iwl_mvm_csme_conn_info __rcu *csme_conn_info;
    835	bool mei_rfkill_blocked;
    836	bool mei_registered;
    837	struct work_struct sap_connected_wk;
    838
    839	/*
    840	 * NVM built based on the SAP data but that we can't free even after
    841	 * we get ownership because it contains the cfg80211's channel.
    842	 */
    843	struct iwl_nvm_data *temp_nvm_data;
    844
    845	/* NVM sections */
    846	struct iwl_nvm_section nvm_sections[NVM_MAX_NUM_SECTIONS];
    847
    848	struct iwl_fw_runtime fwrt;
    849
    850	/* EEPROM MAC addresses */
    851	struct mac_address addresses[IWL_MVM_MAX_ADDRESSES];
    852
    853	/* data related to data path */
    854	struct iwl_rx_phy_info last_phy_info;
    855	struct ieee80211_sta __rcu *fw_id_to_mac_id[IWL_MVM_STATION_COUNT_MAX];
    856	u8 rx_ba_sessions;
    857
    858	/* configured by mac80211 */
    859	u32 rts_threshold;
    860
    861	/* Scan status, cmd (pre-allocated) and auxiliary station */
    862	unsigned int scan_status;
    863	void *scan_cmd;
    864	struct iwl_mcast_filter_cmd *mcast_filter_cmd;
    865	/* For CDB this is low band scan type, for non-CDB - type. */
    866	enum iwl_mvm_scan_type scan_type;
    867	enum iwl_mvm_scan_type hb_scan_type;
    868
    869	enum iwl_mvm_sched_scan_pass_all_states sched_scan_pass_all;
    870	struct delayed_work scan_timeout_dwork;
    871
    872	/* max number of simultaneous scans the FW supports */
    873	unsigned int max_scans;
    874
    875	/* UMAC scan tracking */
    876	u32 scan_uid_status[IWL_MVM_MAX_UMAC_SCANS];
    877
    878	/* start time of last scan in TSF of the mac that requested the scan */
    879	u64 scan_start;
    880
    881	/* the vif that requested the current scan */
    882	struct iwl_mvm_vif *scan_vif;
    883
    884	/* rx chain antennas set through debugfs for the scan command */
    885	u8 scan_rx_ant;
    886
    887	/* Internal station */
    888	struct iwl_mvm_int_sta aux_sta;
    889	struct iwl_mvm_int_sta snif_sta;
    890
    891	bool last_ebs_successful;
    892
    893	u8 scan_last_antenna_idx; /* to toggle TX between antennas */
    894	u8 mgmt_last_antenna_idx;
    895
    896	/* last smart fifo state that was successfully sent to firmware */
    897	enum iwl_sf_state sf_state;
    898
    899	/*
    900	 * Leave this pointer outside the ifdef below so that it can be
    901	 * assigned without ifdef in the source code.
    902	 */
    903	struct dentry *debugfs_dir;
    904#ifdef CONFIG_IWLWIFI_DEBUGFS
    905	u32 dbgfs_sram_offset, dbgfs_sram_len;
    906	u32 dbgfs_prph_reg_addr;
    907	bool disable_power_off;
    908	bool disable_power_off_d3;
    909	bool beacon_inject_active;
    910
    911	bool scan_iter_notif_enabled;
    912
    913	struct debugfs_blob_wrapper nvm_hw_blob;
    914	struct debugfs_blob_wrapper nvm_sw_blob;
    915	struct debugfs_blob_wrapper nvm_calib_blob;
    916	struct debugfs_blob_wrapper nvm_prod_blob;
    917	struct debugfs_blob_wrapper nvm_phy_sku_blob;
    918	struct debugfs_blob_wrapper nvm_reg_blob;
    919
    920	struct iwl_mvm_frame_stats drv_rx_stats;
    921	spinlock_t drv_stats_lock;
    922	u16 dbgfs_rx_phyinfo;
    923#endif
    924
    925	struct iwl_mvm_phy_ctxt phy_ctxts[NUM_PHY_CTX];
    926
    927	struct list_head time_event_list;
    928	spinlock_t time_event_lock;
    929
    930	/*
    931	 * A bitmap indicating the index of the key in use. The firmware
    932	 * can hold 16 keys at most. Reflect this fact.
    933	 */
    934	unsigned long fw_key_table[BITS_TO_LONGS(STA_KEY_MAX_NUM)];
    935	u8 fw_key_deleted[STA_KEY_MAX_NUM];
    936
    937	struct ieee80211_vif __rcu *vif_id_to_mac[NUM_MAC_INDEX_DRIVER];
    938
    939	/* -1 for always, 0 for never, >0 for that many times */
    940	s8 fw_restart;
    941	u8 *error_recovery_buf;
    942
    943#ifdef CONFIG_IWLWIFI_LEDS
    944	struct led_classdev led;
    945#endif
    946
    947	struct ieee80211_vif *p2p_device_vif;
    948
    949#ifdef CONFIG_PM
    950	struct wiphy_wowlan_support wowlan;
    951	int gtk_ivlen, gtk_icvlen, ptk_ivlen, ptk_icvlen;
    952
    953	/* sched scan settings for net detect */
    954	struct ieee80211_scan_ies nd_ies;
    955	struct cfg80211_match_set *nd_match_sets;
    956	int n_nd_match_sets;
    957	struct ieee80211_channel **nd_channels;
    958	int n_nd_channels;
    959	bool net_detect;
    960	u8 offload_tid;
    961#ifdef CONFIG_IWLWIFI_DEBUGFS
    962	bool d3_wake_sysassert;
    963	bool d3_test_active;
    964	u32 d3_test_pme_ptr;
    965	struct ieee80211_vif *keep_vif;
    966	u32 last_netdetect_scans; /* no. of scans in the last net-detect wake */
    967#endif
    968#endif
    969
    970	wait_queue_head_t rx_sync_waitq;
    971
    972	/* BT-Coex */
    973	struct iwl_bt_coex_profile_notif last_bt_notif;
    974	struct iwl_bt_coex_ci_cmd last_bt_ci_cmd;
    975
    976	u8 bt_tx_prio;
    977	enum iwl_bt_force_ant_mode bt_force_ant_mode;
    978
    979	/* Aux ROC */
    980	struct list_head aux_roc_te_list;
    981
    982	/* Thermal Throttling and CTkill */
    983	struct iwl_mvm_tt_mgmt thermal_throttle;
    984#ifdef CONFIG_THERMAL
    985	struct iwl_mvm_thermal_device tz_device;
    986	struct iwl_mvm_cooling_device cooling_dev;
    987#endif
    988
    989	s32 temperature;	/* Celsius */
    990	/*
    991	 * Debug option to set the NIC temperature. This option makes the
    992	 * driver think this is the actual NIC temperature, and ignore the
    993	 * real temperature that is received from the fw
    994	 */
    995	bool temperature_test;  /* Debug test temperature is enabled */
    996
    997	bool fw_static_smps_request;
    998
    999	unsigned long bt_coex_last_tcm_ts;
   1000	struct iwl_mvm_tcm tcm;
   1001
   1002	u8 uapsd_noagg_bssid_write_idx;
   1003	struct mac_address uapsd_noagg_bssids[IWL_MVM_UAPSD_NOAGG_BSSIDS_NUM]
   1004		__aligned(2);
   1005
   1006	struct iwl_time_quota_cmd last_quota_cmd;
   1007
   1008#ifdef CONFIG_NL80211_TESTMODE
   1009	u32 noa_duration;
   1010	struct ieee80211_vif *noa_vif;
   1011#endif
   1012
   1013	/* Tx queues */
   1014	u16 aux_queue;
   1015	u16 snif_queue;
   1016	u16 probe_queue;
   1017	u16 p2p_dev_queue;
   1018
   1019	/* Indicate if device power save is allowed */
   1020	u8 ps_disabled; /* u8 instead of bool to ease debugfs_create_* usage */
   1021	/* Indicate if 32Khz external clock is valid */
   1022	u32 ext_clock_valid;
   1023
   1024	/* This vif used by CSME to send / receive traffic */
   1025	struct ieee80211_vif *csme_vif;
   1026	struct ieee80211_vif __rcu *csa_vif;
   1027	struct ieee80211_vif __rcu *csa_tx_blocked_vif;
   1028	u8 csa_tx_block_bcn_timeout;
   1029
   1030	/* system time of last beacon (for AP/GO interface) */
   1031	u32 ap_last_beacon_gp2;
   1032
   1033	/* indicates that we transmitted the last beacon */
   1034	bool ibss_manager;
   1035
   1036	bool lar_regdom_set;
   1037	enum iwl_mcc_source mcc_src;
   1038
   1039	/* TDLS channel switch data */
   1040	struct {
   1041		struct delayed_work dwork;
   1042		enum iwl_mvm_tdls_cs_state state;
   1043
   1044		/*
   1045		 * Current cs sta - might be different from periodic cs peer
   1046		 * station. Value is meaningless when the cs-state is idle.
   1047		 */
   1048		u8 cur_sta_id;
   1049
   1050		/* TDLS periodic channel-switch peer */
   1051		struct {
   1052			u8 sta_id;
   1053			u8 op_class;
   1054			bool initiator; /* are we the link initiator */
   1055			struct cfg80211_chan_def chandef;
   1056			struct sk_buff *skb; /* ch sw template */
   1057			u32 ch_sw_tm_ie;
   1058
   1059			/* timestamp of last ch-sw request sent (GP2 time) */
   1060			u32 sent_timestamp;
   1061		} peer;
   1062	} tdls_cs;
   1063
   1064
   1065	u32 ciphers[IWL_MVM_NUM_CIPHERS];
   1066
   1067	struct cfg80211_ftm_responder_stats ftm_resp_stats;
   1068	struct {
   1069		struct cfg80211_pmsr_request *req;
   1070		struct wireless_dev *req_wdev;
   1071		struct list_head loc_list;
   1072		int responses[IWL_MVM_TOF_MAX_APS];
   1073		struct {
   1074			struct list_head resp;
   1075		} smooth;
   1076		struct list_head pasn_list;
   1077	} ftm_initiator;
   1078
   1079	struct list_head resp_pasn_list;
   1080
   1081	struct {
   1082		u8 d0i3_resp;
   1083		u8 range_resp;
   1084	} cmd_ver;
   1085
   1086	struct ieee80211_vif *nan_vif;
   1087	struct iwl_mvm_baid_data __rcu *baid_map[IWL_MAX_BAID];
   1088
   1089	/*
   1090	 * Drop beacons from other APs in AP mode when there are no connected
   1091	 * clients.
   1092	 */
   1093	bool drop_bcn_ap_mode;
   1094
   1095	struct delayed_work cs_tx_unblock_dwork;
   1096
   1097	/* does a monitor vif exist (only one can exist hence bool) */
   1098	bool monitor_on;
   1099
   1100	/* sniffer data to include in radiotap */
   1101	__le16 cur_aid;
   1102	u8 cur_bssid[ETH_ALEN];
   1103
   1104	unsigned long last_6ghz_passive_scan_jiffies;
   1105	unsigned long last_reset_or_resume_time_jiffies;
   1106
   1107	bool sta_remove_requires_queue_remove;
   1108};
   1109
   1110/* Extract MVM priv from op_mode and _hw */
   1111#define IWL_OP_MODE_GET_MVM(_iwl_op_mode)		\
   1112	((struct iwl_mvm *)(_iwl_op_mode)->op_mode_specific)
   1113
   1114#define IWL_MAC80211_GET_MVM(_hw)			\
   1115	IWL_OP_MODE_GET_MVM((struct iwl_op_mode *)((_hw)->priv))
   1116
   1117/**
   1118 * enum iwl_mvm_status - MVM status bits
   1119 * @IWL_MVM_STATUS_HW_RFKILL: HW RF-kill is asserted
   1120 * @IWL_MVM_STATUS_HW_CTKILL: CT-kill is active
   1121 * @IWL_MVM_STATUS_ROC_RUNNING: remain-on-channel is running
   1122 * @IWL_MVM_STATUS_HW_RESTART_REQUESTED: HW restart was requested
   1123 * @IWL_MVM_STATUS_IN_HW_RESTART: HW restart is active
   1124 * @IWL_MVM_STATUS_ROC_AUX_RUNNING: AUX remain-on-channel is running
   1125 * @IWL_MVM_STATUS_FIRMWARE_RUNNING: firmware is running
   1126 * @IWL_MVM_STATUS_NEED_FLUSH_P2P: need to flush P2P bcast STA
   1127 * @IWL_MVM_STATUS_IN_D3: in D3 (or at least about to go into it)
   1128 * @IWL_MVM_STATUS_SUPPRESS_ERROR_LOG_ONCE: suppress one error log
   1129 *	if this is set, when intentionally triggered
   1130 * @IWL_MVM_STATUS_STARTING: starting mac,
   1131 *	used to disable restart flow while in STARTING state
   1132 */
   1133enum iwl_mvm_status {
   1134	IWL_MVM_STATUS_HW_RFKILL,
   1135	IWL_MVM_STATUS_HW_CTKILL,
   1136	IWL_MVM_STATUS_ROC_RUNNING,
   1137	IWL_MVM_STATUS_HW_RESTART_REQUESTED,
   1138	IWL_MVM_STATUS_IN_HW_RESTART,
   1139	IWL_MVM_STATUS_ROC_AUX_RUNNING,
   1140	IWL_MVM_STATUS_FIRMWARE_RUNNING,
   1141	IWL_MVM_STATUS_NEED_FLUSH_P2P,
   1142	IWL_MVM_STATUS_IN_D3,
   1143	IWL_MVM_STATUS_SUPPRESS_ERROR_LOG_ONCE,
   1144	IWL_MVM_STATUS_STARTING,
   1145};
   1146
   1147struct iwl_mvm_csme_conn_info {
   1148	struct rcu_head rcu_head;
   1149	struct iwl_mei_conn_info conn_info;
   1150};
   1151
   1152/* Keep track of completed init configuration */
   1153enum iwl_mvm_init_status {
   1154	IWL_MVM_INIT_STATUS_THERMAL_INIT_COMPLETE = BIT(0),
   1155	IWL_MVM_INIT_STATUS_LEDS_INIT_COMPLETE = BIT(1),
   1156};
   1157
   1158static inline bool iwl_mvm_is_radio_killed(struct iwl_mvm *mvm)
   1159{
   1160	return test_bit(IWL_MVM_STATUS_HW_RFKILL, &mvm->status) ||
   1161	       test_bit(IWL_MVM_STATUS_HW_CTKILL, &mvm->status);
   1162}
   1163
   1164static inline bool iwl_mvm_is_radio_hw_killed(struct iwl_mvm *mvm)
   1165{
   1166	return test_bit(IWL_MVM_STATUS_HW_RFKILL, &mvm->status);
   1167}
   1168
   1169static inline bool iwl_mvm_firmware_running(struct iwl_mvm *mvm)
   1170{
   1171	return test_bit(IWL_MVM_STATUS_FIRMWARE_RUNNING, &mvm->status);
   1172}
   1173
   1174/* Must be called with rcu_read_lock() held and it can only be
   1175 * released when mvmsta is not needed anymore.
   1176 */
   1177static inline struct iwl_mvm_sta *
   1178iwl_mvm_sta_from_staid_rcu(struct iwl_mvm *mvm, u8 sta_id)
   1179{
   1180	struct ieee80211_sta *sta;
   1181
   1182	if (sta_id >= mvm->fw->ucode_capa.num_stations)
   1183		return NULL;
   1184
   1185	sta = rcu_dereference(mvm->fw_id_to_mac_id[sta_id]);
   1186
   1187	/* This can happen if the station has been removed right now */
   1188	if (IS_ERR_OR_NULL(sta))
   1189		return NULL;
   1190
   1191	return iwl_mvm_sta_from_mac80211(sta);
   1192}
   1193
   1194static inline struct iwl_mvm_sta *
   1195iwl_mvm_sta_from_staid_protected(struct iwl_mvm *mvm, u8 sta_id)
   1196{
   1197	struct ieee80211_sta *sta;
   1198
   1199	if (sta_id >= mvm->fw->ucode_capa.num_stations)
   1200		return NULL;
   1201
   1202	sta = rcu_dereference_protected(mvm->fw_id_to_mac_id[sta_id],
   1203					lockdep_is_held(&mvm->mutex));
   1204
   1205	/* This can happen if the station has been removed right now */
   1206	if (IS_ERR_OR_NULL(sta))
   1207		return NULL;
   1208
   1209	return iwl_mvm_sta_from_mac80211(sta);
   1210}
   1211
   1212static inline struct ieee80211_vif *
   1213iwl_mvm_rcu_dereference_vif_id(struct iwl_mvm *mvm, u8 vif_id, bool rcu)
   1214{
   1215	if (WARN_ON(vif_id >= ARRAY_SIZE(mvm->vif_id_to_mac)))
   1216		return NULL;
   1217
   1218	if (rcu)
   1219		return rcu_dereference(mvm->vif_id_to_mac[vif_id]);
   1220
   1221	return rcu_dereference_protected(mvm->vif_id_to_mac[vif_id],
   1222					 lockdep_is_held(&mvm->mutex));
   1223}
   1224
   1225static inline bool iwl_mvm_is_adaptive_dwell_supported(struct iwl_mvm *mvm)
   1226{
   1227	return fw_has_api(&mvm->fw->ucode_capa,
   1228			  IWL_UCODE_TLV_API_ADAPTIVE_DWELL);
   1229}
   1230
   1231static inline bool iwl_mvm_is_adaptive_dwell_v2_supported(struct iwl_mvm *mvm)
   1232{
   1233	return fw_has_api(&mvm->fw->ucode_capa,
   1234			  IWL_UCODE_TLV_API_ADAPTIVE_DWELL_V2);
   1235}
   1236
   1237static inline bool iwl_mvm_is_adwell_hb_ap_num_supported(struct iwl_mvm *mvm)
   1238{
   1239	return fw_has_api(&mvm->fw->ucode_capa,
   1240			  IWL_UCODE_TLV_API_ADWELL_HB_DEF_N_AP);
   1241}
   1242
   1243static inline bool iwl_mvm_is_oce_supported(struct iwl_mvm *mvm)
   1244{
   1245	/* OCE should never be enabled for LMAC scan FWs */
   1246	return fw_has_api(&mvm->fw->ucode_capa, IWL_UCODE_TLV_API_OCE);
   1247}
   1248
   1249static inline bool iwl_mvm_is_frag_ebs_supported(struct iwl_mvm *mvm)
   1250{
   1251	return fw_has_api(&mvm->fw->ucode_capa, IWL_UCODE_TLV_API_FRAG_EBS);
   1252}
   1253
   1254static inline bool iwl_mvm_is_short_beacon_notif_supported(struct iwl_mvm *mvm)
   1255{
   1256	return fw_has_api(&mvm->fw->ucode_capa,
   1257			  IWL_UCODE_TLV_API_SHORT_BEACON_NOTIF);
   1258}
   1259
   1260static inline bool iwl_mvm_is_dqa_data_queue(struct iwl_mvm *mvm, u8 queue)
   1261{
   1262	return (queue >= IWL_MVM_DQA_MIN_DATA_QUEUE) &&
   1263	       (queue <= IWL_MVM_DQA_MAX_DATA_QUEUE);
   1264}
   1265
   1266static inline bool iwl_mvm_is_dqa_mgmt_queue(struct iwl_mvm *mvm, u8 queue)
   1267{
   1268	return (queue >= IWL_MVM_DQA_MIN_MGMT_QUEUE) &&
   1269	       (queue <= IWL_MVM_DQA_MAX_MGMT_QUEUE);
   1270}
   1271
   1272static inline bool iwl_mvm_is_lar_supported(struct iwl_mvm *mvm)
   1273{
   1274	bool nvm_lar = mvm->nvm_data->lar_enabled;
   1275	bool tlv_lar = fw_has_capa(&mvm->fw->ucode_capa,
   1276				   IWL_UCODE_TLV_CAPA_LAR_SUPPORT);
   1277
   1278	/*
   1279	 * Enable LAR only if it is supported by the FW (TLV) &&
   1280	 * enabled in the NVM
   1281	 */
   1282	if (mvm->cfg->nvm_type == IWL_NVM_EXT)
   1283		return nvm_lar && tlv_lar;
   1284	else
   1285		return tlv_lar;
   1286}
   1287
   1288static inline bool iwl_mvm_is_wifi_mcc_supported(struct iwl_mvm *mvm)
   1289{
   1290	return fw_has_api(&mvm->fw->ucode_capa,
   1291			  IWL_UCODE_TLV_API_WIFI_MCC_UPDATE) ||
   1292	       fw_has_capa(&mvm->fw->ucode_capa,
   1293			   IWL_UCODE_TLV_CAPA_LAR_MULTI_MCC);
   1294}
   1295
   1296static inline bool iwl_mvm_bt_is_rrc_supported(struct iwl_mvm *mvm)
   1297{
   1298	return fw_has_capa(&mvm->fw->ucode_capa,
   1299			   IWL_UCODE_TLV_CAPA_BT_COEX_RRC) &&
   1300		IWL_MVM_BT_COEX_RRC;
   1301}
   1302
   1303static inline bool iwl_mvm_is_csum_supported(struct iwl_mvm *mvm)
   1304{
   1305	return fw_has_capa(&mvm->fw->ucode_capa,
   1306			   IWL_UCODE_TLV_CAPA_CSUM_SUPPORT) &&
   1307               !IWL_MVM_HW_CSUM_DISABLE;
   1308}
   1309
   1310static inline bool iwl_mvm_is_mplut_supported(struct iwl_mvm *mvm)
   1311{
   1312	return fw_has_capa(&mvm->fw->ucode_capa,
   1313			   IWL_UCODE_TLV_CAPA_BT_MPLUT_SUPPORT) &&
   1314		IWL_MVM_BT_COEX_MPLUT;
   1315}
   1316
   1317static inline
   1318bool iwl_mvm_is_p2p_scm_uapsd_supported(struct iwl_mvm *mvm)
   1319{
   1320	return fw_has_capa(&mvm->fw->ucode_capa,
   1321			   IWL_UCODE_TLV_CAPA_P2P_SCM_UAPSD) &&
   1322		!(iwlwifi_mod_params.uapsd_disable &
   1323		  IWL_DISABLE_UAPSD_P2P_CLIENT);
   1324}
   1325
   1326static inline bool iwl_mvm_has_new_rx_api(struct iwl_mvm *mvm)
   1327{
   1328	return fw_has_capa(&mvm->fw->ucode_capa,
   1329			   IWL_UCODE_TLV_CAPA_MULTI_QUEUE_RX_SUPPORT);
   1330}
   1331
   1332static inline bool iwl_mvm_has_new_tx_api(struct iwl_mvm *mvm)
   1333{
   1334	/* TODO - replace with TLV once defined */
   1335	return mvm->trans->trans_cfg->use_tfh;
   1336}
   1337
   1338static inline bool iwl_mvm_has_unified_ucode(struct iwl_mvm *mvm)
   1339{
   1340	/* TODO - better define this */
   1341	return mvm->trans->trans_cfg->device_family >= IWL_DEVICE_FAMILY_22000;
   1342}
   1343
   1344static inline bool iwl_mvm_is_cdb_supported(struct iwl_mvm *mvm)
   1345{
   1346	/*
   1347	 * TODO:
   1348	 * The issue of how to determine CDB APIs and usage is still not fully
   1349	 * defined.
   1350	 * There is a compilation for CDB and non-CDB FW, but there may
   1351	 * be also runtime check.
   1352	 * For now there is a TLV for checking compilation mode, but a
   1353	 * runtime check will also have to be here - once defined.
   1354	 */
   1355	return fw_has_capa(&mvm->fw->ucode_capa,
   1356			   IWL_UCODE_TLV_CAPA_CDB_SUPPORT);
   1357}
   1358
   1359static inline bool iwl_mvm_cdb_scan_api(struct iwl_mvm *mvm)
   1360{
   1361	/*
   1362	 * TODO: should this be the same as iwl_mvm_is_cdb_supported()?
   1363	 * but then there's a little bit of code in scan that won't make
   1364	 * any sense...
   1365	 */
   1366	return mvm->trans->trans_cfg->device_family >= IWL_DEVICE_FAMILY_22000;
   1367}
   1368
   1369static inline bool iwl_mvm_is_scan_ext_chan_supported(struct iwl_mvm *mvm)
   1370{
   1371	return fw_has_api(&mvm->fw->ucode_capa,
   1372			  IWL_UCODE_TLV_API_SCAN_EXT_CHAN_VER);
   1373}
   1374
   1375
   1376static inline bool iwl_mvm_is_reduced_config_scan_supported(struct iwl_mvm *mvm)
   1377{
   1378	return fw_has_api(&mvm->fw->ucode_capa,
   1379			  IWL_UCODE_TLV_API_REDUCED_SCAN_CONFIG);
   1380}
   1381
   1382static inline bool iwl_mvm_is_band_in_rx_supported(struct iwl_mvm *mvm)
   1383{
   1384	return fw_has_api(&mvm->fw->ucode_capa,
   1385			   IWL_UCODE_TLV_API_BAND_IN_RX_DATA);
   1386}
   1387
   1388static inline bool iwl_mvm_has_new_rx_stats_api(struct iwl_mvm *mvm)
   1389{
   1390	return fw_has_api(&mvm->fw->ucode_capa,
   1391			  IWL_UCODE_TLV_API_NEW_RX_STATS);
   1392}
   1393
   1394static inline bool iwl_mvm_has_quota_low_latency(struct iwl_mvm *mvm)
   1395{
   1396	return fw_has_api(&mvm->fw->ucode_capa,
   1397			  IWL_UCODE_TLV_API_QUOTA_LOW_LATENCY);
   1398}
   1399
   1400static inline bool iwl_mvm_has_tlc_offload(const struct iwl_mvm *mvm)
   1401{
   1402	return fw_has_capa(&mvm->fw->ucode_capa,
   1403			   IWL_UCODE_TLV_CAPA_TLC_OFFLOAD);
   1404}
   1405
   1406static inline struct agg_tx_status *
   1407iwl_mvm_get_agg_status(struct iwl_mvm *mvm, void *tx_resp)
   1408{
   1409	if (iwl_mvm_has_new_tx_api(mvm))
   1410		return &((struct iwl_mvm_tx_resp *)tx_resp)->status;
   1411	else
   1412		return ((struct iwl_mvm_tx_resp_v3 *)tx_resp)->status;
   1413}
   1414
   1415static inline bool iwl_mvm_is_tt_in_fw(struct iwl_mvm *mvm)
   1416{
   1417	/* these two TLV are redundant since the responsibility to CT-kill by
   1418	 * FW happens only after we send at least one command of
   1419	 * temperature THs report.
   1420	 */
   1421	return fw_has_capa(&mvm->fw->ucode_capa,
   1422			   IWL_UCODE_TLV_CAPA_CT_KILL_BY_FW) &&
   1423	       fw_has_capa(&mvm->fw->ucode_capa,
   1424			   IWL_UCODE_TLV_CAPA_TEMP_THS_REPORT_SUPPORT);
   1425}
   1426
   1427static inline bool iwl_mvm_is_ctdp_supported(struct iwl_mvm *mvm)
   1428{
   1429	return fw_has_capa(&mvm->fw->ucode_capa,
   1430			   IWL_UCODE_TLV_CAPA_CTDP_SUPPORT);
   1431}
   1432
   1433extern const u8 iwl_mvm_ac_to_tx_fifo[];
   1434extern const u8 iwl_mvm_ac_to_gen2_tx_fifo[];
   1435
   1436static inline u8 iwl_mvm_mac_ac_to_tx_fifo(struct iwl_mvm *mvm,
   1437					   enum ieee80211_ac_numbers ac)
   1438{
   1439	return iwl_mvm_has_new_tx_api(mvm) ?
   1440		iwl_mvm_ac_to_gen2_tx_fifo[ac] : iwl_mvm_ac_to_tx_fifo[ac];
   1441}
   1442
   1443struct iwl_rate_info {
   1444	u8 plcp;	/* uCode API:  IWL_RATE_6M_PLCP, etc. */
   1445	u8 plcp_siso;	/* uCode API:  IWL_RATE_SISO_6M_PLCP, etc. */
   1446	u8 plcp_mimo2;	/* uCode API:  IWL_RATE_MIMO2_6M_PLCP, etc. */
   1447	u8 plcp_mimo3;  /* uCode API:  IWL_RATE_MIMO3_6M_PLCP, etc. */
   1448	u8 ieee;	/* MAC header:  IWL_RATE_6M_IEEE, etc. */
   1449};
   1450
   1451void __iwl_mvm_mac_stop(struct iwl_mvm *mvm);
   1452int __iwl_mvm_mac_start(struct iwl_mvm *mvm);
   1453
   1454/******************
   1455 * MVM Methods
   1456 ******************/
   1457/* uCode */
   1458int iwl_run_init_mvm_ucode(struct iwl_mvm *mvm);
   1459
   1460/* Utils */
   1461int iwl_mvm_legacy_hw_idx_to_mac80211_idx(u32 rate_n_flags,
   1462					  enum nl80211_band band);
   1463int iwl_mvm_legacy_rate_to_mac80211_idx(u32 rate_n_flags,
   1464					enum nl80211_band band);
   1465void iwl_mvm_hwrate_to_tx_rate(u32 rate_n_flags,
   1466			       enum nl80211_band band,
   1467			       struct ieee80211_tx_rate *r);
   1468void iwl_mvm_hwrate_to_tx_rate_v1(u32 rate_n_flags,
   1469				  enum nl80211_band band,
   1470				  struct ieee80211_tx_rate *r);
   1471u8 iwl_mvm_mac80211_idx_to_hwrate(const struct iwl_fw *fw, int rate_idx);
   1472u8 iwl_mvm_mac80211_ac_to_ucode_ac(enum ieee80211_ac_numbers ac);
   1473
   1474static inline void iwl_mvm_dump_nic_error_log(struct iwl_mvm *mvm)
   1475{
   1476	iwl_fwrt_dump_error_logs(&mvm->fwrt);
   1477}
   1478
   1479u8 first_antenna(u8 mask);
   1480u8 iwl_mvm_next_antenna(struct iwl_mvm *mvm, u8 valid, u8 last_idx);
   1481void iwl_mvm_get_sync_time(struct iwl_mvm *mvm, int clock_type, u32 *gp2,
   1482			   u64 *boottime, ktime_t *realtime);
   1483u32 iwl_mvm_get_systime(struct iwl_mvm *mvm);
   1484
   1485/* Tx / Host Commands */
   1486int __must_check iwl_mvm_send_cmd(struct iwl_mvm *mvm,
   1487				  struct iwl_host_cmd *cmd);
   1488int __must_check iwl_mvm_send_cmd_pdu(struct iwl_mvm *mvm, u32 id,
   1489				      u32 flags, u16 len, const void *data);
   1490int __must_check iwl_mvm_send_cmd_status(struct iwl_mvm *mvm,
   1491					 struct iwl_host_cmd *cmd,
   1492					 u32 *status);
   1493int __must_check iwl_mvm_send_cmd_pdu_status(struct iwl_mvm *mvm, u32 id,
   1494					     u16 len, const void *data,
   1495					     u32 *status);
   1496int iwl_mvm_tx_skb_sta(struct iwl_mvm *mvm, struct sk_buff *skb,
   1497		       struct ieee80211_sta *sta);
   1498int iwl_mvm_tx_skb_non_sta(struct iwl_mvm *mvm, struct sk_buff *skb);
   1499void iwl_mvm_set_tx_cmd(struct iwl_mvm *mvm, struct sk_buff *skb,
   1500			struct iwl_tx_cmd *tx_cmd,
   1501			struct ieee80211_tx_info *info, u8 sta_id);
   1502void iwl_mvm_set_tx_cmd_rate(struct iwl_mvm *mvm, struct iwl_tx_cmd *tx_cmd,
   1503			    struct ieee80211_tx_info *info,
   1504			    struct ieee80211_sta *sta, __le16 fc);
   1505void iwl_mvm_mac_itxq_xmit(struct ieee80211_hw *hw, struct ieee80211_txq *txq);
   1506unsigned int iwl_mvm_max_amsdu_size(struct iwl_mvm *mvm,
   1507				    struct ieee80211_sta *sta,
   1508				    unsigned int tid);
   1509u32 iwl_mvm_tx_csum_bz(struct iwl_mvm *mvm, struct sk_buff *skb, bool amsdu);
   1510
   1511#ifdef CONFIG_IWLWIFI_DEBUG
   1512const char *iwl_mvm_get_tx_fail_reason(u32 status);
   1513#else
   1514static inline const char *iwl_mvm_get_tx_fail_reason(u32 status) { return ""; }
   1515#endif
   1516int iwl_mvm_flush_tx_path(struct iwl_mvm *mvm, u32 tfd_msk);
   1517int iwl_mvm_flush_sta(struct iwl_mvm *mvm, void *sta, bool internal);
   1518int iwl_mvm_flush_sta_tids(struct iwl_mvm *mvm, u32 sta_id, u16 tids);
   1519
   1520void iwl_mvm_async_handlers_purge(struct iwl_mvm *mvm);
   1521
   1522static inline void iwl_mvm_set_tx_cmd_ccmp(struct ieee80211_tx_info *info,
   1523					   struct iwl_tx_cmd *tx_cmd)
   1524{
   1525	struct ieee80211_key_conf *keyconf = info->control.hw_key;
   1526
   1527	tx_cmd->sec_ctl = TX_CMD_SEC_CCM;
   1528	memcpy(tx_cmd->key, keyconf->key, keyconf->keylen);
   1529}
   1530
   1531static inline void iwl_mvm_wait_for_async_handlers(struct iwl_mvm *mvm)
   1532{
   1533	flush_work(&mvm->async_handlers_wk);
   1534}
   1535
   1536/* Statistics */
   1537void iwl_mvm_handle_rx_statistics(struct iwl_mvm *mvm,
   1538				  struct iwl_rx_packet *pkt);
   1539void iwl_mvm_rx_statistics(struct iwl_mvm *mvm,
   1540			   struct iwl_rx_cmd_buffer *rxb);
   1541int iwl_mvm_request_statistics(struct iwl_mvm *mvm, bool clear);
   1542void iwl_mvm_accu_radio_stats(struct iwl_mvm *mvm);
   1543
   1544/* NVM */
   1545int iwl_nvm_init(struct iwl_mvm *mvm);
   1546int iwl_mvm_load_nvm_to_nic(struct iwl_mvm *mvm);
   1547
   1548static inline u8 iwl_mvm_get_valid_tx_ant(struct iwl_mvm *mvm)
   1549{
   1550	return mvm->nvm_data && mvm->nvm_data->valid_tx_ant ?
   1551	       mvm->fw->valid_tx_ant & mvm->nvm_data->valid_tx_ant :
   1552	       mvm->fw->valid_tx_ant;
   1553}
   1554
   1555static inline u8 iwl_mvm_get_valid_rx_ant(struct iwl_mvm *mvm)
   1556{
   1557	return mvm->nvm_data && mvm->nvm_data->valid_rx_ant ?
   1558	       mvm->fw->valid_rx_ant & mvm->nvm_data->valid_rx_ant :
   1559	       mvm->fw->valid_rx_ant;
   1560}
   1561
   1562static inline void iwl_mvm_toggle_tx_ant(struct iwl_mvm *mvm, u8 *ant)
   1563{
   1564	*ant = iwl_mvm_next_antenna(mvm, iwl_mvm_get_valid_tx_ant(mvm), *ant);
   1565}
   1566
   1567static inline u32 iwl_mvm_get_phy_config(struct iwl_mvm *mvm)
   1568{
   1569	u32 phy_config = ~(FW_PHY_CFG_TX_CHAIN |
   1570			   FW_PHY_CFG_RX_CHAIN);
   1571	u32 valid_rx_ant = iwl_mvm_get_valid_rx_ant(mvm);
   1572	u32 valid_tx_ant = iwl_mvm_get_valid_tx_ant(mvm);
   1573
   1574	phy_config |= valid_tx_ant << FW_PHY_CFG_TX_CHAIN_POS |
   1575		      valid_rx_ant << FW_PHY_CFG_RX_CHAIN_POS;
   1576
   1577	return mvm->fw->phy_config & phy_config;
   1578}
   1579
   1580int iwl_mvm_up(struct iwl_mvm *mvm);
   1581int iwl_mvm_load_d3_fw(struct iwl_mvm *mvm);
   1582
   1583int iwl_mvm_mac_setup_register(struct iwl_mvm *mvm);
   1584
   1585/*
   1586 * FW notifications / CMD responses handlers
   1587 * Convention: iwl_mvm_rx_<NAME OF THE CMD>
   1588 */
   1589void iwl_mvm_rx_mq(struct iwl_op_mode *op_mode,
   1590		   struct napi_struct *napi,
   1591		   struct iwl_rx_cmd_buffer *rxb);
   1592void iwl_mvm_rx_rx_phy_cmd(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb);
   1593void iwl_mvm_rx_rx_mpdu(struct iwl_mvm *mvm, struct napi_struct *napi,
   1594			struct iwl_rx_cmd_buffer *rxb);
   1595void iwl_mvm_rx_mpdu_mq(struct iwl_mvm *mvm, struct napi_struct *napi,
   1596			struct iwl_rx_cmd_buffer *rxb, int queue);
   1597void iwl_mvm_rx_monitor_no_data(struct iwl_mvm *mvm, struct napi_struct *napi,
   1598				struct iwl_rx_cmd_buffer *rxb, int queue);
   1599void iwl_mvm_rx_frame_release(struct iwl_mvm *mvm, struct napi_struct *napi,
   1600			      struct iwl_rx_cmd_buffer *rxb, int queue);
   1601void iwl_mvm_rx_bar_frame_release(struct iwl_mvm *mvm, struct napi_struct *napi,
   1602				  struct iwl_rx_cmd_buffer *rxb, int queue);
   1603void iwl_mvm_rx_queue_notif(struct iwl_mvm *mvm, struct napi_struct *napi,
   1604			    struct iwl_rx_cmd_buffer *rxb, int queue);
   1605void iwl_mvm_rx_tx_cmd(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb);
   1606void iwl_mvm_mfu_assert_dump_notif(struct iwl_mvm *mvm,
   1607				   struct iwl_rx_cmd_buffer *rxb);
   1608void iwl_mvm_send_recovery_cmd(struct iwl_mvm *mvm, u32 flags);
   1609void iwl_mvm_rx_ba_notif(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb);
   1610void iwl_mvm_rx_ant_coupling_notif(struct iwl_mvm *mvm,
   1611				   struct iwl_rx_cmd_buffer *rxb);
   1612void iwl_mvm_rx_fw_error(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb);
   1613void iwl_mvm_rx_mfuart_notif(struct iwl_mvm *mvm,
   1614			     struct iwl_rx_cmd_buffer *rxb);
   1615void iwl_mvm_rx_shared_mem_cfg_notif(struct iwl_mvm *mvm,
   1616				     struct iwl_rx_cmd_buffer *rxb);
   1617
   1618/* MVM PHY */
   1619int iwl_mvm_phy_ctxt_add(struct iwl_mvm *mvm, struct iwl_mvm_phy_ctxt *ctxt,
   1620			 struct cfg80211_chan_def *chandef,
   1621			 u8 chains_static, u8 chains_dynamic);
   1622int iwl_mvm_phy_ctxt_changed(struct iwl_mvm *mvm, struct iwl_mvm_phy_ctxt *ctxt,
   1623			     struct cfg80211_chan_def *chandef,
   1624			     u8 chains_static, u8 chains_dynamic);
   1625void iwl_mvm_phy_ctxt_ref(struct iwl_mvm *mvm,
   1626			  struct iwl_mvm_phy_ctxt *ctxt);
   1627void iwl_mvm_phy_ctxt_unref(struct iwl_mvm *mvm,
   1628			    struct iwl_mvm_phy_ctxt *ctxt);
   1629int iwl_mvm_phy_ctx_count(struct iwl_mvm *mvm);
   1630u8 iwl_mvm_get_channel_width(struct cfg80211_chan_def *chandef);
   1631u8 iwl_mvm_get_ctrl_pos(struct cfg80211_chan_def *chandef);
   1632
   1633/* MAC (virtual interface) programming */
   1634int iwl_mvm_mac_ctxt_init(struct iwl_mvm *mvm, struct ieee80211_vif *vif);
   1635int iwl_mvm_mac_ctxt_add(struct iwl_mvm *mvm, struct ieee80211_vif *vif);
   1636int iwl_mvm_mac_ctxt_changed(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
   1637			     bool force_assoc_off, const u8 *bssid_override);
   1638int iwl_mvm_mac_ctxt_remove(struct iwl_mvm *mvm, struct ieee80211_vif *vif);
   1639int iwl_mvm_mac_ctxt_beacon_changed(struct iwl_mvm *mvm,
   1640				    struct ieee80211_vif *vif);
   1641int iwl_mvm_mac_ctxt_send_beacon(struct iwl_mvm *mvm,
   1642				 struct ieee80211_vif *vif,
   1643				 struct sk_buff *beacon);
   1644int iwl_mvm_mac_ctxt_send_beacon_cmd(struct iwl_mvm *mvm,
   1645				     struct sk_buff *beacon,
   1646				     void *data, int len);
   1647u8 iwl_mvm_mac_ctxt_get_lowest_rate(struct ieee80211_tx_info *info,
   1648				    struct ieee80211_vif *vif);
   1649u16 iwl_mvm_mac_ctxt_get_beacon_flags(const struct iwl_fw *fw,
   1650				      u8 rate_idx);
   1651void iwl_mvm_mac_ctxt_set_tim(struct iwl_mvm *mvm,
   1652			      __le32 *tim_index, __le32 *tim_size,
   1653			      u8 *beacon, u32 frame_size);
   1654void iwl_mvm_rx_beacon_notif(struct iwl_mvm *mvm,
   1655			     struct iwl_rx_cmd_buffer *rxb);
   1656void iwl_mvm_rx_missed_beacons_notif(struct iwl_mvm *mvm,
   1657				     struct iwl_rx_cmd_buffer *rxb);
   1658void iwl_mvm_rx_stored_beacon_notif(struct iwl_mvm *mvm,
   1659				    struct iwl_rx_cmd_buffer *rxb);
   1660void iwl_mvm_mu_mimo_grp_notif(struct iwl_mvm *mvm,
   1661			       struct iwl_rx_cmd_buffer *rxb);
   1662void iwl_mvm_sta_pm_notif(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb);
   1663void iwl_mvm_window_status_notif(struct iwl_mvm *mvm,
   1664				 struct iwl_rx_cmd_buffer *rxb);
   1665void iwl_mvm_mac_ctxt_recalc_tsf_id(struct iwl_mvm *mvm,
   1666				    struct ieee80211_vif *vif);
   1667void iwl_mvm_probe_resp_data_notif(struct iwl_mvm *mvm,
   1668				   struct iwl_rx_cmd_buffer *rxb);
   1669void iwl_mvm_rx_missed_vap_notif(struct iwl_mvm *mvm,
   1670				 struct iwl_rx_cmd_buffer *rxb);
   1671void iwl_mvm_channel_switch_start_notif(struct iwl_mvm *mvm,
   1672					struct iwl_rx_cmd_buffer *rxb);
   1673void iwl_mvm_channel_switch_error_notif(struct iwl_mvm *mvm,
   1674					struct iwl_rx_cmd_buffer *rxb);
   1675/* Bindings */
   1676int iwl_mvm_binding_add_vif(struct iwl_mvm *mvm, struct ieee80211_vif *vif);
   1677int iwl_mvm_binding_remove_vif(struct iwl_mvm *mvm, struct ieee80211_vif *vif);
   1678
   1679/* Quota management */
   1680static inline size_t iwl_mvm_quota_cmd_size(struct iwl_mvm *mvm)
   1681{
   1682	return iwl_mvm_has_quota_low_latency(mvm) ?
   1683		sizeof(struct iwl_time_quota_cmd) :
   1684		sizeof(struct iwl_time_quota_cmd_v1);
   1685}
   1686
   1687static inline struct iwl_time_quota_data
   1688*iwl_mvm_quota_cmd_get_quota(struct iwl_mvm *mvm,
   1689			     struct iwl_time_quota_cmd *cmd,
   1690			     int i)
   1691{
   1692	struct iwl_time_quota_data_v1 *quotas;
   1693
   1694	if (iwl_mvm_has_quota_low_latency(mvm))
   1695		return &cmd->quotas[i];
   1696
   1697	quotas = (struct iwl_time_quota_data_v1 *)cmd->quotas;
   1698	return (struct iwl_time_quota_data *)&quotas[i];
   1699}
   1700
   1701int iwl_mvm_update_quotas(struct iwl_mvm *mvm, bool force_upload,
   1702			  struct ieee80211_vif *disabled_vif);
   1703
   1704/* Scanning */
   1705int iwl_mvm_reg_scan_start(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
   1706			   struct cfg80211_scan_request *req,
   1707			   struct ieee80211_scan_ies *ies);
   1708int iwl_mvm_scan_size(struct iwl_mvm *mvm);
   1709int iwl_mvm_scan_stop(struct iwl_mvm *mvm, int type, bool notify);
   1710int iwl_mvm_max_scan_ie_len(struct iwl_mvm *mvm);
   1711void iwl_mvm_report_scan_aborted(struct iwl_mvm *mvm);
   1712void iwl_mvm_scan_timeout_wk(struct work_struct *work);
   1713
   1714/* Scheduled scan */
   1715void iwl_mvm_rx_lmac_scan_complete_notif(struct iwl_mvm *mvm,
   1716					 struct iwl_rx_cmd_buffer *rxb);
   1717void iwl_mvm_rx_lmac_scan_iter_complete_notif(struct iwl_mvm *mvm,
   1718					      struct iwl_rx_cmd_buffer *rxb);
   1719int iwl_mvm_sched_scan_start(struct iwl_mvm *mvm,
   1720			     struct ieee80211_vif *vif,
   1721			     struct cfg80211_sched_scan_request *req,
   1722			     struct ieee80211_scan_ies *ies,
   1723			     int type);
   1724void iwl_mvm_rx_scan_match_found(struct iwl_mvm *mvm,
   1725				 struct iwl_rx_cmd_buffer *rxb);
   1726
   1727/* UMAC scan */
   1728int iwl_mvm_config_scan(struct iwl_mvm *mvm);
   1729void iwl_mvm_rx_umac_scan_complete_notif(struct iwl_mvm *mvm,
   1730					 struct iwl_rx_cmd_buffer *rxb);
   1731void iwl_mvm_rx_umac_scan_iter_complete_notif(struct iwl_mvm *mvm,
   1732					      struct iwl_rx_cmd_buffer *rxb);
   1733
   1734/* MVM debugfs */
   1735#ifdef CONFIG_IWLWIFI_DEBUGFS
   1736void iwl_mvm_dbgfs_register(struct iwl_mvm *mvm);
   1737void iwl_mvm_vif_dbgfs_register(struct iwl_mvm *mvm, struct ieee80211_vif *vif);
   1738void iwl_mvm_vif_dbgfs_clean(struct iwl_mvm *mvm, struct ieee80211_vif *vif);
   1739#else
   1740static inline void iwl_mvm_dbgfs_register(struct iwl_mvm *mvm)
   1741{
   1742}
   1743static inline void
   1744iwl_mvm_vif_dbgfs_register(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
   1745{
   1746}
   1747static inline void
   1748iwl_mvm_vif_dbgfs_clean(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
   1749{
   1750}
   1751#endif /* CONFIG_IWLWIFI_DEBUGFS */
   1752
   1753/* rate scaling */
   1754int iwl_mvm_send_lq_cmd(struct iwl_mvm *mvm, struct iwl_lq_cmd *lq);
   1755void iwl_mvm_update_frame_stats(struct iwl_mvm *mvm, u32 rate, bool agg);
   1756int rs_pretty_print_rate_v1(char *buf, int bufsz, const u32 rate);
   1757void rs_update_last_rssi(struct iwl_mvm *mvm,
   1758			 struct iwl_mvm_sta *mvmsta,
   1759			 struct ieee80211_rx_status *rx_status);
   1760
   1761/* power management */
   1762int iwl_mvm_power_update_device(struct iwl_mvm *mvm);
   1763int iwl_mvm_power_update_mac(struct iwl_mvm *mvm);
   1764int iwl_mvm_power_update_ps(struct iwl_mvm *mvm);
   1765int iwl_mvm_power_mac_dbgfs_read(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
   1766				 char *buf, int bufsz);
   1767
   1768void iwl_mvm_power_vif_assoc(struct iwl_mvm *mvm, struct ieee80211_vif *vif);
   1769void iwl_mvm_power_uapsd_misbehaving_ap_notif(struct iwl_mvm *mvm,
   1770					      struct iwl_rx_cmd_buffer *rxb);
   1771
   1772#ifdef CONFIG_IWLWIFI_LEDS
   1773int iwl_mvm_leds_init(struct iwl_mvm *mvm);
   1774void iwl_mvm_leds_exit(struct iwl_mvm *mvm);
   1775void iwl_mvm_leds_sync(struct iwl_mvm *mvm);
   1776#else
   1777static inline int iwl_mvm_leds_init(struct iwl_mvm *mvm)
   1778{
   1779	return 0;
   1780}
   1781static inline void iwl_mvm_leds_exit(struct iwl_mvm *mvm)
   1782{
   1783}
   1784static inline void iwl_mvm_leds_sync(struct iwl_mvm *mvm)
   1785{
   1786}
   1787#endif
   1788
   1789/* D3 (WoWLAN, NetDetect) */
   1790int iwl_mvm_suspend(struct ieee80211_hw *hw, struct cfg80211_wowlan *wowlan);
   1791int iwl_mvm_resume(struct ieee80211_hw *hw);
   1792void iwl_mvm_set_wakeup(struct ieee80211_hw *hw, bool enabled);
   1793void iwl_mvm_set_rekey_data(struct ieee80211_hw *hw,
   1794			    struct ieee80211_vif *vif,
   1795			    struct cfg80211_gtk_rekey_data *data);
   1796void iwl_mvm_ipv6_addr_change(struct ieee80211_hw *hw,
   1797			      struct ieee80211_vif *vif,
   1798			      struct inet6_dev *idev);
   1799void iwl_mvm_set_default_unicast_key(struct ieee80211_hw *hw,
   1800				     struct ieee80211_vif *vif, int idx);
   1801extern const struct file_operations iwl_dbgfs_d3_test_ops;
   1802#ifdef CONFIG_PM
   1803void iwl_mvm_set_last_nonqos_seq(struct iwl_mvm *mvm,
   1804				 struct ieee80211_vif *vif);
   1805#else
   1806static inline void
   1807iwl_mvm_set_last_nonqos_seq(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
   1808{
   1809}
   1810#endif
   1811void iwl_mvm_set_wowlan_qos_seq(struct iwl_mvm_sta *mvm_ap_sta,
   1812				struct iwl_wowlan_config_cmd *cmd);
   1813int iwl_mvm_send_proto_offload(struct iwl_mvm *mvm,
   1814			       struct ieee80211_vif *vif,
   1815			       bool disable_offloading,
   1816			       bool offload_ns,
   1817			       u32 cmd_flags);
   1818
   1819/* BT Coex */
   1820int iwl_mvm_send_bt_init_conf(struct iwl_mvm *mvm);
   1821void iwl_mvm_rx_bt_coex_notif(struct iwl_mvm *mvm,
   1822			      struct iwl_rx_cmd_buffer *rxb);
   1823void iwl_mvm_bt_rssi_event(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
   1824			   enum ieee80211_rssi_event_data);
   1825void iwl_mvm_bt_coex_vif_change(struct iwl_mvm *mvm);
   1826u16 iwl_mvm_coex_agg_time_limit(struct iwl_mvm *mvm,
   1827				struct ieee80211_sta *sta);
   1828bool iwl_mvm_bt_coex_is_mimo_allowed(struct iwl_mvm *mvm,
   1829				     struct ieee80211_sta *sta);
   1830bool iwl_mvm_bt_coex_is_ant_avail(struct iwl_mvm *mvm, u8 ant);
   1831bool iwl_mvm_bt_coex_is_shared_ant_avail(struct iwl_mvm *mvm);
   1832bool iwl_mvm_bt_coex_is_tpc_allowed(struct iwl_mvm *mvm,
   1833				    enum nl80211_band band);
   1834u8 iwl_mvm_bt_coex_get_single_ant_msk(struct iwl_mvm *mvm, u8 enabled_ants);
   1835u8 iwl_mvm_bt_coex_tx_prio(struct iwl_mvm *mvm, struct ieee80211_hdr *hdr,
   1836			   struct ieee80211_tx_info *info, u8 ac);
   1837
   1838/* beacon filtering */
   1839#ifdef CONFIG_IWLWIFI_DEBUGFS
   1840void
   1841iwl_mvm_beacon_filter_debugfs_parameters(struct ieee80211_vif *vif,
   1842					 struct iwl_beacon_filter_cmd *cmd);
   1843#else
   1844static inline void
   1845iwl_mvm_beacon_filter_debugfs_parameters(struct ieee80211_vif *vif,
   1846					 struct iwl_beacon_filter_cmd *cmd)
   1847{}
   1848#endif
   1849int iwl_mvm_enable_beacon_filter(struct iwl_mvm *mvm,
   1850				 struct ieee80211_vif *vif,
   1851				 u32 flags);
   1852int iwl_mvm_disable_beacon_filter(struct iwl_mvm *mvm,
   1853				  struct ieee80211_vif *vif,
   1854				  u32 flags);
   1855/* SMPS */
   1856void iwl_mvm_update_smps(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
   1857				enum iwl_mvm_smps_type_request req_type,
   1858				enum ieee80211_smps_mode smps_request);
   1859bool iwl_mvm_rx_diversity_allowed(struct iwl_mvm *mvm,
   1860				  struct iwl_mvm_phy_ctxt *ctxt);
   1861void iwl_mvm_apply_fw_smps_request(struct ieee80211_vif *vif);
   1862
   1863/* Low latency */
   1864int iwl_mvm_update_low_latency(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
   1865			      bool low_latency,
   1866			      enum iwl_mvm_low_latency_cause cause);
   1867/* get SystemLowLatencyMode - only needed for beacon threshold? */
   1868bool iwl_mvm_low_latency(struct iwl_mvm *mvm);
   1869bool iwl_mvm_low_latency_band(struct iwl_mvm *mvm, enum nl80211_band band);
   1870void iwl_mvm_send_low_latency_cmd(struct iwl_mvm *mvm, bool low_latency,
   1871				  u16 mac_id);
   1872
   1873/* get VMACLowLatencyMode */
   1874static inline bool iwl_mvm_vif_low_latency(struct iwl_mvm_vif *mvmvif)
   1875{
   1876	/*
   1877	 * should this consider associated/active/... state?
   1878	 *
   1879	 * Normally low-latency should only be active on interfaces
   1880	 * that are active, but at least with debugfs it can also be
   1881	 * enabled on interfaces that aren't active. However, when
   1882	 * interface aren't active then they aren't added into the
   1883	 * binding, so this has no real impact. For now, just return
   1884	 * the current desired low-latency state.
   1885	 */
   1886	return mvmvif->low_latency_actual;
   1887}
   1888
   1889static inline
   1890void iwl_mvm_vif_set_low_latency(struct iwl_mvm_vif *mvmvif, bool set,
   1891				 enum iwl_mvm_low_latency_cause cause)
   1892{
   1893	u8 new_state;
   1894
   1895	if (set)
   1896		mvmvif->low_latency |= cause;
   1897	else
   1898		mvmvif->low_latency &= ~cause;
   1899
   1900	/*
   1901	 * if LOW_LATENCY_DEBUGFS_FORCE_ENABLE is enabled no changes are
   1902	 * allowed to actual mode.
   1903	 */
   1904	if (mvmvif->low_latency & LOW_LATENCY_DEBUGFS_FORCE_ENABLE &&
   1905	    cause != LOW_LATENCY_DEBUGFS_FORCE_ENABLE)
   1906		return;
   1907
   1908	if (cause == LOW_LATENCY_DEBUGFS_FORCE_ENABLE && set)
   1909		/*
   1910		 * We enter force state
   1911		 */
   1912		new_state = !!(mvmvif->low_latency &
   1913			       LOW_LATENCY_DEBUGFS_FORCE);
   1914	else
   1915		/*
   1916		 * Check if any other one set low latency
   1917		 */
   1918		new_state = !!(mvmvif->low_latency &
   1919				  ~(LOW_LATENCY_DEBUGFS_FORCE_ENABLE |
   1920				    LOW_LATENCY_DEBUGFS_FORCE));
   1921
   1922	mvmvif->low_latency_actual = new_state;
   1923}
   1924
   1925/* Return a bitmask with all the hw supported queues, except for the
   1926 * command queue, which can't be flushed.
   1927 */
   1928static inline u32 iwl_mvm_flushable_queues(struct iwl_mvm *mvm)
   1929{
   1930	return ((BIT(mvm->trans->trans_cfg->base_params->num_of_queues) - 1) &
   1931		~BIT(IWL_MVM_DQA_CMD_QUEUE));
   1932}
   1933
   1934void iwl_mvm_stop_device(struct iwl_mvm *mvm);
   1935
   1936/* Thermal management and CT-kill */
   1937void iwl_mvm_tt_tx_backoff(struct iwl_mvm *mvm, u32 backoff);
   1938void iwl_mvm_temp_notif(struct iwl_mvm *mvm,
   1939			struct iwl_rx_cmd_buffer *rxb);
   1940void iwl_mvm_tt_handler(struct iwl_mvm *mvm);
   1941void iwl_mvm_thermal_initialize(struct iwl_mvm *mvm, u32 min_backoff);
   1942void iwl_mvm_thermal_exit(struct iwl_mvm *mvm);
   1943void iwl_mvm_set_hw_ctkill_state(struct iwl_mvm *mvm, bool state);
   1944int iwl_mvm_get_temp(struct iwl_mvm *mvm, s32 *temp);
   1945void iwl_mvm_ct_kill_notif(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb);
   1946void iwl_mvm_enter_ctkill(struct iwl_mvm *mvm);
   1947int iwl_mvm_send_temp_report_ths_cmd(struct iwl_mvm *mvm);
   1948int iwl_mvm_ctdp_command(struct iwl_mvm *mvm, u32 op, u32 budget);
   1949
   1950#if IS_ENABLED(CONFIG_IWLMEI)
   1951
   1952/* vendor commands */
   1953void iwl_mvm_vendor_cmds_register(struct iwl_mvm *mvm);
   1954
   1955#else
   1956
   1957static inline void iwl_mvm_vendor_cmds_register(struct iwl_mvm *mvm) {}
   1958
   1959#endif
   1960
   1961/* Location Aware Regulatory */
   1962struct iwl_mcc_update_resp *
   1963iwl_mvm_update_mcc(struct iwl_mvm *mvm, const char *alpha2,
   1964		   enum iwl_mcc_source src_id);
   1965int iwl_mvm_init_mcc(struct iwl_mvm *mvm);
   1966void iwl_mvm_rx_chub_update_mcc(struct iwl_mvm *mvm,
   1967				struct iwl_rx_cmd_buffer *rxb);
   1968struct ieee80211_regdomain *iwl_mvm_get_regdomain(struct wiphy *wiphy,
   1969						  const char *alpha2,
   1970						  enum iwl_mcc_source src_id,
   1971						  bool *changed);
   1972struct ieee80211_regdomain *iwl_mvm_get_current_regdomain(struct iwl_mvm *mvm,
   1973							  bool *changed);
   1974int iwl_mvm_init_fw_regd(struct iwl_mvm *mvm);
   1975void iwl_mvm_update_changed_regdom(struct iwl_mvm *mvm);
   1976
   1977/* smart fifo */
   1978int iwl_mvm_sf_update(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
   1979		      bool added_vif);
   1980
   1981/* FTM responder */
   1982int iwl_mvm_ftm_start_responder(struct iwl_mvm *mvm, struct ieee80211_vif *vif);
   1983void iwl_mvm_ftm_restart_responder(struct iwl_mvm *mvm,
   1984				   struct ieee80211_vif *vif);
   1985void iwl_mvm_ftm_responder_stats(struct iwl_mvm *mvm,
   1986				 struct iwl_rx_cmd_buffer *rxb);
   1987int iwl_mvm_ftm_resp_remove_pasn_sta(struct iwl_mvm *mvm,
   1988				     struct ieee80211_vif *vif, u8 *addr);
   1989int iwl_mvm_ftm_respoder_add_pasn_sta(struct iwl_mvm *mvm,
   1990				      struct ieee80211_vif *vif,
   1991				      u8 *addr, u32 cipher, u8 *tk, u32 tk_len,
   1992				      u8 *hltk, u32 hltk_len);
   1993void iwl_mvm_ftm_responder_clear(struct iwl_mvm *mvm,
   1994				 struct ieee80211_vif *vif);
   1995
   1996/* FTM initiator */
   1997void iwl_mvm_ftm_restart(struct iwl_mvm *mvm);
   1998void iwl_mvm_ftm_range_resp(struct iwl_mvm *mvm,
   1999			    struct iwl_rx_cmd_buffer *rxb);
   2000void iwl_mvm_ftm_lc_notif(struct iwl_mvm *mvm,
   2001			  struct iwl_rx_cmd_buffer *rxb);
   2002int iwl_mvm_ftm_start(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
   2003		      struct cfg80211_pmsr_request *request);
   2004void iwl_mvm_ftm_abort(struct iwl_mvm *mvm, struct cfg80211_pmsr_request *req);
   2005void iwl_mvm_ftm_initiator_smooth_config(struct iwl_mvm *mvm);
   2006void iwl_mvm_ftm_initiator_smooth_stop(struct iwl_mvm *mvm);
   2007int iwl_mvm_ftm_add_pasn_sta(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
   2008			     u8 *addr, u32 cipher, u8 *tk, u32 tk_len,
   2009			     u8 *hltk, u32 hltk_len);
   2010void iwl_mvm_ftm_remove_pasn_sta(struct iwl_mvm *mvm, u8 *addr);
   2011
   2012/* TDLS */
   2013
   2014/*
   2015 * We use TID 4 (VI) as a FW-used-only TID when TDLS connections are present.
   2016 * This TID is marked as used vs the AP and all connected TDLS peers.
   2017 */
   2018#define IWL_MVM_TDLS_FW_TID 4
   2019
   2020int iwl_mvm_tdls_sta_count(struct iwl_mvm *mvm, struct ieee80211_vif *vif);
   2021void iwl_mvm_teardown_tdls_peers(struct iwl_mvm *mvm);
   2022void iwl_mvm_recalc_tdls_state(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
   2023			       bool sta_added);
   2024void iwl_mvm_mac_mgd_protect_tdls_discover(struct ieee80211_hw *hw,
   2025					   struct ieee80211_vif *vif);
   2026int iwl_mvm_tdls_channel_switch(struct ieee80211_hw *hw,
   2027				struct ieee80211_vif *vif,
   2028				struct ieee80211_sta *sta, u8 oper_class,
   2029				struct cfg80211_chan_def *chandef,
   2030				struct sk_buff *tmpl_skb, u32 ch_sw_tm_ie);
   2031void iwl_mvm_tdls_recv_channel_switch(struct ieee80211_hw *hw,
   2032				      struct ieee80211_vif *vif,
   2033				      struct ieee80211_tdls_ch_sw_params *params);
   2034void iwl_mvm_tdls_cancel_channel_switch(struct ieee80211_hw *hw,
   2035					struct ieee80211_vif *vif,
   2036					struct ieee80211_sta *sta);
   2037void iwl_mvm_rx_tdls_notif(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb);
   2038void iwl_mvm_tdls_ch_switch_work(struct work_struct *work);
   2039
   2040void iwl_mvm_sync_rx_queues_internal(struct iwl_mvm *mvm,
   2041				     enum iwl_mvm_rxq_notif_type type,
   2042				     bool sync,
   2043				     const void *data, u32 size);
   2044void iwl_mvm_reorder_timer_expired(struct timer_list *t);
   2045struct ieee80211_vif *iwl_mvm_get_bss_vif(struct iwl_mvm *mvm);
   2046struct ieee80211_vif *iwl_mvm_get_vif_by_macid(struct iwl_mvm *mvm, u32 macid);
   2047bool iwl_mvm_is_vif_assoc(struct iwl_mvm *mvm);
   2048
   2049#define MVM_TCM_PERIOD_MSEC 500
   2050#define MVM_TCM_PERIOD (HZ * MVM_TCM_PERIOD_MSEC / 1000)
   2051#define MVM_LL_PERIOD (10 * HZ)
   2052void iwl_mvm_tcm_work(struct work_struct *work);
   2053void iwl_mvm_recalc_tcm(struct iwl_mvm *mvm);
   2054void iwl_mvm_pause_tcm(struct iwl_mvm *mvm, bool with_cancel);
   2055void iwl_mvm_resume_tcm(struct iwl_mvm *mvm);
   2056void iwl_mvm_tcm_add_vif(struct iwl_mvm *mvm, struct ieee80211_vif *vif);
   2057void iwl_mvm_tcm_rm_vif(struct iwl_mvm *mvm, struct ieee80211_vif *vif);
   2058u8 iwl_mvm_tcm_load_percentage(u32 airtime, u32 elapsed);
   2059
   2060void iwl_mvm_nic_restart(struct iwl_mvm *mvm, bool fw_error);
   2061unsigned int iwl_mvm_get_wd_timeout(struct iwl_mvm *mvm,
   2062				    struct ieee80211_vif *vif,
   2063				    bool tdls, bool cmd_q);
   2064void iwl_mvm_connection_loss(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
   2065			     const char *errmsg);
   2066void iwl_mvm_event_frame_timeout_callback(struct iwl_mvm *mvm,
   2067					  struct ieee80211_vif *vif,
   2068					  const struct ieee80211_sta *sta,
   2069					  u16 tid);
   2070
   2071int iwl_mvm_sar_select_profile(struct iwl_mvm *mvm, int prof_a, int prof_b);
   2072int iwl_mvm_get_sar_geo_profile(struct iwl_mvm *mvm);
   2073int iwl_mvm_ppag_send_cmd(struct iwl_mvm *mvm);
   2074void iwl_mvm_get_acpi_tables(struct iwl_mvm *mvm);
   2075#ifdef CONFIG_IWLWIFI_DEBUGFS
   2076void iwl_mvm_sta_add_debugfs(struct ieee80211_hw *hw,
   2077			     struct ieee80211_vif *vif,
   2078			     struct ieee80211_sta *sta,
   2079			     struct dentry *dir);
   2080#endif
   2081
   2082int iwl_rfi_send_config_cmd(struct iwl_mvm *mvm,
   2083			    struct iwl_rfi_lut_entry *rfi_table);
   2084struct iwl_rfi_freq_table_resp_cmd *iwl_rfi_get_freq_table(struct iwl_mvm *mvm);
   2085void iwl_rfi_deactivate_notif_handler(struct iwl_mvm *mvm,
   2086				      struct iwl_rx_cmd_buffer *rxb);
   2087
   2088static inline u8 iwl_mvm_phy_band_from_nl80211(enum nl80211_band band)
   2089{
   2090	switch (band) {
   2091	case NL80211_BAND_2GHZ:
   2092		return PHY_BAND_24;
   2093	case NL80211_BAND_5GHZ:
   2094		return PHY_BAND_5;
   2095	case NL80211_BAND_6GHZ:
   2096		return PHY_BAND_6;
   2097	default:
   2098		WARN_ONCE(1, "Unsupported band (%u)\n", band);
   2099		return PHY_BAND_5;
   2100	}
   2101}
   2102
   2103/* Channel info utils */
   2104static inline bool iwl_mvm_has_ultra_hb_channel(struct iwl_mvm *mvm)
   2105{
   2106	return fw_has_capa(&mvm->fw->ucode_capa,
   2107			   IWL_UCODE_TLV_CAPA_ULTRA_HB_CHANNELS);
   2108}
   2109
   2110static inline void *iwl_mvm_chan_info_cmd_tail(struct iwl_mvm *mvm,
   2111					       struct iwl_fw_channel_info *ci)
   2112{
   2113	return (u8 *)ci + (iwl_mvm_has_ultra_hb_channel(mvm) ?
   2114			   sizeof(struct iwl_fw_channel_info) :
   2115			   sizeof(struct iwl_fw_channel_info_v1));
   2116}
   2117
   2118static inline size_t iwl_mvm_chan_info_padding(struct iwl_mvm *mvm)
   2119{
   2120	return iwl_mvm_has_ultra_hb_channel(mvm) ? 0 :
   2121		sizeof(struct iwl_fw_channel_info) -
   2122		sizeof(struct iwl_fw_channel_info_v1);
   2123}
   2124
   2125static inline void iwl_mvm_set_chan_info(struct iwl_mvm *mvm,
   2126					 struct iwl_fw_channel_info *ci,
   2127					 u32 chan, u8 band, u8 width,
   2128					 u8 ctrl_pos)
   2129{
   2130	if (iwl_mvm_has_ultra_hb_channel(mvm)) {
   2131		ci->channel = cpu_to_le32(chan);
   2132		ci->band = band;
   2133		ci->width = width;
   2134		ci->ctrl_pos = ctrl_pos;
   2135	} else {
   2136		struct iwl_fw_channel_info_v1 *ci_v1 =
   2137					(struct iwl_fw_channel_info_v1 *)ci;
   2138
   2139		ci_v1->channel = chan;
   2140		ci_v1->band = band;
   2141		ci_v1->width = width;
   2142		ci_v1->ctrl_pos = ctrl_pos;
   2143	}
   2144}
   2145
   2146static inline void
   2147iwl_mvm_set_chan_info_chandef(struct iwl_mvm *mvm,
   2148			      struct iwl_fw_channel_info *ci,
   2149			      struct cfg80211_chan_def *chandef)
   2150{
   2151	enum nl80211_band band = chandef->chan->band;
   2152
   2153	iwl_mvm_set_chan_info(mvm, ci, chandef->chan->hw_value,
   2154			      iwl_mvm_phy_band_from_nl80211(band),
   2155			      iwl_mvm_get_channel_width(chandef),
   2156			      iwl_mvm_get_ctrl_pos(chandef));
   2157}
   2158
   2159static inline int iwl_umac_scan_get_max_profiles(const struct iwl_fw *fw)
   2160{
   2161	u8 ver = iwl_fw_lookup_cmd_ver(fw, SCAN_OFFLOAD_UPDATE_PROFILES_CMD,
   2162				       IWL_FW_CMD_VER_UNKNOWN);
   2163	return (ver == IWL_FW_CMD_VER_UNKNOWN || ver < 3) ?
   2164		IWL_SCAN_MAX_PROFILES : IWL_SCAN_MAX_PROFILES_V2;
   2165}
   2166
   2167static inline
   2168enum iwl_location_cipher iwl_mvm_cipher_to_location_cipher(u32 cipher)
   2169{
   2170	switch (cipher) {
   2171	case WLAN_CIPHER_SUITE_CCMP:
   2172		return IWL_LOCATION_CIPHER_CCMP_128;
   2173	case WLAN_CIPHER_SUITE_GCMP:
   2174		return IWL_LOCATION_CIPHER_GCMP_128;
   2175	case WLAN_CIPHER_SUITE_GCMP_256:
   2176		return IWL_LOCATION_CIPHER_GCMP_256;
   2177	default:
   2178		return IWL_LOCATION_CIPHER_INVALID;
   2179	}
   2180}
   2181
   2182struct iwl_mvm_csme_conn_info *iwl_mvm_get_csme_conn_info(struct iwl_mvm *mvm);
   2183static inline int iwl_mvm_mei_get_ownership(struct iwl_mvm *mvm)
   2184{
   2185	if (mvm->mei_registered)
   2186		return iwl_mei_get_ownership();
   2187	return 0;
   2188}
   2189
   2190static inline void iwl_mvm_mei_tx_copy_to_csme(struct iwl_mvm *mvm,
   2191					       struct sk_buff *skb,
   2192					       unsigned int ivlen)
   2193{
   2194	if (mvm->mei_registered)
   2195		iwl_mei_tx_copy_to_csme(skb, ivlen);
   2196}
   2197
   2198static inline void iwl_mvm_mei_host_disassociated(struct iwl_mvm *mvm)
   2199{
   2200	if (mvm->mei_registered)
   2201		iwl_mei_host_disassociated();
   2202}
   2203
   2204static inline void iwl_mvm_mei_device_down(struct iwl_mvm *mvm)
   2205{
   2206	if (mvm->mei_registered)
   2207		iwl_mei_device_down();
   2208}
   2209
   2210static inline void iwl_mvm_mei_set_sw_rfkill_state(struct iwl_mvm *mvm)
   2211{
   2212	bool sw_rfkill =
   2213		mvm->hw_registered ? rfkill_soft_blocked(mvm->hw->wiphy->rfkill) : false;
   2214
   2215	if (mvm->mei_registered)
   2216		iwl_mei_set_rfkill_state(iwl_mvm_is_radio_killed(mvm),
   2217					 sw_rfkill);
   2218}
   2219
   2220void iwl_mvm_send_roaming_forbidden_event(struct iwl_mvm *mvm,
   2221					  struct ieee80211_vif *vif,
   2222					  bool forbidden);
   2223
   2224#endif /* __IWL_MVM_H__ */