/* SPDX-License-Identifier: GPL-2.0-only */
/*
 * Copyright (C) 2021 - 2022 Intel Corporation
 */

#ifndef __sap_h__
#define __sap_h__

#include "mei/iwl-mei.h"

/**
 * DOC: Introduction
 *
 * SAP is the protocol used by the Intel Wireless driver (iwlwifi)
 * and the wireless driver implemented in the CSME firmware.
 * It allows to do several things:
 * 1) Decide who is the owner of the device: CSME or the host
 * 2) When the host is the owner of the device, CSME can still
 * send and receive packets through iwlwifi.
 *
 * The protocol uses the ME interface (mei driver) to send
 * messages to the CSME firmware. Those messages have a header
 * &struct iwl_sap_me_msg_hdr and this header is followed
 * by a payload.
 *
 * Since this messaging system cannot support high amounts of
 * traffic, iwlwifi and the CSME firmware's WLAN driver have an
 * additional communication pipe to exchange information. The body
 * of the message is copied to a shared area and the message that
 * goes over the ME interface just signals the other side
 * that a new message is waiting in the shared area. The ME
 * interface is used only for signaling and not to transfer
 * the payload.
 *
 * This shared area of memory is DMA'able mapped to be
 * writable by both the CSME firmware and iwlwifi. It is
 * mapped to address space of the device that controls the ME
 * interface's DMA engine. Any data that iwlwifi needs to
 * send to the CSME firmware needs to be copied to there.
 */

/**
 * DOC: Initial Handshake
 *
 * Once we get a link to the CMSE's WLAN driver we start the handshake
 * to establish the shared memory that will allow the communication between
 * the CSME's WLAN driver and the host.
 *
 * 1) Host sends %SAP_ME_MSG_START message with the physical address
 * of the shared area.
 * 2) CSME replies with %SAP_ME_MSG_START_OK which includes the versions
 * protocol versions supported by CSME.
 */

/**
 * DOC: Host and driver state messages
 *
 * In order to let CSME know about the host state and the host driver state,
 * the host sends messages that let CSME know about the host's state.
 * When the host driver is loaded, the host sends %SAP_MSG_NOTIF_WIFIDR_UP.
 * When the host driver is unloaded, the host sends %SAP_MSG_NOTIF_WIFIDR_DOWN.
 * When the iwlmei is unloaded, %SAP_MSG_NOTIF_HOST_GOES_DOWN is sent to let
 * CSME know not to access the shared memory anymore since it'll be freed.
 *
 * CSME will reply to SAP_MSG_NOTIF_WIFIDR_UP by
 * %SAP_MSG_NOTIF_AMT_STATE to let the host driver whether CSME can use the
 * WiFi device or not followed by %SAP_MSG_NOTIF_CSME_CONN_STATUS to inform
 * the host driver on the connection state of CSME.
 *
 * When host is associated to an AP, it must send %SAP_MSG_NOTIF_HOST_LINK_UP
 * and when it disconnect from the AP, it must send
 * %SAP_MSG_NOTIF_HOST_LINK_DOWN.
 */

/**
 * DOC: Ownership
 *
 * The device can be controlled either by the CSME firmware or
 * by the host driver: iwlwifi. There is a negotiation between
 * those two entities to determine who controls (or owns) the
 * device. Since the CSME can control the device even when the
 * OS is not working or even missing, the CSME can request the
 * device if it comes to the conclusion that the OS's host driver
 * is not operational. This is why the host driver needs to
 * signal CSME that it is up and running. If the driver is
 * unloaded, it'll signal CSME that it is going down so that
 * CSME can take ownership.
 */

/**
 * DOC: Ownership transfer
 *
 * When the host driver needs the device, it'll send the
 * %SAP_MSG_NOTIF_HOST_ASKS_FOR_NIC_OWNERSHIP that will be replied by
 * %SAP_MSG_NOTIF_CSME_REPLY_TO_HOST_OWNERSHIP_REQ which will let the
 * host know whether the ownership is granted or no. If the ownership is
 * granted, the hosts sends %SAP_MSG_NOTIF_HOST_OWNERSHIP_CONFIRMED.
 *
 * When CSME requests ownership, it'll send the
 * %SAP_MSG_NOTIF_CSME_TAKING_OWNERSHIP and give some time to host to stop
 * accessing the device. The host needs to send
 * %SAP_MSG_NOTIF_CSME_OWNERSHIP_CONFIRMED to confirm that it won't access
 * the device anymore. If the host failed to send this message fast enough,
 * CSME will take ownership on the device anyway.
 * When CSME is willing to release the ownership, it'll send
 * %SAP_MSG_NOTIF_CSME_CAN_RELEASE_OWNERSHIP.
 */

