1 /* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
2 /*
3  * Copyright (C) 2012-2014, 2018-2022 Intel Corporation
4  * Copyright (C) 2013-2014 Intel Mobile Communications GmbH
5  * Copyright (C) 2015-2017 Intel Deutschland GmbH
6  */
7 #ifndef __iwl_fw_api_d3_h__
8 #define __iwl_fw_api_d3_h__
9 #include <iwl-trans.h>
10 
11 /**
12  * enum iwl_d0i3_flags - d0i3 flags
13  * @IWL_D0I3_RESET_REQUIRE: FW require reset upon resume
14  */
15 enum iwl_d0i3_flags {
16 	IWL_D0I3_RESET_REQUIRE = BIT(0),
17 };
18 
19 /**
20  * enum iwl_d3_wakeup_flags - D3 manager wakeup flags
21  * @IWL_WAKEUP_D3_CONFIG_FW_ERROR: wake up on firmware sysassert
22  */
23 enum iwl_d3_wakeup_flags {
24 	IWL_WAKEUP_D3_CONFIG_FW_ERROR = BIT(0),
25 }; /* D3_MANAGER_WAKEUP_CONFIG_API_E_VER_3 */
26 
27 /**
28  * struct iwl_d3_manager_config - D3 manager configuration command
29  * @min_sleep_time: minimum sleep time (in usec)
30  * @wakeup_flags: wakeup flags, see &enum iwl_d3_wakeup_flags
31  * @wakeup_host_timer: force wakeup after this many seconds
32  *
33  * The structure is used for the D3_CONFIG_CMD command.
34  */
35 struct iwl_d3_manager_config {
36 	__le32 min_sleep_time;
37 	__le32 wakeup_flags;
38 	__le32 wakeup_host_timer;
39 } __packed; /* D3_MANAGER_CONFIG_CMD_S_VER_4 */
40 
41 
42 /* TODO: OFFLOADS_QUERY_API_S_VER_1 */
43 
44 /**
45  * enum iwl_d3_proto_offloads - enabled protocol offloads
46  * @IWL_D3_PROTO_OFFLOAD_ARP: ARP data is enabled
47  * @IWL_D3_PROTO_OFFLOAD_NS: NS (Neighbor Solicitation) is enabled
48  * @IWL_D3_PROTO_IPV4_VALID: IPv4 data is valid
49  * @IWL_D3_PROTO_IPV6_VALID: IPv6 data is valid
50  * @IWL_D3_PROTO_REJECT_BTM: reject BTM request
51  */
52 enum iwl_proto_offloads {
53 	IWL_D3_PROTO_OFFLOAD_ARP = BIT(0),
54 	IWL_D3_PROTO_OFFLOAD_NS = BIT(1),
55 	IWL_D3_PROTO_IPV4_VALID = BIT(2),
56 	IWL_D3_PROTO_IPV6_VALID = BIT(3),
57 	IWL_D3_PROTO_REJECT_BTM = BIT(4),
58 };
59 
60 #define IWL_PROTO_OFFLOAD_NUM_IPV6_ADDRS_V1	2
61 #define IWL_PROTO_OFFLOAD_NUM_IPV6_ADDRS_V2	6
62 #define IWL_PROTO_OFFLOAD_NUM_IPV6_ADDRS_V3L	12
63 #define IWL_PROTO_OFFLOAD_NUM_IPV6_ADDRS_V3S	4
64 #define IWL_PROTO_OFFLOAD_NUM_IPV6_ADDRS_MAX	12
65 
66 #define IWL_PROTO_OFFLOAD_NUM_NS_CONFIG_V3L	4
67 #define IWL_PROTO_OFFLOAD_NUM_NS_CONFIG_V3S	2
68 
69 /**
70  * struct iwl_proto_offload_cmd_common - ARP/NS offload common part
71  * @enabled: enable flags
72  * @remote_ipv4_addr: remote address to answer to (or zero if all)
73  * @host_ipv4_addr: our IPv4 address to respond to queries for
74  * @arp_mac_addr: our MAC address for ARP responses
75  * @reserved: unused
76  */
77 struct iwl_proto_offload_cmd_common {
78 	__le32 enabled;
79 	__be32 remote_ipv4_addr;
80 	__be32 host_ipv4_addr;
81 	u8 arp_mac_addr[ETH_ALEN];
82 	__le16 reserved;
83 } __packed;
84 
85 /**
86  * struct iwl_proto_offload_cmd_v1 - ARP/NS offload configuration
87  * @common: common/IPv4 configuration
88  * @remote_ipv6_addr: remote address to answer to (or zero if all)
89  * @solicited_node_ipv6_addr: broken -- solicited node address exists
90  *	for each target address
91  * @target_ipv6_addr: our target addresses
92  * @ndp_mac_addr: neighbor solicitation response MAC address
93  * @reserved2: reserved
94  */
95 struct iwl_proto_offload_cmd_v1 {
96 	struct iwl_proto_offload_cmd_common common;
97 	u8 remote_ipv6_addr[16];
98 	u8 solicited_node_ipv6_addr[16];
99 	u8 target_ipv6_addr[IWL_PROTO_OFFLOAD_NUM_IPV6_ADDRS_V1][16];
100 	u8 ndp_mac_addr[ETH_ALEN];
101 	__le16 reserved2;
102 } __packed; /* PROT_OFFLOAD_CONFIG_CMD_DB_S_VER_1 */
103 
104 /**
105  * struct iwl_proto_offload_cmd_v2 - ARP/NS offload configuration
106  * @common: common/IPv4 configuration
107  * @remote_ipv6_addr: remote address to answer to (or zero if all)
108  * @solicited_node_ipv6_addr: broken -- solicited node address exists
109  *	for each target address
110  * @target_ipv6_addr: our target addresses
111  * @ndp_mac_addr: neighbor solicitation response MAC address
112  * @num_valid_ipv6_addrs: number of valid IPv6 addresses
113  * @reserved2: reserved
114  */
115 struct iwl_proto_offload_cmd_v2 {
116 	struct iwl_proto_offload_cmd_common common;
117 	u8 remote_ipv6_addr[16];
118 	u8 solicited_node_ipv6_addr[16];
119 	u8 target_ipv6_addr[IWL_PROTO_OFFLOAD_NUM_IPV6_ADDRS_V2][16];
120 	u8 ndp_mac_addr[ETH_ALEN];
121 	u8 num_valid_ipv6_addrs;
122 	u8 reserved2[3];
123 } __packed; /* PROT_OFFLOAD_CONFIG_CMD_DB_S_VER_2 */
124 
125 struct iwl_ns_config {
126 	struct in6_addr source_ipv6_addr;
127 	struct in6_addr dest_ipv6_addr;
128 	u8 target_mac_addr[ETH_ALEN];
129 	__le16 reserved;
130 } __packed; /* NS_OFFLOAD_CONFIG */
131 
132 struct iwl_targ_addr {
133 	struct in6_addr addr;
134 	__le32 config_num;
135 } __packed; /* TARGET_IPV6_ADDRESS */
136 
137 /**
138  * struct iwl_proto_offload_cmd_v3_small - ARP/NS offload configuration
139  * @common: common/IPv4 configuration
140  * @num_valid_ipv6_addrs: number of valid IPv6 addresses
141  * @targ_addrs: target IPv6 addresses
142  * @ns_config: NS offload configurations
143  */
144 struct iwl_proto_offload_cmd_v3_small {
145 	struct iwl_proto_offload_cmd_common common;
146 	__le32 num_valid_ipv6_addrs;
147 	struct iwl_targ_addr targ_addrs[IWL_PROTO_OFFLOAD_NUM_IPV6_ADDRS_V3S];
148 	struct iwl_ns_config ns_config[IWL_PROTO_OFFLOAD_NUM_NS_CONFIG_V3S];
149 } __packed; /* PROT_OFFLOAD_CONFIG_CMD_DB_S_VER_3 */
150 
151 /**
152  * struct iwl_proto_offload_cmd_v3_large - ARP/NS offload configuration
153  * @common: common/IPv4 configuration
154  * @num_valid_ipv6_addrs: number of valid IPv6 addresses
155  * @targ_addrs: target IPv6 addresses
156  * @ns_config: NS offload configurations
157  */
158 struct iwl_proto_offload_cmd_v3_large {
159 	struct iwl_proto_offload_cmd_common common;
160 	__le32 num_valid_ipv6_addrs;
161 	struct iwl_targ_addr targ_addrs[IWL_PROTO_OFFLOAD_NUM_IPV6_ADDRS_V3L];
162 	struct iwl_ns_config ns_config[IWL_PROTO_OFFLOAD_NUM_NS_CONFIG_V3L];
163 } __packed; /* PROT_OFFLOAD_CONFIG_CMD_DB_S_VER_3 */
164 
165 /**
166  * struct iwl_proto_offload_cmd_v4 - ARP/NS offload configuration
167  * @sta_id: station id
168  * @common: common/IPv4 configuration
169  * @num_valid_ipv6_addrs: number of valid IPv6 addresses
170  * @targ_addrs: target IPv6 addresses
171  * @ns_config: NS offload configurations
172  */
173 struct iwl_proto_offload_cmd_v4 {
174 	__le32 sta_id;
175 	struct iwl_proto_offload_cmd_common common;
176 	__le32 num_valid_ipv6_addrs;
177 	struct iwl_targ_addr targ_addrs[IWL_PROTO_OFFLOAD_NUM_IPV6_ADDRS_V3L];
178 	struct iwl_ns_config ns_config[IWL_PROTO_OFFLOAD_NUM_NS_CONFIG_V3L];
179 } __packed; /* PROT_OFFLOAD_CONFIG_CMD_DB_S_VER_4 */
180 
181 /*
182  * WOWLAN_PATTERNS
183  */
184 #define IWL_WOWLAN_MIN_PATTERN_LEN	16
185 #define IWL_WOWLAN_MAX_PATTERN_LEN	128
186 
187 struct iwl_wowlan_pattern_v1 {
188 	u8 mask[IWL_WOWLAN_MAX_PATTERN_LEN / 8];
189 	u8 pattern[IWL_WOWLAN_MAX_PATTERN_LEN];
190 	u8 mask_size;
191 	u8 pattern_size;
192 	__le16 reserved;
193 } __packed; /* WOWLAN_PATTERN_API_S_VER_1 */
194 
195 #define IWL_WOWLAN_MAX_PATTERNS	20
196 
197 /**
198  * struct iwl_wowlan_patterns_cmd - WoWLAN wakeup patterns
199  */
200 struct iwl_wowlan_patterns_cmd_v1 {
201 	/**
202 	 * @n_patterns: number of patterns
203 	 */
204 	__le32 n_patterns;
205 
206 	/**
207 	 * @patterns: the patterns, array length in @n_patterns
208 	 */
209 	struct iwl_wowlan_pattern_v1 patterns[];
210 } __packed; /* WOWLAN_PATTERN_ARRAY_API_S_VER_1 */
211 
212 #define IPV4_ADDR_SIZE	4
213 #define IPV6_ADDR_SIZE	16
214 
215 enum iwl_wowlan_pattern_type {
216 	WOWLAN_PATTERN_TYPE_BITMASK,
217 	WOWLAN_PATTERN_TYPE_IPV4_TCP_SYN,
218 	WOWLAN_PATTERN_TYPE_IPV6_TCP_SYN,
219 	WOWLAN_PATTERN_TYPE_IPV4_TCP_SYN_WILDCARD,
220 	WOWLAN_PATTERN_TYPE_IPV6_TCP_SYN_WILDCARD,
221 }; /* WOWLAN_PATTERN_TYPE_API_E_VER_1 */
222 
223 /**
224  * struct iwl_wowlan_ipv4_tcp_syn - WoWLAN IPv4 TCP SYN pattern data
225  */
226 struct iwl_wowlan_ipv4_tcp_syn {
227 	/**
228 	 * @src_addr: source IP address to match
229 	 */
230 	u8 src_addr[IPV4_ADDR_SIZE];
231 
232 	/**
233 	 * @dst_addr: destination IP address to match
234 	 */
235 	u8 dst_addr[IPV4_ADDR_SIZE];
236 
237 	/**
238 	 * @src_port: source TCP port to match
239 	 */
240 	__le16 src_port;
241 
242 	/**
243 	 * @dst_port: destination TCP port to match
244 	 */
245 	__le16 dst_port;
246 } __packed; /* WOWLAN_IPV4_TCP_SYN_API_S_VER_1 */
247 
248 /**
249  * struct iwl_wowlan_ipv6_tcp_syn - WoWLAN Ipv6 TCP SYN pattern data
250  */
251 struct iwl_wowlan_ipv6_tcp_syn {
252 	/**
253 	 * @src_addr: source IP address to match
254 	 */
255 	u8 src_addr[IPV6_ADDR_SIZE];
256 
257 	/**
258 	 * @dst_addr: destination IP address to match
259 	 */
260 	u8 dst_addr[IPV6_ADDR_SIZE];
261 
262 	/**
263 	 * @src_port: source TCP port to match
264 	 */
265 	__le16 src_port;
266 
267 	/**
268 	 * @dst_port: destination TCP port to match
269 	 */
270 	__le16 dst_port;
271 } __packed; /* WOWLAN_IPV6_TCP_SYN_API_S_VER_1 */
272 
273 /**
274  * union iwl_wowlan_pattern_data - Data for the different pattern types
275  *
276  * If wildcard addresses/ports are to be used, the union can be left
277  * undefined.
278  */
279 union iwl_wowlan_pattern_data {
280 	/**
281 	 * @bitmask: bitmask pattern data
282 	 */
283 	struct iwl_wowlan_pattern_v1 bitmask;
284 
285 	/**
286 	 * @ipv4_tcp_syn: IPv4 TCP SYN pattern data
287 	 */
288 	struct iwl_wowlan_ipv4_tcp_syn ipv4_tcp_syn;
289 
290 	/**
291 	 * @ipv6_tcp_syn: IPv6 TCP SYN pattern data
292 	 */
293 	struct iwl_wowlan_ipv6_tcp_syn ipv6_tcp_syn;
294 }; /* WOWLAN_PATTERN_API_U_VER_1 */
295 
296 /**
297  * struct iwl_wowlan_pattern_v2 - Pattern entry for the WoWLAN wakeup patterns
298  */
299 struct iwl_wowlan_pattern_v2 {
300 	/**
301 	 * @pattern_type: defines the struct type to be used in the union
302 	 */
303 	u8 pattern_type;
304 
305 	/**
306 	 * @reserved: reserved for alignment
307 	 */
308 	u8 reserved[3];
309 
310 	/**
311 	 * @u: the union containing the match data, or undefined for
312 	 *     wildcard matches
313 	 */
314 	union iwl_wowlan_pattern_data u;
315 } __packed; /* WOWLAN_PATTERN_API_S_VER_2 */
316 
317 /**
318  * struct iwl_wowlan_patterns_cmd - WoWLAN wakeup patterns command
319  */
320 struct iwl_wowlan_patterns_cmd {
321 	/**
322 	 * @n_patterns: number of patterns
323 	 */
324 	u8 n_patterns;
325 
326 	/**
327 	 * @n_patterns: sta_id
328 	 */
329 	u8 sta_id;
330 
331 	/**
332 	 * @reserved: reserved for alignment
333 	 */
334 	__le16 reserved;
335 
336 	/**
337 	 * @patterns: the patterns, array length in @n_patterns
338 	 */
339 	struct iwl_wowlan_pattern_v2 patterns[];
340 } __packed; /* WOWLAN_PATTERN_ARRAY_API_S_VER_3 */
341 
342 enum iwl_wowlan_wakeup_filters {
343 	IWL_WOWLAN_WAKEUP_MAGIC_PACKET			= BIT(0),
344 	IWL_WOWLAN_WAKEUP_PATTERN_MATCH			= BIT(1),
345 	IWL_WOWLAN_WAKEUP_BEACON_MISS			= BIT(2),
346 	IWL_WOWLAN_WAKEUP_LINK_CHANGE			= BIT(3),
347 	IWL_WOWLAN_WAKEUP_GTK_REKEY_FAIL		= BIT(4),
348 	IWL_WOWLAN_WAKEUP_EAP_IDENT_REQ			= BIT(5),
349 	IWL_WOWLAN_WAKEUP_4WAY_HANDSHAKE		= BIT(6),
350 	IWL_WOWLAN_WAKEUP_ENABLE_NET_DETECT		= BIT(7),
351 	IWL_WOWLAN_WAKEUP_RF_KILL_DEASSERT		= BIT(8),
352 	IWL_WOWLAN_WAKEUP_REMOTE_LINK_LOSS		= BIT(9),
353 	IWL_WOWLAN_WAKEUP_REMOTE_SIGNATURE_TABLE	= BIT(10),
354 	IWL_WOWLAN_WAKEUP_REMOTE_TCP_EXTERNAL		= BIT(11),
355 	IWL_WOWLAN_WAKEUP_REMOTE_WAKEUP_PACKET		= BIT(12),
356 	IWL_WOWLAN_WAKEUP_IOAC_MAGIC_PACKET		= BIT(13),
357 	IWL_WOWLAN_WAKEUP_HOST_TIMER			= BIT(14),
358 	IWL_WOWLAN_WAKEUP_RX_FRAME			= BIT(15),
359 	IWL_WOWLAN_WAKEUP_BCN_FILTERING			= BIT(16),
360 }; /* WOWLAN_WAKEUP_FILTER_API_E_VER_4 */
361 
362 enum iwl_wowlan_flags {
363 	IS_11W_ASSOC		= BIT(0),
364 	ENABLE_L3_FILTERING	= BIT(1),
365 	ENABLE_NBNS_FILTERING	= BIT(2),
366 	ENABLE_DHCP_FILTERING	= BIT(3),
367 	ENABLE_STORE_BEACON	= BIT(4),
368 };
369 
370 /**
371  * struct iwl_wowlan_config_cmd - WoWLAN configuration (versions 5 and 6)
372  * @wakeup_filter: filter from &enum iwl_wowlan_wakeup_filters
373  * @non_qos_seq: non-QoS sequence counter to use next.
374  *               Reserved if the struct has version >= 6.
375  * @qos_seq: QoS sequence counters to use next
376  * @wowlan_ba_teardown_tids: bitmap of BA sessions to tear down
377  * @is_11n_connection: indicates HT connection
378  * @offloading_tid: TID reserved for firmware use
379  * @flags: extra flags, see &enum iwl_wowlan_flags
380  * @sta_id: station ID for wowlan.
381  * @reserved: reserved
382  */
383 struct iwl_wowlan_config_cmd {
384 	__le32 wakeup_filter;
385 	__le16 non_qos_seq;
386 	__le16 qos_seq[8];
387 	u8 wowlan_ba_teardown_tids;
388 	u8 is_11n_connection;
389 	u8 offloading_tid;
390 	u8 flags;
391 	u8 sta_id;
392 	u8 reserved;
393 } __packed; /* WOWLAN_CONFIG_API_S_VER_5 */
394 
395 #define IWL_NUM_RSC	16
396 #define WOWLAN_KEY_MAX_SIZE	32
397 #define WOWLAN_GTK_KEYS_NUM     2
398 #define WOWLAN_IGTK_KEYS_NUM	2
399 
400 /*
401  * WOWLAN_TSC_RSC_PARAMS
402  */
403 struct tkip_sc {
404 	__le16 iv16;
405 	__le16 pad;
406 	__le32 iv32;
407 } __packed; /* TKIP_SC_API_U_VER_1 */
408 
409 struct iwl_tkip_rsc_tsc {
410 	struct tkip_sc unicast_rsc[IWL_NUM_RSC];
411 	struct tkip_sc multicast_rsc[IWL_NUM_RSC];
412 	struct tkip_sc tsc;
413 } __packed; /* TKIP_TSC_RSC_API_S_VER_1 */
414 
415 struct aes_sc {
416 	__le64 pn;
417 } __packed; /* TKIP_AES_SC_API_U_VER_1 */
418 
419 struct iwl_aes_rsc_tsc {
420 	struct aes_sc unicast_rsc[IWL_NUM_RSC];
421 	struct aes_sc multicast_rsc[IWL_NUM_RSC];
422 	struct aes_sc tsc;
423 } __packed; /* AES_TSC_RSC_API_S_VER_1 */
424 
425 union iwl_all_tsc_rsc {
426 	struct iwl_tkip_rsc_tsc tkip;
427 	struct iwl_aes_rsc_tsc aes;
428 }; /* ALL_TSC_RSC_API_S_VER_2 */
429 
430 struct iwl_wowlan_rsc_tsc_params_cmd_ver_2 {
431 	union iwl_all_tsc_rsc all_tsc_rsc;
432 } __packed; /* ALL_TSC_RSC_API_S_VER_2 */
433 
434 struct iwl_wowlan_rsc_tsc_params_cmd_v4 {
435 	struct iwl_wowlan_rsc_tsc_params_cmd_ver_2 params;
436 	__le32 sta_id;
437 } __packed; /* ALL_TSC_RSC_API_S_VER_4 */
438 
439 struct iwl_wowlan_rsc_tsc_params_cmd {
440 	__le64 ucast_rsc[IWL_MAX_TID_COUNT];
441 	__le64 mcast_rsc[WOWLAN_GTK_KEYS_NUM][IWL_MAX_TID_COUNT];
442 	__le32 sta_id;
443 #define IWL_MCAST_KEY_MAP_INVALID	0xff
444 	u8 mcast_key_id_map[4];
445 } __packed; /* ALL_TSC_RSC_API_S_VER_5 */
446 
447 #define IWL_MIC_KEY_SIZE	8
448 struct iwl_mic_keys {
449 	u8 tx[IWL_MIC_KEY_SIZE];
450 	u8 rx_unicast[IWL_MIC_KEY_SIZE];
451 	u8 rx_mcast[IWL_MIC_KEY_SIZE];
452 } __packed; /* MIC_KEYS_API_S_VER_1 */
453 
454 #define IWL_P1K_SIZE		5
455 struct iwl_p1k_cache {
456 	__le16 p1k[IWL_P1K_SIZE];
457 } __packed;
458 
459 #define IWL_NUM_RX_P1K_CACHE	2
460 
461 struct iwl_wowlan_tkip_params_cmd_ver_1 {
462 	struct iwl_mic_keys mic_keys;
463 	struct iwl_p1k_cache tx;
464 	struct iwl_p1k_cache rx_uni[IWL_NUM_RX_P1K_CACHE];
465 	struct iwl_p1k_cache rx_multi[IWL_NUM_RX_P1K_CACHE];
466 } __packed; /* WOWLAN_TKIP_SETTING_API_S_VER_1 */
467 
468 struct iwl_wowlan_tkip_params_cmd {
469 	struct iwl_mic_keys mic_keys;
470 	struct iwl_p1k_cache tx;
471 	struct iwl_p1k_cache rx_uni[IWL_NUM_RX_P1K_CACHE];
472 	struct iwl_p1k_cache rx_multi[IWL_NUM_RX_P1K_CACHE];
473 	u8     reversed[2];
474 	__le32 sta_id;
475 } __packed; /* WOWLAN_TKIP_SETTING_API_S_VER_2 */
476 
477 #define IWL_KCK_MAX_SIZE	32
478 #define IWL_KEK_MAX_SIZE	32
479 
480 struct iwl_wowlan_kek_kck_material_cmd_v2 {
481 	u8	kck[IWL_KCK_MAX_SIZE];
482 	u8	kek[IWL_KEK_MAX_SIZE];
483 	__le16	kck_len;
484 	__le16	kek_len;
485 	__le64	replay_ctr;
486 } __packed; /* KEK_KCK_MATERIAL_API_S_VER_2 */
487 
488 struct iwl_wowlan_kek_kck_material_cmd_v3 {
489 	u8	kck[IWL_KCK_MAX_SIZE];
490 	u8	kek[IWL_KEK_MAX_SIZE];
491 	__le16	kck_len;
492 	__le16	kek_len;
493 	__le64	replay_ctr;
494 	__le32  akm;
495 	__le32  gtk_cipher;
496 	__le32  igtk_cipher;
497 	__le32  bigtk_cipher;
498 } __packed; /* KEK_KCK_MATERIAL_API_S_VER_3 */
499 
500 struct iwl_wowlan_kek_kck_material_cmd_v4 {
501 	__le32  sta_id;
502 	u8	kck[IWL_KCK_MAX_SIZE];
503 	u8	kek[IWL_KEK_MAX_SIZE];
504 	__le16	kck_len;
505 	__le16	kek_len;
506 	__le64	replay_ctr;
507 	__le32  akm;
508 	__le32  gtk_cipher;
509 	__le32  igtk_cipher;
510 	__le32  bigtk_cipher;
511 } __packed; /* KEK_KCK_MATERIAL_API_S_VER_4 */
512 
513 struct iwl_wowlan_get_status_cmd {
514 	__le32  sta_id;
515 } __packed; /* WOWLAN_GET_STATUSES_CMD_API_S_VER_1 */
516 
517 #define RF_KILL_INDICATOR_FOR_WOWLAN	0x87
518 
519 enum iwl_wowlan_rekey_status {
520 	IWL_WOWLAN_REKEY_POST_REKEY = 0,
521 	IWL_WOWLAN_REKEY_WHILE_REKEY = 1,
522 }; /* WOWLAN_REKEY_STATUS_API_E_VER_1 */
523 
524 enum iwl_wowlan_wakeup_reason {
525 	IWL_WOWLAN_WAKEUP_BY_NON_WIRELESS			= 0,
526 	IWL_WOWLAN_WAKEUP_BY_MAGIC_PACKET			= BIT(0),
527 	IWL_WOWLAN_WAKEUP_BY_PATTERN				= BIT(1),
528 	IWL_WOWLAN_WAKEUP_BY_DISCONNECTION_ON_MISSED_BEACON	= BIT(2),
529 	IWL_WOWLAN_WAKEUP_BY_DISCONNECTION_ON_DEAUTH		= BIT(3),
530 	IWL_WOWLAN_WAKEUP_BY_GTK_REKEY_FAILURE			= BIT(4),
531 	IWL_WOWLAN_WAKEUP_BY_RFKILL_DEASSERTED			= BIT(5),
532 	IWL_WOWLAN_WAKEUP_BY_UCODE_ERROR			= BIT(6),
533 	IWL_WOWLAN_WAKEUP_BY_EAPOL_REQUEST			= BIT(7),
534 	IWL_WOWLAN_WAKEUP_BY_FOUR_WAY_HANDSHAKE			= BIT(8),
535 	IWL_WOWLAN_WAKEUP_BY_REM_WAKE_LINK_LOSS			= BIT(9),
536 	IWL_WOWLAN_WAKEUP_BY_REM_WAKE_SIGNATURE_TABLE		= BIT(10),
537 	IWL_WOWLAN_WAKEUP_BY_REM_WAKE_TCP_EXTERNAL		= BIT(11),
538 	IWL_WOWLAN_WAKEUP_BY_REM_WAKE_WAKEUP_PACKET		= BIT(12),
539 	IWL_WOWLAN_WAKEUP_BY_IOAC_MAGIC_PACKET			= BIT(13),
540 	IWL_WOWLAN_WAKEUP_BY_D3_WAKEUP_HOST_TIMER		= BIT(14),
541 	IWL_WOWLAN_WAKEUP_BY_RXFRAME_FILTERED_IN		= BIT(15),
542 	IWL_WOWLAN_WAKEUP_BY_BEACON_FILTERED_IN			= BIT(16),
543 	IWL_WAKEUP_BY_11W_UNPROTECTED_DEAUTH_OR_DISASSOC	= BIT(17),
544 	IWL_WAKEUP_BY_PATTERN_IPV4_TCP_SYN			= BIT(18),
545 	IWL_WAKEUP_BY_PATTERN_IPV4_TCP_SYN_WILDCARD		= BIT(19),
546 	IWL_WAKEUP_BY_PATTERN_IPV6_TCP_SYN			= BIT(20),
547 	IWL_WAKEUP_BY_PATTERN_IPV6_TCP_SYN_WILDCARD		= BIT(21),
548 }; /* WOWLAN_WAKE_UP_REASON_API_E_VER_2 */
549 
550 struct iwl_wowlan_gtk_status_v1 {
551 	u8 key_index;
552 	u8 reserved[3];
553 	u8 decrypt_key[16];
554 	u8 tkip_mic_key[8];
555 	struct iwl_wowlan_rsc_tsc_params_cmd_ver_2 rsc;
556 } __packed; /* WOWLAN_GTK_MATERIAL_VER_1 */
557 
558 /**
559  * struct iwl_wowlan_gtk_status_v2 - GTK status
560  * @key: GTK material
561  * @key_len: GTK legth, if set to 0, the key is not available
562  * @key_flags: information about the key:
563  *	bits[0:1]:  key index assigned by the AP
564  *	bits[2:6]:  GTK index of the key in the internal DB
565  *	bit[7]:     Set iff this is the currently used GTK
566  * @reserved: padding
567  * @tkip_mic_key: TKIP RX MIC key
568  * @rsc: TSC RSC counters
569  */
570 struct iwl_wowlan_gtk_status_v2 {
571 	u8 key[WOWLAN_KEY_MAX_SIZE];
572 	u8 key_len;
573 	u8 key_flags;
574 	u8 reserved[2];
575 	u8 tkip_mic_key[8];
576 	struct iwl_wowlan_rsc_tsc_params_cmd_ver_2 rsc;
577 } __packed; /* WOWLAN_GTK_MATERIAL_VER_2 */
578 
579 /**
580  * struct iwl_wowlan_all_rsc_tsc_v5 - key counters
581  * @ucast_rsc: unicast RSC values
582  * @mcast_rsc: multicast RSC values (per key map value)
583  * @sta_id: station ID
584  * @mcast_key_id_map: map of key id to @mcast_rsc entry
585  */
586 struct iwl_wowlan_all_rsc_tsc_v5 {
587 	__le64 ucast_rsc[IWL_MAX_TID_COUNT];
588 	__le64 mcast_rsc[2][IWL_MAX_TID_COUNT];
589 	__le32 sta_id;
590 	u8 mcast_key_id_map[4];
591 } __packed; /* ALL_TSC_RSC_API_S_VER_5 */
592 
593 /**
594  * struct iwl_wowlan_gtk_status_v3 - GTK status
595  * @key: GTK material
596  * @key_len: GTK length, if set to 0, the key is not available
597  * @key_flags: information about the key:
598  *	bits[0:1]:  key index assigned by the AP
599  *	bits[2:6]:  GTK index of the key in the internal DB
600  *	bit[7]:     Set iff this is the currently used GTK
601  * @reserved: padding
602  * @tkip_mic_key: TKIP RX MIC key
603  * @sc: RSC/TSC counters
604  */
605 struct iwl_wowlan_gtk_status_v3 {
606 	u8 key[WOWLAN_KEY_MAX_SIZE];
607 	u8 key_len;
608 	u8 key_flags;
609 	u8 reserved[2];
610 	u8 tkip_mic_key[IWL_MIC_KEY_SIZE];
611 	struct iwl_wowlan_all_rsc_tsc_v5 sc;
612 } __packed; /* WOWLAN_GTK_MATERIAL_VER_3 */
613 
614 #define IWL_WOWLAN_GTK_IDX_MASK		(BIT(0) | BIT(1))
615 
616 /**
617  * struct iwl_wowlan_igtk_status - IGTK status
618  * @key: IGTK material
619  * @ipn: the IGTK packet number (replay counter)
620  * @key_len: IGTK length, if set to 0, the key is not available
621  * @key_flags: information about the key:
622  *	bits[0]:    key index assigned by the AP (0: index 4, 1: index 5)
623  *	bits[1:5]:  IGTK index of the key in the internal DB
624  *	bit[6]:     Set iff this is the currently used IGTK
625  */
626 struct iwl_wowlan_igtk_status {
627 	u8 key[WOWLAN_KEY_MAX_SIZE];
628 	u8 ipn[6];
629 	u8 key_len;
630 	u8 key_flags;
631 } __packed; /* WOWLAN_IGTK_MATERIAL_VER_1 */
632 
633 /**
634  * struct iwl_wowlan_status_v6 - WoWLAN status
635  * @gtk: GTK data
636  * @replay_ctr: GTK rekey replay counter
637  * @pattern_number: number of the matched pattern
638  * @non_qos_seq_ctr: non-QoS sequence counter to use next
639  * @qos_seq_ctr: QoS sequence counters to use next
640  * @wakeup_reasons: wakeup reasons, see &enum iwl_wowlan_wakeup_reason
641  * @num_of_gtk_rekeys: number of GTK rekeys
642  * @transmitted_ndps: number of transmitted neighbor discovery packets
643  * @received_beacons: number of received beacons
644  * @wake_packet_length: wakeup packet length
645  * @wake_packet_bufsize: wakeup packet buffer size
646  * @wake_packet: wakeup packet
647  */
648 struct iwl_wowlan_status_v6 {
649 	struct iwl_wowlan_gtk_status_v1 gtk;
650 	__le64 replay_ctr;
651 	__le16 pattern_number;
652 	__le16 non_qos_seq_ctr;
653 	__le16 qos_seq_ctr[8];
654 	__le32 wakeup_reasons;
655 	__le32 num_of_gtk_rekeys;
656 	__le32 transmitted_ndps;
657 	__le32 received_beacons;
658 	__le32 wake_packet_length;
659 	__le32 wake_packet_bufsize;
660 	u8 wake_packet[]; /* can be truncated from _length to _bufsize */
661 } __packed; /* WOWLAN_STATUSES_API_S_VER_6 */
662 
663 /**
664  * struct iwl_wowlan_status_v7 - WoWLAN status
665  * @gtk: GTK data
666  * @igtk: IGTK data
667  * @replay_ctr: GTK rekey replay counter
668  * @pattern_number: number of the matched pattern
669  * @non_qos_seq_ctr: non-QoS sequence counter to use next
670  * @qos_seq_ctr: QoS sequence counters to use next
671  * @wakeup_reasons: wakeup reasons, see &enum iwl_wowlan_wakeup_reason
672  * @num_of_gtk_rekeys: number of GTK rekeys
673  * @transmitted_ndps: number of transmitted neighbor discovery packets
674  * @received_beacons: number of received beacons
675  * @wake_packet_length: wakeup packet length
676  * @wake_packet_bufsize: wakeup packet buffer size
677  * @wake_packet: wakeup packet
678  */
679 struct iwl_wowlan_status_v7 {
680 	struct iwl_wowlan_gtk_status_v2 gtk[WOWLAN_GTK_KEYS_NUM];
681 	struct iwl_wowlan_igtk_status igtk[WOWLAN_IGTK_KEYS_NUM];
682 	__le64 replay_ctr;
683 	__le16 pattern_number;
684 	__le16 non_qos_seq_ctr;
685 	__le16 qos_seq_ctr[8];
686 	__le32 wakeup_reasons;
687 	__le32 num_of_gtk_rekeys;
688 	__le32 transmitted_ndps;
689 	__le32 received_beacons;
690 	__le32 wake_packet_length;
691 	__le32 wake_packet_bufsize;
692 	u8 wake_packet[]; /* can be truncated from _length to _bufsize */
693 } __packed; /* WOWLAN_STATUSES_API_S_VER_7 */
694 
695 /**
696  * struct iwl_wowlan_status_v9 - WoWLAN status (versions 9 and 10)
697  * @gtk: GTK data
698  * @igtk: IGTK data
699  * @replay_ctr: GTK rekey replay counter
700  * @pattern_number: number of the matched pattern
701  * @non_qos_seq_ctr: non-QoS sequence counter to use next.
702  *                   Reserved if the struct has version >= 10.
703  * @qos_seq_ctr: QoS sequence counters to use next
704  * @wakeup_reasons: wakeup reasons, see &enum iwl_wowlan_wakeup_reason
705  * @num_of_gtk_rekeys: number of GTK rekeys
706  * @transmitted_ndps: number of transmitted neighbor discovery packets
707  * @received_beacons: number of received beacons
708  * @wake_packet_length: wakeup packet length
709  * @wake_packet_bufsize: wakeup packet buffer size
710  * @tid_tear_down: bit mask of tids whose BA sessions were closed
711  *		   in suspend state
712  * @reserved: unused
713  * @wake_packet: wakeup packet
714  */
715 struct iwl_wowlan_status_v9 {
716 	struct iwl_wowlan_gtk_status_v2 gtk[WOWLAN_GTK_KEYS_NUM];
717 	struct iwl_wowlan_igtk_status igtk[WOWLAN_IGTK_KEYS_NUM];
718 	__le64 replay_ctr;
719 	__le16 pattern_number;
720 	__le16 non_qos_seq_ctr;
721 	__le16 qos_seq_ctr[8];
722 	__le32 wakeup_reasons;
723 	__le32 num_of_gtk_rekeys;
724 	__le32 transmitted_ndps;
725 	__le32 received_beacons;
726 	__le32 wake_packet_length;
727 	__le32 wake_packet_bufsize;
728 	u8 tid_tear_down;
729 	u8 reserved[3];
730 	u8 wake_packet[]; /* can be truncated from _length to _bufsize */
731 } __packed; /* WOWLAN_STATUSES_RSP_API_S_VER_9 */
732 
733 /**
734  * struct iwl_wowlan_status_v12 - WoWLAN status
735  * @gtk: GTK data
736  * @igtk: IGTK data
737  * @replay_ctr: GTK rekey replay counter
738  * @pattern_number: number of the matched pattern
739  * @non_qos_seq_ctr: non-QoS sequence counter to use next.
740  *                   Reserved if the struct has version >= 10.
741  * @qos_seq_ctr: QoS sequence counters to use next
742  * @wakeup_reasons: wakeup reasons, see &enum iwl_wowlan_wakeup_reason
743  * @num_of_gtk_rekeys: number of GTK rekeys
744  * @transmitted_ndps: number of transmitted neighbor discovery packets
745  * @received_beacons: number of received beacons
746  * @wake_packet_length: wakeup packet length
747  * @wake_packet_bufsize: wakeup packet buffer size
748  * @tid_tear_down: bit mask of tids whose BA sessions were closed
749  *		   in suspend state
750  * @reserved: unused
751  * @wake_packet: wakeup packet
752  */
753 struct iwl_wowlan_status_v12 {
754 	struct iwl_wowlan_gtk_status_v3 gtk[WOWLAN_GTK_KEYS_NUM];
755 	struct iwl_wowlan_igtk_status igtk[WOWLAN_IGTK_KEYS_NUM];
756 	__le64 replay_ctr;
757 	__le16 pattern_number;
758 	__le16 non_qos_seq_ctr;
759 	__le16 qos_seq_ctr[8];
760 	__le32 wakeup_reasons;
761 	__le32 num_of_gtk_rekeys;
762 	__le32 transmitted_ndps;
763 	__le32 received_beacons;
764 	__le32 wake_packet_length;
765 	__le32 wake_packet_bufsize;
766 	u8 tid_tear_down;
767 	u8 reserved[3];
768 	u8 wake_packet[]; /* can be truncated from _length to _bufsize */
769 } __packed; /* WOWLAN_STATUSES_RSP_API_S_VER_12 */
770 
771 /**
772  * struct iwl_wowlan_info_notif_v1 - WoWLAN information notification
773  * @gtk: GTK data
774  * @igtk: IGTK data
775  * @replay_ctr: GTK rekey replay counter
776  * @pattern_number: number of the matched patterns
777  * @reserved1: reserved
778  * @qos_seq_ctr: QoS sequence counters to use next
779  * @wakeup_reasons: wakeup reasons, see &enum iwl_wowlan_wakeup_reason
780  * @num_of_gtk_rekeys: number of GTK rekeys
781  * @transmitted_ndps: number of transmitted neighbor discovery packets
782  * @received_beacons: number of received beacons
783  * @wake_packet_length: wakeup packet length
784  * @wake_packet_bufsize: wakeup packet buffer size
785  * @tid_tear_down: bit mask of tids whose BA sessions were closed
786  *	in suspend state
787  * @station_id: station id
788  * @reserved2: reserved
789  */
790 struct iwl_wowlan_info_notif_v1 {
791 	struct iwl_wowlan_gtk_status_v3 gtk[WOWLAN_GTK_KEYS_NUM];
792 	struct iwl_wowlan_igtk_status igtk[WOWLAN_IGTK_KEYS_NUM];
793 	__le64 replay_ctr;
794 	__le16 pattern_number;
795 	__le16 reserved1;
796 	__le16 qos_seq_ctr[8];
797 	__le32 wakeup_reasons;
798 	__le32 num_of_gtk_rekeys;
799 	__le32 transmitted_ndps;
800 	__le32 received_beacons;
801 	__le32 wake_packet_length;
802 	__le32 wake_packet_bufsize;
803 	u8 tid_tear_down;
804 	u8 station_id;
805 	u8 reserved2[2];
806 } __packed; /* WOWLAN_INFO_NTFY_API_S_VER_1 */
807 
808 /**
809  * struct iwl_wowlan_info_notif - WoWLAN information notification
810  * @gtk: GTK data
811  * @igtk: IGTK data
812  * @replay_ctr: GTK rekey replay counter
813  * @pattern_number: number of the matched patterns
814  * @reserved1: reserved
815  * @qos_seq_ctr: QoS sequence counters to use next
816  * @wakeup_reasons: wakeup reasons, see &enum iwl_wowlan_wakeup_reason
817  * @num_of_gtk_rekeys: number of GTK rekeys
818  * @transmitted_ndps: number of transmitted neighbor discovery packets
819  * @received_beacons: number of received beacons
820  * @tid_tear_down: bit mask of tids whose BA sessions were closed
821  *	in suspend state
822  * @station_id: station id
823  * @reserved2: reserved
824  */
825 struct iwl_wowlan_info_notif {
826 	struct iwl_wowlan_gtk_status_v3 gtk[WOWLAN_GTK_KEYS_NUM];
827 	struct iwl_wowlan_igtk_status igtk[WOWLAN_IGTK_KEYS_NUM];
828 	__le64 replay_ctr;
829 	__le16 pattern_number;
830 	__le16 reserved1;
831 	__le16 qos_seq_ctr[8];
832 	__le32 wakeup_reasons;
833 	__le32 num_of_gtk_rekeys;
834 	__le32 transmitted_ndps;
835 	__le32 received_beacons;
836 	u8 tid_tear_down;
837 	u8 station_id;
838 	u8 reserved2[2];
839 } __packed; /* WOWLAN_INFO_NTFY_API_S_VER_2 */
840 
841 /**
842  * struct iwl_wowlan_wake_pkt_notif - WoWLAN wake packet notification
843  * @wake_packet_length: wakeup packet length
844  * @station_id: station id
845  * @reserved: unused
846  * @wake_packet: wakeup packet
847  */
848 struct iwl_wowlan_wake_pkt_notif {
849 	__le32 wake_packet_length;
850 	u8 station_id;
851 	u8 reserved[3];
852 	u8 wake_packet[1];
853 } __packed; /* WOWLAN_WAKE_PKT_NTFY_API_S_VER_1 */
854 
855 /**
856  * struct iwl_mvm_d3_end_notif -  d3 end notification
857  * @flags: See &enum iwl_d0i3_flags
858  */
859 struct iwl_mvm_d3_end_notif {
860 	__le32 flags;
861 } __packed;
862 
863 /* TODO: NetDetect API */
864 
865 #endif /* __iwl_fw_api_d3_h__ */
866