1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65#ifndef __fw_api_d3_h__
66#define __fw_api_d3_h__
67
68
69
70
71
72enum iwl_d3_wakeup_flags {
73 IWL_WAKEUP_D3_CONFIG_FW_ERROR = BIT(0),
74};
75
76
77
78
79
80
81
82
83
84struct iwl_d3_manager_config {
85 __le32 min_sleep_time;
86 __le32 wakeup_flags;
87 __le32 wakeup_host_timer;
88} __packed;
89
90
91
92
93
94
95
96
97
98enum iwl_proto_offloads {
99 IWL_D3_PROTO_OFFLOAD_ARP = BIT(0),
100 IWL_D3_PROTO_OFFLOAD_NS = BIT(1),
101};
102
103#define IWL_PROTO_OFFLOAD_NUM_IPV6_ADDRS_V1 2
104#define IWL_PROTO_OFFLOAD_NUM_IPV6_ADDRS_V2 6
105#define IWL_PROTO_OFFLOAD_NUM_IPV6_ADDRS_V3L 12
106#define IWL_PROTO_OFFLOAD_NUM_IPV6_ADDRS_V3S 4
107#define IWL_PROTO_OFFLOAD_NUM_IPV6_ADDRS_MAX 12
108
109#define IWL_PROTO_OFFLOAD_NUM_NS_CONFIG_V3L 4
110#define IWL_PROTO_OFFLOAD_NUM_NS_CONFIG_V3S 2
111
112
113
114
115
116
117
118
119
120struct iwl_proto_offload_cmd_common {
121 __le32 enabled;
122 __be32 remote_ipv4_addr;
123 __be32 host_ipv4_addr;
124 u8 arp_mac_addr[ETH_ALEN];
125 __le16 reserved;
126} __packed;
127
128
129
130
131
132
133
134
135
136
137struct iwl_proto_offload_cmd_v1 {
138 struct iwl_proto_offload_cmd_common common;
139 u8 remote_ipv6_addr[16];
140 u8 solicited_node_ipv6_addr[16];
141 u8 target_ipv6_addr[IWL_PROTO_OFFLOAD_NUM_IPV6_ADDRS_V1][16];
142 u8 ndp_mac_addr[ETH_ALEN];
143 __le16 reserved2;
144} __packed;
145
146
147
148
149
150
151
152
153
154
155struct iwl_proto_offload_cmd_v2 {
156 struct iwl_proto_offload_cmd_common common;
157 u8 remote_ipv6_addr[16];
158 u8 solicited_node_ipv6_addr[16];
159 u8 target_ipv6_addr[IWL_PROTO_OFFLOAD_NUM_IPV6_ADDRS_V2][16];
160 u8 ndp_mac_addr[ETH_ALEN];
161 u8 numValidIPv6Addresses;
162 u8 reserved2[3];
163} __packed;
164
165struct iwl_ns_config {
166 struct in6_addr source_ipv6_addr;
167 struct in6_addr dest_ipv6_addr;
168 u8 target_mac_addr[ETH_ALEN];
169 __le16 reserved;
170} __packed;
171
172struct iwl_targ_addr {
173 struct in6_addr addr;
174 __le32 config_num;
175} __packed;
176
177
178
179
180
181
182
183struct iwl_proto_offload_cmd_v3_small {
184 struct iwl_proto_offload_cmd_common common;
185 __le32 num_valid_ipv6_addrs;
186 struct iwl_targ_addr targ_addrs[IWL_PROTO_OFFLOAD_NUM_IPV6_ADDRS_V3S];
187 struct iwl_ns_config ns_config[IWL_PROTO_OFFLOAD_NUM_NS_CONFIG_V3S];
188} __packed;
189
190
191
192
193
194
195
196struct iwl_proto_offload_cmd_v3_large {
197 struct iwl_proto_offload_cmd_common common;
198 __le32 num_valid_ipv6_addrs;
199 struct iwl_targ_addr targ_addrs[IWL_PROTO_OFFLOAD_NUM_IPV6_ADDRS_V3L];
200 struct iwl_ns_config ns_config[IWL_PROTO_OFFLOAD_NUM_NS_CONFIG_V3L];
201} __packed;
202
203
204
205
206#define IWL_WOWLAN_MIN_PATTERN_LEN 16
207#define IWL_WOWLAN_MAX_PATTERN_LEN 128
208
209struct iwl_wowlan_pattern {
210 u8 mask[IWL_WOWLAN_MAX_PATTERN_LEN / 8];
211 u8 pattern[IWL_WOWLAN_MAX_PATTERN_LEN];
212 u8 mask_size;
213 u8 pattern_size;
214 __le16 reserved;
215} __packed;
216
217#define IWL_WOWLAN_MAX_PATTERNS 20
218
219struct iwl_wowlan_patterns_cmd {
220 __le32 n_patterns;
221 struct iwl_wowlan_pattern patterns[];
222} __packed;
223
224enum iwl_wowlan_wakeup_filters {
225 IWL_WOWLAN_WAKEUP_MAGIC_PACKET = BIT(0),
226 IWL_WOWLAN_WAKEUP_PATTERN_MATCH = BIT(1),
227 IWL_WOWLAN_WAKEUP_BEACON_MISS = BIT(2),
228 IWL_WOWLAN_WAKEUP_LINK_CHANGE = BIT(3),
229 IWL_WOWLAN_WAKEUP_GTK_REKEY_FAIL = BIT(4),
230 IWL_WOWLAN_WAKEUP_EAP_IDENT_REQ = BIT(5),
231 IWL_WOWLAN_WAKEUP_4WAY_HANDSHAKE = BIT(6),
232 IWL_WOWLAN_WAKEUP_ENABLE_NET_DETECT = BIT(7),
233 IWL_WOWLAN_WAKEUP_RF_KILL_DEASSERT = BIT(8),
234 IWL_WOWLAN_WAKEUP_REMOTE_LINK_LOSS = BIT(9),
235 IWL_WOWLAN_WAKEUP_REMOTE_SIGNATURE_TABLE = BIT(10),
236 IWL_WOWLAN_WAKEUP_REMOTE_TCP_EXTERNAL = BIT(11),
237 IWL_WOWLAN_WAKEUP_REMOTE_WAKEUP_PACKET = BIT(12),
238 IWL_WOWLAN_WAKEUP_IOAC_MAGIC_PACKET = BIT(13),
239 IWL_WOWLAN_WAKEUP_HOST_TIMER = BIT(14),
240 IWL_WOWLAN_WAKEUP_RX_FRAME = BIT(15),
241 IWL_WOWLAN_WAKEUP_BCN_FILTERING = BIT(16),
242};
243
244struct iwl_wowlan_config_cmd {
245 __le32 wakeup_filter;
246 __le16 non_qos_seq;
247 __le16 qos_seq[8];
248 u8 wowlan_ba_teardown_tids;
249 u8 is_11n_connection;
250 u8 offloading_tid;
251 u8 reserved[3];
252} __packed;
253
254
255
256
257#define IWL_NUM_RSC 16
258
259struct tkip_sc {
260 __le16 iv16;
261 __le16 pad;
262 __le32 iv32;
263} __packed;
264
265struct iwl_tkip_rsc_tsc {
266 struct tkip_sc unicast_rsc[IWL_NUM_RSC];
267 struct tkip_sc multicast_rsc[IWL_NUM_RSC];
268 struct tkip_sc tsc;
269} __packed;
270
271struct aes_sc {
272 __le64 pn;
273} __packed;
274
275struct iwl_aes_rsc_tsc {
276 struct aes_sc unicast_rsc[IWL_NUM_RSC];
277 struct aes_sc multicast_rsc[IWL_NUM_RSC];
278 struct aes_sc tsc;
279} __packed;
280
281union iwl_all_tsc_rsc {
282 struct iwl_tkip_rsc_tsc tkip;
283 struct iwl_aes_rsc_tsc aes;
284};
285
286struct iwl_wowlan_rsc_tsc_params_cmd {
287 union iwl_all_tsc_rsc all_tsc_rsc;
288} __packed;
289
290#define IWL_MIC_KEY_SIZE 8
291struct iwl_mic_keys {
292 u8 tx[IWL_MIC_KEY_SIZE];
293 u8 rx_unicast[IWL_MIC_KEY_SIZE];
294 u8 rx_mcast[IWL_MIC_KEY_SIZE];
295} __packed;
296
297#define IWL_P1K_SIZE 5
298struct iwl_p1k_cache {
299 __le16 p1k[IWL_P1K_SIZE];
300} __packed;
301
302#define IWL_NUM_RX_P1K_CACHE 2
303
304struct iwl_wowlan_tkip_params_cmd {
305 struct iwl_mic_keys mic_keys;
306 struct iwl_p1k_cache tx;
307 struct iwl_p1k_cache rx_uni[IWL_NUM_RX_P1K_CACHE];
308 struct iwl_p1k_cache rx_multi[IWL_NUM_RX_P1K_CACHE];
309} __packed;
310
311#define IWL_KCK_MAX_SIZE 32
312#define IWL_KEK_MAX_SIZE 32
313
314struct iwl_wowlan_kek_kck_material_cmd {
315 u8 kck[IWL_KCK_MAX_SIZE];
316 u8 kek[IWL_KEK_MAX_SIZE];
317 __le16 kck_len;
318 __le16 kek_len;
319 __le64 replay_ctr;
320} __packed;
321
322#define RF_KILL_INDICATOR_FOR_WOWLAN 0x87
323
324enum iwl_wowlan_rekey_status {
325 IWL_WOWLAN_REKEY_POST_REKEY = 0,
326 IWL_WOWLAN_REKEY_WHILE_REKEY = 1,
327};
328
329enum iwl_wowlan_wakeup_reason {
330 IWL_WOWLAN_WAKEUP_BY_NON_WIRELESS = 0,
331 IWL_WOWLAN_WAKEUP_BY_MAGIC_PACKET = BIT(0),
332 IWL_WOWLAN_WAKEUP_BY_PATTERN = BIT(1),
333 IWL_WOWLAN_WAKEUP_BY_DISCONNECTION_ON_MISSED_BEACON = BIT(2),
334 IWL_WOWLAN_WAKEUP_BY_DISCONNECTION_ON_DEAUTH = BIT(3),
335 IWL_WOWLAN_WAKEUP_BY_GTK_REKEY_FAILURE = BIT(4),
336 IWL_WOWLAN_WAKEUP_BY_RFKILL_DEASSERTED = BIT(5),
337 IWL_WOWLAN_WAKEUP_BY_UCODE_ERROR = BIT(6),
338 IWL_WOWLAN_WAKEUP_BY_EAPOL_REQUEST = BIT(7),
339 IWL_WOWLAN_WAKEUP_BY_FOUR_WAY_HANDSHAKE = BIT(8),
340 IWL_WOWLAN_WAKEUP_BY_REM_WAKE_LINK_LOSS = BIT(9),
341 IWL_WOWLAN_WAKEUP_BY_REM_WAKE_SIGNATURE_TABLE = BIT(10),
342
343 IWL_WOWLAN_WAKEUP_BY_REM_WAKE_WAKEUP_PACKET = BIT(12),
344};
345
346struct iwl_wowlan_gtk_status {
347 u8 key_index;
348 u8 reserved[3];
349 u8 decrypt_key[16];
350 u8 tkip_mic_key[8];
351 struct iwl_wowlan_rsc_tsc_params_cmd rsc;
352} __packed;
353
354struct iwl_wowlan_status {
355 struct iwl_wowlan_gtk_status gtk;
356 __le64 replay_ctr;
357 __le16 pattern_number;
358 __le16 non_qos_seq_ctr;
359 __le16 qos_seq_ctr[8];
360 __le32 wakeup_reasons;
361 __le32 num_of_gtk_rekeys;
362 __le32 transmitted_ndps;
363 __le32 received_beacons;
364 __le32 wake_packet_length;
365 __le32 wake_packet_bufsize;
366 u8 wake_packet[];
367} __packed;
368
369#define IWL_WOWLAN_TCP_MAX_PACKET_LEN 64
370#define IWL_WOWLAN_REMOTE_WAKE_MAX_PACKET_LEN 128
371#define IWL_WOWLAN_REMOTE_WAKE_MAX_TOKENS 2048
372
373struct iwl_tcp_packet_info {
374 __le16 tcp_pseudo_header_checksum;
375 __le16 tcp_payload_length;
376} __packed;
377
378struct iwl_tcp_packet {
379 struct iwl_tcp_packet_info info;
380 u8 rx_mask[IWL_WOWLAN_MAX_PATTERN_LEN / 8];
381 u8 data[IWL_WOWLAN_TCP_MAX_PACKET_LEN];
382} __packed;
383
384struct iwl_remote_wake_packet {
385 struct iwl_tcp_packet_info info;
386 u8 rx_mask[IWL_WOWLAN_MAX_PATTERN_LEN / 8];
387 u8 data[IWL_WOWLAN_REMOTE_WAKE_MAX_PACKET_LEN];
388} __packed;
389
390struct iwl_wowlan_remote_wake_config {
391 __le32 connection_max_time;
392
393 u8 max_syn_retries;
394 u8 max_data_retries;
395 u8 tcp_syn_ack_timeout;
396 u8 tcp_ack_timeout;
397
398 struct iwl_tcp_packet syn_tx;
399 struct iwl_tcp_packet synack_rx;
400 struct iwl_tcp_packet keepalive_ack_rx;
401 struct iwl_tcp_packet fin_tx;
402
403 struct iwl_remote_wake_packet keepalive_tx;
404 struct iwl_remote_wake_packet wake_rx;
405
406
407 u8 sequence_number_offset;
408 u8 sequence_number_length;
409 u8 token_offset;
410 u8 token_length;
411
412 __le32 initial_sequence_number;
413 __le16 keepalive_interval;
414 __le16 num_tokens;
415 u8 tokens[IWL_WOWLAN_REMOTE_WAKE_MAX_TOKENS];
416} __packed;
417
418
419
420#endif
421