/**
 * DOC: Data messages
 *
 * Data messages must be sent and receives on a separate queue in the shared
 * memory. Almost all the data messages use the %SAP_MSG_DATA_PACKET for both
 * packets sent by CSME to the host to be sent to the AP or for packets
 * received from the AP and sent by the host to CSME.
 * CSME sends filters to the host to let the host what inbound packets it must
 * send to CSME. Those filters are received by the host as a
 * %SAP_MSG_NOTIF_CSME_FILTERS command.
 * The only outbound packets that must be sent to CSME are the DHCP packets.
 * Those packets must use the %SAP_MSG_CB_DATA_PACKET message.
 */

/**
 * enum iwl_sap_me_msg_id - the ID of the ME message
 * @SAP_ME_MSG_START: See &struct iwl_sap_me_msg_start.
 * @SAP_ME_MSG_START_OK: See &struct iwl_sap_me_msg_start_ok.
 * @SAP_ME_MSG_CHECK_SHARED_AREA: This message has no payload.
 */
enum iwl_sap_me_msg_id {
	SAP_ME_MSG_START	= 1,
	SAP_ME_MSG_START_OK,
	SAP_ME_MSG_CHECK_SHARED_AREA,
};

/**
 * struct iwl_sap_me_msg_hdr - the header of the ME message
 * @type: the type of the message, see &enum iwl_sap_me_msg_id.
 * @seq_num: a sequence number used for debug only.
 * @len: the length of the message.
 */
struct iwl_sap_me_msg_hdr {
	__le32 type;
	__le32 seq_num;
	__le32 len;
} __packed;

/**
 * struct iwl_sap_me_msg_start - used for the %SAP_ME_MSG_START message
 * @hdr: See &struct iwl_sap_me_msg_hdr.
 * @shared_mem: physical address of SAP shared memory area.
 * @init_data_seq_num: seq_num of the first data packet HOST -> CSME.
 * @init_notif_seq_num: seq_num of the first notification HOST -> CSME.
 * @supported_versions: The host sends to the CSME a zero-terminated array
 * of versions its supports.
 *
 * This message is sent by the host to CSME and will responded by the
 * %SAP_ME_MSG_START_OK message.
 */
struct iwl_sap_me_msg_start {
	struct iwl_sap_me_msg_hdr hdr;
	__le64 shared_mem;
	__le16 init_data_seq_num;
	__le16 init_notif_seq_num;
	u8 supported_versions[64];
} __packed;

/**
 * struct iwl_sap_me_msg_start_ok - used for the %SAP_ME_MSG_START_OK
 * @hdr: See &struct iwl_sap_me_msg_hdr
 * @init_data_seq_num: Not used.
 * @init_notif_seq_num: Not used
 * @supported_version: The version that will be used.
 * @reserved: For alignment.
 *
 * This message is sent by CSME to the host in response to the
 * %SAP_ME_MSG_START message.
 */
struct iwl_sap_me_msg_start_ok {
	struct iwl_sap_me_msg_hdr hdr;
	__le16 init_data_seq_num;
	__le16 init_notif_seq_num;
	u8 supported_version;
	u8 reserved[3];
} __packed;

