xref: /linux/drivers/net/wireless/intel/iwlwifi/fw/api/scan.h (revision c532de5a67a70f8533d495f8f2aaa9a0491c3ad0)
1 /* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
2 /*
3  * Copyright (C) 2012-2014, 2018-2024 Intel Corporation
4  * Copyright (C) 2013-2015 Intel Mobile Communications GmbH
5  * Copyright (C) 2016-2017 Intel Deutschland GmbH
6  */
7 #ifndef __iwl_fw_api_scan_h__
8 #define __iwl_fw_api_scan_h__
9 
10 /* Scan Commands, Responses, Notifications */
11 
12 /**
13  * enum iwl_scan_subcmd_ids - scan commands
14  */
15 enum iwl_scan_subcmd_ids {
16 	/**
17 	 * @CHANNEL_SURVEY_NOTIF: &struct iwl_umac_scan_channel_survey_notif
18 	 */
19 	CHANNEL_SURVEY_NOTIF = 0xFB,
20 	/**
21 	 * @OFFLOAD_MATCH_INFO_NOTIF: &struct iwl_scan_offload_match_info
22 	 */
23 	OFFLOAD_MATCH_INFO_NOTIF = 0xFC,
24 };
25 
26 /* Max number of IEs for direct SSID scans in a command */
27 #define PROBE_OPTION_MAX		20
28 
29 #define SCAN_SHORT_SSID_MAX_SIZE        8
30 #define SCAN_BSSID_MAX_SIZE             16
31 
32 /**
33  * struct iwl_ssid_ie - directed scan network information element
34  *
35  * Up to 20 of these may appear in REPLY_SCAN_CMD,
36  * selected by "type" bit field in struct iwl_scan_channel;
37  * each channel may select different ssids from among the 20 entries.
38  * SSID IEs get transmitted in reverse order of entry.
39  *
40  * @id: element ID
41  * @len: element length
42  * @ssid: element (SSID) data
43  */
44 struct iwl_ssid_ie {
45 	u8 id;
46 	u8 len;
47 	u8 ssid[IEEE80211_MAX_SSID_LEN];
48 } __packed; /* SCAN_DIRECT_SSID_IE_API_S_VER_1 */
49 
50 /* scan offload */
51 #define IWL_SCAN_MAX_BLACKLIST_LEN	64
52 #define IWL_SCAN_SHORT_BLACKLIST_LEN	16
53 #define IWL_SCAN_MAX_PROFILES		11
54 #define IWL_SCAN_MAX_PROFILES_V2	8
55 #define SCAN_OFFLOAD_PROBE_REQ_SIZE	512
56 #define SCAN_NUM_BAND_PROBE_DATA_V_1	2
57 #define SCAN_NUM_BAND_PROBE_DATA_V_2	3
58 
59 /* Default watchdog (in MS) for scheduled scan iteration */
60 #define IWL_SCHED_SCAN_WATCHDOG cpu_to_le16(15000)
61 
62 #define IWL_GOOD_CRC_TH_DEFAULT cpu_to_le16(1)
63 #define CAN_ABORT_STATUS 1
64 
65 #define IWL_FULL_SCAN_MULTIPLIER 5
66 #define IWL_FAST_SCHED_SCAN_ITERATIONS 3
67 #define IWL_MAX_SCHED_SCAN_PLANS 2
68 
69 #define IWL_MAX_NUM_NOISE_RESULTS 22
70 
71 enum scan_framework_client {
72 	SCAN_CLIENT_SCHED_SCAN		= BIT(0),
73 	SCAN_CLIENT_NETDETECT		= BIT(1),
74 	SCAN_CLIENT_ASSET_TRACKING	= BIT(2),
75 };
76 
77 /**
78  * struct iwl_scan_offload_blocklist - SCAN_OFFLOAD_BLACKLIST_S
79  * @ssid:		MAC address to filter out
80  * @reported_rssi:	AP rssi reported to the host
81  * @client_bitmap: clients ignore this entry  - enum scan_framework_client
82  */
83 struct iwl_scan_offload_blocklist {
84 	u8 ssid[ETH_ALEN];
85 	u8 reported_rssi;
86 	u8 client_bitmap;
87 } __packed;
88 
89 enum iwl_scan_offload_network_type {
90 	IWL_NETWORK_TYPE_BSS	= 1,
91 	IWL_NETWORK_TYPE_IBSS	= 2,
92 	IWL_NETWORK_TYPE_ANY	= 3,
93 };
94 
95 enum iwl_scan_offload_band_selection {
96 	IWL_SCAN_OFFLOAD_SELECT_2_4	= 0x4,
97 	IWL_SCAN_OFFLOAD_SELECT_5_2	= 0x8,
98 	IWL_SCAN_OFFLOAD_SELECT_ANY	= 0xc,
99 };
100 
101 enum iwl_scan_offload_auth_alg {
102 	IWL_AUTH_ALGO_UNSUPPORTED  = 0x00,
103 	IWL_AUTH_ALGO_NONE         = 0x01,
104 	IWL_AUTH_ALGO_PSK          = 0x02,
105 	IWL_AUTH_ALGO_8021X        = 0x04,
106 	IWL_AUTH_ALGO_SAE          = 0x08,
107 	IWL_AUTH_ALGO_8021X_SHA384 = 0x10,
108 	IWL_AUTH_ALGO_OWE          = 0x20,
109 };
110 
111 /**
112  * struct iwl_scan_offload_profile - SCAN_OFFLOAD_PROFILE_S
113  * @ssid_index:		index to ssid list in fixed part
114  * @unicast_cipher:	encryption algorithm to match - bitmap
115  * @auth_alg:		authentication algorithm to match - bitmap
116  * @network_type:	enum iwl_scan_offload_network_type
117  * @band_selection:	enum iwl_scan_offload_band_selection
118  * @client_bitmap:	clients waiting for match - enum scan_framework_client
119  * @reserved:		reserved
120  */
121 struct iwl_scan_offload_profile {
122 	u8 ssid_index;
123 	u8 unicast_cipher;
124 	u8 auth_alg;
125 	u8 network_type;
126 	u8 band_selection;
127 	u8 client_bitmap;
128 	u8 reserved[2];
129 } __packed;
130 
131 /**
132  * struct iwl_scan_offload_profile_cfg_data
133  * @blocklist_len:	length of blocklist
134  * @num_profiles:	num of profiles in the list
135  * @match_notify:	clients waiting for match found notification
136  * @pass_match:		clients waiting for the results
137  * @active_clients:	active clients bitmap - enum scan_framework_client
138  * @any_beacon_notify:	clients waiting for match notification without match
139  * @reserved:		reserved
140  */
141 struct iwl_scan_offload_profile_cfg_data {
142 	u8 blocklist_len;
143 	u8 num_profiles;
144 	u8 match_notify;
145 	u8 pass_match;
146 	u8 active_clients;
147 	u8 any_beacon_notify;
148 	u8 reserved[2];
149 } __packed;
150 
151 /**
152  * struct iwl_scan_offload_profile_cfg_v1 - scan offload profile config
153  * @profiles:	profiles to search for match
154  * @data:	the rest of the data for profile_cfg
155  */
156 struct iwl_scan_offload_profile_cfg_v1 {
157 	struct iwl_scan_offload_profile profiles[IWL_SCAN_MAX_PROFILES];
158 	struct iwl_scan_offload_profile_cfg_data data;
159 } __packed; /* SCAN_OFFLOAD_PROFILES_CFG_API_S_VER_1-2*/
160 
161 /**
162  * struct iwl_scan_offload_profile_cfg
163  * @profiles:	profiles to search for match
164  * @data:	the rest of the data for profile_cfg
165  */
166 struct iwl_scan_offload_profile_cfg {
167 	struct iwl_scan_offload_profile profiles[IWL_SCAN_MAX_PROFILES_V2];
168 	struct iwl_scan_offload_profile_cfg_data data;
169 } __packed; /* SCAN_OFFLOAD_PROFILES_CFG_API_S_VER_3*/
170 
171 /**
172  * struct iwl_scan_schedule_lmac - schedule of scan offload
173  * @delay:		delay between iterations, in seconds.
174  * @iterations:		num of scan iterations
175  * @full_scan_mul:	number of partial scans before each full scan
176  */
177 struct iwl_scan_schedule_lmac {
178 	__le16 delay;
179 	u8 iterations;
180 	u8 full_scan_mul;
181 } __packed; /* SCAN_SCHEDULE_API_S */
182 
183 enum iwl_scan_offload_complete_status {
184 	IWL_SCAN_OFFLOAD_COMPLETED	= 1,
185 	IWL_SCAN_OFFLOAD_ABORTED	= 2,
186 };
187 
188 enum iwl_scan_ebs_status {
189 	IWL_SCAN_EBS_SUCCESS,
190 	IWL_SCAN_EBS_FAILED,
191 	IWL_SCAN_EBS_CHAN_NOT_FOUND,
192 	IWL_SCAN_EBS_INACTIVE,
193 };
194 
195 /**
196  * struct iwl_scan_req_tx_cmd - SCAN_REQ_TX_CMD_API_S
197  * @tx_flags: combination of TX_CMD_FLG_*
198  * @rate_n_flags: rate for *all* Tx attempts, if TX_CMD_FLG_STA_RATE_MSK is
199  *	cleared. Combination of RATE_MCS_*
200  * @sta_id: index of destination station in FW station table
201  * @reserved: for alignment and future use
202  */
203 struct iwl_scan_req_tx_cmd {
204 	__le32 tx_flags;
205 	__le32 rate_n_flags;
206 	u8 sta_id;
207 	u8 reserved[3];
208 } __packed;
209 
210 enum iwl_scan_channel_flags_lmac {
211 	IWL_UNIFIED_SCAN_CHANNEL_FULL		= BIT(27),
212 	IWL_UNIFIED_SCAN_CHANNEL_PARTIAL	= BIT(28),
213 };
214 
215 /**
216  * struct iwl_scan_channel_cfg_lmac - SCAN_CHANNEL_CFG_S_VER2
217  * @flags:		bits 1-20: directed scan to i'th ssid
218  *			other bits &enum iwl_scan_channel_flags_lmac
219  * @channel_num:	channel number 1-13 etc
220  * @iter_count:		scan iteration on this channel
221  * @iter_interval:	interval in seconds between iterations on one channel
222  */
223 struct iwl_scan_channel_cfg_lmac {
224 	__le32 flags;
225 	__le16 channel_num;
226 	__le16 iter_count;
227 	__le32 iter_interval;
228 } __packed;
229 
230 /**
231  * struct iwl_scan_probe_segment - PROBE_SEGMENT_API_S_VER_1
232  * @offset: offset in the data block
233  * @len: length of the segment
234  */
235 struct iwl_scan_probe_segment {
236 	__le16 offset;
237 	__le16 len;
238 } __packed;
239 
240 /**
241  * struct iwl_scan_probe_req_v1 - PROBE_REQUEST_FRAME_API_S_VER_2
242  * @mac_header: first (and common) part of the probe
243  * @band_data: band specific data
244  * @common_data: last (and common) part of the probe
245  * @buf: raw data block
246  */
247 struct iwl_scan_probe_req_v1 {
248 	struct iwl_scan_probe_segment mac_header;
249 	struct iwl_scan_probe_segment band_data[SCAN_NUM_BAND_PROBE_DATA_V_1];
250 	struct iwl_scan_probe_segment common_data;
251 	u8 buf[SCAN_OFFLOAD_PROBE_REQ_SIZE];
252 } __packed;
253 
254 /**
255  * struct iwl_scan_probe_req - PROBE_REQUEST_FRAME_API_S_VER_v2
256  * @mac_header: first (and common) part of the probe
257  * @band_data: band specific data
258  * @common_data: last (and common) part of the probe
259  * @buf: raw data block
260  */
261 struct iwl_scan_probe_req {
262 	struct iwl_scan_probe_segment mac_header;
263 	struct iwl_scan_probe_segment band_data[SCAN_NUM_BAND_PROBE_DATA_V_2];
264 	struct iwl_scan_probe_segment common_data;
265 	u8 buf[SCAN_OFFLOAD_PROBE_REQ_SIZE];
266 } __packed;
267 
268 enum iwl_scan_channel_flags {
269 	IWL_SCAN_CHANNEL_FLAG_EBS		= BIT(0),
270 	IWL_SCAN_CHANNEL_FLAG_EBS_ACCURATE	= BIT(1),
271 	IWL_SCAN_CHANNEL_FLAG_CACHE_ADD		= BIT(2),
272 	IWL_SCAN_CHANNEL_FLAG_EBS_FRAG		= BIT(3),
273 	IWL_SCAN_CHANNEL_FLAG_FORCE_EBS         = BIT(4),
274 	IWL_SCAN_CHANNEL_FLAG_ENABLE_CHAN_ORDER = BIT(5),
275 	IWL_SCAN_CHANNEL_FLAG_6G_PSC_NO_FILTER  = BIT(6),
276 };
277 
278 /**
279  * struct iwl_scan_channel_opt - CHANNEL_OPTIMIZATION_API_S
280  * @flags: enum iwl_scan_channel_flags
281  * @non_ebs_ratio: defines the ratio of number of scan iterations where EBS is
282  *	involved.
283  *	1 - EBS is disabled.
284  *	2 - every second scan will be full scan(and so on).
285  */
286 struct iwl_scan_channel_opt {
287 	__le16 flags;
288 	__le16 non_ebs_ratio;
289 } __packed;
290 
291 /**
292  * enum iwl_mvm_lmac_scan_flags - LMAC scan flags
293  * @IWL_MVM_LMAC_SCAN_FLAG_PASS_ALL: pass all beacons and probe responses
294  *	without filtering.
295  * @IWL_MVM_LMAC_SCAN_FLAG_PASSIVE: force passive scan on all channels
296  * @IWL_MVM_LMAC_SCAN_FLAG_PRE_CONNECTION: single channel scan
297  * @IWL_MVM_LMAC_SCAN_FLAG_ITER_COMPLETE: send iteration complete notification
298  * @IWL_MVM_LMAC_SCAN_FLAG_MULTIPLE_SSIDS: multiple SSID matching
299  * @IWL_MVM_LMAC_SCAN_FLAG_FRAGMENTED: all passive scans will be fragmented
300  * @IWL_MVM_LMAC_SCAN_FLAGS_RRM_ENABLED: insert WFA vendor-specific TPC report
301  *	and DS parameter set IEs into probe requests.
302  * @IWL_MVM_LMAC_SCAN_FLAG_EXTENDED_DWELL: use extended dwell time on channels
303  *	1, 6 and 11.
304  * @IWL_MVM_LMAC_SCAN_FLAG_MATCH: Send match found notification on matches
305  */
306 enum iwl_mvm_lmac_scan_flags {
307 	IWL_MVM_LMAC_SCAN_FLAG_PASS_ALL		= BIT(0),
308 	IWL_MVM_LMAC_SCAN_FLAG_PASSIVE		= BIT(1),
309 	IWL_MVM_LMAC_SCAN_FLAG_PRE_CONNECTION	= BIT(2),
310 	IWL_MVM_LMAC_SCAN_FLAG_ITER_COMPLETE	= BIT(3),
311 	IWL_MVM_LMAC_SCAN_FLAG_MULTIPLE_SSIDS	= BIT(4),
312 	IWL_MVM_LMAC_SCAN_FLAG_FRAGMENTED	= BIT(5),
313 	IWL_MVM_LMAC_SCAN_FLAGS_RRM_ENABLED	= BIT(6),
314 	IWL_MVM_LMAC_SCAN_FLAG_EXTENDED_DWELL	= BIT(7),
315 	IWL_MVM_LMAC_SCAN_FLAG_MATCH		= BIT(9),
316 };
317 
318 enum iwl_scan_priority {
319 	IWL_SCAN_PRIORITY_LOW,
320 	IWL_SCAN_PRIORITY_MEDIUM,
321 	IWL_SCAN_PRIORITY_HIGH,
322 };
323 
324 enum iwl_scan_priority_ext {
325 	IWL_SCAN_PRIORITY_EXT_0_LOWEST,
326 	IWL_SCAN_PRIORITY_EXT_1,
327 	IWL_SCAN_PRIORITY_EXT_2,
328 	IWL_SCAN_PRIORITY_EXT_3,
329 	IWL_SCAN_PRIORITY_EXT_4,
330 	IWL_SCAN_PRIORITY_EXT_5,
331 	IWL_SCAN_PRIORITY_EXT_6,
332 	IWL_SCAN_PRIORITY_EXT_7_HIGHEST,
333 };
334 
335 /**
336  * struct iwl_scan_req_lmac - SCAN_REQUEST_CMD_API_S_VER_1
337  * @reserved1: for alignment and future use
338  * @n_channels: num of channels to scan
339  * @active_dwell: dwell time for active channels
340  * @passive_dwell: dwell time for passive channels
341  * @fragmented_dwell: dwell time for fragmented passive scan
342  * @extended_dwell: dwell time for channels 1, 6 and 11 (in certain cases)
343  * @reserved2: for alignment and future use
344  * @rx_chain_select: PHY_RX_CHAIN_* flags
345  * @scan_flags: &enum iwl_mvm_lmac_scan_flags
346  * @max_out_time: max time (in TU) to be out of associated channel
347  * @suspend_time: pause scan this long (TUs) when returning to service channel
348  * @flags: RXON flags
349  * @filter_flags: RXON filter
350  * @tx_cmd: tx command for active scan; for 2GHz and for 5GHz
351  * @direct_scan: list of SSIDs for directed active scan
352  * @scan_prio: enum iwl_scan_priority
353  * @iter_num: number of scan iterations
354  * @delay: delay in seconds before first iteration
355  * @schedule: two scheduling plans. The first one is finite, the second one can
356  *	be infinite.
357  * @channel_opt: channel optimization options, for full and partial scan
358  * @data: channel configuration and probe request packet.
359  */
360 struct iwl_scan_req_lmac {
361 	/* SCAN_REQUEST_FIXED_PART_API_S_VER_7 */
362 	__le32 reserved1;
363 	u8 n_channels;
364 	u8 active_dwell;
365 	u8 passive_dwell;
366 	u8 fragmented_dwell;
367 	u8 extended_dwell;
368 	u8 reserved2;
369 	__le16 rx_chain_select;
370 	__le32 scan_flags;
371 	__le32 max_out_time;
372 	__le32 suspend_time;
373 	/* RX_ON_FLAGS_API_S_VER_1 */
374 	__le32 flags;
375 	__le32 filter_flags;
376 	struct iwl_scan_req_tx_cmd tx_cmd[2];
377 	struct iwl_ssid_ie direct_scan[PROBE_OPTION_MAX];
378 	__le32 scan_prio;
379 	/* SCAN_REQ_PERIODIC_PARAMS_API_S */
380 	__le32 iter_num;
381 	__le32 delay;
382 	struct iwl_scan_schedule_lmac schedule[IWL_MAX_SCHED_SCAN_PLANS];
383 	struct iwl_scan_channel_opt channel_opt[2];
384 	u8 data[];
385 } __packed;
386 
387 /**
388  * struct iwl_scan_results_notif - scan results for one channel -
389  *	SCAN_RESULT_NTF_API_S_VER_3
390  * @channel: which channel the results are from
391  * @band: 0 for 5.2 GHz, 1 for 2.4 GHz
392  * @probe_status: SCAN_PROBE_STATUS_*, indicates success of probe request
393  * @num_probe_not_sent: # of request that weren't sent due to not enough time
394  * @duration: duration spent in channel, in usecs
395  */
396 struct iwl_scan_results_notif {
397 	u8 channel;
398 	u8 band;
399 	u8 probe_status;
400 	u8 num_probe_not_sent;
401 	__le32 duration;
402 } __packed;
403 
404 /**
405  * struct iwl_lmac_scan_complete_notif - notifies end of scanning (all channels)
406  *	SCAN_COMPLETE_NTF_API_S_VER_3
407  * @scanned_channels: number of channels scanned (and number of valid results)
408  * @status: one of SCAN_COMP_STATUS_*
409  * @bt_status: BT on/off status
410  * @last_channel: last channel that was scanned
411  * @tsf_low: TSF timer (lower half) in usecs
412  * @tsf_high: TSF timer (higher half) in usecs
413  * @results: an array of scan results, only "scanned_channels" of them are valid
414  */
415 struct iwl_lmac_scan_complete_notif {
416 	u8 scanned_channels;
417 	u8 status;
418 	u8 bt_status;
419 	u8 last_channel;
420 	__le32 tsf_low;
421 	__le32 tsf_high;
422 	struct iwl_scan_results_notif results[];
423 } __packed;
424 
425 /**
426  * struct iwl_periodic_scan_complete - PERIODIC_SCAN_COMPLETE_NTF_API_S_VER_2
427  * @last_schedule_line: last schedule line executed (fast or regular)
428  * @last_schedule_iteration: last scan iteration executed before scan abort
429  * @status: &enum iwl_scan_offload_complete_status
430  * @ebs_status: EBS success status &enum iwl_scan_ebs_status
431  * @time_after_last_iter: time in seconds elapsed after last iteration
432  * @reserved: reserved
433  */
434 struct iwl_periodic_scan_complete {
435 	u8 last_schedule_line;
436 	u8 last_schedule_iteration;
437 	u8 status;
438 	u8 ebs_status;
439 	__le32 time_after_last_iter;
440 	__le32 reserved;
441 } __packed;
442 
443 /* UMAC Scan API */
444 
445 /* The maximum of either of these cannot exceed 8, because we use an
446  * 8-bit mask (see enum iwl_scan_status).
447  */
448 #define IWL_MAX_UMAC_SCANS 4
449 #define IWL_MAX_LMAC_SCANS 1
450 
451 enum scan_config_flags {
452 	SCAN_CONFIG_FLAG_ACTIVATE			= BIT(0),
453 	SCAN_CONFIG_FLAG_DEACTIVATE			= BIT(1),
454 	SCAN_CONFIG_FLAG_FORBID_CHUB_REQS		= BIT(2),
455 	SCAN_CONFIG_FLAG_ALLOW_CHUB_REQS		= BIT(3),
456 	SCAN_CONFIG_FLAG_SET_TX_CHAINS			= BIT(8),
457 	SCAN_CONFIG_FLAG_SET_RX_CHAINS			= BIT(9),
458 	SCAN_CONFIG_FLAG_SET_AUX_STA_ID			= BIT(10),
459 	SCAN_CONFIG_FLAG_SET_ALL_TIMES			= BIT(11),
460 	SCAN_CONFIG_FLAG_SET_EFFECTIVE_TIMES		= BIT(12),
461 	SCAN_CONFIG_FLAG_SET_CHANNEL_FLAGS		= BIT(13),
462 	SCAN_CONFIG_FLAG_SET_LEGACY_RATES		= BIT(14),
463 	SCAN_CONFIG_FLAG_SET_MAC_ADDR			= BIT(15),
464 	SCAN_CONFIG_FLAG_SET_FRAGMENTED			= BIT(16),
465 	SCAN_CONFIG_FLAG_CLEAR_FRAGMENTED		= BIT(17),
466 	SCAN_CONFIG_FLAG_SET_CAM_MODE			= BIT(18),
467 	SCAN_CONFIG_FLAG_CLEAR_CAM_MODE			= BIT(19),
468 	SCAN_CONFIG_FLAG_SET_PROMISC_MODE		= BIT(20),
469 	SCAN_CONFIG_FLAG_CLEAR_PROMISC_MODE		= BIT(21),
470 	SCAN_CONFIG_FLAG_SET_LMAC2_FRAGMENTED		= BIT(22),
471 	SCAN_CONFIG_FLAG_CLEAR_LMAC2_FRAGMENTED		= BIT(23),
472 
473 	/* Bits 26-31 are for num of channels in channel_array */
474 #define SCAN_CONFIG_N_CHANNELS(n) ((n) << 26)
475 };
476 
477 enum scan_config_rates {
478 	/* OFDM basic rates */
479 	SCAN_CONFIG_RATE_6M	= BIT(0),
480 	SCAN_CONFIG_RATE_9M	= BIT(1),
481 	SCAN_CONFIG_RATE_12M	= BIT(2),
482 	SCAN_CONFIG_RATE_18M	= BIT(3),
483 	SCAN_CONFIG_RATE_24M	= BIT(4),
484 	SCAN_CONFIG_RATE_36M	= BIT(5),
485 	SCAN_CONFIG_RATE_48M	= BIT(6),
486 	SCAN_CONFIG_RATE_54M	= BIT(7),
487 	/* CCK basic rates */
488 	SCAN_CONFIG_RATE_1M	= BIT(8),
489 	SCAN_CONFIG_RATE_2M	= BIT(9),
490 	SCAN_CONFIG_RATE_5M	= BIT(10),
491 	SCAN_CONFIG_RATE_11M	= BIT(11),
492 
493 	/* Bits 16-27 are for supported rates */
494 #define SCAN_CONFIG_SUPPORTED_RATE(rate)	((rate) << 16)
495 };
496 
497 enum iwl_channel_flags {
498 	IWL_CHANNEL_FLAG_EBS				= BIT(0),
499 	IWL_CHANNEL_FLAG_ACCURATE_EBS			= BIT(1),
500 	IWL_CHANNEL_FLAG_EBS_ADD			= BIT(2),
501 	IWL_CHANNEL_FLAG_PRE_SCAN_PASSIVE2ACTIVE	= BIT(3),
502 };
503 
504 enum iwl_uhb_chan_cfg_flags {
505 	IWL_UHB_CHAN_CFG_FLAG_UNSOLICITED_PROBE_RES = BIT(24),
506 	IWL_UHB_CHAN_CFG_FLAG_PSC_CHAN_NO_LISTEN    = BIT(25),
507 	IWL_UHB_CHAN_CFG_FLAG_FORCE_PASSIVE         = BIT(26),
508 };
509 /**
510  * struct iwl_scan_dwell
511  * @active:		default dwell time for active scan
512  * @passive:		default dwell time for passive scan
513  * @fragmented:		default dwell time for fragmented scan
514  * @extended:		default dwell time for channels 1, 6 and 11
515  */
516 struct iwl_scan_dwell {
517 	u8 active;
518 	u8 passive;
519 	u8 fragmented;
520 	u8 extended;
521 } __packed;
522 
523 /**
524  * struct iwl_scan_config_v1 - scan configuration command
525  * @flags:			enum scan_config_flags
526  * @tx_chains:			valid_tx antenna - ANT_* definitions
527  * @rx_chains:			valid_rx antenna - ANT_* definitions
528  * @legacy_rates:		default legacy rates - enum scan_config_rates
529  * @out_of_channel_time:	default max out of serving channel time
530  * @suspend_time:		default max suspend time
531  * @dwell:			dwells for the scan
532  * @mac_addr:			default mac address to be used in probes
533  * @bcast_sta_id:		the index of the station in the fw
534  * @channel_flags:		default channel flags - enum iwl_channel_flags
535  *				scan_config_channel_flag
536  * @channel_array:		default supported channels
537  */
538 struct iwl_scan_config_v1 {
539 	__le32 flags;
540 	__le32 tx_chains;
541 	__le32 rx_chains;
542 	__le32 legacy_rates;
543 	__le32 out_of_channel_time;
544 	__le32 suspend_time;
545 	struct iwl_scan_dwell dwell;
546 	u8 mac_addr[ETH_ALEN];
547 	u8 bcast_sta_id;
548 	u8 channel_flags;
549 	u8 channel_array[];
550 } __packed; /* SCAN_CONFIG_DB_CMD_API_S */
551 
552 #define SCAN_TWO_LMACS 2
553 #define SCAN_LB_LMAC_IDX 0
554 #define SCAN_HB_LMAC_IDX 1
555 
556 /**
557  * struct iwl_scan_config_v2 - scan configuration command
558  * @flags:			enum scan_config_flags
559  * @tx_chains:			valid_tx antenna - ANT_* definitions
560  * @rx_chains:			valid_rx antenna - ANT_* definitions
561  * @legacy_rates:		default legacy rates - enum scan_config_rates
562  * @out_of_channel_time:	default max out of serving channel time
563  * @suspend_time:		default max suspend time
564  * @dwell:			dwells for the scan
565  * @mac_addr:			default mac address to be used in probes
566  * @bcast_sta_id:		the index of the station in the fw
567  * @channel_flags:		default channel flags - enum iwl_channel_flags
568  *				scan_config_channel_flag
569  * @channel_array:		default supported channels
570  */
571 struct iwl_scan_config_v2 {
572 	__le32 flags;
573 	__le32 tx_chains;
574 	__le32 rx_chains;
575 	__le32 legacy_rates;
576 	__le32 out_of_channel_time[SCAN_TWO_LMACS];
577 	__le32 suspend_time[SCAN_TWO_LMACS];
578 	struct iwl_scan_dwell dwell;
579 	u8 mac_addr[ETH_ALEN];
580 	u8 bcast_sta_id;
581 	u8 channel_flags;
582 	u8 channel_array[];
583 } __packed; /* SCAN_CONFIG_DB_CMD_API_S_2 */
584 
585 /**
586  * struct iwl_scan_config - scan configuration command
587  * @enable_cam_mode: whether to enable CAM mode.
588  * @enable_promiscouos_mode: whether to enable promiscouos mode
589  * @bcast_sta_id: the index of the station in the fw. Deprecated starting with
590  *     API version 5.
591  * @reserved: reserved
592  * @tx_chains: valid_tx antenna - ANT_* definitions
593  * @rx_chains: valid_rx antenna - ANT_* definitions
594  */
595 struct iwl_scan_config {
596 	u8 enable_cam_mode;
597 	u8 enable_promiscouos_mode;
598 	u8 bcast_sta_id;
599 	u8 reserved;
600 	__le32 tx_chains;
601 	__le32 rx_chains;
602 } __packed; /* SCAN_CONFIG_DB_CMD_API_S_5 */
603 
604 /**
605  * enum iwl_umac_scan_flags - UMAC scan flags
606  * @IWL_UMAC_SCAN_FLAG_PREEMPTIVE: scan process triggered by this scan request
607  *	can be preempted by other scan requests with higher priority.
608  *	The low priority scan will be resumed when the higher proirity scan is
609  *	completed.
610  * @IWL_UMAC_SCAN_FLAG_START_NOTIF: notification will be sent to the driver
611  *	when scan starts.
612  */
613 enum iwl_umac_scan_flags {
614 	IWL_UMAC_SCAN_FLAG_PREEMPTIVE		= BIT(0),
615 	IWL_UMAC_SCAN_FLAG_START_NOTIF		= BIT(1),
616 };
617 
618 enum iwl_umac_scan_uid_offsets {
619 	IWL_UMAC_SCAN_UID_TYPE_OFFSET		= 0,
620 	IWL_UMAC_SCAN_UID_SEQ_OFFSET		= 8,
621 };
622 
623 enum iwl_umac_scan_general_flags {
624 	IWL_UMAC_SCAN_GEN_FLAGS_PERIODIC		= BIT(0),
625 	IWL_UMAC_SCAN_GEN_FLAGS_OVER_BT			= BIT(1),
626 	IWL_UMAC_SCAN_GEN_FLAGS_PASS_ALL		= BIT(2),
627 	IWL_UMAC_SCAN_GEN_FLAGS_PASSIVE			= BIT(3),
628 	IWL_UMAC_SCAN_GEN_FLAGS_PRE_CONNECT		= BIT(4),
629 	IWL_UMAC_SCAN_GEN_FLAGS_ITER_COMPLETE		= BIT(5),
630 	IWL_UMAC_SCAN_GEN_FLAGS_MULTIPLE_SSID		= BIT(6),
631 	IWL_UMAC_SCAN_GEN_FLAGS_FRAGMENTED		= BIT(7),
632 	IWL_UMAC_SCAN_GEN_FLAGS_RRM_ENABLED		= BIT(8),
633 	IWL_UMAC_SCAN_GEN_FLAGS_MATCH			= BIT(9),
634 	IWL_UMAC_SCAN_GEN_FLAGS_EXTENDED_DWELL		= BIT(10),
635 	/* Extended dwell is obselete when adaptive dwell is used, making this
636 	 * bit reusable. Hence, probe request defer is used only when adaptive
637 	 * dwell is supported. */
638 	IWL_UMAC_SCAN_GEN_FLAGS_PROB_REQ_DEFER_SUPP	= BIT(10),
639 	IWL_UMAC_SCAN_GEN_FLAGS_LMAC2_FRAGMENTED	= BIT(11),
640 	IWL_UMAC_SCAN_GEN_FLAGS_ADAPTIVE_DWELL		= BIT(13),
641 	IWL_UMAC_SCAN_GEN_FLAGS_MAX_CHNL_TIME		= BIT(14),
642 	IWL_UMAC_SCAN_GEN_FLAGS_PROB_REQ_HIGH_TX_RATE	= BIT(15),
643 };
644 
645 /**
646  * enum iwl_umac_scan_general_flags2 - UMAC scan general flags #2
647  * @IWL_UMAC_SCAN_GEN_FLAGS2_NOTIF_PER_CHNL: Whether to send a complete
648  *	notification per channel or not.
649  * @IWL_UMAC_SCAN_GEN_FLAGS2_ALLOW_CHNL_REORDER: Whether to allow channel
650  *	reorder optimization or not.
651  * @IWL_UMAC_SCAN_GEN_FLAGS2_COLLECT_CHANNEL_STATS: Enable channel statistics
652  *	collection when #IWL_UMAC_SCAN_GEN_FLAGS_V2_FORCE_PASSIVE is set.
653  */
654 enum iwl_umac_scan_general_flags2 {
655 	IWL_UMAC_SCAN_GEN_FLAGS2_NOTIF_PER_CHNL		= BIT(0),
656 	IWL_UMAC_SCAN_GEN_FLAGS2_ALLOW_CHNL_REORDER	= BIT(1),
657 	IWL_UMAC_SCAN_GEN_FLAGS2_COLLECT_CHANNEL_STATS	= BIT(3),
658 };
659 
660 /**
661  * enum iwl_umac_scan_general_flags_v2 - UMAC scan general flags version 2
662  *
663  * The FW flags were reordered and hence the driver introduce version 2
664  *
665  * @IWL_UMAC_SCAN_GEN_FLAGS_V2_PERIODIC: periodic or scheduled
666  * @IWL_UMAC_SCAN_GEN_FLAGS_V2_PASS_ALL: pass all probe responses and beacons
667  *                                       during scan iterations
668  * @IWL_UMAC_SCAN_GEN_FLAGS_V2_NTFY_ITER_COMPLETE: send complete notification
669  *      on every iteration instead of only once after the last iteration
670  * @IWL_UMAC_SCAN_GEN_FLAGS_V2_FRAGMENTED_LMAC1: fragmented scan LMAC1
671  * @IWL_UMAC_SCAN_GEN_FLAGS_V2_FRAGMENTED_LMAC2: fragmented scan LMAC2
672  * @IWL_UMAC_SCAN_GEN_FLAGS_V2_MATCH: does this scan check for profile matching
673  * @IWL_UMAC_SCAN_GEN_FLAGS_V2_USE_ALL_RX_CHAINS: use all valid chains for RX
674  * @IWL_UMAC_SCAN_GEN_FLAGS_V2_ADAPTIVE_DWELL: works with adaptive dwell
675  *                                             for active channel
676  * @IWL_UMAC_SCAN_GEN_FLAGS_V2_PREEMPTIVE: can be preempted by other requests
677  * @IWL_UMAC_SCAN_GEN_FLAGS_V2_NTF_START: send notification of scan start
678  * @IWL_UMAC_SCAN_GEN_FLAGS_V2_MULTI_SSID: matching on multiple SSIDs
679  * @IWL_UMAC_SCAN_GEN_FLAGS_V2_FORCE_PASSIVE: all the channels scanned
680  *                                           as passive
681  * @IWL_UMAC_SCAN_GEN_FLAGS_V2_TRIGGER_UHB_SCAN: at the end of 2.4GHz and
682  *		5.2Ghz bands scan, trigger scan on 6GHz band to discover
683  *		the reported collocated APs
684  * @IWL_UMAC_SCAN_GEN_FLAGS_V2_6GHZ_PASSIVE_SCAN: at the end of 2.4GHz and 5GHz
685  *      bands scan, if not APs were discovered, allow scan to conitnue and scan
686  *      6GHz PSC channels in order to discover country information.
687  * @IWL_UMAC_SCAN_GEN_FLAGS_V2_6GHZ_PASSIVE_SCAN_FILTER_IN: in case
688  *      &IWL_UMAC_SCAN_GEN_FLAGS_V2_6GHZ_PASSIVE_SCAN is enabled and scan is
689  *      activated over 6GHz PSC channels, filter in beacons and probe responses.
690  * @IWL_UMAC_SCAN_GEN_FLAGS_V2_OCE: if set, send probe requests in a minimum
691  *      rate of 5.5Mpbs, filter in broadcast probe responses and set the max
692  *      channel time indication field in the FILS request parameters element
693  *      (if included by the driver in the probe request IEs).
694  */
695 enum iwl_umac_scan_general_flags_v2 {
696 	IWL_UMAC_SCAN_GEN_FLAGS_V2_PERIODIC             = BIT(0),
697 	IWL_UMAC_SCAN_GEN_FLAGS_V2_PASS_ALL             = BIT(1),
698 	IWL_UMAC_SCAN_GEN_FLAGS_V2_NTFY_ITER_COMPLETE   = BIT(2),
699 	IWL_UMAC_SCAN_GEN_FLAGS_V2_FRAGMENTED_LMAC1     = BIT(3),
700 	IWL_UMAC_SCAN_GEN_FLAGS_V2_FRAGMENTED_LMAC2     = BIT(4),
701 	IWL_UMAC_SCAN_GEN_FLAGS_V2_MATCH                = BIT(5),
702 	IWL_UMAC_SCAN_GEN_FLAGS_V2_USE_ALL_RX_CHAINS    = BIT(6),
703 	IWL_UMAC_SCAN_GEN_FLAGS_V2_ADAPTIVE_DWELL       = BIT(7),
704 	IWL_UMAC_SCAN_GEN_FLAGS_V2_PREEMPTIVE           = BIT(8),
705 	IWL_UMAC_SCAN_GEN_FLAGS_V2_NTF_START            = BIT(9),
706 	IWL_UMAC_SCAN_GEN_FLAGS_V2_MULTI_SSID           = BIT(10),
707 	IWL_UMAC_SCAN_GEN_FLAGS_V2_FORCE_PASSIVE        = BIT(11),
708 	IWL_UMAC_SCAN_GEN_FLAGS_V2_TRIGGER_UHB_SCAN     = BIT(12),
709 	IWL_UMAC_SCAN_GEN_FLAGS_V2_6GHZ_PASSIVE_SCAN    = BIT(13),
710 	IWL_UMAC_SCAN_GEN_FLAGS_V2_6GHZ_PASSIVE_SCAN_FILTER_IN = BIT(14),
711 	IWL_UMAC_SCAN_GEN_FLAGS_V2_OCE                  = BIT(15),
712 };
713 
714 /**
715  * enum iwl_umac_scan_general_params_flags2 - UMAC scan general flags2
716  *
717  * @IWL_UMAC_SCAN_GEN_PARAMS_FLAGS2_RESPECT_P2P_GO_LB: scan event scheduling
718  *     should be aware of a P2P GO operation on the 2GHz band.
719  * @IWL_UMAC_SCAN_GEN_PARAMS_FLAGS2_RESPECT_P2P_GO_HB: scan event scheduling
720  *     should be aware of a P2P GO operation on the 5GHz or 6GHz band.
721  * @IWL_UMAC_SCAN_GEN_PARAMS_FLAGS2_DONT_TOGGLE_ANT: don't toggle between
722  *     valid antennas, and use the same antenna as in previous scan
723  */
724 enum iwl_umac_scan_general_params_flags2 {
725 	IWL_UMAC_SCAN_GEN_PARAMS_FLAGS2_RESPECT_P2P_GO_LB = BIT(0),
726 	IWL_UMAC_SCAN_GEN_PARAMS_FLAGS2_RESPECT_P2P_GO_HB = BIT(1),
727 	IWL_UMAC_SCAN_GEN_PARAMS_FLAGS2_DONT_TOGGLE_ANT   = BIT(2),
728 };
729 
730 /**
731  * struct iwl_scan_channel_cfg_umac
732  * @flags:		bitmap - 0-19:	directed scan to i'th ssid.
733  * @channel_num:	channel number 1-13 etc.
734  * @v1:			command version 1
735  * @v1.iter_count:	repetition count for the channel.
736  * @v1.iter_interval:	interval between two scan iterations on one channel.
737  * @v2:			command versions 2-4
738  * @v2.band:		band of channel: 0 for 2GHz, 1 for 5GHz
739  * @v2.iter_count:	repetition count for the channel.
740  * @v2.iter_interval:	interval between two scan iterations on one channel.
741  * @v5:			command versions 5 and up
742  * @v5.iter_count:	repetition count for the channel.
743  * @v5.iter_interval:	interval between two scan iterations on one channel.
744  * @v5.psd_20:		highest PSD value for all APs known so far
745  *			on this channel.
746  */
747 struct  iwl_scan_channel_cfg_umac {
748 #define IWL_CHAN_CFG_FLAGS_BAND_POS 30
749 	__le32 flags;
750 	u8 channel_num;
751 
752 	/* All versions are of the same size, so use a union without adjusting
753 	 * the command size later
754 	 */
755 	union {
756 		struct {
757 			u8 iter_count;
758 			__le16 iter_interval;
759 		} __packed v1;  /* SCAN_CHANNEL_CONFIG_API_S_VER_1 */
760 		struct {
761 			u8 band;
762 			u8 iter_count;
763 			u8 iter_interval;
764 		} __packed v2; /* SCAN_CHANNEL_CONFIG_API_S_VER_2
765 				* SCAN_CHANNEL_CONFIG_API_S_VER_3
766 				* SCAN_CHANNEL_CONFIG_API_S_VER_4
767 				*/
768 		struct {
769 			u8 psd_20;
770 			u8 iter_count;
771 			u8 iter_interval;
772 		} __packed v5;  /* SCAN_CHANNEL_CONFIG_API_S_VER_5 */
773 	} __packed;
774 } __packed;
775 
776 /**
777  * struct iwl_scan_umac_schedule
778  * @interval: interval in seconds between scan iterations
779  * @iter_count: num of scan iterations for schedule plan, 0xff for infinite loop
780  * @reserved: for alignment and future use
781  */
782 struct iwl_scan_umac_schedule {
783 	__le16 interval;
784 	u8 iter_count;
785 	u8 reserved;
786 } __packed; /* SCAN_SCHED_PARAM_API_S_VER_1 */
787 
788 struct iwl_scan_req_umac_tail_v1 {
789 	/* SCAN_PERIODIC_PARAMS_API_S_VER_1 */
790 	struct iwl_scan_umac_schedule schedule[IWL_MAX_SCHED_SCAN_PLANS];
791 	__le16 delay;
792 	__le16 reserved;
793 	/* SCAN_PROBE_PARAMS_API_S_VER_1 */
794 	struct iwl_scan_probe_req_v1 preq;
795 	struct iwl_ssid_ie direct_scan[PROBE_OPTION_MAX];
796 } __packed;
797 
798 /**
799  * struct iwl_scan_req_umac_tail_v2 - the rest of the UMAC scan request command
800  *      parameters following channels configuration array.
801  * @schedule: two scheduling plans.
802  * @delay: delay in TUs before starting the first scan iteration
803  * @reserved: for future use and alignment
804  * @preq: probe request with IEs blocks
805  * @direct_scan: list of SSIDs for directed active scan
806  */
807 struct iwl_scan_req_umac_tail_v2 {
808 	/* SCAN_PERIODIC_PARAMS_API_S_VER_1 */
809 	struct iwl_scan_umac_schedule schedule[IWL_MAX_SCHED_SCAN_PLANS];
810 	__le16 delay;
811 	__le16 reserved;
812 	/* SCAN_PROBE_PARAMS_API_S_VER_2 */
813 	struct iwl_scan_probe_req preq;
814 	struct iwl_ssid_ie direct_scan[PROBE_OPTION_MAX];
815 } __packed;
816 
817 /**
818  * struct iwl_scan_umac_chan_param
819  * @flags: channel flags &enum iwl_scan_channel_flags
820  * @count: num of channels in scan request
821  * @reserved: for future use and alignment
822  */
823 struct iwl_scan_umac_chan_param {
824 	u8 flags;
825 	u8 count;
826 	__le16 reserved;
827 } __packed; /*SCAN_CHANNEL_PARAMS_API_S_VER_1 */
828 
829 /**
830  * struct iwl_scan_req_umac
831  * @flags: &enum iwl_umac_scan_flags
832  * @uid: scan id, &enum iwl_umac_scan_uid_offsets
833  * @ooc_priority: out of channel priority - &enum iwl_scan_priority
834  * @general_flags: &enum iwl_umac_scan_general_flags
835  * @scan_start_mac_id: report the scan start TSF time according to this mac TSF
836  * @extended_dwell: dwell time for channels 1, 6 and 11
837  * @active_dwell: dwell time for active scan per LMAC
838  * @passive_dwell: dwell time for passive scan per LMAC
839  * @fragmented_dwell: dwell time for fragmented passive scan
840  * @adwell_default_n_aps: for adaptive dwell the default number of APs
841  *	per channel
842  * @adwell_default_n_aps_social: for adaptive dwell the default
843  *	number of APs per social (1,6,11) channel
844  * @general_flags2: &enum iwl_umac_scan_general_flags2
845  * @adwell_max_budget: for adaptive dwell the maximal budget of TU to be added
846  *	to total scan time
847  * @max_out_time: max out of serving channel time, per LMAC - for CDB there
848  *	are 2 LMACs
849  * @suspend_time: max suspend time, per LMAC - for CDB there are 2 LMACs
850  * @scan_priority: scan internal prioritization &enum iwl_scan_priority
851  * @num_of_fragments: Number of fragments needed for full coverage per band.
852  *	Relevant only for fragmented scan.
853  * @channel: &struct iwl_scan_umac_chan_param
854  * @reserved: for future use and alignment
855  * @reserved3: for future use and alignment
856  * @data: &struct iwl_scan_channel_cfg_umac and
857  *	&struct iwl_scan_req_umac_tail
858  */
859 struct iwl_scan_req_umac {
860 	__le32 flags;
861 	__le32 uid;
862 	__le32 ooc_priority;
863 	__le16 general_flags;
864 	u8 reserved;
865 	u8 scan_start_mac_id;
866 	union {
867 		struct {
868 			u8 extended_dwell;
869 			u8 active_dwell;
870 			u8 passive_dwell;
871 			u8 fragmented_dwell;
872 			__le32 max_out_time;
873 			__le32 suspend_time;
874 			__le32 scan_priority;
875 			struct iwl_scan_umac_chan_param channel;
876 			u8 data[];
877 		} v1; /* SCAN_REQUEST_CMD_UMAC_API_S_VER_1 */
878 		struct {
879 			u8 extended_dwell;
880 			u8 active_dwell;
881 			u8 passive_dwell;
882 			u8 fragmented_dwell;
883 			__le32 max_out_time[SCAN_TWO_LMACS];
884 			__le32 suspend_time[SCAN_TWO_LMACS];
885 			__le32 scan_priority;
886 			struct iwl_scan_umac_chan_param channel;
887 			u8 data[];
888 		} v6; /* SCAN_REQUEST_CMD_UMAC_API_S_VER_6 */
889 		struct {
890 			u8 active_dwell;
891 			u8 passive_dwell;
892 			u8 fragmented_dwell;
893 			u8 adwell_default_n_aps;
894 			u8 adwell_default_n_aps_social;
895 			u8 reserved3;
896 			__le16 adwell_max_budget;
897 			__le32 max_out_time[SCAN_TWO_LMACS];
898 			__le32 suspend_time[SCAN_TWO_LMACS];
899 			__le32 scan_priority;
900 			struct iwl_scan_umac_chan_param channel;
901 			u8 data[];
902 		} v7; /* SCAN_REQUEST_CMD_UMAC_API_S_VER_7 */
903 		struct {
904 			u8 active_dwell[SCAN_TWO_LMACS];
905 			u8 reserved2;
906 			u8 adwell_default_n_aps;
907 			u8 adwell_default_n_aps_social;
908 			u8 general_flags2;
909 			__le16 adwell_max_budget;
910 			__le32 max_out_time[SCAN_TWO_LMACS];
911 			__le32 suspend_time[SCAN_TWO_LMACS];
912 			__le32 scan_priority;
913 			u8 passive_dwell[SCAN_TWO_LMACS];
914 			u8 num_of_fragments[SCAN_TWO_LMACS];
915 			struct iwl_scan_umac_chan_param channel;
916 			u8 data[];
917 		} v8; /* SCAN_REQUEST_CMD_UMAC_API_S_VER_8 */
918 		struct {
919 			u8 active_dwell[SCAN_TWO_LMACS];
920 			u8 adwell_default_hb_n_aps;
921 			u8 adwell_default_lb_n_aps;
922 			u8 adwell_default_n_aps_social;
923 			u8 general_flags2;
924 			__le16 adwell_max_budget;
925 			__le32 max_out_time[SCAN_TWO_LMACS];
926 			__le32 suspend_time[SCAN_TWO_LMACS];
927 			__le32 scan_priority;
928 			u8 passive_dwell[SCAN_TWO_LMACS];
929 			u8 num_of_fragments[SCAN_TWO_LMACS];
930 			struct iwl_scan_umac_chan_param channel;
931 			u8 data[];
932 		} v9; /* SCAN_REQUEST_CMD_UMAC_API_S_VER_9 */
933 	};
934 } __packed;
935 
936 #define IWL_SCAN_REQ_UMAC_SIZE_V8 sizeof(struct iwl_scan_req_umac)
937 #define IWL_SCAN_REQ_UMAC_SIZE_V7 48
938 #define IWL_SCAN_REQ_UMAC_SIZE_V6 44
939 #define IWL_SCAN_REQ_UMAC_SIZE_V1 36
940 
941 /**
942  * struct iwl_scan_probe_params_v3
943  * @preq: scan probe request params
944  * @ssid_num: number of valid SSIDs in direct scan array
945  * @short_ssid_num: number of valid short SSIDs in short ssid array
946  * @bssid_num: number of valid bssid in bssids array
947  * @reserved: reserved
948  * @direct_scan: list of ssids
949  * @short_ssid: array of short ssids
950  * @bssid_array: array of bssids
951  */
952 struct iwl_scan_probe_params_v3 {
953 	struct iwl_scan_probe_req preq;
954 	u8 ssid_num;
955 	u8 short_ssid_num;
956 	u8 bssid_num;
957 	u8 reserved;
958 	struct iwl_ssid_ie direct_scan[PROBE_OPTION_MAX];
959 	__le32 short_ssid[SCAN_SHORT_SSID_MAX_SIZE];
960 	u8 bssid_array[SCAN_BSSID_MAX_SIZE][ETH_ALEN];
961 } __packed; /* SCAN_PROBE_PARAMS_API_S_VER_3 */
962 
963 /**
964  * struct iwl_scan_probe_params_v4
965  * @preq: scan probe request params
966  * @short_ssid_num: number of valid short SSIDs in short ssid array
967  * @bssid_num: number of valid bssid in bssids array
968  * @reserved: reserved
969  * @direct_scan: list of ssids
970  * @short_ssid: array of short ssids
971  * @bssid_array: array of bssids
972  */
973 struct iwl_scan_probe_params_v4 {
974 	struct iwl_scan_probe_req preq;
975 	u8 short_ssid_num;
976 	u8 bssid_num;
977 	__le16 reserved;
978 	struct iwl_ssid_ie direct_scan[PROBE_OPTION_MAX];
979 	__le32 short_ssid[SCAN_SHORT_SSID_MAX_SIZE];
980 	u8 bssid_array[SCAN_BSSID_MAX_SIZE][ETH_ALEN];
981 } __packed; /* SCAN_PROBE_PARAMS_API_S_VER_4 */
982 
983 #define SCAN_MAX_NUM_CHANS_V3 67
984 
985 /**
986  * struct iwl_scan_channel_params_v4
987  * @flags: channel flags &enum iwl_scan_channel_flags
988  * @count: num of channels in scan request
989  * @num_of_aps_override: override the number of APs the FW uses to calculate
990  *	dwell time when adaptive dwell is used
991  * @reserved: for future use and alignment
992  * @channel_config: array of explicit channel configurations
993  *                  for 2.4Ghz and 5.2Ghz bands
994  * @adwell_ch_override_bitmap: when using adaptive dwell, override the number
995  *	of APs value with &num_of_aps_override for the channel.
996  *	To cast channel to index, use &iwl_mvm_scan_ch_and_band_to_idx
997  */
998 struct iwl_scan_channel_params_v4 {
999 	u8 flags;
1000 	u8 count;
1001 	u8 num_of_aps_override;
1002 	u8 reserved;
1003 	struct iwl_scan_channel_cfg_umac channel_config[SCAN_MAX_NUM_CHANS_V3];
1004 	u8 adwell_ch_override_bitmap[16];
1005 } __packed; /* SCAN_CHANNEL_PARAMS_API_S_VER_4 also
1006 	       SCAN_CHANNEL_PARAMS_API_S_VER_5 */
1007 
1008 /**
1009  * struct iwl_scan_channel_params_v7
1010  * @flags: channel flags &enum iwl_scan_channel_flags
1011  * @count: num of channels in scan request
1012  * @n_aps_override: override the number of APs the FW uses to calculate dwell
1013  *	time when adaptive dwell is used.
1014  *	Channel k will use n_aps_override[i] when BIT(20 + i) is set in
1015  *	channel_config[k].flags
1016  * @channel_config: array of explicit channel configurations
1017  *                  for 2.4Ghz and 5.2Ghz bands
1018  */
1019 struct iwl_scan_channel_params_v7 {
1020 	u8 flags;
1021 	u8 count;
1022 	u8 n_aps_override[2];
1023 	struct iwl_scan_channel_cfg_umac channel_config[SCAN_MAX_NUM_CHANS_V3];
1024 } __packed; /* SCAN_CHANNEL_PARAMS_API_S_VER_6 */
1025 
1026 /**
1027  * struct iwl_scan_general_params_v11
1028  * @flags: &enum iwl_umac_scan_general_flags_v2
1029  * @reserved: reserved for future
1030  * @scan_start_mac_or_link_id: report the scan start TSF time according to this
1031  *     mac (up to verion 11) or link (starting with version 12) TSF
1032  * @active_dwell: dwell time for active scan per LMAC
1033  * @adwell_default_2g: adaptive dwell default number of APs
1034  *                        for 2.4GHz channel
1035  * @adwell_default_5g: adaptive dwell default number of APs
1036  *                        for 5GHz channels
1037  * @adwell_default_social_chn: adaptive dwell default number of
1038  *                             APs per social channel
1039  * @flags2: for version 11 see &enum iwl_umac_scan_general_params_flags2.
1040  *     Otherwise reserved.
1041  * @adwell_max_budget: the maximal number of TUs that adaptive dwell
1042  *                     can add to the total scan time
1043  * @max_out_of_time: max out of serving channel time, per LMAC
1044  * @suspend_time: max suspend time, per LMAC
1045  * @scan_priority: priority of the request
1046  * @passive_dwell: continues dwell time for passive channel
1047  *                 (without adaptive dwell)
1048  * @num_of_fragments: number of fragments needed for full fragmented
1049  *                    scan coverage.
1050  */
1051 struct iwl_scan_general_params_v11 {
1052 	__le16 flags;
1053 	u8 reserved;
1054 	u8 scan_start_mac_or_link_id;
1055 	u8 active_dwell[SCAN_TWO_LMACS];
1056 	u8 adwell_default_2g;
1057 	u8 adwell_default_5g;
1058 	u8 adwell_default_social_chn;
1059 	u8 flags2;
1060 	__le16 adwell_max_budget;
1061 	__le32 max_out_of_time[SCAN_TWO_LMACS];
1062 	__le32 suspend_time[SCAN_TWO_LMACS];
1063 	__le32 scan_priority;
1064 	u8 passive_dwell[SCAN_TWO_LMACS];
1065 	u8 num_of_fragments[SCAN_TWO_LMACS];
1066 } __packed; /* SCAN_GENERAL_PARAMS_API_S_VER_12, *_VER_11  and *_VER_10 */
1067 
1068 /**
1069  * struct iwl_scan_periodic_parms_v1
1070  * @schedule: can scheduling parameter
1071  * @delay: initial delay of the periodic scan in seconds
1072  * @reserved: reserved for future
1073  */
1074 struct iwl_scan_periodic_parms_v1 {
1075 	struct iwl_scan_umac_schedule schedule[IWL_MAX_SCHED_SCAN_PLANS];
1076 	__le16 delay;
1077 	__le16 reserved;
1078 } __packed; /* SCAN_PERIODIC_PARAMS_API_S_VER_1 */
1079 
1080 /**
1081  * struct iwl_scan_req_params_v12
1082  * @general_params: &struct iwl_scan_general_params_v11
1083  * @channel_params: &struct iwl_scan_channel_params_v4
1084  * @periodic_params: &struct iwl_scan_periodic_parms_v1
1085  * @probe_params: &struct iwl_scan_probe_params_v3
1086  */
1087 struct iwl_scan_req_params_v12 {
1088 	struct iwl_scan_general_params_v11 general_params;
1089 	struct iwl_scan_channel_params_v4 channel_params;
1090 	struct iwl_scan_periodic_parms_v1 periodic_params;
1091 	struct iwl_scan_probe_params_v3 probe_params;
1092 } __packed; /* SCAN_REQUEST_PARAMS_API_S_VER_12 */
1093 
1094 /**
1095  * struct iwl_scan_req_params_v17 - scan request parameters (v17)
1096  * @general_params: &struct iwl_scan_general_params_v11
1097  * @channel_params: &struct iwl_scan_channel_params_v7
1098  * @periodic_params: &struct iwl_scan_periodic_parms_v1
1099  * @probe_params: &struct iwl_scan_probe_params_v4
1100  */
1101 struct iwl_scan_req_params_v17 {
1102 	struct iwl_scan_general_params_v11 general_params;
1103 	struct iwl_scan_channel_params_v7 channel_params;
1104 	struct iwl_scan_periodic_parms_v1 periodic_params;
1105 	struct iwl_scan_probe_params_v4 probe_params;
1106 } __packed; /* SCAN_REQUEST_PARAMS_API_S_VER_17 - 14 */
1107 
1108 /**
1109  * struct iwl_scan_req_umac_v12
1110  * @uid: scan id, &enum iwl_umac_scan_uid_offsets
1111  * @ooc_priority: out of channel priority - &enum iwl_scan_priority
1112  * @scan_params: scan parameters
1113  */
1114 struct iwl_scan_req_umac_v12 {
1115 	__le32 uid;
1116 	__le32 ooc_priority;
1117 	struct iwl_scan_req_params_v12 scan_params;
1118 } __packed; /* SCAN_REQUEST_CMD_UMAC_API_S_VER_12 */
1119 
1120 /**
1121  * struct iwl_scan_req_umac_v17 - scan request command (v17)
1122  * @uid: scan id, &enum iwl_umac_scan_uid_offsets
1123  * @ooc_priority: out of channel priority - &enum iwl_scan_priority
1124  * @scan_params: scan parameters
1125  */
1126 struct iwl_scan_req_umac_v17 {
1127 	__le32 uid;
1128 	__le32 ooc_priority;
1129 	struct iwl_scan_req_params_v17 scan_params;
1130 } __packed; /* SCAN_REQUEST_CMD_UMAC_API_S_VER_17 - 14 */
1131 
1132 /**
1133  * struct iwl_umac_scan_abort
1134  * @uid: scan id, &enum iwl_umac_scan_uid_offsets
1135  * @flags: reserved
1136  */
1137 struct iwl_umac_scan_abort {
1138 	__le32 uid;
1139 	__le32 flags;
1140 } __packed; /* SCAN_ABORT_CMD_UMAC_API_S_VER_1 */
1141 
1142 /**
1143  * enum iwl_umac_scan_abort_status
1144  *
1145  * @IWL_UMAC_SCAN_ABORT_STATUS_SUCCESS: scan was successfully aborted
1146  * @IWL_UMAC_SCAN_ABORT_STATUS_IN_PROGRESS: scan abort is in progress
1147  * @IWL_UMAC_SCAN_ABORT_STATUS_NOT_FOUND: nothing to abort
1148  */
1149 enum iwl_umac_scan_abort_status {
1150 	IWL_UMAC_SCAN_ABORT_STATUS_SUCCESS = 0,
1151 	IWL_UMAC_SCAN_ABORT_STATUS_IN_PROGRESS,
1152 	IWL_UMAC_SCAN_ABORT_STATUS_NOT_FOUND,
1153 };
1154 
1155 /**
1156  * struct iwl_umac_scan_complete
1157  * @uid: scan id, &enum iwl_umac_scan_uid_offsets
1158  * @last_schedule: last scheduling line
1159  * @last_iter: last scan iteration number
1160  * @status: &enum iwl_scan_offload_complete_status
1161  * @ebs_status: &enum iwl_scan_ebs_status
1162  * @time_from_last_iter: time elapsed from last iteration
1163  * @reserved: for future use
1164  */
1165 struct iwl_umac_scan_complete {
1166 	__le32 uid;
1167 	u8 last_schedule;
1168 	u8 last_iter;
1169 	u8 status;
1170 	u8 ebs_status;
1171 	__le32 time_from_last_iter;
1172 	__le32 reserved;
1173 } __packed; /* SCAN_COMPLETE_NTF_UMAC_API_S_VER_1 */
1174 
1175 #define SCAN_OFFLOAD_MATCHING_CHANNELS_LEN_V1 5
1176 #define SCAN_OFFLOAD_MATCHING_CHANNELS_LEN    7
1177 
1178 /**
1179  * struct iwl_scan_offload_profile_match_v1 - match information
1180  * @bssid: matched bssid
1181  * @reserved: reserved
1182  * @channel: channel where the match occurred
1183  * @energy: energy
1184  * @matching_feature: feature matches
1185  * @matching_channels: bitmap of channels that matched, referencing
1186  *	the channels passed in the scan offload request.
1187  */
1188 struct iwl_scan_offload_profile_match_v1 {
1189 	u8 bssid[ETH_ALEN];
1190 	__le16 reserved;
1191 	u8 channel;
1192 	u8 energy;
1193 	u8 matching_feature;
1194 	u8 matching_channels[SCAN_OFFLOAD_MATCHING_CHANNELS_LEN_V1];
1195 } __packed; /* SCAN_OFFLOAD_PROFILE_MATCH_RESULTS_S_VER_1 */
1196 
1197 /**
1198  * struct iwl_scan_offload_profiles_query_v1 - match results query response
1199  * @matched_profiles: bitmap of matched profiles, referencing the
1200  *	matches passed in the scan offload request
1201  * @last_scan_age: age of the last offloaded scan
1202  * @n_scans_done: number of offloaded scans done
1203  * @gp2_d0u: GP2 when D0U occurred
1204  * @gp2_invoked: GP2 when scan offload was invoked
1205  * @resume_while_scanning: not used
1206  * @self_recovery: obsolete
1207  * @reserved: reserved
1208  * @matches: array of match information, one for each match
1209  */
1210 struct iwl_scan_offload_profiles_query_v1 {
1211 	__le32 matched_profiles;
1212 	__le32 last_scan_age;
1213 	__le32 n_scans_done;
1214 	__le32 gp2_d0u;
1215 	__le32 gp2_invoked;
1216 	u8 resume_while_scanning;
1217 	u8 self_recovery;
1218 	__le16 reserved;
1219 	struct iwl_scan_offload_profile_match_v1 matches[];
1220 } __packed; /* SCAN_OFFLOAD_PROFILES_QUERY_RSP_S_VER_2 */
1221 
1222 /**
1223  * struct iwl_scan_offload_profile_match - match information
1224  * @bssid: matched bssid
1225  * @reserved: reserved
1226  * @channel: channel where the match occurred
1227  * @energy: energy
1228  * @matching_feature: feature matches
1229  * @matching_channels: bitmap of channels that matched, referencing
1230  *	the channels passed in the scan offload request.
1231  */
1232 struct iwl_scan_offload_profile_match {
1233 	u8 bssid[ETH_ALEN];
1234 	__le16 reserved;
1235 	u8 channel;
1236 	u8 energy;
1237 	u8 matching_feature;
1238 	u8 matching_channels[SCAN_OFFLOAD_MATCHING_CHANNELS_LEN];
1239 } __packed; /* SCAN_OFFLOAD_PROFILE_MATCH_RESULTS_S_VER_2 */
1240 
1241 /**
1242  * struct iwl_scan_offload_match_info - match results information
1243  * @matched_profiles: bitmap of matched profiles, referencing the
1244  *	matches passed in the scan offload request
1245  * @last_scan_age: age of the last offloaded scan
1246  * @n_scans_done: number of offloaded scans done
1247  * @gp2_d0u: GP2 when D0U occurred
1248  * @gp2_invoked: GP2 when scan offload was invoked
1249  * @resume_while_scanning: not used
1250  * @self_recovery: obsolete
1251  * @reserved: reserved
1252  * @matches: array of match information, one for each match
1253  */
1254 struct iwl_scan_offload_match_info {
1255 	__le32 matched_profiles;
1256 	__le32 last_scan_age;
1257 	__le32 n_scans_done;
1258 	__le32 gp2_d0u;
1259 	__le32 gp2_invoked;
1260 	u8 resume_while_scanning;
1261 	u8 self_recovery;
1262 	__le16 reserved;
1263 	struct iwl_scan_offload_profile_match matches[];
1264 } __packed; /* SCAN_OFFLOAD_PROFILES_QUERY_RSP_S_VER_3 and
1265 	     * SCAN_OFFLOAD_MATCH_INFO_NOTIFICATION_S_VER_1
1266 	     */
1267 
1268 /**
1269  * struct iwl_umac_scan_iter_complete_notif - notifies end of scanning iteration
1270  * @uid: scan id, &enum iwl_umac_scan_uid_offsets
1271  * @scanned_channels: number of channels scanned and number of valid elements in
1272  *	results array
1273  * @status: one of SCAN_COMP_STATUS_*
1274  * @bt_status: BT on/off status
1275  * @last_channel: last channel that was scanned
1276  * @start_tsf: TSF timer in usecs of the scan start time for the mac specified
1277  *	in &struct iwl_scan_req_umac.
1278  * @results: array of scan results, length in @scanned_channels
1279  */
1280 struct iwl_umac_scan_iter_complete_notif {
1281 	__le32 uid;
1282 	u8 scanned_channels;
1283 	u8 status;
1284 	u8 bt_status;
1285 	u8 last_channel;
1286 	__le64 start_tsf;
1287 	struct iwl_scan_results_notif results[];
1288 } __packed; /* SCAN_ITER_COMPLETE_NTF_UMAC_API_S_VER_2 */
1289 
1290 /**
1291  * struct iwl_umac_scan_channel_survey_notif - data for survey
1292  * @channel: the channel scanned
1293  * @band: band of channel
1294  * @noise: noise floor measurements in negative dBm, invalid 0xff
1295  * @reserved: for future use and alignment
1296  * @active_time: time in ms the radio was turned on (on the channel)
1297  * @busy_time: time in ms the channel was sensed busy, 0 for a clean channel
1298  * @tx_time: time the radio spent transmitting data
1299  * @rx_time: time the radio spent receiving data
1300  */
1301 struct iwl_umac_scan_channel_survey_notif {
1302 	__le32 channel;
1303 	__le32 band;
1304 	u8 noise[IWL_MAX_NUM_NOISE_RESULTS];
1305 	u8 reserved[2];
1306 	__le32 active_time;
1307 	__le32 busy_time;
1308 	__le32 tx_time;
1309 	__le32 rx_time;
1310 } __packed; /* SCAN_CHANNEL_SURVEY_NTF_API_S_VER_1 */
1311 
1312 #endif /* __iwl_fw_api_scan_h__ */
1313