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