/**
 * enum iwl_sap_msg - SAP messages
 * @SAP_MSG_NOTIF_BOTH_WAYS_MIN: Not used.
 * @SAP_MSG_NOTIF_PING: No payload. Solicitate a response message (check-alive).
 * @SAP_MSG_NOTIF_PONG: No payload. The response message.
 * @SAP_MSG_NOTIF_BOTH_WAYS_MAX: Not used.
 *
 * @SAP_MSG_NOTIF_FROM_CSME_MIN: Not used.
 * @SAP_MSG_NOTIF_CSME_FILTERS: TODO
 * @SAP_MSG_NOTIF_AMT_STATE: Payload is a DW. Any non-zero value means
 *	that CSME is enabled.
 * @SAP_MSG_NOTIF_CSME_REPLY_TO_HOST_OWNERSHIP_REQ: Payload is a DW. 0 means
 *	the host will not get ownership. Any other value means the host is
 *	the owner.
 * @SAP_MSG_NOTIF_CSME_TAKING_OWNERSHIP: No payload.
 * @SAP_MSG_NOTIF_TRIGGER_IP_REFRESH: No payload.
 * @SAP_MSG_NOTIF_CSME_CAN_RELEASE_OWNERSHIP: No payload.
 * @SAP_MSG_NOTIF_NIC_OWNER: Payload is a DW. See &enum iwl_sap_nic_owner.
 * @SAP_MSG_NOTIF_CSME_CONN_STATUS: See &struct iwl_sap_notif_conn_status.
 * @SAP_MSG_NOTIF_NVM: See &struct iwl_sap_nvm.
 * @SAP_MSG_NOTIF_PLDR_ACK: See &struct iwl_sap_pldr_ack_data.
 * @SAP_MSG_NOTIF_FROM_CSME_MAX: Not used.
 *
 * @SAP_MSG_NOTIF_FROM_HOST_MIN: Not used.
 * @SAP_MSG_NOTIF_BAND_SELECTION: TODO
 * @SAP_MSG_NOTIF_RADIO_STATE: Payload is a DW.
 *	See &enum iwl_sap_radio_state_bitmap.
 * @SAP_MSG_NOTIF_NIC_INFO: See &struct iwl_sap_notif_host_nic_info.
 * @SAP_MSG_NOTIF_HOST_ASKS_FOR_NIC_OWNERSHIP: No payload.
 * @SAP_MSG_NOTIF_HOST_SUSPENDS: Payload is a DW. Bitmap described in
 *	&enum iwl_sap_notif_host_suspends_bitmap.
 * @SAP_MSG_NOTIF_HOST_RESUMES: Payload is a DW. 0 or 1. 1 says that
 *	the CSME should re-initialize the init control block.
 * @SAP_MSG_NOTIF_HOST_GOES_DOWN: No payload.
 * @SAP_MSG_NOTIF_CSME_OWNERSHIP_CONFIRMED: No payload.
 * @SAP_MSG_NOTIF_COUNTRY_CODE: See &struct iwl_sap_notif_country_code.
 * @SAP_MSG_NOTIF_HOST_LINK_UP: See &struct iwl_sap_notif_host_link_up.
 * @SAP_MSG_NOTIF_HOST_LINK_DOWN: See &struct iwl_sap_notif_host_link_down.
 * @SAP_MSG_NOTIF_WHO_OWNS_NIC: No payload.
 * @SAP_MSG_NOTIF_WIFIDR_DOWN: No payload.
 * @SAP_MSG_NOTIF_WIFIDR_UP: No payload.
 * @SAP_MSG_NOTIF_HOST_OWNERSHIP_CONFIRMED: No payload.
 * @SAP_MSG_NOTIF_SAR_LIMITS: See &struct iwl_sap_notif_sar_limits.
 * @SAP_MSG_NOTIF_GET_NVM: No payload. Triggers %SAP_MSG_NOTIF_NVM.
 * @SAP_MSG_NOTIF_PLDR: See &struct iwl_sap_pldr_data.
 * @SAP_MSG_NOTIF_PLDR_END: See &struct iwl_sap_pldr_end_data.
 * @SAP_MSG_NOTIF_FROM_HOST_MAX: Not used.
 *
 * @SAP_MSG_DATA_MIN: Not used.
 * @SAP_MSG_DATA_PACKET: Packets that passed the filters defined by
 *	%SAP_MSG_NOTIF_CSME_FILTERS. The payload is &struct iwl_sap_hdr with
 *	the payload of the packet immediately afterwards.
 * @SAP_MSG_CB_DATA_PACKET: Indicates to CSME that we transmitted a specific
 *	packet. Used only for DHCP transmitted packets. See
 *	&struct iwl_sap_cb_data.
 * @SAP_MSG_DATA_MAX: Not used.
 */
enum iwl_sap_msg {
	SAP_MSG_NOTIF_BOTH_WAYS_MIN			= 0,
	SAP_MSG_NOTIF_PING				= 1,
	SAP_MSG_NOTIF_PONG				= 2,
	SAP_MSG_NOTIF_BOTH_WAYS_MAX,

	SAP_MSG_NOTIF_FROM_CSME_MIN			= 500,
	SAP_MSG_NOTIF_CSME_FILTERS			= SAP_MSG_NOTIF_FROM_CSME_MIN,
	/* 501 is deprecated */
	SAP_MSG_NOTIF_AMT_STATE				= 502,
	SAP_MSG_NOTIF_CSME_REPLY_TO_HOST_OWNERSHIP_REQ	= 503,
	SAP_MSG_NOTIF_CSME_TAKING_OWNERSHIP		= 504,
	SAP_MSG_NOTIF_TRIGGER_IP_REFRESH		= 505,
	SAP_MSG_NOTIF_CSME_CAN_RELEASE_OWNERSHIP	= 506,
	/* 507 is deprecated */
	/* 508 is deprecated */
	/* 509 is deprecated */
	/* 510 is deprecated */
	SAP_MSG_NOTIF_NIC_OWNER				= 511,
	SAP_MSG_NOTIF_CSME_CONN_STATUS			= 512,
	SAP_MSG_NOTIF_NVM				= 513,
	/* 514 - 517 not supported */
	SAP_MSG_NOTIF_PLDR_ACK				= 518,
	SAP_MSG_NOTIF_FROM_CSME_MAX,

