xref: /linux/drivers/net/wireless/intel/iwlwifi/mei/sap.h (revision 0d2ab5f922e75d10162e7199826e14df9cfae5cc)
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3  * Copyright (C) 2021 - 2022, 2025 Intel Corporation
4  */
5 
6 #ifndef __sap_h__
7 #define __sap_h__
8 
9 #include "mei/iwl-mei.h"
10 
11 /**
12  * DOC: Introduction
13  *
14  * SAP is the protocol used by the Intel Wireless driver (iwlwifi)
15  * and the wireless driver implemented in the CSME firmware.
16  * It allows to do several things:
17  * 1) Decide who is the owner of the device: CSME or the host
18  * 2) When the host is the owner of the device, CSME can still
19  * send and receive packets through iwlwifi.
20  *
21  * The protocol uses the ME interface (mei driver) to send
22  * messages to the CSME firmware. Those messages have a header
23  * &struct iwl_sap_me_msg_hdr and this header is followed
24  * by a payload.
25  *
26  * Since this messaging system cannot support high amounts of
27  * traffic, iwlwifi and the CSME firmware's WLAN driver have an
28  * additional communication pipe to exchange information. The body
29  * of the message is copied to a shared area and the message that
30  * goes over the ME interface just signals the other side
31  * that a new message is waiting in the shared area. The ME
32  * interface is used only for signaling and not to transfer
33  * the payload.
34  *
35  * This shared area of memory is DMA'able mapped to be
36  * writable by both the CSME firmware and iwlwifi. It is
37  * mapped to address space of the device that controls the ME
38  * interface's DMA engine. Any data that iwlwifi needs to
39  * send to the CSME firmware needs to be copied to there.
40  */
41 
42 /**
43  * DOC: Initial Handshake
44  *
45  * Once we get a link to the CMSE's WLAN driver we start the handshake
46  * to establish the shared memory that will allow the communication between
47  * the CSME's WLAN driver and the host.
48  *
49  * 1) Host sends %SAP_ME_MSG_START message with the physical address
50  * of the shared area.
51  * 2) CSME replies with %SAP_ME_MSG_START_OK which includes the versions
52  * protocol versions supported by CSME.
53  */
54 
55 /**
56  * DOC: Host and driver state messages
57  *
58  * In order to let CSME know about the host state and the host driver state,
59  * the host sends messages that let CSME know about the host's state.
60  * When the host driver is loaded, the host sends %SAP_MSG_NOTIF_WIFIDR_UP.
61  * When the host driver is unloaded, the host sends %SAP_MSG_NOTIF_WIFIDR_DOWN.
62  * When the iwlmei is unloaded, %SAP_MSG_NOTIF_HOST_GOES_DOWN is sent to let
63  * CSME know not to access the shared memory anymore since it'll be freed.
64  *
65  * CSME will reply to SAP_MSG_NOTIF_WIFIDR_UP by
66  * %SAP_MSG_NOTIF_AMT_STATE to let the host driver whether CSME can use the
67  * WiFi device or not followed by %SAP_MSG_NOTIF_CSME_CONN_STATUS to inform
68  * the host driver on the connection state of CSME.
69  *
70  * When host is associated to an AP, it must send %SAP_MSG_NOTIF_HOST_LINK_UP
71  * and when it disconnect from the AP, it must send
72  * %SAP_MSG_NOTIF_HOST_LINK_DOWN.
73  */
74 
75 /**
76  * DOC: Ownership
77  *
78  * The device can be controlled either by the CSME firmware or
79  * by the host driver: iwlwifi. There is a negotiation between
80  * those two entities to determine who controls (or owns) the
81  * device. Since the CSME can control the device even when the
82  * OS is not working or even missing, the CSME can request the
83  * device if it comes to the conclusion that the OS's host driver
84  * is not operational. This is why the host driver needs to
85  * signal CSME that it is up and running. If the driver is
86  * unloaded, it'll signal CSME that it is going down so that
87  * CSME can take ownership.
88  */
89 
90 /**
91  * DOC: Ownership transfer
92  *
93  * When the host driver needs the device, it'll send the
94  * %SAP_MSG_NOTIF_HOST_ASKS_FOR_NIC_OWNERSHIP that will be replied by
95  * %SAP_MSG_NOTIF_CSME_REPLY_TO_HOST_OWNERSHIP_REQ which will let the
96  * host know whether the ownership is granted or no. If the ownership is
97  * granted, the hosts sends %SAP_MSG_NOTIF_HOST_OWNERSHIP_CONFIRMED.
98  *
99  * When CSME requests ownership, it'll send the
100  * %SAP_MSG_NOTIF_CSME_TAKING_OWNERSHIP and give some time to host to stop
101  * accessing the device. The host needs to send
102  * %SAP_MSG_NOTIF_CSME_OWNERSHIP_CONFIRMED to confirm that it won't access
103  * the device anymore. If the host failed to send this message fast enough,
104  * CSME will take ownership on the device anyway.
105  * When CSME is willing to release the ownership, it'll send
106  * %SAP_MSG_NOTIF_CSME_CAN_RELEASE_OWNERSHIP.
107  */
108 
109 /**
110  * DOC: Data messages
111  *
112  * Data messages must be sent and receives on a separate queue in the shared
113  * memory. Almost all the data messages use the %SAP_MSG_DATA_PACKET for both
114  * packets sent by CSME to the host to be sent to the AP or for packets
115  * received from the AP and sent by the host to CSME.
116  * CSME sends filters to the host to let the host what inbound packets it must
117  * send to CSME. Those filters are received by the host as a
118  * %SAP_MSG_NOTIF_CSME_FILTERS command.
119  * The only outbound packets that must be sent to CSME are the DHCP packets.
120  * Those packets must use the %SAP_MSG_CB_DATA_PACKET message.
121  */
122 
123 /**
124  * enum iwl_sap_me_msg_id - the ID of the ME message
125  * @SAP_ME_MSG_START: See &struct iwl_sap_me_msg_start.
126  * @SAP_ME_MSG_START_OK: See &struct iwl_sap_me_msg_start_ok.
127  * @SAP_ME_MSG_CHECK_SHARED_AREA: This message has no payload.
128  */
129 enum iwl_sap_me_msg_id {
130 	SAP_ME_MSG_START	= 1,
131 	SAP_ME_MSG_START_OK,
132 	SAP_ME_MSG_CHECK_SHARED_AREA,
133 };
134 
135 /**
136  * struct iwl_sap_me_msg_hdr - the header of the ME message
137  * @type: the type of the message, see &enum iwl_sap_me_msg_id.
138  * @seq_num: a sequence number used for debug only.
139  * @len: the length of the message.
140  */
141 struct iwl_sap_me_msg_hdr {
142 	__le32 type;
143 	__le32 seq_num;
144 	__le32 len;
145 } __packed;
146 
147 /**
148  * struct iwl_sap_me_msg_start - used for the %SAP_ME_MSG_START message
149  * @hdr: See &struct iwl_sap_me_msg_hdr.
150  * @shared_mem: physical address of SAP shared memory area.
151  * @init_data_seq_num: seq_num of the first data packet HOST -> CSME.
152  * @init_notif_seq_num: seq_num of the first notification HOST -> CSME.
153  * @supported_versions: The host sends to the CSME a zero-terminated array
154  * of versions its supports.
155  *
156  * This message is sent by the host to CSME and will responded by the
157  * %SAP_ME_MSG_START_OK message.
158  */
159 struct iwl_sap_me_msg_start {
160 	struct iwl_sap_me_msg_hdr hdr;
161 	__le64 shared_mem;
162 	__le16 init_data_seq_num;
163 	__le16 init_notif_seq_num;
164 	u8 supported_versions[64];
165 } __packed;
166 
167 /**
168  * struct iwl_sap_me_msg_start_ok - used for the %SAP_ME_MSG_START_OK
169  * @hdr: See &struct iwl_sap_me_msg_hdr
170  * @init_data_seq_num: Not used.
171  * @init_notif_seq_num: Not used
172  * @supported_version: The version that will be used.
173  * @reserved: For alignment.
174  *
175  * This message is sent by CSME to the host in response to the
176  * %SAP_ME_MSG_START message.
177  */
178 struct iwl_sap_me_msg_start_ok {
179 	struct iwl_sap_me_msg_hdr hdr;
180 	__le16 init_data_seq_num;
181 	__le16 init_notif_seq_num;
182 	u8 supported_version;
183 	u8 reserved[3];
184 } __packed;
185 
186 /**
187  * enum iwl_sap_msg - SAP messages
188  * @SAP_MSG_NOTIF_BOTH_WAYS_MIN: Not used.
189  * @SAP_MSG_NOTIF_PING: No payload. Solicitate a response message (check-alive).
190  * @SAP_MSG_NOTIF_PONG: No payload. The response message.
191  * @SAP_MSG_NOTIF_BOTH_WAYS_MAX: Not used.
192  *
193  * @SAP_MSG_NOTIF_FROM_CSME_MIN: Not used.
194  * @SAP_MSG_NOTIF_CSME_FILTERS: TODO
195  * @SAP_MSG_NOTIF_AMT_STATE: Payload is a DW. Any non-zero value means
196  *	that CSME is enabled.
197  * @SAP_MSG_NOTIF_CSME_REPLY_TO_HOST_OWNERSHIP_REQ: Payload is a DW. 0 means
198  *	the host will not get ownership. Any other value means the host is
199  *	the owner.
200  * @SAP_MSG_NOTIF_CSME_TAKING_OWNERSHIP: No payload.
201  * @SAP_MSG_NOTIF_TRIGGER_IP_REFRESH: No payload.
202  * @SAP_MSG_NOTIF_CSME_CAN_RELEASE_OWNERSHIP: No payload.
203  * @SAP_MSG_NOTIF_NIC_OWNER: Payload is a DW. See &enum iwl_sap_nic_owner.
204  * @SAP_MSG_NOTIF_CSME_CONN_STATUS: See &struct iwl_sap_notif_conn_status.
205  * @SAP_MSG_NOTIF_NVM: See &struct iwl_sap_nvm.
206  * @SAP_MSG_NOTIF_PLDR_ACK: See &struct iwl_sap_pldr_ack_data.
207  * @SAP_MSG_NOTIF_FROM_CSME_MAX: Not used.
208  *
209  * @SAP_MSG_NOTIF_FROM_HOST_MIN: Not used.
210  * @SAP_MSG_NOTIF_BAND_SELECTION: TODO
211  * @SAP_MSG_NOTIF_RADIO_STATE: Payload is a DW.
212  *	See &enum iwl_sap_radio_state_bitmap.
213  * @SAP_MSG_NOTIF_NIC_INFO: See &struct iwl_sap_notif_host_nic_info.
214  * @SAP_MSG_NOTIF_HOST_ASKS_FOR_NIC_OWNERSHIP: No payload.
215  * @SAP_MSG_NOTIF_HOST_SUSPENDS: Payload is a DW. Bitmap described in
216  *	&enum iwl_sap_notif_host_suspends_bitmap.
217  * @SAP_MSG_NOTIF_HOST_RESUMES: Payload is a DW. 0 or 1. 1 says that
218  *	the CSME should re-initialize the init control block.
219  * @SAP_MSG_NOTIF_HOST_GOES_DOWN: No payload.
220  * @SAP_MSG_NOTIF_CSME_OWNERSHIP_CONFIRMED: No payload.
221  * @SAP_MSG_NOTIF_COUNTRY_CODE: See &struct iwl_sap_notif_country_code.
222  * @SAP_MSG_NOTIF_HOST_LINK_UP: See &struct iwl_sap_notif_host_link_up.
223  * @SAP_MSG_NOTIF_HOST_LINK_DOWN: See &struct iwl_sap_notif_host_link_down.
224  * @SAP_MSG_NOTIF_WHO_OWNS_NIC: No payload.
225  * @SAP_MSG_NOTIF_WIFIDR_DOWN: No payload.
226  * @SAP_MSG_NOTIF_WIFIDR_UP: No payload.
227  * @SAP_MSG_NOTIF_HOST_OWNERSHIP_CONFIRMED: No payload.
228  * @SAP_MSG_NOTIF_SAR_LIMITS: See &struct iwl_sap_notif_sar_limits.
229  * @SAP_MSG_NOTIF_GET_NVM: No payload. Triggers %SAP_MSG_NOTIF_NVM.
230  * @SAP_MSG_NOTIF_PLDR: See &struct iwl_sap_pldr_data.
231  * @SAP_MSG_NOTIF_PLDR_END: See &struct iwl_sap_pldr_end_data.
232  * @SAP_MSG_NOTIF_FROM_HOST_MAX: Not used.
233  *
234  * @SAP_MSG_DATA_MIN: Not used.
235  * @SAP_MSG_DATA_PACKET: Packets that passed the filters defined by
236  *	%SAP_MSG_NOTIF_CSME_FILTERS. The payload is &struct iwl_sap_hdr with
237  *	the payload of the packet immediately afterwards.
238  * @SAP_MSG_CB_DATA_PACKET: Indicates to CSME that we transmitted a specific
239  *	packet. Used only for DHCP transmitted packets. See
240  *	&struct iwl_sap_cb_data.
241  * @SAP_MSG_DATA_MAX: Not used.
242  */
243 enum iwl_sap_msg {
244 	SAP_MSG_NOTIF_BOTH_WAYS_MIN			= 0,
245 	SAP_MSG_NOTIF_PING				= 1,
246 	SAP_MSG_NOTIF_PONG				= 2,
247 	SAP_MSG_NOTIF_BOTH_WAYS_MAX,
248 
249 	SAP_MSG_NOTIF_FROM_CSME_MIN			= 500,
250 	SAP_MSG_NOTIF_CSME_FILTERS			= SAP_MSG_NOTIF_FROM_CSME_MIN,
251 	/* 501 is deprecated */
252 	SAP_MSG_NOTIF_AMT_STATE				= 502,
253 	SAP_MSG_NOTIF_CSME_REPLY_TO_HOST_OWNERSHIP_REQ	= 503,
254 	SAP_MSG_NOTIF_CSME_TAKING_OWNERSHIP		= 504,
255 	SAP_MSG_NOTIF_TRIGGER_IP_REFRESH		= 505,
256 	SAP_MSG_NOTIF_CSME_CAN_RELEASE_OWNERSHIP	= 506,
257 	/* 507 is deprecated */
258 	/* 508 is deprecated */
259 	/* 509 is deprecated */
260 	/* 510 is deprecated */
261 	SAP_MSG_NOTIF_NIC_OWNER				= 511,
262 	SAP_MSG_NOTIF_CSME_CONN_STATUS			= 512,
263 	SAP_MSG_NOTIF_NVM				= 513,
264 	/* 514 - 517 not supported */
265 	SAP_MSG_NOTIF_PLDR_ACK				= 518,
266 	SAP_MSG_NOTIF_FROM_CSME_MAX,
267 
268 	SAP_MSG_NOTIF_FROM_HOST_MIN			= 1000,
269 	SAP_MSG_NOTIF_BAND_SELECTION			= SAP_MSG_NOTIF_FROM_HOST_MIN,
270 	SAP_MSG_NOTIF_RADIO_STATE			= 1001,
271 	SAP_MSG_NOTIF_NIC_INFO				= 1002,
272 	SAP_MSG_NOTIF_HOST_ASKS_FOR_NIC_OWNERSHIP	= 1003,
273 	SAP_MSG_NOTIF_HOST_SUSPENDS			= 1004,
274 	SAP_MSG_NOTIF_HOST_RESUMES			= 1005,
275 	SAP_MSG_NOTIF_HOST_GOES_DOWN			= 1006,
276 	SAP_MSG_NOTIF_CSME_OWNERSHIP_CONFIRMED		= 1007,
277 	SAP_MSG_NOTIF_COUNTRY_CODE			= 1008,
278 	SAP_MSG_NOTIF_HOST_LINK_UP			= 1009,
279 	SAP_MSG_NOTIF_HOST_LINK_DOWN			= 1010,
280 	SAP_MSG_NOTIF_WHO_OWNS_NIC			= 1011,
281 	SAP_MSG_NOTIF_WIFIDR_DOWN			= 1012,
282 	SAP_MSG_NOTIF_WIFIDR_UP				= 1013,
283 	/* 1014 is deprecated */
284 	SAP_MSG_NOTIF_HOST_OWNERSHIP_CONFIRMED		= 1015,
285 	SAP_MSG_NOTIF_SAR_LIMITS			= 1016,
286 	SAP_MSG_NOTIF_GET_NVM				= 1017,
287 	/* 1018 - 1023 not supported */
288 	SAP_MSG_NOTIF_PLDR				= 1024,
289 	SAP_MSG_NOTIF_PLDR_END				= 1025,
290 	SAP_MSG_NOTIF_FROM_HOST_MAX,
291 
292 	SAP_MSG_DATA_MIN				= 2000,
293 	SAP_MSG_DATA_PACKET				= SAP_MSG_DATA_MIN,
294 	SAP_MSG_CB_DATA_PACKET				= 2001,
295 	SAP_MSG_DATA_MAX,
296 };
297 
298 /**
299  * struct iwl_sap_hdr - prefixes any SAP message
300  * @type: See &enum iwl_sap_msg.
301  * @len: The length of the message (header not included).
302  * @seq_num: For debug.
303  */
304 struct iwl_sap_hdr {
305 	__le16 type;
306 	__le16 len;
307 	__le32 seq_num;
308 };
309 
310 /**
311  * struct iwl_sap_msg_dw - suits any DW long SAP message
312  * @hdr: The SAP header
313  * @val: The value of the DW.
314  */
315 struct iwl_sap_msg_dw {
316 	struct iwl_sap_hdr hdr;
317 	__le32 val;
318 };
319 
320 /**
321  * enum iwl_sap_nic_owner - used by %SAP_MSG_NOTIF_NIC_OWNER
322  * @SAP_NIC_OWNER_UNKNOWN: Not used.
323  * @SAP_NIC_OWNER_HOST: The host owns the NIC.
324  * @SAP_NIC_OWNER_ME: CSME owns the NIC.
325  */
326 enum iwl_sap_nic_owner {
327 	SAP_NIC_OWNER_UNKNOWN,
328 	SAP_NIC_OWNER_HOST,
329 	SAP_NIC_OWNER_ME,
330 };
331 
332 enum iwl_sap_wifi_auth_type {
333 	SAP_WIFI_AUTH_TYPE_OPEN		= IWL_MEI_AKM_AUTH_OPEN,
334 	SAP_WIFI_AUTH_TYPE_RSNA		= IWL_MEI_AKM_AUTH_RSNA,
335 	SAP_WIFI_AUTH_TYPE_RSNA_PSK	= IWL_MEI_AKM_AUTH_RSNA_PSK,
336 	SAP_WIFI_AUTH_TYPE_SAE		= IWL_MEI_AKM_AUTH_SAE,
337 	SAP_WIFI_AUTH_TYPE_MAX,
338 };
339 
340 /**
341  * enum iwl_sap_wifi_cipher_alg - MEI WiFi cipher algorithm IDs
342  * @SAP_WIFI_CIPHER_ALG_NONE: No encryption
343  * @SAP_WIFI_CIPHER_ALG_TKIP: TKIPO
344  * @SAP_WIFI_CIPHER_ALG_CCMP: CCMP
345  * @SAP_WIFI_CIPHER_ALG_GCMP: GCMP-128
346  * @SAP_WIFI_CIPHER_ALG_GCMP_256: GCMP-256
347  */
348 enum iwl_sap_wifi_cipher_alg {
349 	SAP_WIFI_CIPHER_ALG_NONE	= IWL_MEI_CIPHER_NONE,
350 	SAP_WIFI_CIPHER_ALG_TKIP	= IWL_MEI_CIPHER_TKIP,
351 	SAP_WIFI_CIPHER_ALG_CCMP	= IWL_MEI_CIPHER_CCMP,
352 	SAP_WIFI_CIPHER_ALG_GCMP	= IWL_MEI_CIPHER_GCMP,
353 	SAP_WIFI_CIPHER_ALG_GCMP_256	= IWL_MEI_CIPHER_GCMP_256,
354 };
355 
356 /**
357  * struct iwl_sap_notif_connection_info - nested in other structures
358  * @ssid_len: The length of the SSID.
359  * @ssid: The SSID.
360  * @auth_mode: The authentication mode. See &enum iwl_sap_wifi_auth_type.
361  * @pairwise_cipher: The cipher used for unicast packets.
362  *	See &enum iwl_sap_wifi_cipher_alg.
363  * @channel: The channel on which we are associated.
364  * @band: The band on which we are associated.
365  * @reserved: For alignment.
366  * @bssid: The BSSID.
367  * @reserved1: For alignment.
368  */
369 struct iwl_sap_notif_connection_info {
370 	__le32 ssid_len;
371 	u8 ssid[32];
372 	__le32 auth_mode;
373 	__le32 pairwise_cipher;
374 	u8 channel;
375 	u8 band;
376 	__le16 reserved;
377 	u8 bssid[6];
378 	__le16 reserved1;
379 } __packed;
380 
381 /**
382  * enum iwl_sap_scan_request - for the scan_request field
383  * @SCAN_REQUEST_FILTERING: Filtering is requested.
384  * @SCAN_REQUEST_FAST: Fast scan is requested.
385  */
386 enum iwl_sap_scan_request {
387 	SCAN_REQUEST_FILTERING	= 1 << 0,
388 	SCAN_REQUEST_FAST	= 1 << 1,
389 };
390 
391 /**
392  * struct iwl_sap_notif_conn_status - payload of %SAP_MSG_NOTIF_CSME_CONN_STATUS
393  * @hdr: The SAP header
394  * @link_prot_state: Non-zero if link protection is active.
395  * @scan_request: See &enum iwl_sap_scan_request.
396  * @conn_info: Information about the connection.
397  */
398 struct iwl_sap_notif_conn_status {
399 	struct iwl_sap_hdr hdr;
400 	__le32 link_prot_state;
401 	__le32 scan_request;
402 	struct iwl_sap_notif_connection_info conn_info;
403 } __packed;
404 
405 /**
406  * enum iwl_sap_radio_state_bitmap - used for %SAP_MSG_NOTIF_RADIO_STATE
407  * @SAP_SW_RFKILL_DEASSERTED: If set, SW RfKill is de-asserted
408  * @SAP_HW_RFKILL_DEASSERTED: If set, HW RfKill is de-asserted
409  *
410  * If both bits are set, then the radio is on.
411  */
412 enum iwl_sap_radio_state_bitmap {
413 	SAP_SW_RFKILL_DEASSERTED	= 1 << 0,
414 	SAP_HW_RFKILL_DEASSERTED	= 1 << 1,
415 };
416 
417 /**
418  * enum iwl_sap_notif_host_suspends_bitmap - used for %SAP_MSG_NOTIF_HOST_SUSPENDS
419  * @SAP_OFFER_NIC: TBD
420  * @SAP_FILTER_CONFIGURED: TBD
421  * @SAP_NLO_CONFIGURED: TBD
422  * @SAP_HOST_OWNS_NIC: TBD
423  * @SAP_LINK_PROTECTED: TBD
424  */
425 enum iwl_sap_notif_host_suspends_bitmap {
426 	SAP_OFFER_NIC		= 1 << 0,
427 	SAP_FILTER_CONFIGURED	= 1 << 1,
428 	SAP_NLO_CONFIGURED	= 1 << 2,
429 	SAP_HOST_OWNS_NIC	= 1 << 3,
430 	SAP_LINK_PROTECTED	= 1 << 4,
431 };
432 
433 /**
434  * struct iwl_sap_notif_country_code - payload of %SAP_MSG_NOTIF_COUNTRY_CODE
435  * @hdr: The SAP header
436  * @mcc: The country code.
437  * @source_id: TBD
438  * @reserved: For alignment.
439  * @diff_time: TBD
440  */
441 struct iwl_sap_notif_country_code {
442 	struct iwl_sap_hdr hdr;
443 	__le16 mcc;
444 	u8 source_id;
445 	u8 reserved;
446 	__le32 diff_time;
447 } __packed;
448 
449 /**
450  * struct iwl_sap_notif_host_link_up - payload of %SAP_MSG_NOTIF_HOST_LINK_UP
451  * @hdr: The SAP header
452  * @conn_info: Information about the connection.
453  * @colloc_channel: The collocated channel
454  * @colloc_band: The band of the collocated channel.
455  * @reserved: For alignment.
456  * @colloc_bssid: The collocated BSSID.
457  * @reserved1: For alignment.
458  */
459 struct iwl_sap_notif_host_link_up {
460 	struct iwl_sap_hdr hdr;
461 	struct iwl_sap_notif_connection_info conn_info;
462 	u8 colloc_channel;
463 	u8 colloc_band;
464 	__le16 reserved;
465 	u8 colloc_bssid[6];
466 	__le16 reserved1;
467 } __packed;
468 
469 /**
470  * enum iwl_sap_notif_link_down_type - used in &struct iwl_sap_notif_host_link_down
471  * @HOST_LINK_DOWN_TYPE_NONE: TBD
472  * @HOST_LINK_DOWN_TYPE_TEMPORARY: TBD
473  * @HOST_LINK_DOWN_TYPE_LONG: TBD
474  */
475 enum iwl_sap_notif_link_down_type {
476 	HOST_LINK_DOWN_TYPE_NONE,
477 	HOST_LINK_DOWN_TYPE_TEMPORARY,
478 	HOST_LINK_DOWN_TYPE_LONG,
479 };
480 
481 /**
482  * struct iwl_sap_notif_host_link_down - payload for %SAP_MSG_NOTIF_HOST_LINK_DOWN
483  * @hdr: The SAP header
484  * @type: See &enum iwl_sap_notif_link_down_type.
485  * @reserved: For alignment.
486  * @reason_valid: If 0, ignore the next field.
487  * @reason: The reason of the disconnection.
488  */
489 struct iwl_sap_notif_host_link_down {
490 	struct iwl_sap_hdr hdr;
491 	u8 type;
492 	u8 reserved[2];
493 	u8 reason_valid;
494 	__le32 reason;
495 } __packed;
496 
497 /**
498  * struct iwl_sap_notif_host_nic_info - payload for %SAP_MSG_NOTIF_NIC_INFO
499  * @hdr: The SAP header
500  * @mac_address: The MAC address as configured to the interface.
501  * @nvm_address: The MAC address as configured in the NVM.
502  */
503 struct iwl_sap_notif_host_nic_info {
504 	struct iwl_sap_hdr hdr;
505 	u8 mac_address[6];
506 	u8 nvm_address[6];
507 } __packed;
508 
509 /**
510  * struct iwl_sap_notif_dw - payload is a dw
511  * @hdr: The SAP header.
512  * @dw: The payload.
513  */
514 struct iwl_sap_notif_dw {
515 	struct iwl_sap_hdr hdr;
516 	__le32 dw;
517 } __packed;
518 
519 /**
520  * struct iwl_sap_notif_sar_limits - payload for %SAP_MSG_NOTIF_SAR_LIMITS
521  * @hdr: The SAP header
522  * @sar_chain_info_table: Tx power limits.
523  */
524 struct iwl_sap_notif_sar_limits {
525 	struct iwl_sap_hdr hdr;
526 	__le16 sar_chain_info_table[2][5];
527 } __packed;
528 
529 /**
530  * enum iwl_sap_nvm_caps - capabilities for NVM SAP
531  * @SAP_NVM_CAPS_LARI_SUPPORT: Lari is supported
532  * @SAP_NVM_CAPS_11AX_SUPPORT: 11AX is supported
533  */
534 enum iwl_sap_nvm_caps {
535 	SAP_NVM_CAPS_LARI_SUPPORT	= BIT(0),
536 	SAP_NVM_CAPS_11AX_SUPPORT	= BIT(1),
537 };
538 
539 /**
540  * struct iwl_sap_nvm - payload for %SAP_MSG_NOTIF_NVM
541  * @hdr: The SAP header.
542  * @hw_addr: The MAC address
543  * @n_hw_addrs: The number of MAC addresses
544  * @reserved: For alignment.
545  * @radio_cfg: The radio configuration.
546  * @caps: See &enum iwl_sap_nvm_caps.
547  * @nvm_version: The version of the NVM.
548  * @channels: The data for each channel.
549  */
550 struct iwl_sap_nvm {
551 	struct iwl_sap_hdr hdr;
552 	u8 hw_addr[6];
553 	u8 n_hw_addrs;
554 	u8 reserved;
555 	__le32 radio_cfg;
556 	__le32 caps;
557 	__le32 nvm_version;
558 	__le32 channels[110];
559 } __packed;
560 
561 /**
562  * enum iwl_sap_eth_filter_flags - used in &struct iwl_sap_eth_filter
563  * @SAP_ETH_FILTER_STOP: Do not process further filters.
564  * @SAP_ETH_FILTER_COPY: Copy the packet to the CSME.
565  * @SAP_ETH_FILTER_ENABLED: If false, the filter should be ignored.
566  */
567 enum iwl_sap_eth_filter_flags {
568 	SAP_ETH_FILTER_STOP    = BIT(0),
569 	SAP_ETH_FILTER_COPY    = BIT(1),
570 	SAP_ETH_FILTER_ENABLED = BIT(2),
571 };
572 
573 /**
574  * struct iwl_sap_eth_filter - a L2 filter
575  * @mac_address: Address to filter.
576  * @flags: See &enum iwl_sap_eth_filter_flags.
577  */
578 struct iwl_sap_eth_filter {
579 	u8 mac_address[6];
580 	u8 flags;
581 } __packed;
582 
583 /**
584  * enum iwl_sap_flex_filter_flags - used in &struct iwl_sap_flex_filter
585  * @SAP_FLEX_FILTER_COPY: Pass UDP / TCP packets to CSME.
586  * @SAP_FLEX_FILTER_ENABLED: If false, the filter should be ignored.
587  * @SAP_FLEX_FILTER_IPV4: Filter requires match on the IP address as well.
588  * @SAP_FLEX_FILTER_IPV6: Filter requires match on the IP address as well.
589  * @SAP_FLEX_FILTER_TCP: Filter should be applied on TCP packets.
590  * @SAP_FLEX_FILTER_UDP: Filter should be applied on UDP packets.
591  */
592 enum iwl_sap_flex_filter_flags {
593 	SAP_FLEX_FILTER_COPY		= BIT(0),
594 	SAP_FLEX_FILTER_ENABLED		= BIT(1),
595 	SAP_FLEX_FILTER_IPV6		= BIT(2),
596 	SAP_FLEX_FILTER_IPV4		= BIT(3),
597 	SAP_FLEX_FILTER_TCP		= BIT(4),
598 	SAP_FLEX_FILTER_UDP		= BIT(5),
599 };
600 
601 /**
602  * struct iwl_sap_flex_filter - filter configuration
603  * @src_port: Source port in network format.
604  * @dst_port: Destination port in network format.
605  * @flags: Flags and protocol, see &enum iwl_sap_flex_filter_flags.
606  * @reserved: For alignment.
607  */
608 struct iwl_sap_flex_filter {
609 	__be16 src_port;
610 	__be16 dst_port;
611 	u8 flags;
612 	u8 reserved;
613 } __packed;
614 
615 /**
616  * enum iwl_sap_ipv4_filter_flags - used in &struct iwl_sap_ipv4_filter
617  * @SAP_IPV4_FILTER_ICMP_PASS: Pass ICMP packets to CSME.
618  * @SAP_IPV4_FILTER_ICMP_COPY: Pass ICMP packets to host.
619  * @SAP_IPV4_FILTER_ARP_REQ_PASS: Pass ARP requests to CSME.
620  * @SAP_IPV4_FILTER_ARP_REQ_COPY: Pass ARP requests to host.
621  * @SAP_IPV4_FILTER_ARP_RESP_PASS: Pass ARP responses to CSME.
622  * @SAP_IPV4_FILTER_ARP_RESP_COPY: Pass ARP responses to host.
623  */
624 enum iwl_sap_ipv4_filter_flags {
625 	SAP_IPV4_FILTER_ICMP_PASS	= BIT(0),
626 	SAP_IPV4_FILTER_ICMP_COPY	= BIT(1),
627 	SAP_IPV4_FILTER_ARP_REQ_PASS	= BIT(2),
628 	SAP_IPV4_FILTER_ARP_REQ_COPY	= BIT(3),
629 	SAP_IPV4_FILTER_ARP_RESP_PASS	= BIT(4),
630 	SAP_IPV4_FILTER_ARP_RESP_COPY	= BIT(5),
631 };
632 
633 /**
634  * struct iwl_sap_ipv4_filter - IPv4 filter configuration
635  * @ipv4_addr: The IP address to filer.
636  * @flags: See &enum iwl_sap_ipv4_filter_flags.
637  */
638 struct iwl_sap_ipv4_filter {
639 	__be32 ipv4_addr;
640 	__le32 flags;
641 } __packed;
642 
643 /**
644  * enum iwl_sap_ipv6_filter_flags - IPv6 filter flags
645  * @SAP_IPV6_ADDR_FILTER_COPY: Pass packets to the host.
646  * @SAP_IPV6_ADDR_FILTER_ENABLED: If false, the filter should be ignored.
647  */
648 enum iwl_sap_ipv6_filter_flags {
649 	SAP_IPV6_ADDR_FILTER_COPY	= BIT(0),
650 	SAP_IPV6_ADDR_FILTER_ENABLED	= BIT(1),
651 };
652 
653 /**
654  * struct iwl_sap_ipv6_filter - IPv6 filter configuration
655  * @addr_lo24: Lowest 24 bits of the IPv6 address.
656  * @flags: See &enum iwl_sap_ipv6_filter_flags.
657  */
658 struct iwl_sap_ipv6_filter {
659 	u8 addr_lo24[3];
660 	u8 flags;
661 } __packed;
662 
663 /**
664  * enum iwl_sap_icmpv6_filter_flags - ICMPv6 filter flags
665  * @SAP_ICMPV6_FILTER_ENABLED: If false, the filter should be ignored.
666  * @SAP_ICMPV6_FILTER_COPY: Pass packets to the host.
667  */
668 enum iwl_sap_icmpv6_filter_flags {
669 	SAP_ICMPV6_FILTER_ENABLED	= BIT(0),
670 	SAP_ICMPV6_FILTER_COPY		= BIT(1),
671 };
672 
673 /**
674  * enum iwl_sap_vlan_filter_flags - VLAN filter flags
675  * @SAP_VLAN_FILTER_VLAN_ID_MSK: VLAN ID
676  * @SAP_VLAN_FILTER_ENABLED: If false, the filter should be ignored.
677  */
678 enum iwl_sap_vlan_filter_flags {
679 	SAP_VLAN_FILTER_VLAN_ID_MSK	= 0x0FFF,
680 	SAP_VLAN_FILTER_ENABLED		= BIT(15),
681 };
682 
683 /**
684  * struct iwl_sap_oob_filters - Out of band filters (for RX only)
685  * @flex_filters: Array of &struct iwl_sap_flex_filter.
686  * @icmpv6_flags: See &enum iwl_sap_icmpv6_filter_flags.
687  * @ipv6_filters: Array of &struct iwl_sap_ipv6_filter.
688  * @eth_filters: Array of &struct iwl_sap_eth_filter.
689  * @reserved: For alignment.
690  * @ipv4_filter: &struct iwl_sap_ipv4_filter.
691  * @vlan: See &enum iwl_sap_vlan_filter_flags.
692  */
693 struct iwl_sap_oob_filters {
694 	struct iwl_sap_flex_filter flex_filters[14];
695 	__le32 icmpv6_flags;
696 	struct iwl_sap_ipv6_filter ipv6_filters[4];
697 	struct iwl_sap_eth_filter eth_filters[5];
698 	u8 reserved;
699 	struct iwl_sap_ipv4_filter ipv4_filter;
700 	__le16 vlan[4];
701 } __packed;
702 
703 /**
704  * struct iwl_sap_csme_filters - payload of %SAP_MSG_NOTIF_CSME_FILTERS
705  * @hdr: The SAP header.
706  * @mode: Not used.
707  * @mac_address: Not used.
708  * @reserved: For alignment.
709  * @cbfilters: Not used.
710  * @filters: Out of band filters.
711  */
712 struct iwl_sap_csme_filters {
713 	struct iwl_sap_hdr hdr;
714 	__le32 mode;
715 	u8 mac_address[6];
716 	__le16 reserved;
717 	u8 cbfilters[1728];
718 	struct iwl_sap_oob_filters filters;
719 } __packed;
720 
721 #define CB_TX_DHCP_FILT_IDX 30
722 /**
723  * struct iwl_sap_cb_data - header to be added for transmitted packets.
724  * @hdr: The SAP header.
725  * @reserved: Not used.
726  * @to_me_filt_status: The filter that matches. Bit %CB_TX_DHCP_FILT_IDX should
727  *	be set for DHCP (the only packet that uses this header).
728  * @reserved2: Not used.
729  * @data_len: The length of the payload.
730  * @payload: The payload of the transmitted packet.
731  */
732 struct iwl_sap_cb_data {
733 	struct iwl_sap_hdr hdr;
734 	__le32 reserved[7];
735 	__le32 to_me_filt_status;
736 	__le32 reserved2;
737 	__le32 data_len;
738 	u8 payload[];
739 };
740 
741 /**
742  * struct iwl_sap_pldr_data - payload of %SAP_MSG_NOTIF_PLDR
743  * @hdr: The SAP header.
744  * @version: SAP message version
745  */
746 struct iwl_sap_pldr_data {
747 	struct iwl_sap_hdr hdr;
748 	__le32 version;
749 } __packed;
750 
751 /**
752  * enum iwl_sap_pldr_status - product reset status
753  * @SAP_PLDR_STATUS_SUCCESS: PLDR started/ended successfully
754  * @SAP_PLDR_STATUS_FAILURE: PLDR failed to start/end
755  */
756 enum iwl_sap_pldr_status {
757 	SAP_PLDR_STATUS_SUCCESS	= 0,
758 	SAP_PLDR_STATUS_FAILURE	= 1,
759 };
760 
761 /*
762  * struct iwl_sap_pldr_end_data - payload of %SAP_MSG_NOTIF_PLDR_END
763  * @hdr: The SAP header.
764  * @version: SAP message version
765  * @status: PLDR end status
766  */
767 struct iwl_sap_pldr_end_data {
768 	struct iwl_sap_hdr hdr;
769 	__le32 version;
770 	__le32 status;
771 } __packed;
772 
773 /*
774  * struct iwl_sap_pldr_ack_data - payload of %SAP_MSG_NOTIF_PLDR_ACK
775  * @version: SAP message version
776  * @status: CSME accept/refuse to the PLDR request
777  */
778 struct iwl_sap_pldr_ack_data {
779 	struct iwl_sap_hdr hdr;
780 	__le32 version;
781 	__le32 status;
782 } __packed;
783 
784 #endif /* __sap_h__ */
785