/* 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__ */