	SAP_MSG_NOTIF_FROM_HOST_MIN			= 1000,
	SAP_MSG_NOTIF_BAND_SELECTION			= SAP_MSG_NOTIF_FROM_HOST_MIN,
	SAP_MSG_NOTIF_RADIO_STATE			= 1001,
	SAP_MSG_NOTIF_NIC_INFO				= 1002,
	SAP_MSG_NOTIF_HOST_ASKS_FOR_NIC_OWNERSHIP	= 1003,
	SAP_MSG_NOTIF_HOST_SUSPENDS			= 1004,
	SAP_MSG_NOTIF_HOST_RESUMES			= 1005,
	SAP_MSG_NOTIF_HOST_GOES_DOWN			= 1006,
	SAP_MSG_NOTIF_CSME_OWNERSHIP_CONFIRMED		= 1007,
	SAP_MSG_NOTIF_COUNTRY_CODE			= 1008,
	SAP_MSG_NOTIF_HOST_LINK_UP			= 1009,
	SAP_MSG_NOTIF_HOST_LINK_DOWN			= 1010,
	SAP_MSG_NOTIF_WHO_OWNS_NIC			= 1011,
	SAP_MSG_NOTIF_WIFIDR_DOWN			= 1012,
	SAP_MSG_NOTIF_WIFIDR_UP				= 1013,
	/* 1014 is deprecated */
	SAP_MSG_NOTIF_HOST_OWNERSHIP_CONFIRMED		= 1015,
	SAP_MSG_NOTIF_SAR_LIMITS			= 1016,
	SAP_MSG_NOTIF_GET_NVM				= 1017,
	/* 1018 - 1023 not supported */
	SAP_MSG_NOTIF_PLDR				= 1024,
	SAP_MSG_NOTIF_PLDR_END				= 1025,
	SAP_MSG_NOTIF_FROM_HOST_MAX,

	SAP_MSG_DATA_MIN				= 2000,
	SAP_MSG_DATA_PACKET				= SAP_MSG_DATA_MIN,
	SAP_MSG_CB_DATA_PACKET				= 2001,
	SAP_MSG_DATA_MAX,
};

/**
 * struct iwl_sap_hdr - prefixes any SAP message
 * @type: See &enum iwl_sap_msg.
 * @len: The length of the message (header not included).
 * @seq_num: For debug.
 * @payload: The payload of the message.
 */
struct iwl_sap_hdr {
	__le16 type;
	__le16 len;
	__le32 seq_num;
	u8 payload[];
};

/**
 * struct iwl_sap_msg_dw - suits any DW long SAP message
 * @hdr: The SAP header
 * @val: The value of the DW.
 */
struct iwl_sap_msg_dw {
	struct iwl_sap_hdr hdr;
	__le32 val;
};

/**
 * enum iwl_sap_nic_owner - used by %SAP_MSG_NOTIF_NIC_OWNER
 * @SAP_NIC_OWNER_UNKNOWN: Not used.
 * @SAP_NIC_OWNER_HOST: The host owns the NIC.
 * @SAP_NIC_OWNER_ME: CSME owns the NIC.
 */
enum iwl_sap_nic_owner {
	SAP_NIC_OWNER_UNKNOWN,
	SAP_NIC_OWNER_HOST,
	SAP_NIC_OWNER_ME,
};

enum iwl_sap_wifi_auth_type {
	SAP_WIFI_AUTH_TYPE_OPEN		= IWL_MEI_AKM_AUTH_OPEN,
	SAP_WIFI_AUTH_TYPE_RSNA		= IWL_MEI_AKM_AUTH_RSNA,
	SAP_WIFI_AUTH_TYPE_RSNA_PSK	= IWL_MEI_AKM_AUTH_RSNA_PSK,
	SAP_WIFI_AUTH_TYPE_SAE		= IWL_MEI_AKM_AUTH_SAE,
	SAP_WIFI_AUTH_TYPE_MAX,
};

/**
 * enum iwl_sap_wifi_cipher_alg
 * @SAP_WIFI_CIPHER_ALG_NONE: TBD
 * @SAP_WIFI_CIPHER_ALG_TKIP: TBD
 * @SAP_WIFI_CIPHER_ALG_CCMP: TBD
 * @SAP_WIFI_CIPHER_ALG_GCMP: TBD
 * @SAP_WIFI_CIPHER_ALG_GCMP_256: TBD
 */
enum iwl_sap_wifi_cipher_alg {
	SAP_WIFI_CIPHER_ALG_NONE	= IWL_MEI_CIPHER_NONE,
	SAP_WIFI_CIPHER_ALG_TKIP	= IWL_MEI_CIPHER_TKIP,
	SAP_WIFI_CIPHER_ALG_CCMP	= IWL_MEI_CIPHER_CCMP,
	SAP_WIFI_CIPHER_ALG_GCMP	= IWL_MEI_CIPHER_GCMP,
	SAP_WIFI_CIPHER_ALG_GCMP_256	= IWL_MEI_CIPHER_GCMP_256,
};

/**
 * struct iwl_sap_notif_connection_info - nested in other structures
 * @ssid_len: The length of the SSID.
 * @ssid: The SSID.
 * @auth_mode: The authentication mode. See &enum iwl_sap_wifi_auth_type.
 * @pairwise_cipher: The cipher used for unicast packets.
 *	See &enum iwl_sap_wifi_cipher_alg.
 * @channel: The channel on which we are associated.
 * @band: The band on which we are associated.
 * @reserved: For alignment.
 * @bssid: The BSSID.
 * @reserved1: For alignment.
 */
struct iwl_sap_notif_connection_info {
	__le32 ssid_len;
	u8 ssid[32];
	__le32 auth_mode;
	__le32 pairwise_cipher;
	u8 channel;
	u8 band;
	__le16 reserved;
	u8 bssid[6];
	__le16 reserved1;
} __packed;

/**
 * enum iwl_sap_scan_request - for the scan_request field
 * @SCAN_REQUEST_FILTERING: Filtering is requested.
 * @SCAN_REQUEST_FAST: Fast scan is requested.
 */
enum iwl_sap_scan_request {
	SCAN_REQUEST_FILTERING	= 1 << 0,
	SCAN_REQUEST_FAST	= 1 << 1,
};

/**
 * struct iwl_sap_notif_conn_status - payload of %SAP_MSG_NOTIF_CSME_CONN_STATUS
 * @hdr: The SAP header
 * @link_prot_state: Non-zero if link protection is active.
 * @scan_request: See &enum iwl_sap_scan_request.
 * @conn_info: Information about the connection.
 */
struct iwl_sap_notif_conn_status {
	struct iwl_sap_hdr hdr;
	__le32 link_prot_state;
	__le32 scan_request;
	struct iwl_sap_notif_connection_info conn_info;
} __packed;

/**
 * enum iwl_sap_radio_state_bitmap - used for %SAP_MSG_NOTIF_RADIO_STATE
 * @SAP_SW_RFKILL_DEASSERTED: If set, SW RfKill is de-asserted
 * @SAP_HW_RFKILL_DEASSERTED: If set, HW RfKill is de-asserted
 *
 * If both bits are set, then the radio is on.
 */
enum iwl_sap_radio_state_bitmap {
	SAP_SW_RFKILL_DEASSERTED	= 1 << 0,
	SAP_HW_RFKILL_DEASSERTED	= 1 << 1,
};

/**
 * enum iwl_sap_notif_host_suspends_bitmap - used for %SAP_MSG_NOTIF_HOST_SUSPENDS
 * @SAP_OFFER_NIC: TBD
 * @SAP_FILTER_CONFIGURED: TBD
 * @SAP_NLO_CONFIGURED: TBD
 * @SAP_HOST_OWNS_NIC: TBD
 * @SAP_LINK_PROTECTED: TBD
 */
enum iwl_sap_notif_host_suspends_bitmap {
	SAP_OFFER_NIC		= 1 << 0,
	SAP_FILTER_CONFIGURED	= 1 << 1,
	SAP_NLO_CONFIGURED	= 1 << 2,
	SAP_HOST_OWNS_NIC	= 1 << 3,
	SAP_LINK_PROTECTED	= 1 << 4,
};

/**
 * struct iwl_sap_notif_country_code - payload of %SAP_MSG_NOTIF_COUNTRY_CODE
 * @hdr: The SAP header
 * @mcc: The country code.
 * @source_id: TBD
 * @reserved: For alignment.
 * @diff_time: TBD
 */
struct iwl_sap_notif_country_code {
	struct iwl_sap_hdr hdr;
	__le16 mcc;
	u8 source_id;
	u8 reserved;
	__le32 diff_time;
} __packed;

/**
 * struct iwl_sap_notif_host_link_up - payload of %SAP_MSG_NOTIF_HOST_LINK_UP
 * @hdr: The SAP header
 * @conn_info: Information about the connection.
 * @colloc_channel: The collocated channel
 * @colloc_band: The band of the collocated channel.
 * @reserved: For alignment.
 * @colloc_bssid: The collocated BSSID.
 * @reserved1: For alignment.
 */
struct iwl_sap_notif_host_link_up {
	struct iwl_sap_hdr hdr;
	struct iwl_sap_notif_connection_info conn_info;
	u8 colloc_channel;
	u8 colloc_band;
	__le16 reserved;
	u8 colloc_bssid[6];
	__le16 reserved1;
} __packed;

/**
 * enum iwl_sap_notif_link_down_type - used in &struct iwl_sap_notif_host_link_down
 * @HOST_LINK_DOWN_TYPE_NONE: TBD
 * @HOST_LINK_DOWN_TYPE_TEMPORARY: TBD
 * @HOST_LINK_DOWN_TYPE_LONG: TBD
 */
enum iwl_sap_notif_link_down_type {
	HOST_LINK_DOWN_TYPE_NONE,
	HOST_LINK_DOWN_TYPE_TEMPORARY,
	HOST_LINK_DOWN_TYPE_LONG,
};

/**
 * struct iwl_sap_notif_host_link_down - payload for %SAP_MSG_NOTIF_HOST_LINK_DOWN
 * @hdr: The SAP header
 * @type: See &enum iwl_sap_notif_link_down_type.
 * @reserved: For alignment.
 * @reason_valid: If 0, ignore the next field.
 * @reason: The reason of the disconnection.
 */
struct iwl_sap_notif_host_link_down {
	struct iwl_sap_hdr hdr;
	u8 type;
	u8 reserved[2];
	u8 reason_valid;
	__le32 reason;
} __packed;

/**
 * struct iwl_sap_notif_host_nic_info - payload for %SAP_MSG_NOTIF_NIC_INFO
 * @hdr: The SAP header
 * @mac_address: The MAC address as configured to the interface.
 * @nvm_address: The MAC address as configured in the NVM.
 */
struct iwl_sap_notif_host_nic_info {
	struct iwl_sap_hdr hdr;
	u8 mac_address[6];
	u8 nvm_address[6];
} __packed;

/**
 * struct iwl_sap_notif_dw - payload is a dw
 * @hdr: The SAP header.
 * @dw: The payload.
 */
struct iwl_sap_notif_dw {
	struct iwl_sap_hdr hdr;
	__le32 dw;
} __packed;

/**
 * struct iwl_sap_notif_sar_limits - payload for %SAP_MSG_NOTIF_SAR_LIMITS
 * @hdr: The SAP header
 * @sar_chain_info_table: Tx power limits.
 */
struct iwl_sap_notif_sar_limits {
	struct iwl_sap_hdr hdr;
	__le16 sar_chain_info_table[2][5];
} __packed;

/**
 * enum iwl_sap_nvm_caps - capabilities for NVM SAP
 * @SAP_NVM_CAPS_LARI_SUPPORT: Lari is supported
 * @SAP_NVM_CAPS_11AX_SUPPORT: 11AX is supported
 */
enum iwl_sap_nvm_caps {
	SAP_NVM_CAPS_LARI_SUPPORT	= BIT(0),
	SAP_NVM_CAPS_11AX_SUPPORT	= BIT(1),
};

/**
 * struct iwl_sap_nvm - payload for %SAP_MSG_NOTIF_NVM
 * @hdr: The SAP header.
 * @hw_addr: The MAC address
 * @n_hw_addrs: The number of MAC addresses
 * @reserved: For alignment.
 * @radio_cfg: The radio configuration.
 * @caps: See &enum iwl_sap_nvm_caps.
 * @nvm_version: The version of the NVM.
 * @channels: The data for each channel.
 */
struct iwl_sap_nvm {
	struct iwl_sap_hdr hdr;
	u8 hw_addr[6];
	u8 n_hw_addrs;
	u8 reserved;
	__le32 radio_cfg;
	__le32 caps;
	__le32 nvm_version;
	__le32 channels[110];
} __packed;

/**
 * enum iwl_sap_eth_filter_flags - used in &struct iwl_sap_eth_filter
 * @SAP_ETH_FILTER_STOP: Do not process further filters.
 * @SAP_ETH_FILTER_COPY: Copy the packet to the CSME.
 * @SAP_ETH_FILTER_ENABLED: If false, the filter should be ignored.
 */
enum iwl_sap_eth_filter_flags {
	SAP_ETH_FILTER_STOP    = BIT(0),
	SAP_ETH_FILTER_COPY    = BIT(1),
	SAP_ETH_FILTER_ENABLED = BIT(2),
};

/**
 * struct iwl_sap_eth_filter - a L2 filter
 * @mac_address: Address to filter.
 * @flags: See &enum iwl_sap_eth_filter_flags.
 */
struct iwl_sap_eth_filter {
	u8 mac_address[6];
	u8 flags;
} __packed;

/**
 * enum iwl_sap_flex_filter_flags - used in &struct iwl_sap_flex_filter
 * @SAP_FLEX_FILTER_COPY: Pass UDP / TCP packets to CSME.
 * @SAP_FLEX_FILTER_ENABLED: If false, the filter should be ignored.
 * @SAP_FLEX_FILTER_IPV4: Filter requires match on the IP address as well.
 * @SAP_FLEX_FILTER_IPV6: Filter requires match on the IP address as well.
 * @SAP_FLEX_FILTER_TCP: Filter should be applied on TCP packets.
 * @SAP_FLEX_FILTER_UDP: Filter should be applied on UDP packets.
 */
enum iwl_sap_flex_filter_flags {
	SAP_FLEX_FILTER_COPY		= BIT(0),
	SAP_FLEX_FILTER_ENABLED		= BIT(1),
	SAP_FLEX_FILTER_IPV6		= BIT(2),
	SAP_FLEX_FILTER_IPV4		= BIT(3),
	SAP_FLEX_FILTER_TCP		= BIT(4),
	SAP_FLEX_FILTER_UDP		= BIT(5),
};

/**
 * struct iwl_sap_flex_filter -
 * @src_port: Source port in network format.
 * @dst_port: Destination port in network format.
 * @flags: Flags and protocol, see &enum iwl_sap_flex_filter_flags.
 * @reserved: For alignment.
 */
struct iwl_sap_flex_filter {
	__be16 src_port;
	__be16 dst_port;
	u8 flags;
	u8 reserved;
} __packed;

/**
 * enum iwl_sap_ipv4_filter_flags - used in &struct iwl_sap_ipv4_filter
 * @SAP_IPV4_FILTER_ICMP_PASS: Pass ICMP packets to CSME.
 * @SAP_IPV4_FILTER_ICMP_COPY: Pass ICMP packets to host.
 * @SAP_IPV4_FILTER_ARP_REQ_PASS: Pass ARP requests to CSME.
 * @SAP_IPV4_FILTER_ARP_REQ_COPY: Pass ARP requests to host.
 * @SAP_IPV4_FILTER_ARP_RESP_PASS: Pass ARP responses to CSME.
 * @SAP_IPV4_FILTER_ARP_RESP_COPY: Pass ARP responses to host.
 */
enum iwl_sap_ipv4_filter_flags {
	SAP_IPV4_FILTER_ICMP_PASS	= BIT(0),
	SAP_IPV4_FILTER_ICMP_COPY	= BIT(1),
	SAP_IPV4_FILTER_ARP_REQ_PASS	= BIT(2),
	SAP_IPV4_FILTER_ARP_REQ_COPY	= BIT(3),
	SAP_IPV4_FILTER_ARP_RESP_PASS	= BIT(4),
	SAP_IPV4_FILTER_ARP_RESP_COPY	= BIT(5),
};

/**
 * struct iwl_sap_ipv4_filter-
 * @ipv4_addr: The IP address to filer.
 * @flags: See &enum iwl_sap_ipv4_filter_flags.
 */
struct iwl_sap_ipv4_filter {
	__be32 ipv4_addr;
	__le32 flags;
} __packed;

/**
 * enum iwl_sap_ipv6_filter_flags -
 * @SAP_IPV6_ADDR_FILTER_COPY: Pass packets to the host.
 * @SAP_IPV6_ADDR_FILTER_ENABLED: If false, the filter should be ignored.
 */
enum iwl_sap_ipv6_filter_flags {
	SAP_IPV6_ADDR_FILTER_COPY	= BIT(0),
	SAP_IPV6_ADDR_FILTER_ENABLED	= BIT(1),
};

/**
 * struct iwl_sap_ipv6_filter -
 * @addr_lo24: Lowest 24 bits of the IPv6 address.
 * @flags: See &enum iwl_sap_ipv6_filter_flags.
 */
struct iwl_sap_ipv6_filter {
	u8 addr_lo24[3];
	u8 flags;
} __packed;

/**
 * enum iwl_sap_icmpv6_filter_flags -
 * @SAP_ICMPV6_FILTER_ENABLED: If false, the filter should be ignored.
 * @SAP_ICMPV6_FILTER_COPY: Pass packets to the host.
 */
enum iwl_sap_icmpv6_filter_flags {
	SAP_ICMPV6_FILTER_ENABLED	= BIT(0),
	SAP_ICMPV6_FILTER_COPY		= BIT(1),
};

/**
 * enum iwl_sap_vlan_filter_flags -
 * @SAP_VLAN_FILTER_VLAN_ID_MSK: TBD
 * @SAP_VLAN_FILTER_ENABLED: If false, the filter should be ignored.
 */
enum iwl_sap_vlan_filter_flags {
	SAP_VLAN_FILTER_VLAN_ID_MSK	= 0x0FFF,
	SAP_VLAN_FILTER_ENABLED		= BIT(15),
};

/**
 * struct iwl_sap_oob_filters - Out of band filters (for RX only)
 * @flex_filters: Array of &struct iwl_sap_flex_filter.
 * @icmpv6_flags: See &enum iwl_sap_icmpv6_filter_flags.
 * @ipv6_filters: Array of &struct iwl_sap_ipv6_filter.
 * @eth_filters: Array of &struct iwl_sap_eth_filter.
 * @reserved: For alignment.
 * @ipv4_filter: &struct iwl_sap_ipv4_filter.
 * @vlan: See &enum iwl_sap_vlan_filter_flags.
 */
struct iwl_sap_oob_filters {
	struct iwl_sap_flex_filter flex_filters[14];
	__le32 icmpv6_flags;
	struct iwl_sap_ipv6_filter ipv6_filters[4];
	struct iwl_sap_eth_filter eth_filters[5];
	u8 reserved;
	struct iwl_sap_ipv4_filter ipv4_filter;
	__le16 vlan[4];
} __packed;

/**
 * struct iwl_sap_csme_filters - payload of %SAP_MSG_NOTIF_CSME_FILTERS
 * @hdr: The SAP header.
 * @mode: Not used.
 * @mac_address: Not used.
 * @reserved: For alignment.
 * @cbfilters: Not used.
 * @filters: Out of band filters.
 */
struct iwl_sap_csme_filters {
	struct iwl_sap_hdr hdr;
	__le32 mode;
	u8 mac_address[6];
	__le16 reserved;
	u8 cbfilters[1728];
	struct iwl_sap_oob_filters filters;
} __packed;

#define CB_TX_DHCP_FILT_IDX 30
/**
 * struct iwl_sap_cb_data - header to be added for transmitted packets.
 * @hdr: The SAP header.
 * @reserved: Not used.
 * @to_me_filt_status: The filter that matches. Bit %CB_TX_DHCP_FILT_IDX should
 *	be set for DHCP (the only packet that uses this header).
 * @reserved2: Not used.
 * @data_len: The length of the payload.
 * @payload: The payload of the transmitted packet.
 */
struct iwl_sap_cb_data {
	struct iwl_sap_hdr hdr;
	__le32 reserved[7];
	__le32 to_me_filt_status;
	__le32 reserved2;
	__le32 data_len;
	u8 payload[];
};

/**
 * struct iwl_sap_pldr_data - payload of %SAP_MSG_NOTIF_PLDR
 * @hdr: The SAP header.
 * @version: SAP message version
 */
struct iwl_sap_pldr_data {
	struct iwl_sap_hdr hdr;
	__le32 version;
} __packed;

/**
 * enum iwl_sap_pldr_status -
 * @SAP_PLDR_STATUS_SUCCESS: PLDR started/ended successfully
 * @SAP_PLDR_STATUS_FAILURE: PLDR failed to start/end
 */
enum iwl_sap_pldr_status {
	SAP_PLDR_STATUS_SUCCESS	= 0,
	SAP_PLDR_STATUS_FAILURE	= 1,
};

/*
 * struct iwl_sap_pldr_end_data - payload of %SAP_MSG_NOTIF_PLDR_END
 * @hdr: The SAP header.
 * @version: SAP message version
 * @status: PLDR end status
 */
struct iwl_sap_pldr_end_data {
	struct iwl_sap_hdr hdr;
	__le32 version;
	__le32 status;
} __packed;

/*
 * struct iwl_sap_pldr_ack_data - payload of %SAP_MSG_NOTIF_PLDR_ACK
 * @version: SAP message version
 * @status: CSME accept/refuse to the PLDR request
 */
struct iwl_sap_pldr_ack_data {
	struct iwl_sap_hdr hdr;
	__le32 version;
	__le32 status;
} __packed;

#endif /* __sap_h__ */
