blob: 5f97d6685a0fb5a5fcf074516cc5fd7cd0820025 [file] [log] [blame]
/******************************************************************************
*
* Copyright(c) 2016 - 2017 Intel Deutschland GmbH
* Copyright(c) 2018 Intel Corporation
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* * Neither the name Intel Corporation nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*****************************************************************************/
#ifndef SRC_CONNECTIVITY_WLAN_DRIVERS_THIRD_PARTY_INTEL_IWLWIFI_FW_API_FMAC_H_
#define SRC_CONNECTIVITY_WLAN_DRIVERS_THIRD_PARTY_INTEL_IWLWIFI_FW_API_FMAC_H_
#include <fuchsia/wlan/ieee80211/c/banjo.h>
#define FMAC_GROUP 0x10
/**
* enum iwl_fmac_cmds - Supported FMAC commands and notifications
*/
enum iwl_fmac_cmds {
/* Commands */
/**
* @FMAC_SCAN:
* Perform a scan using configuration defined in
* &struct iwl_fmac_scan_cmd.
* The scan flow is asynchronous and upon completion a
* %FMAC_SCAN_COMPLETE notification is sent by fmac using
* &struct iwl_fmac_scan_complete_notif.
*/
FMAC_SCAN = 0x0,
/**
* @FMAC_SCAN_ABORT:
* Stop an ongoing scan. The command is defined in
* &struct iwl_fmac_scan_abort_cmd.
*/
FMAC_SCAN_ABORT = 0x1,
/**
* @FMAC_ADD_VIF:
* Add a virtual interface. The interface configuration is
* defined in &struct iwl_fmac_add_vif_cmd.
*/
FMAC_ADD_VIF = 0x2,
/**
* @FMAC_DEL_VIF:
* Delete a virtual interface. The command is defined in
* &struct iwl_fmac_del_vif_cmd.
*/
FMAC_DEL_VIF = 0x3,
/**
* @FMAC_CONNECT:
* As a station interface, connect to a network, using the configuration
* defined in &struct iwl_fmac_connect_cmd. The connect flow is
* asynchronous and upon completion a %FMAC_CONNECT_RESULT notification
* is sent by FMAC using &struct iwl_fmac_connect_result.
*/
FMAC_CONNECT = 0x4,
/**
* @FMAC_DISCONNECT:
* As station interface, disconnect. The command is defined in
* &struct iwl_fmac_disconnect_cmd.
*/
FMAC_DISCONNECT = 0x5,
/**
* @FMAC_SAR: TODO
*/
FMAC_SAR = 0x6,
/**
* @FMAC_NVM:
* Apply the global NVM configuration using configuration defined in
* &struct iwl_fmac_nvm_cmd.
*/
FMAC_NVM = 0x7,
#ifdef CPTCFG_IWLFMAC_9000_SUPPORT
/**
* @FMAC_REQ_QUEUE:
* Request a new transmit queue, using the configuration in
* &struct iwl_fmac_req_queue. Only used with 9000-series devices.
*/
FMAC_REQ_QUEUE = 0x8,
/**
* @FMAC_REL_QUEUE:
* Release a queue allocated for <RA, TID>, using the configuration in
* &struct iwl_fmac_rel_queue. Only used with 9000-series devices.
*/
FMAC_REL_QUEUE = 0x9,
#endif
#ifdef CPTCFG_IWLFMAC_9000_SUPPORT
/**
* @FMAC_SCD_QUEUE_CFG:
* Configure a transmit queue, as defined in
* &struct iwl_fmac_scd_txq_cfg_cmd.
* Only used with 9000-series devices.
*/
FMAC_SCD_QUEUE_CFG = 0xb,
#endif
/**
* @FMAC_CONFIG:
* Configure global or interface specific settings as defined
* in &struct iwl_fmac_config_cmd.
*/
FMAC_CONFIG = 0xc,
/* 0xd is reserved */
/* 0xe is reserved */
/**
* @FMAC_REG_CFG: TODO
*/
FMAC_REG_CFG = 0xf,
/* 0x10 is reverved */
/* 0x11 is reverved */
/* 0x12 is reverved */
/* 0x13 is reverved */
/**
* @FMAC_SET_PMK:
* Set the key after a successful IEEE802.1X authentication.
* The available key types are defined in &iwl_fmac_key_type.
* &struct iwl_fmac_mlme_set_pmk_cmd as the command struct.
*/
FMAC_SET_PMK = 0x14,
/**
* @FMAC_ACK_STA_REMOVED:
* Acknowledge that station removal was processed and the driver has
* stopped using the station ID; uses the notification
* &struct iwl_fmac_sta_removed as the command struct.
*/
FMAC_ACK_STA_REMOVED = 0x15,
/**
* @FMAC_TEST_FIPS:
* Test security algorithms implemented in FMAC
*/
FMAC_TEST_FIPS = 0x16,
/* 0x17 is reserved */
/* 0x19 is reserved */
/* 0x1a is reserved */
/* 0x1b is reserved */
/* 0x1c is reserved */
/* 0x1d is reserved */
/* 0x1e is reserved */
/**
* @FMAC_MIC_FAILURE:
* Inform FMAC about TKIP MMIC failures, FMAC will run countermeasures.
* &struct iwl_fmac_mic_failure as the command struct.
*/
FMAC_MIC_FAILURE = 0x1f,
/**
* @FMAC_SET_MONITOR_CHAN:
* Set channel of monitor interface.
* &struct iwl_fmac_set_monitor_chan_cmd as the command struct.
*/
FMAC_SET_MONITOR_CHAN = 0x20,
/* 0x21 is reserved */
/**
* @FMAC_HOST_BASED_AP:
* Manage (start / modify / stop) a host based AP.
* &struct iwl_fmac_host_ap_cmd as the command struct or
* &struct iwl_fmac_host_ap_resp for the response
*/
FMAC_HOST_BASED_AP = 0x22,
/**
* @FMAC_HOST_BASED_AP_STA:
* Add / modify / remove stations for the host based AP.
* &struct iwl_fmac_host_ap_sta_cmd as the command struct.
*/
FMAC_HOST_BASED_AP_STA = 0x23,
/**
* @FMAC_TEMPORAL_KEY:
* Add / remove keys for the host based AP.
* &struct iwl_fmac_temporal_key_cmd as the command struct.
* &struct iwl_fmac_temporal_key_resp is the response.
*/
FMAC_TEMPORAL_KEY = 0x24,
/**
* @FMAC_TKIP_SET_MCAST_RSC:
* Update TKIP MCAST Receive Sequence Counter. The driver should send
* this command every time the 4 high bytes of the RSC change.
* &struct iwl_fmac_tkip_mcast_rsc is the command struct.
*/
FMAC_TKIP_SET_MCAST_RSC = 0x25,
/**
* @FMAC_PORT_AUTHORIZED:
* Inform FMAC that VIF is authorized.
* &struct iwl_fmac_port_authorized_cmd as the command struct.
*/
FMAC_PORT_AUTHORIZED = 0x26,
/**
* @FMAC_ROAM:
* Roam to the current network, using the configuration defined in
* &struct iwl_fmac_connect_cmd.
* The roam flow is asynchronous and upon completion
* a %FMAC_ROAM_RESULT notification is sent by FMAC using &struct
* iwl_fmac_roam_result.
*/
FMAC_ROAM = 0x27,
/**
* @FMAC_RECOVER:
* Ask FMAC to recover after a firmware reset using the configuration
* blob in &struct iwl_fmac_recover_cmd.
*/
FMAC_RECOVER = 0x28,
/* Notifications */
/**
* @FMAC_RECOVERY_COMPLETE:
* Notifies that the recovery is complete. Uses the
* &struct iwl_fmac_recovery_complete as the notification structure.
*/
FMAC_RECOVERY_COMPLETE = 0xe8,
/**
* @FMAC_INACTIVE_STATION:
* Notifies about a station that we haven't heard from and that
* does't reply to our probe (Null Data Packet). This station
* should be disconnected.
* &struct iwl_fmac_inactive_sta is the notification struct.
*/
FMAC_INACTIVE_STATION = 0xe9,
/**
* @FMAC_ROAM_IS_NEEDED:
* Roam is needed notification, with roam information
* given in &struct iwl_fmac_roam_is_needed.
*/
FMAC_ROAM_IS_NEEDED = 0xea,
/**
* @FMAC_ROAM_RESULT:
* Roam result notification, with information given in &struct
* iwl_fmac_roam_result.
*/
FMAC_ROAM_RESULT = 0xeb,
#ifdef CPTCFG_IWLFMAC_9000_SUPPORT
/**
* @FMAC_SEND_FRAME:
* Notification about a frame that should be sent by the host
* on FMAC's behalf as defined in &struct iwl_fmac_send_frame_notif
* Only used with 9000-series devices.
*/
FMAC_SEND_FRAME = 0xf0,
#endif
/* 0xf1 is reserved */
/* 0xf2 is reserved */
/**
* @FMAC_EAPOL:
* Notification about a received EAPOL frame. This notification is
* used to notify the host about EAPOL frames required for IEEE802.1X
* authentication. Other EAPOL frames are not passed to the host.
*/
FMAC_EAPOL = 0xf3,
/* 0xf4 is reserved */
/* 0xf5 is reserved */
/**
* @FMAC_REG_UPDATE: TODO
*/
FMAC_REG_UPDATE = 0xf6,
/**
* @FMAC_TRIGGER_NOTIF: TODO
*/
FMAC_TRIGGER_NOTIF = 0xf7,
/* 0xf8 is reserved */
/* 0xf9 is reserved */
/* 0xfa is reserved */
/**
* @FMAC_KEYS_UPDATE:
* Notification about new keys, where the new key configuration is
* given in &struct iwl_fmac_keys_update_notif.
*/
FMAC_KEYS_UPDATE = 0xfb,
/**
* @FMAC_DISCONNECTED:
* For station interface, disconnection from a network notification,
* with additional information given in &struct iwl_fmac_disconnect_cmd.
*/
FMAC_DISCONNECTED = 0xfc,
/**
* @FMAC_DEBUG:
* Debug information notification with additional information given
* in &struct iwl_fmac_debug_notif.
*/
FMAC_DEBUG = 0xfd,
/**
* @FMAC_CONNECT_RESULT:
* Connect request result notification, with the
* connection information given in &struct iwl_fmac_connect_result.
*/
FMAC_CONNECT_RESULT = 0xfe,
/**
* @FMAC_SCAN_COMPLETE:
* Scan completed notification, with additional information
* in &struct iwl_fmac_scan_complete_notif.
*/
FMAC_SCAN_COMPLETE = 0xff,
};
#define IWL_FMAC_MAX_SSIDS 20
#define IWL_FMAC_MAX_CHANS 50
#ifdef CPTCFG_IWLFMAC_9000_SUPPORT
/*
* Value used, in 9000-series API, when no queue is
* assigned/present.
*/
#define IWL_FMAC_NO_QUEUE 0xff
#endif
/**
* struct iwl_fmac_scan_cmd - MLME scan command
* @vif_id: vif_id returned by &FMAC_ADD_VIF command
* @random_mac: use randomized mac address
* @n_ssids: number of ssids in &ssids.
* @n_freqs: number of freqs in &freqs
* @flags: currently unused.
* @rates_24: currently unused.
* @rates_52: currently unused.
* @ssids: SSIDs to scan for (active scan only)
* @ssids_lengths: lengths of the SSIDs in &ssids
* @freqs: freqs in MHz. If none are specified all the supported frequencies are
* scanned.
* @bssid: BSSID to scan for (most commonly, the wildcard BSSID).
* @ie_len: length of IEs in octets.
* @ie: optional IEs added to probe request.
*
* Request a scan operation on &freqs, probing for the networks
* specified by &ssids. The scan execution is done in an asynchronous manner,
* and the completion of the flow is indicated via %FMAC_SCAN_COMPLETE
* notification.
*/
struct iwl_fmac_scan_cmd {
uint8_t vif_id;
uint8_t random_mac;
uint8_t n_ssids;
uint8_t n_freqs;
__le32 flags;
__le16 rates_24;
__le16 rates_52;
uint8_t ssids[IWL_FMAC_MAX_SSIDS][fuchsia_wlan_ieee80211_MAX_SSID_BYTE_LEN];
uint8_t ssids_lengths[IWL_FMAC_MAX_SSIDS];
__le16 freqs[IWL_FMAC_MAX_CHANS];
uint8_t bssid[ETH_ALEN];
__le16 ie_len;
#ifndef _MSC_VER
uint8_t ie[0];
#endif
/* pad to a multiple of 4 bytes */
} __packed;
/**
* struct iwl_fmac_scan_abort_cmd - MLME scan abort command
* @vif_id: the interface identifier returned in &iwl_fmac_add_vif_resp
* @reserved: for alignment.
*
* Request to abort an ongoing scan operation initiated by %FMAC_SCAN command.
*/
struct iwl_fmac_scan_abort_cmd {
uint8_t vif_id;
uint8_t reserved[3];
} __packed;
/**
* enum iwl_fmac_vif_type - Interface types supported by fmac
* @IWL_FMAC_IFTYPE_MGD: Managed interface.
* @IWL_FMAC_IFTYPE_P2P_CLIENT: P2P Client interface. Not supported yet.
* @IWL_FMAC_IFTYPE_P2P_GO: P2P Group Owner interface. Not supported yet.
* @IWL_FMAC_IFTYPE_P2P_DEVICE: P2P Device interface. Not supported yet.
* @IWL_FMAC_IFTYPE_MONITOR: Sniffer Device interface.
* @IWL_FMAC_IFTYPE_HOST_BASED_AP: Access Point interface, but handled by the
* host. All management frames will be forwarded to the host. There can be
* at most one such vif in the system.
* @IWL_FMAC_IFTYPE_ANY: catch-all interface type for config command.
*/
enum iwl_fmac_vif_type {
IWL_FMAC_IFTYPE_MGD = 1,
/* 2 is reserved */
IWL_FMAC_IFTYPE_P2P_CLIENT = 3,
IWL_FMAC_IFTYPE_P2P_GO,
IWL_FMAC_IFTYPE_P2P_DEVICE,
/* 6 is reserved */
IWL_FMAC_IFTYPE_MONITOR = 7,
IWL_FMAC_IFTYPE_HOST_BASED_AP,
/* 7 is reserved */
IWL_FMAC_IFTYPE_ANY = 0xff,
};
#define IWL_FMAC_STATION_COUNT 16
enum iwl_fmac_tx_fifo {
IWL_FMAC_TX_FIFO_BK = 0,
IWL_FMAC_TX_FIFO_BE,
IWL_FMAC_TX_FIFO_VI,
IWL_FMAC_TX_FIFO_VO,
IWL_FMAC_TX_FIFO_MCAST = 5,
IWL_FMAC_TX_FIFO_CMD = 7,
};
static const uint8_t iwl_fmac_tid_to_tx_fifo[] = {
IWL_FMAC_TX_FIFO_BE, IWL_FMAC_TX_FIFO_BK, IWL_FMAC_TX_FIFO_BK,
IWL_FMAC_TX_FIFO_BE, IWL_FMAC_TX_FIFO_VI, IWL_FMAC_TX_FIFO_VI,
IWL_FMAC_TX_FIFO_VO, IWL_FMAC_TX_FIFO_VO, IWL_FMAC_TX_FIFO_VO /* MGMT is mapped to VO */
};
/**
* struct iwl_fmac_add_vif_cmd - Add a new virtual interface.
* @addr: the mac address that should be assigned to the interface.
* @type: the requested interface type as specified in %iwl_fmac_vif_type.
* @reserved: for alignment.
*
* Add a new virtual interface. The flow is a synchronous one, and upon
* completion, the operation result is conveyed using &iwl_fmac_add_vif_resp.
*/
struct iwl_fmac_add_vif_cmd {
uint8_t addr[ETH_ALEN];
uint8_t type;
uint8_t reserved;
} __packed;
/**
* enum iwl_fw_add_vif_resp_status - Status of %FMAC_ADD_VIF command.
* @IWL_ADD_VIF_SUCCESS: Success to add a new interface.
* @IWL_ADD_VIF_FAILURE: Failure to add a new interface.
*/
enum iwl_fw_add_vif_resp_status {
IWL_ADD_VIF_SUCCESS = 0,
IWL_ADD_VIF_FAILURE,
};
/**
* struct iwl_fmac_del_vif_cmd - Delete a virtual interface.
* @id: the interface id, as returned in &iwl_fmac_add_vif_resp in case of a
* @reserved: for alignment.
* successful %FMAC_ADD_VIF command.
*/
struct iwl_fmac_del_vif_cmd {
uint8_t id;
uint8_t reserved[3];
} __packed;
/**
* struct iwl_fmac_add_vif_resp - response for a %FMAC_ADD_VIF command.
* @status: see &iwl_fw_add_vif_resp_status.
* @id: on successful operation, would hold the new interface identifier.
* @reserved: for alignment.
*/
struct iwl_fmac_add_vif_resp {
uint8_t status;
uint8_t id;
__le16 reserved;
} __packed;
/**
* enum iwl_fmac_connection_flags - connection flags
* @IWL_FMAC_FREQ_IN_USE: use only the specified frequency.
* @IWL_FMAC_FREQ_HINT: use as an hint to optimize connection time.
* @IWL_FMAC_CONNECT_FLAGS_BSSID_WHITELIST: If this is set, the BSSIDs list is
* a whitelist, i.e. a list of the acceptable BSSIDs for connection.
* Otherwise, the BSSIDs list is a blacklist specifying disallowed BSSIDs.
*/
enum iwl_fmac_connection_flags {
IWL_FMAC_FREQ_IN_USE = BIT(0),
IWL_FMAC_FREQ_HINT = BIT(1),
IWL_FMAC_CONNECT_FLAGS_BSSID_WHITELIST = BIT(2),
};
/*
* Supported cipher suites (both pairwise and group):
* @IWL_FMAC_CIPHER_NONE:
* @IWL_FMAC_CIPHER_WEP40:
* @IWL_FMAC_CIPHER_WEP104:
* @IWL_FMAC_CIPHER_TKIP:
* @IWL_FMAC_CIPHER_CCMP:
* @IWL_FMAC_CIPHER_GCMP:
* @IWL_FMAC_CIPHER_GCMP_256:
* @IWL_FMAC_CIPHER_CCMP_256:
*/
#define IWL_FMAC_CIPHER_NONE BIT(0)
#define IWL_FMAC_CIPHER_WEP40 BIT(1)
#define IWL_FMAC_CIPHER_WEP104 BIT(2)
#define IWL_FMAC_CIPHER_TKIP BIT(3)
#define IWL_FMAC_CIPHER_CCMP BIT(4)
#define IWL_FMAC_CIPHER_AES_128_CMAC BIT(5)
#define IWL_FMAC_CIPHER_GCMP BIT(6)
#define IWL_FMAC_CIPHER_GCMP_256 BIT(8)
#define IWL_FMAC_CIPHER_CCMP_256 BIT(9)
#define IWL_FMAC_SUPPORTED_CIPHERS \
(IWL_FMAC_CIPHER_NONE | IWL_FMAC_CIPHER_WEP40 | IWL_FMAC_CIPHER_WEP104 | IWL_FMAC_CIPHER_TKIP | \
IWL_FMAC_CIPHER_CCMP | IWL_FMAC_CIPHER_AES_128_CMAC | IWL_FMAC_CIPHER_GCMP | \
IWL_FMAC_CIPHER_GCMP_256 | IWL_FMAC_CIPHER_CCMP_256)
/**
* Supported key management suites:
* @IWL_FMAC_KEY_MGMT_IEEE8021X:
* @IWL_FMAC_KEY_MGMT_PSK:
* @IWL_FMAC_KEY_MGMT_IEEE8021X_SHA256:
* @IWL_FMAC_KEY_MGMT_PSK_SHA256:
* @IWL_FMAC_KEY_MGMT_IEEE8021X_SUITE_B:
* @IWL_FMAC_KEY_MGMT_IEEE8021X_SUITE_B_192:
*/
#define IWL_FMAC_KEY_MGMT_IEEE8021X BIT(0)
#define IWL_FMAC_KEY_MGMT_PSK BIT(1)
#define IWL_FMAC_KEY_MGMT_FT_IEEE8021X BIT(5)
#define IWL_FMAC_KEY_MGMT_FT_PSK BIT(6)
#define IWL_FMAC_KEY_MGMT_IEEE8021X_SHA256 BIT(7)
#define IWL_FMAC_KEY_MGMT_PSK_SHA256 BIT(8)
#define IWL_FMAC_KEY_MGMT_IEEE8021X_SUITE_B BIT(16)
#define IWL_FMAC_KEY_MGMT_IEEE8021X_SUITE_B_192 BIT(17)
#define IWL_FMAC_SUPPORTED_KEY_MGMT \
(IWL_FMAC_KEY_MGMT_PSK | IWL_FMAC_KEY_MGMT_PSK_SHA256 | IWL_FMAC_KEY_MGMT_FT_IEEE8021X | \
IWL_FMAC_KEY_MGMT_FT_PSK | IWL_FMAC_KEY_MGMT_IEEE8021X | IWL_FMAC_KEY_MGMT_IEEE8021X_SHA256 | \
IWL_FMAC_KEY_MGMT_IEEE8021X_SUITE_B | IWL_FMAC_KEY_MGMT_IEEE8021X_SUITE_B_192)
/**
* Supported security protocols:
* @IWL_FMAC_PROTO_WPA:
* @IWL_FMAC_PROTO_RSN:
*/
#define IWL_FMAC_PROTO_WPA BIT(0)
#define IWL_FMAC_PROTO_RSN BIT(1)
#define IWL_FMAC_SUPPORTED_PROTO (IWL_FMAC_PROTO_WPA | IWL_FMAC_PROTO_RSN)
/**
* enum iwl_fmac_mfp_mode: Supported Management Frame Protection modes.
* @IWL_FMAC_MFP_NO: management frame protection not used
* @IWL_FMAC_MFP_OPTIONAL: management frame protection is optional
* @IWL_FMAC_MFP_REQUIRED: management frame protection is required
*/
enum iwl_fmac_mfp_mode {
IWL_FMAC_MFP_NO,
IWL_FMAC_MFP_OPTIONAL,
IWL_FMAC_MFP_REQUIRED,
};
#define IWL_NUM_WEP_KEYS 4
#define IWL_MAX_WEP_KEY_LEN 13
/**
* struct iwl_fmac_crypto - Security configuration.
* @cipher_group: the allowed group cipher suite as specified in
* %IWL_FMAC_CIPHER_\*.
* @ciphers_pairwise: the allowed pairwise cipher suites as specified in
* %IWL_FMAC_CIPHER_\*
* @key_mgmt: the supported key management suites as specified in
* %IWL_FMAC_KEY_MGMT_\*. If set to NONE only wep section of the union
* below will be accessed. If PSK is set the key and proto will be read
* from wpa section.
* @mfp: the Management Frame Protection configuration. The allowed
* configurations are specified in %iwl_fmac_mfp_mode. Only supported
* for station mode for now. This option is not supported on 9000 devices.
* @reserved: reserved
* @psk: the pre-shared key used with key management suites
* %IWL_FMAC_KEY_MGMT_PSK and %IWL_FMAC_KEY_MGMT_PSK_SHA256.
* @proto: the allowed protocol as specified in %IWL_FMAC_PROTO_\*.
* @key: WEP keys data.
* @key_len: WEP key length (can vary between 5 or 13)
* @def_key: default wep key, the other keys aren't used. The default key
* is also used for shared WEP authentication.
* @reserved: for future use and alignment.
* @u: union of the various types of key material
*/
struct iwl_fmac_crypto {
__le32 cipher_group;
__le32 ciphers_pairwise;
__le32 key_mgmt;
uint8_t mfp;
uint8_t reserved[3];
union {
struct {
uint8_t psk[32];
__le32 proto;
} __packed wpa;
struct {
uint8_t key[IWL_NUM_WEP_KEYS][IWL_MAX_WEP_KEY_LEN];
uint8_t key_len[IWL_NUM_WEP_KEYS];
uint8_t def_key;
uint8_t reserved1[3];
} __packed wep;
} u;
} __packed;
#define IWL_FMAC_MAX_BSSIDS 10
/**
* struct iwl_fmac_connect_cmd - connect to a network.
* @vif_id: the virtual interface identifier as returned in
* &iwl_fmac_add_vif_resp.
* @max_retries: number of retries before notifying connection failure.
* @center_freq: optional frequency that can be used to limit the connection
* only for BSSs on the specified frequency.
* @flags: see &enum iwl_fmac_connection_flags.
* @bssid: optional parameter to limit the connection only to a BSS
* with the specified BSSID.
* @reserved1: for alignment.
* @ssid_len: the length of %ssid.
* @ssid: the SSID of the network to connect to.
* @crypto: the connection security configuration as specified in
* %iwl_fmac_crypto.
* @reserved2: for alignment.
* @n_bssids: number of BSSIDs in the @bssids array.
* @bssids: array of @n_bssids. Depending on the @flags field, this is either
* a blacklist (i.e. specifies disallowed BSSIDs, and all other BSSIDs are
* allowed) or a whitelist (i.e. speficies a list of acceptable BSSIDs, and
* all other BSSIDs are disallowed). If this array is empty, all BSSIDs are
* allowed.
*
* A connect request to the network specified in %ssid. The command is allowed
* iff the interface specified in %vif_id is currently idle (i.e., not connected
* or trying to connect). The flow is an asynchronous one, and upon completion,
* the operation result is conveyed by %FMAC_CONNECT_RESULT.
*/
struct iwl_fmac_connect_cmd {
uint8_t vif_id;
uint8_t max_retries;
__le16 center_freq;
__le32 flags;
uint8_t bssid[ETH_ALEN];
uint8_t reserved1;
uint8_t ssid_len;
uint8_t ssid[fuchsia_wlan_ieee80211_MAX_SSID_BYTE_LEN];
struct iwl_fmac_crypto crypto;
uint8_t reserved2[3];
uint8_t n_bssids;
uint8_t bssids[IWL_FMAC_MAX_BSSIDS * ETH_ALEN];
} __packed;
/**
* struct iwl_fmac_port_authorized_cmd - set port to authorized
* @vif_id: the interface identifier for which port is authorized
* @reserved: reserved for 4 byte alignment.
*/
struct iwl_fmac_port_authorized_cmd {
uint8_t vif_id;
uint8_t reserved[3];
} __packed;
#define UMAC_DEFAULT_KEYS 4
#define IWL_FMAC_MAX_PN_LEN 16
#define IWL_FMAC_TKIP_MCAST_RX_MIC_KEY 8
/**
* struct iwl_fmac_key - Meta data for an fmac key entry.
* @valid: 1 if the key is valid for use; Otherwise 0.
* @keyidx: a SW key identifier.
* @hw_keyidx: a HW key identifier.
* @rx_pn_len: the number of valid octets in &rx_pn.
* @rx_pn: the Rx packet number in the order needed for PN comparison for
* &cipher.
* @cipher: the cipher suite associated with the key (one of
* %IWL_FMAC_CIPHER_\*).
* @tkip_mcast_rx_mic_key: key used for TKIP MIC key for multicast Rx.
* @reserved: reserved for none 9000 family support
*/
struct iwl_fmac_key {
uint8_t valid;
uint8_t keyidx;
uint8_t hw_keyidx;
uint8_t rx_pn_len;
uint8_t rx_pn[IWL_FMAC_MAX_PN_LEN];
__le32 cipher;
#ifdef CPTCFG_IWLFMAC_9000_SUPPORT
uint8_t tkip_mcast_rx_mic_key[IWL_FMAC_TKIP_MCAST_RX_MIC_KEY];
#else
uint8_t reserved[IWL_FMAC_TKIP_MCAST_RX_MIC_KEY];
#endif /* CPTCFG_IWLFMAC_9000_SUPPORT */
} __packed;
/**
* struct iwl_fmac_keys - Describing a set of keys.
* @ptk: an array of pairwise transient keys as specified in %iwl_fmac_key.
* @gtk: an array of group transient keys as specified in %iwl_fmac_key.
* @wep_tx_keyidx: default WEP TX key index
* @reserved: for alignment.
*/
struct iwl_fmac_keys {
struct iwl_fmac_key ptk[UMAC_DEFAULT_KEYS];
struct iwl_fmac_key gtk[UMAC_DEFAULT_KEYS];
uint8_t wep_tx_keyidx;
uint8_t reserved[3];
} __packed;
/**
* struct iwl_fmac_connect_result - connect result notification.
*/
struct iwl_fmac_connect_result {
/**
* @vif_id:
* the interface identifier returned in &iwl_fmac_add_vif_resp
*/
uint8_t vif_id;
/**
* @sta_id:
* on successful connection, holds a station entry index associated
* with AP the station interface associated with.
*/
uint8_t sta_id;
/**
* @center_freq:
* on successful connection, the center frequency of the BSS.
*/
__le16 center_freq;
/**
* @status:
* status code as defined in IEEE 802.11-2016 Table 9-46
* ("Status codes").
*/
__le16 status;
/**
* @bssid:
* on successful connection, the bssid of the BSS.
*/
uint8_t bssid[ETH_ALEN];
/**
* @signal:
* on successful connection, the signal in dBm of the BSS.
*/
__le32 signal;
/**
* @capability:
* on successful connection, the BSS capabilities as reported in
* the beacon/probe response.
*/
__le16 capability;
/**
* @beacon_int:
* on successful connection, the beacon interval of the BSS.
*/
__le16 beacon_int;
/**
* @tsf: TODO
*/
__le64 tsf;
/**
* @presp_ielen:
* the length of the probe response ies.
*/
__le32 presp_ielen;
/**
* @beacon_ielen:
* the length of the beacon ies.
*/
__le32 beacon_ielen;
/**
* @assoc_req_ie_len:
* the length of the association request body (fixed part + IEs).
*/
__le32 assoc_req_ie_len;
/**
* @assoc_resp_ie_len:
* the length of the association response body (fixed part + IEs).
*/
__le32 assoc_resp_ie_len;
/**
* @qos:
* 1 iff the BSS supports WMM.
*/
uint8_t qos;
/**
* @bk_acm:
* 1 iff %qos and the BK AC requires admission control.
*/
uint8_t bk_acm;
/**
* @be_acm:
* 1 iff %qos and the BE AC requires admission control.
*/
uint8_t be_acm;
/**
* @vi_acm:
* 1 iff %qos and the VI AC requires admission control.
*/
uint8_t vi_acm;
/**
* @vo_acm:
* 1 iff %qos and the VO AC requires admission control.
*/
uint8_t vo_acm;
/**
* @not_found:
* 1 iff no BSS was found suitable for connection.
*/
uint8_t not_found;
/**
* @authorized: TODO
*/
uint8_t authorized;
/**
* @reassoc:
* flag indicates if the assoc request was reassoc.
*/
uint8_t reassoc;
/**
* @keys:
* On successful connection to a secure network that does not require
* 802.1x authentication and key derivation, holds the security keys as
* defined in &iwl_fmac_keys.
*/
struct iwl_fmac_keys keys;
/**
* @ie_data:
* the probe response ies (&presp_ielen), followed by the beacon ies
* (&beacon_ielen), followed by the association request ies
* (&assoc_req_ie_len) followed by the association response ies
* (&assoc_resp_ie_len).
*/
#ifndef _MSC_VER
uint8_t ie_data[0];
#endif
} __packed;
/**
* struct iwl_fmac_disconnect_cmd - disconnect from a network.
* @vif_id: the virtual interface identifier as returned in
* &iwl_fmac_add_vif_resp
* @locally_generated: 1 if the disconnection was locally generated; Otherwise
* 0.
* @reason: reason code for disconnection, if available
*
* Can be used both as a command to fmac requesting it to disconnect, and can
* also be used as a notification sent from fmac to indicate that a previous
* connection is no longer valid.
*/
struct iwl_fmac_disconnect_cmd {
uint8_t vif_id;
uint8_t locally_generated;
__le16 reason;
} __packed;
/**
* enum iwl_fmac_dbg_type - support debug notification types.
* @IWL_FMAC_DBG_INT_CMD: Debug notification describing an internal command
* from fmac.
* @IWL_FMAC_DBG_INT_RESP: Debug notification describing an internal command
* response to fmac.
* @IWL_FMAC_DBG_INT_NOTIF: Debug notification describing an asynchronous
* notification received by fmac.
* @IWL_FMAC_DBG_INT_TX: Debug notification describing a frame being
* transmitter by fmac.
*/
enum iwl_fmac_dbg_type {
IWL_FMAC_DBG_INT_CMD,
IWL_FMAC_DBG_INT_RESP,
IWL_FMAC_DBG_INT_NOTIF,
IWL_FMAC_DBG_INT_TX,
};
/**
* struct iwl_fmac_debug_notif - Notification containing debug data.
* @type: See %iwl_fmac_dbg_type.
* @reserved: for alignment.
* @data: type dependent data.
*
* Sent asynchronously from fmac, to notify about fmac interaction with other
* components.
*/
struct iwl_fmac_debug_notif {
uint8_t type;
uint8_t reserved[3];
#ifndef _MSC_VER
uint8_t data[0];
#endif
} __packed;
/**
* struct iwl_fmac_keys_update_notif - Notification about update keys.
* @vif_id: the virtual interface identifier as returned in
* &iwl_fmac_add_vif_resp.
* @sta_id: holds a station entry index associated with the station for which
* the keys were updated.
* @reserved: for alignment.
* @keys: see &iwl_fmac_keys.
*
* The notification is sent from fmac to indicate that new keys were derived for
* the given station.
*/
struct iwl_fmac_keys_update_notif {
uint8_t vif_id;
uint8_t sta_id;
uint8_t reserved[2];
struct iwl_fmac_keys keys;
} __packed;
/**
* struct iwl_fmac_scan_complete_notif - Scan complete notification
* @aborted: 1 if the scan was aborted; Otherwise 0.
* @reserved: for alignment.
*
* Used to notify about the completion of a scan request originated by calling
* %FMAC_SCAN.
*/
struct iwl_fmac_scan_complete_notif {
uint8_t aborted;
uint8_t reserved[3];
} __packed;
/**
* enum iwl_fmac_nvm_sku_cap - Supported capabilities.
* @NVM_SKU_CAP_BAND_24GHZ_ENABLED: Operation on 2.4 GHz enabled.
* @NVM_SKU_CAP_BAND_52GHZ_ENABLED: Operation on 5.2 GHz enabled.
* @NVM_SKU_CAP_11N_ENABLED: 802.11n support enabled.
* @NVM_SKU_CAP_11AC_ENABLED: 80211.11ac support enabled.
* @NVM_SKU_CAP_AMT_ENABLED: AMT enabled.
* @NVM_SKU_CAP_IPAN_ENABLED: P2P enabled.
* @NVM_SKU_CAP_MIMO_DISABLED: MIMO is disabled.
* @NVM_SKU_CAP_11AX_ENABLED: 80211.11ax support enabled.
*/
enum iwl_fmac_nvm_sku_cap {
NVM_SKU_CAP_BAND_24GHZ_ENABLED = 0x1,
NVM_SKU_CAP_BAND_52GHZ_ENABLED = 0x2,
NVM_SKU_CAP_11N_ENABLED = 0x4,
NVM_SKU_CAP_11AC_ENABLED = 0x8,
NVM_SKU_CAP_AMT_ENABLED = 0x10,
NVM_SKU_CAP_IPAN_ENABLED = 0x20,
NVM_SKU_CAP_MIMO_DISABLED = 0x40,
NVM_SKU_CAP_11AX_ENABLED = 0x80,
};
/**
* enum iwl_fmac_nvm_ht_cap - Supported HT capabilities.
* @NVM_HT_CAP_LDPC_CODING: LDPC enabled.
* @NVM_HT_CAP_SUP_WIDTH_20_40: 40 MHz is supported.
* @NVM_HT_CAP_SM_PS: SMPS enabled.
* @NVM_HT_CAP_GRN_FLD: Green field supported.
* @NVM_HT_CAP_SGI_20: Short guard interval in 20MHz enabled.
* @NVM_HT_CAP_SGI_40: Short guard interval in 40MHz enabled.
* @NVM_HT_CAP_TX_STBC: Transmit STBC enabled.
* @NVM_HT_CAP_RX_STBC: Received STBC enabled
* @NVM_HT_CAP_DELAY_BA: Delayed block acknowledgment enabled.
* @NVM_HT_CAP_MAX_AMSDU: large A-MSDU size is supported
* @NVM_HT_CAP_DSSSCCK40: DSSS-CCK40 is supported
* @NVM_HT_CAP_RESERVED: (reserved)
* @NVM_HT_CAP_40MHZ_INTOLERANT: device is 40 MHz intolerant
* @NVM_HT_CAP_LSIG_TXOP_PROT: L-SIG TXOP protection is supported
*
* See 9.4.2.56.2 ("HT Capability Information field") in P802.11Revmc_D5.0.
*/
enum iwl_fmac_nvm_ht_cap {
NVM_HT_CAP_LDPC_CODING = 0x0001,
NVM_HT_CAP_SUP_WIDTH_20_40 = 0x0002,
NVM_HT_CAP_SM_PS = 0x000C,
NVM_HT_CAP_GRN_FLD = 0x0010,
NVM_HT_CAP_SGI_20 = 0x0020,
NVM_HT_CAP_SGI_40 = 0x0040,
NVM_HT_CAP_TX_STBC = 0x0080,
NVM_HT_CAP_RX_STBC = 0x0300,
NVM_HT_CAP_DELAY_BA = 0x0400,
NVM_HT_CAP_MAX_AMSDU = 0x0800,
NVM_HT_CAP_DSSSCCK40 = 0x1000,
NVM_HT_CAP_RESERVED = 0x2000,
NVM_HT_CAP_40MHZ_INTOLERANT = 0x4000,
NVM_HT_CAP_LSIG_TXOP_PROT = 0x8000,
};
/**
* enum iwl_fmac_nvm_vht_cap - Supported VHT capabilities.
* @NVM_VHT_CAP_MAX_MPDU_LENGTH_3895: max MPDU (A-MSDU) length 3895 bytes
* @NVM_VHT_CAP_MAX_MPDU_LENGTH_7991: max MPDU (A-MSDU) length 7991 bytes
* @NVM_VHT_CAP_MAX_MPDU_LENGTH_11454: max MPDU (A-MSDU) length 11454 bytes
* @NVM_VHT_CAP_MAX_MPDU_MASK: Mask of supported MPDU lengths.
* @NVM_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ: Operation in 160MHz channels supported.
* @NVM_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ: Operation in 80MHz + 80MHz
* channels supported.
* @NVM_VHT_CAP_SUPP_CHAN_WIDTH_MASK: Supported channel widths.
* @NVM_VHT_CAP_RXLDPC: LDPC is supported on RX
* @NVM_VHT_CAP_SHORT_GI_80: short guard interval supported in 80 MHz
* @NVM_VHT_CAP_SHORT_GI_160: short guard interval supported in 160 MHz
* @NVM_VHT_CAP_TXSTBC: TX STBC supported
* @NVM_VHT_CAP_RXSTBC_1: RX STBC support: 1 chain
* @NVM_VHT_CAP_RXSTBC_2: RX STBC support: 2 chains
* @NVM_VHT_CAP_RXSTBC_3: RX STBC support: 3 chains
* @NVM_VHT_CAP_RXSTBC_4: RX STBC support: 4 chains
* @NVM_VHT_CAP_RXSTBC_MASK: RX STBC mask
* @NVM_VHT_CAP_SU_BEAMFORMER_CAPABLE: Single user Beamformer supported.
* @NVM_VHT_CAP_SU_BEAMFORMEE_CAPABLE: Single user Beamformee supported.
* @NVM_VHT_CAP_BEAMFORMEE_STS_MASK: beamformee STS mask
* @NVM_VHT_CAP_SOUNDING_DIMENSIONS_MASK: sounding dimensions mask
* @NVM_VHT_CAP_MU_BEAMFORMER_CAPABLE: Multi user Beamformer supported.
* @NVM_VHT_CAP_MU_BEAMFORMEE_CAPABLE: Multi user Beacmformee supported.
* @NVM_VHT_CAP_VHT_TXOP_PS: VHT TXOP PS supported
* @NVM_VHT_CAP_HTC_VHT: HTC supported
* @NVM_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK: A-MPDU length exponent mask
* @NVM_VHT_CAP_VHT_LINK_ADAPTATION_VHT_UNSOL_MFB:
* VHT link adaptation: unsolicited MFB supported
* @NVM_VHT_CAP_VHT_LINK_ADAPTATION_VHT_MRQ_MFB:
* VHT link adaptation: MRQ MFB is supported
* @NVM_VHT_CAP_RX_ANTENNA_PATTERN: RX antenna pattern
* @NVM_VHT_CAP_TX_ANTENNA_PATTERN: TX antenna pattern
*
* See 9.4.2.158.2 ("VHT Capabilities Information field") in P802.11Revmc_D5.0.
*/
enum iwl_fmac_nvm_vht_cap {
NVM_VHT_CAP_MAX_MPDU_LENGTH_3895 = 0x00000000,
NVM_VHT_CAP_MAX_MPDU_LENGTH_7991 = 0x00000001,
NVM_VHT_CAP_MAX_MPDU_LENGTH_11454 = 0x00000002,
NVM_VHT_CAP_MAX_MPDU_MASK = 0x00000003,
NVM_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ = 0x00000004,
NVM_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ = 0x00000008,
NVM_VHT_CAP_SUPP_CHAN_WIDTH_MASK = 0x0000000C,
NVM_VHT_CAP_RXLDPC = 0x00000010,
NVM_VHT_CAP_SHORT_GI_80 = 0x00000020,
NVM_VHT_CAP_SHORT_GI_160 = 0x00000040,
NVM_VHT_CAP_TXSTBC = 0x00000080,
NVM_VHT_CAP_RXSTBC_1 = 0x00000100,
NVM_VHT_CAP_RXSTBC_2 = 0x00000200,
NVM_VHT_CAP_RXSTBC_3 = 0x00000300,
NVM_VHT_CAP_RXSTBC_4 = 0x00000400,
NVM_VHT_CAP_RXSTBC_MASK = 0x00000700,
NVM_VHT_CAP_SU_BEAMFORMER_CAPABLE = 0x00000800,
NVM_VHT_CAP_SU_BEAMFORMEE_CAPABLE = 0x00001000,
NVM_VHT_CAP_BEAMFORMEE_STS_MASK = 0x0000e000,
NVM_VHT_CAP_SOUNDING_DIMENSIONS_MASK = 0x00070000,
NVM_VHT_CAP_MU_BEAMFORMER_CAPABLE = 0x00080000,
NVM_VHT_CAP_MU_BEAMFORMEE_CAPABLE = 0x00100000,
NVM_VHT_CAP_VHT_TXOP_PS = 0x00200000,
NVM_VHT_CAP_HTC_VHT = 0x00400000,
NVM_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK = 0x03800000,
NVM_VHT_CAP_VHT_LINK_ADAPTATION_VHT_UNSOL_MFB = 0x08000000,
NVM_VHT_CAP_VHT_LINK_ADAPTATION_VHT_MRQ_MFB = 0x0c000000,
NVM_VHT_CAP_RX_ANTENNA_PATTERN = 0x10000000,
NVM_VHT_CAP_TX_ANTENNA_PATTERN = 0x20000000,
};
#define NVM_HT_MCS_MASK_LEN 10
/**
* struct iwl_fmac_nvm_mcs_info - Supported HT MCSes
* @rx_mask: RX mask (like in 802.11)
* @rx_highest: RX highest (like in 802.11)
* @tx_params: TX parameters (like in 802.11)
* @reserved: for alignment.
*
* See 9.4.2.56.4 ("Supported MCS Set field") in P802.11Revmc_D5.0.
*/
struct iwl_fmac_nvm_mcs_info {
uint8_t rx_mask[NVM_HT_MCS_MASK_LEN];
__le16 rx_highest;
uint8_t tx_params;
uint8_t reserved[3];
} __packed;
/**
* struct iwl_fmac_nvm_vht_mcs_info - Supported VHT MCSes
* @rx_mcs_map: RX MCS map (like in 802.11)
* @rx_highest: RX highest (like in 802.11)
* @tx_mcs_map: TX MCS map (like in 802.11)
* @tx_highest: TX highest (like in 802.11)
*
* See 9.4.2.158.3 ("Supported VHT-MCS and NSS Set field") in P802.11Revmc_D5.0.
*/
struct iwl_fmac_nvm_vht_mcs_info {
__le16 rx_mcs_map;
__le16 rx_highest;
__le16 tx_mcs_map;
__le16 tx_highest;
} __packed;
/**
* enum iwl_fmac_nvm_bands - Supported bands.
* @NVM_BAND_24GHZ: Operation on 2.4GHz.
* @NVM_BAND_52GHZ: Operation on 5.2GHz.
* @NVM_NUM_BANDS: number of defined/possible bands
*/
enum iwl_fmac_nvm_bands { NVM_BAND_24GHZ, NVM_BAND_52GHZ, NVM_NUM_BANDS };
/**
* struct iwl_fmac_nvm_ht - supported HT capabilities.
* @ht_supported: 1 if HT is supported; Otherwise 0.
* @reserved: for alignment.
* @cap: See &iwl_fmac_nvm_ht_cap.
* @ampdu_factor: A-MPDU factor (like in 802.11)
* @ampdu_density: A-MPDU density (like in 802.11)
* @mcs: See &iwl_fmac_nvm_mcs_info.
*/
struct iwl_fmac_nvm_ht {
uint8_t ht_supported;
uint8_t reserved[3];
__le16 cap;
uint8_t ampdu_factor;
uint8_t ampdu_density;
struct iwl_fmac_nvm_mcs_info mcs;
} __packed;
/**
* struct iwl_fmac_nvm_vht - supported VHT capabilities
* @vht_supported: 1 if VHT is supported; Otherwise 0.
* @reserved: for alignment.
* @cap: See %iwl_fmac_nvm_vht_cap
* @vht_mcs: See %iwl_fmac_nvm_vht_mcs_info
*/
struct iwl_fmac_nvm_vht {
uint8_t vht_supported;
uint8_t reserved[3];
__le32 cap;
struct iwl_fmac_nvm_vht_mcs_info vht_mcs;
} __packed;
/**
* struct iwl_fmac_nvm_cmd - NVM configuration command.
* @sku_cap: See &enum iwl_fmac_nvm_sku_cap
* @n_addr: number of supported addresses.
* @hw_addr: hw base address.
* @valid_ant: Valid antenna configuration.
* @reserved: for alignment.
* @ht: HT configuration for each band. See &iwl_fmac_nvm_ht.
* @vht: VHT configuration for each band. See &iwl_fmac_nvm_vht.
*
* The command is sent once in the lifetime of fmac, as part of the
* initialization flow, to configure the runtime capabilities and supported
* features of fmac.
*/
struct iwl_fmac_nvm_cmd {
uint8_t sku_cap;
uint8_t n_addr;
uint8_t hw_addr[ETH_ALEN];
#define NVM_CMD_TX_ANT(_x) ((_x)&0xf)
#define NVM_CMD_RX_ANT(_x) (((_x)&0xf0) >> 4)
uint8_t valid_ant;
uint8_t reserved[3];
struct iwl_fmac_nvm_ht ht[NVM_NUM_BANDS];
struct iwl_fmac_nvm_vht vht[NVM_NUM_BANDS];
} __packed;
#ifdef CPTCFG_IWLFMAC_9000_SUPPORT
/**
* struct iwl_fmac_req_queue - Request Transmit queue.
* @vif_id: the vif_id of the STA to use.
* @sta_id: sta_id to add a queue to.
* @tid: the TID of the traffic for the requested queue.
* @reserved: for alignment.
*
* The command is used to request a transmit queue for the given
* <station, TID>.
*
* Note that this is only used with 9000-series devices.
*/
struct iwl_fmac_req_queue {
uint8_t vif_id;
uint8_t sta_id;
uint8_t tid;
uint8_t reserved;
} __packed;
/**
* struct iwl_fmac_req_queue_response - Response to a transmit queue allocation
* request.
* @queue: the queue allocated for the request. 0xff means failure.
* @reserved: for alignment.
*
* Note that this is only used with 9000-series devices.
*/
struct iwl_fmac_req_queue_response {
uint8_t queue;
uint8_t reserved[3];
} __packed;
/**
* struct iwl_fmac_rel_queue - Request to release a transmit queue.
* @vif_id: the vif_id of the STA to use.
* @sta_id: sta_id to release the TID from.
* @tid: the TID of the traffic to remove
* @reserved: for alignment.
*
* The command is used to request to release the transmit queue allocation for
* the <sta, TID>
*
* Note that this is only used with 9000-series devices.
*/
struct iwl_fmac_rel_queue {
uint8_t vif_id;
uint8_t sta_id;
uint8_t tid;
uint8_t reserved;
} __packed;
/**
* struct iwl_fmac_rel_queue_response - Response to a transmit queue release
* request.
* @free_queue: 1 if the queue should be freed, 0 otherwise.
* @reserved: for alignment.
*
* Note that this is only used with 9000-series devices.
*/
struct iwl_fmac_rel_queue_response {
uint8_t free_queue;
uint8_t reserved[3];
} __packed;
#endif
/**
* struct iwl_fmac_rs_fixed_cmd - set fixed rate for transmit.
* @sta_id: station to set the rate.
* @vif_id: the vif_id of the STA to use.
* @reduced_txp: set power reduction.
* @reserved: for alignment.
* @hw_rate: the fixed value for the rate in LMAC format.
*
* The command is used to request to disable the transmit rate scaling
* algorithm, and instead use the given fixed rate.
*/
struct iwl_fmac_rs_fixed_cmd {
uint8_t sta_id;
uint8_t vif_id;
uint8_t reduced_txp;
uint8_t reserved;
__le32 hw_rate;
} __packed;
#ifdef CPTCFG_IWLFMAC_9000_SUPPORT
/**
* struct iwl_fmac_scd_txq_cfg_cmd - FMAC txq hw scheduler config command.
* @vif_id: the vif_id of the STA to use.
* @reserved1: for alignment.
* @token: token (unused)
* @sta_id: sta_id to use.
* @tid: the TID of the traffic for the requested queue.
* @scd_queue: scheduler queue to configure.
* @enable: 1 queue enable, 0 queue disable.
* @aggregate: 1 aggregated queue, 0 otherwise.
* @tx_fifo: &enum iwl_fmac_tx_fifo.
* @window: BA window size.
* @ssn: SSN for the BA agreement.
* @reserved2: for alignment.
*
* Note that this is only used with 9000-series devices.
*/
struct iwl_fmac_scd_txq_cfg_cmd {
uint8_t vif_id;
uint8_t reserved1[3];
uint8_t token;
uint8_t sta_id;
uint8_t tid;
uint8_t scd_queue;
uint8_t enable;
uint8_t aggregate;
uint8_t tx_fifo;
uint8_t window;
__le16 ssn;
__le16 reserved2;
} __packed;
#endif
/**
* enum iwl_fmac_sync_source - Source of the Rx multi queue synchronization
* request
* @IWL_FMAC_SYNC_SRC_DRIVER: the request originated in the driver.
* @IWL_FMAC_SYNC_SRC_FMAC: the request originated in fmac.
*/
enum iwl_fmac_sync_source {
IWL_FMAC_SYNC_SRC_DRIVER,
IWL_FMAC_SYNC_SRC_FMAC,
};
/**
* enum iwl_fmac_sync_type - Type of the Rx multi queue synchronization request.
* @IWL_FMAC_SYNC_TYPE_DELBA: request due to Rx delba.
*/
enum iwl_fmac_sync_type {
IWL_FMAC_SYNC_TYPE_DELBA,
};
/**
* struct iwl_rxq_sync_payload - shared sync notification payload.
* @src: see &enum iwl_fmac_sync_source.
* @type: see &enum iwl_fmac_sync_type for FMAC-sourced messages.
* @reserved: for alignment.
* @payload: payload for the message.
*
* This is the sync message payload, sometimes generated by the
* FMAC firmware and possibly for use by the driver.
*/
struct iwl_rxq_sync_payload {
uint8_t src;
uint8_t type;
uint8_t reserved[2];
#ifndef _MSC_VER
uint8_t payload[0];
#endif
} __packed;
/**
* struct iwl_rx_sync_delba - shared sync notification for delba.
* @hdr: see &iwl_req_sync_payload.
* @sta_id: the corresponding station identifier.
* @ba_id: the bloack ack identifier.
* @reserved: for alignment.
*/
struct iwl_rx_sync_delba {
struct iwl_rxq_sync_payload hdr;
uint8_t sta_id;
uint8_t ba_id;
uint8_t reserved[2];
} __packed;
/**
* enum fmac_ps_mode - Enumerates the support power schemes for the device.
* @FMAC_PS_MODE_CAM: No power save.
* @FMAC_PS_MODE_BALANCED: Balanced power save.
* @FMAC_PS_MODE_LP: Low power save mode.
*/
enum fmac_ps_mode {
FMAC_PS_MODE_CAM = 1,
FMAC_PS_MODE_BALANCED,
FMAC_PS_MODE_LP,
};
/**
* enum fmac_bt_cfg_mode - Enumerates the support the BT Coex modes.
* @FMAC_BT_CFG_NW: N-wire.
* @FMAC_BT_CFG_DISABLE: BT Coex disabled.
* @FMAC_BT_CFG_BT: BT always gets the antenna.
* @FMAC_BT_CFG_WIFI: WIFI always gets the antenna.
*/
enum fmac_bt_cfg_mode {
FMAC_BT_CFG_NW = 0,
FMAC_BT_CFG_DISABLE,
FMAC_BT_CFG_BT,
FMAC_BT_CFG_WIFI,
};
/**
* enum fmac_uapsd_enable_mode - Enumerates the bits for U-APSD enablement.
* @FMAC_UAPSD_ENABLE_BSS: U-APSD is enabled for BSS role.
* @FMAC_UAPSD_ENABLE_P2P_CLIENT: U-APSD is enabled for P2P Client role.
*/
enum fmac_uapsd_enable_mode {
FMAC_UAPSD_ENABLE_BSS = BIT(0),
FMAC_UAPSD_ENABLE_P2P_CLIENT = BIT(1),
};
/**
* enum umac_scan_type - defines the possible scan types
* @IWL_SCAN_TYPE_NOT_SET: the scan type is undefined
* @IWL_SCAN_TYPE_UNASSOC: scan type to be used when unassociated
* @IWL_SCAN_TYPE_WILD: agressive scan that can be used when the
* latency requirement and the throughput are not high.
* @IWL_SCAN_TYPE_MILD: gentle scan that can be used when there is
* some throughput without low latency requirements.
* @IWL_SCAN_TYPE_FRAGMENTED: fragmented scan types where small blocks
* of scan are performed separately in order to prevent latency
* and throughput disruptions.
* @IWL_SCAN_TYPE_MAX: highest index of scan.
*/
enum umac_scan_type {
IWL_SCAN_TYPE_NOT_SET,
IWL_SCAN_TYPE_UNASSOC,
IWL_SCAN_TYPE_WILD,
IWL_SCAN_TYPE_MILD,
IWL_SCAN_TYPE_FRAGMENTED,
IWL_SCAN_TYPE_MAX,
};
#define IWL_FMAC_POWER_LEVEL_UNSET 0xff
/**
* enum fmac_sad_mode: choose the single antenna diversity mode (SAD)
* @FMAC_SAD_ENABLED: toogle the enablement of SAD
* @FMAC_SAD_NIC_DEFAULT: use NIC default value
* @FMAC_SAD_ANT_A: choose antenna A by default
* @FMAC_SAD_ANT_B: choose antenna B by default
*/
enum fmac_sad_mode {
FMAC_SAD_ENABLED = BIT(0),
FMAC_SAD_NIC_DEFAULT = 0 << 1,
FMAC_SAD_ANT_A = 1 << 1,
FMAC_SAD_ANT_B = 2 << 1,
};
/**
* enum iwl_fmac_config_id - configuration id.
* @IWL_FMAC_STATIC_CONFIG_U32_START: first static global config that fit a
* uint32_t. A static config is a config that can't be modified after
* @IWL_FMAC_STATIC_CONFIG_COMPLETE has been sent.
* @IWL_FMAC_STATIC_CONFIG_POWER_SCHEME: see &enum fmac_ps_mode.
* @IWL_FMAC_STATIC_CONFIG_COEX_MODE: see &enum fmac_bt_cfg_mode.
* @IWL_FMAC_STATIC_CONFIG_COEX_SYNC2SCO: boolean.
* @IWL_FMAC_STATIC_CONFIG_COEX_PLCR: boolean.
* @IWL_FMAC_STATIC_CONFIG_COEX_MPLUT: boolean.
* @IWL_FMAC_STATIC_CONFIG_DEPRECATED_1: Not in use
* @IWL_FMAC_STATIC_CONFIG_DEPRECATED_2: Not in use
* @IWL_FMAC_STATIC_CONFIG_UAPSD_ENABLED: bitmap for U-APSD enablement. Check
* &enum fmac_uapsd_enable_mode. Default is 0.
* @IWL_FMAC_STATIC_CONFIG_LTR_MODE: PCIe link training mode
* @IWL_FMAC_STATIC_CONFIG_SINGLE_ANT_DIVERSITY_CONF: see &enum fmac_sad_mode.
* @IWL_FMAC_STATIC_CONFIG_EXTERNAL_WPA: Configure to work in external WPA mode
* (Security upload mode) for all future added interfaces.
* @IWL_FMAC_STATIC_CONFIG_U32_MAX: highest index of static global
* configuration.
* @IWL_FMAC_STATIC_CONFIG_U32_NUM: number of static global configs that fit
* a uint32_t. A static config is a config that can't be modified after
* @IWL_FMAC_STATIC_CONFIG_COMPLETE has been sent.
*
* @IWL_FMAC_CONFIG_U32_START: first uint32_t config that is global but can be
* changed on the fly.
* @IWL_FMAC_CONFIG_INTERNAL_CMD_TO_HOST: forward internal commands to
* host for debug.
* @IWL_FMAC_CONFIG_RS_STAT_THOLD: threshold for sending RS statistics
* notifications from LMAC.
* @IWL_FMAC_CONFIG_SCAN_TYPE: force scan type, regardless of internal
* policies, according to &enum umac_scan_type.
* @IWL_FMAC_CONFIG_U32_MAX:highest index of configs that fit a uint32_t and that
* can be changed on the fly.
* @IWL_FMAC_CONFIG_U32_NUM: number of configs that fit a uint32_t and that can
* be changed on the fly.
*
* @IWL_FMAC_CONFIG_START: first config that doesn't fit a uint32_t. Those
* configurations may or may not be modified on the fly. Depending
* on the configuration. The firmware will not enforce any policy.
* @IWL_FMAC_CONFIG_DEBUG_LEVEL: debug level of the FMAC component in the
* firmware. Since it can't be stored in the same place as other
* CONFIG_U32 confs, it is in this section.
* @IWL_FMAC_CONFIG_TRIGGER: trigger configuration
* @IWL_FMAC_CONFIG_MAX: highest index of configs that don't fit a uint32_t.
* @IWL_FMAC_CONFIG_NUM: number of configs that don't git a uint32_t.
*
* @IWL_FMAC_CONFIG_VIF_START: first per-vif configuration
* @IWL_FMAC_CONFIG_VIF_POWER_DISABLED: power save disablement
* @IWL_FMAC_CONFIG_VIF_TXPOWER_USER: user-configured txpower in dbm,
* or IWL_FMAC_UNSET_POWER_LEVEL if unset
* @IWL_FMAC_CONFIG_VIF_LOW_LATENCY: user-configured low latency mode.
* @IWL_FMAC_CONFIG_VIF_INDICATE_ROAM_IS_NEEDED: config that roam indication
* is needed instead of internal FMAC roam flow.
* @IWL_FMAC_CONFIG_VIF_MAX: highest index of per-vif config
* @IWL_FMAC_CONFIG_VIF_NUM: number of per-vif configs
*
* @IWL_FMAC_CONFIG_WPAS_GLOBAL: a key=value string (NULL terminated) where
* key is one of wpa_supplicant global configuration options.
* @IWL_FMAC_STATIC_CONFIG_COMPLETE: indicates that all the static
* configuration has been applied. Must be sent once in the firmware's
* life. No data should be attached to this configuration.
*/
enum iwl_fmac_config_id {
IWL_FMAC_STATIC_CONFIG_U32_START = 0x0,
IWL_FMAC_STATIC_CONFIG_POWER_SCHEME = IWL_FMAC_STATIC_CONFIG_U32_START,
IWL_FMAC_STATIC_CONFIG_COEX_MODE,
IWL_FMAC_STATIC_CONFIG_COEX_SYNC2SCO,
IWL_FMAC_STATIC_CONFIG_COEX_PLCR,
IWL_FMAC_STATIC_CONFIG_COEX_MPLUT,
IWL_FMAC_STATIC_CONFIG_DEPRECATED_1,
IWL_FMAC_STATIC_CONFIG_DEPRECATED_2,
IWL_FMAC_STATIC_CONFIG_UAPSD_ENABLED,
IWL_FMAC_STATIC_CONFIG_LTR_MODE,
IWL_FMAC_STATIC_CONFIG_SINGLE_ANT_DIVERSITY_CONF,
IWL_FMAC_STATIC_CONFIG_EXTERNAL_WPA,
IWL_FMAC_STATIC_CONFIG_U32_MAX,
IWL_FMAC_STATIC_CONFIG_U32_NUM =
IWL_FMAC_STATIC_CONFIG_U32_MAX - IWL_FMAC_STATIC_CONFIG_U32_START,
IWL_FMAC_CONFIG_U32_START = 0x100,
IWL_FMAC_CONFIG_INTERNAL_CMD_TO_HOST = IWL_FMAC_CONFIG_U32_START,
IWL_FMAC_CONFIG_RS_STAT_THOLD,
IWL_FMAC_CONFIG_SCAN_TYPE,
IWL_FMAC_CONFIG_U32_MAX,
IWL_FMAC_CONFIG_U32_NUM = IWL_FMAC_CONFIG_U32_MAX - IWL_FMAC_CONFIG_U32_START,
IWL_FMAC_CONFIG_START = 0x200,
IWL_FMAC_CONFIG_DEBUG_LEVEL = IWL_FMAC_CONFIG_START,
IWL_FMAC_CONFIG_TRIGGER,
IWL_FMAC_CONFIG_MAX,
IWL_FMAC_CONFIG_NUM = IWL_FMAC_CONFIG_MAX - IWL_FMAC_CONFIG_START,
IWL_FMAC_CONFIG_VIF_START = 0x300,
IWL_FMAC_CONFIG_VIF_POWER_DISABLED = IWL_FMAC_CONFIG_VIF_START,
IWL_FMAC_CONFIG_VIF_TXPOWER_USER,
IWL_FMAC_CONFIG_VIF_LOW_LATENCY,
IWL_FMAC_CONFIG_VIF_INDICATE_ROAM_IS_NEEDED,
IWL_FMAC_CONFIG_VIF_MAX,
IWL_FMAC_CONFIG_VIF_NUM = IWL_FMAC_CONFIG_VIF_MAX - IWL_FMAC_CONFIG_VIF_START,
IWL_FMAC_CONFIG_WPAS_GLOBAL = 0x400,
IWL_FMAC_STATIC_CONFIG_COMPLETE = 0xffff,
};
#define IWL_FMAC_VIF_ID_GLOBAL 0xff
/**
* struct iwl_fmac_config_cmd - configuration command.
* @vif_id: vif_id or IWL_FMAC_VIF_ID_GLOBAL for global configuration.
* @reserved: for alignment.
* @config_id: see &enum iwl_fmac_config_id.
* @len: the length of the configuration in bytes (must be a multiple of 4).
* @data: the data of the configuration.
*/
struct iwl_fmac_config_cmd {
uint8_t vif_id;
uint8_t reserved[3];
__le16 config_id;
__le16 len;
#ifndef _MSC_VER
uint8_t data[0];
#endif
} __packed;
/**
* enum iwl_fmac_chan_width - channel widths.
* @IWL_CHAN_WIDTH_20_NOHT: 20MHz without HT.
* @IWL_CHAN_WIDTH_20: 20MHz with HT.
* @IWL_CHAN_WIDTH_40: 40MHz.
* @IWL_CHAN_WIDTH_80: 80MHz.
* @IWL_CHAN_WIDTH_160: 160MHz (including 80MHz + 80MHz).
* @IWL_NUM_CHAN_WIDTH: number of supported channel width values
*/
enum iwl_fmac_chan_width {
IWL_CHAN_WIDTH_20_NOHT,
IWL_CHAN_WIDTH_20,
IWL_CHAN_WIDTH_40,
IWL_CHAN_WIDTH_80,
IWL_CHAN_WIDTH_160,
IWL_NUM_CHAN_WIDTH
};
#define IWL_FMAC_NUM_CHAIN_LIMITS 2
#define IWL_FMAC_NUM_SUB_BANDS 5
struct iwl_fmac_sar_restrictions {
__le16 per_chain_restriction[IWL_FMAC_NUM_CHAIN_LIMITS][IWL_FMAC_NUM_SUB_BANDS];
} __packed;
/**
* enum iwl_fmac_hidden_ssid - types of hidden ssid
* @IWL_FMAC_HIDDEN_SSID_NONE: not hidden
* @IWL_FMAC_HIDDEN_SSID_ZERO_LEN: use zero length in the SSID IE.
* @IWL_FMAC_HIDDEN_SSID_ZERO_BYTES: use real length, but zero the SSID bytes
*/
enum iwl_fmac_hidden_ssid {
IWL_FMAC_HIDDEN_SSID_NONE = 0,
IWL_FMAC_HIDDEN_SSID_ZERO_LEN = 1,
IWL_FMAC_HIDDEN_SSID_ZERO_BYTES = 2,
};
/**
* struct iwl_fmac_chandef - channel definition.
* @control_freq: control frequency.
* @reserved: for alignment.
* @center_freq1: center frequency for the channel.
* @bandwidth: see &iwl_fmac_chan_width.
* @reserved2: for alignment.
*/
struct iwl_fmac_chandef {
__le16 control_freq;
__le16 center_freq1;
__le16 reserved;
uint8_t bandwidth;
uint8_t reserved2;
} __packed;
/**
* enum iwl_fmac_start_ap_resp_status - Status in &struct iwl_fmac_host_ap_resp
* @IWL_FMAC_START_AP_SUCCESS: Success to start AP.
* @IWL_FMAC_START_AP_FAILURE: Fail to start AP.
*/
enum iwl_fmac_start_ap_resp_status {
IWL_FMAC_START_AP_SUCCESS = 0,
IWL_FMAC_START_AP_FAILURE,
};
/**
* enum iwl_fmac_action_host_based_ap - for struct iwl_fmac_host_ap_cmd's action
* @IWL_FMAC_START_HOST_BASED_AP: to start the host based AP
* @IWL_FMAC_STOP_HOST_BASED_AP: to stop the host based AP
* @IWL_FMAC_MODIFY_HOST_BASED_AP: modify the host based AP
*/
enum iwl_fmac_action_host_based_ap {
IWL_FMAC_START_HOST_BASED_AP = 0,
IWL_FMAC_STOP_HOST_BASED_AP = 1,
IWL_FMAC_MODIFY_HOST_BASED_AP = 2,
};
/**
* enum iwl_fmac_host_ap_changed - describe what field is valid
* @IWL_FMAC_CTS_PROT_CHANGED: use_cts_prot is valid
* @IWL_FMAC_SHORT_PREAMBLE_CHANGED: use_short_preamble is valid
* @IWL_FMAC_SHORT_SLOT_CHANGED: use_short_slot is valid
* @IWL_FMAC_BASIC_RATES_CHANGED: basic_rates_bitmap is valid
* @IWL_FMAC_HT_OPMODE_CHANGED: ht_opmode is valid
* @IWL_FMAC_AC_PARAMS_CHANGED_BK: ac_params for BK is valid
* @IWL_FMAC_AC_PARAMS_CHANGED_BE: ac_params for BE is valid
* @IWL_FMAC_AC_PARAMS_CHANGED_VI: ac_params for VI is valid
* @IWL_FMAC_AC_PARAMS_CHANGED_VO: ac_params for VO is valid
* @IWL_FMAC_BEACON_CHANGED: beacon frame has been updated
*/
enum iwl_fmac_host_ap_changed {
IWL_FMAC_CTS_PROT_CHANGED = BIT(0),
IWL_FMAC_SHORT_PREAMBLE_CHANGED = BIT(1),
IWL_FMAC_SHORT_SLOT_CHANGED = BIT(2),
IWL_FMAC_BASIC_RATES_CHANGED = BIT(3),
IWL_FMAC_HT_OPMODE_CHANGED = BIT(4),
IWL_FMAC_AC_PARAMS_CHANGED_BK = BIT(5),
IWL_FMAC_AC_PARAMS_CHANGED_BE = BIT(6),
IWL_FMAC_AC_PARAMS_CHANGED_VI = BIT(7),
IWL_FMAC_AC_PARAMS_CHANGED_VO = BIT(8),
IWL_FMAC_BEACON_CHANGED = BIT(9),
};
/**
* struct iwl_fmac_ac_params - describes the AC params
* @txop: maximum burst time
* @cw_min: minimum contention window
* @cw_max: maximum contention window
* @aifs: Arbitration interframe space
* @reserved: for alignment
*/
struct iwl_fmac_ac_params {
__le16 txop;
__le16 cw_min;
__le16 cw_max;
uint8_t aifs;
uint8_t reserved;
} __packed;
/**
* struct iwl_fmac_host_ap_cmd - manage a host based AP vif
* @vif_id: the interface identifier returned in &iwl_fmac_add_vif_resp.
* The vif's type must be %@IWL_FMAC_IFTYPE_HOST_BASED_AP.
* @action: see &enum iwl_fmac_action_host_based_ap. Note: not all fields are
* relevant for all the actions.
* @dtim_period: the DTIM beacon in units of &beacon_int. Ignored in any action
* that is not %IWL_FMAC_START_HOST_BASED_AP.
* @use_cts_prot: Whether to use CTS protection
* @use_short_preamble: Whether the use of short preambles is allowed
* @use_short_slot: Whether the use of short slot time is allowed
* @basic_rates_bitmap: bitmap of basic rates:
* bit 0: 1Mbps bit 1: 2Mbps bit 2: 5Mbps bit 3: 11Mbps bit 4: 6Mbps
* bit 5: 9Mbps bit 6: 12Mbps bit 7: 18Mbps bit 8: 24Mbps bit 9: 36Mbps
* bit 10: 48Mbps bit 11: 54Mbps
* @ht_opmode: HT Operation mode
* @beacon_int: the beacon interval in TU. Ignored in any &action that is not
* %IWL_FMAC_START_HOST_BASED_AP.
* @inactivity_timeout: the max inactivity for clients, before they are removed
* from the BSS (given in seconds). Ignored in any &action that is not
* %IWL_FMAC_START_HOST_BASED_AP.
* @chandef: see &iwl_fmac_chandef. Ignored in any &action that is not
* %IWL_FMAC_START_HOST_BASED_AP.
* @changed: indicates what field changed. See &enum iwl_fmac_host_ap_changed.
* @ac_params: the AC parameters. The order of the AC in the array is:
* 0: BK, 1: BE, 2: VI, 3: VO
* @byte_cnt: length of the beacon frame. Ignored if %IWL_FMAC_BEACON_CHANGED
* is not set in &changed.
* @tim_idx: The index in bytes to where the TIM IE should be inserted. Ignored
* if %IWL_FMAC_BEACON_CHANGED is not set in &changed.
* @frame: the template of the beacon frame. Ignored if
* %IWL_FMAC_BEACON_CHANGED is not set in &changed.
*
* The command is used to manage (start / modify / stop) host based AP
* functionality.
* The flow to manage the host based AP is a synchronous flow as opposed to
* the regular AP mode. The response of this command is &struct
* iwl_fmac_host_ap_resp. All the management and EAPOL frames will be handled
* in the host.
*/
struct iwl_fmac_host_ap_cmd {
uint8_t vif_id;
uint8_t action;
uint8_t dtim_period;
uint8_t use_cts_prot;
uint8_t use_short_preamble;
uint8_t use_short_slot;
__le16 basic_rates_bitmap;
__le16 ht_opmode;
__le16 beacon_int;
__le32 inactivity_timeout;
struct iwl_fmac_chandef chandef;
struct iwl_fmac_ac_params ac_params[4];
__le16 byte_cnt;
__le16 tim_idx;
__le32 changed;
#ifndef _MSC_VER
uint8_t frame[0];
#endif
} __packed;
/**
* struct iwl_fmac_host_ap_resp - Response of the %FMAC_HOST_BASED_AP
*/
struct iwl_fmac_host_ap_resp {
/**
* @vif_id:
* the interface identifier returned in &iwl_fmac_add_vif_resp.
*/
uint8_t vif_id;
/**
* @mcast_sta_id:
* the identifier allocation for the used for broadcast and multicast
* transmissions. Relevant only if the %action was
* %IWL_FMAC_START_HOST_BASED_AP.
*/
uint8_t mcast_sta_id;
/**
* @bcast_sta_id:
* the identifier allocation for the used for broadcast management
* frames. Relevant only if the %action was
* %IWL_FMAC_START_HOST_BASED_AP.
*/
uint8_t bcast_sta_id;
#ifdef CPTCFG_IWLFMAC_9000_SUPPORT
/**
* @mcast_queue:
* queue allocation for broadcast and multicast transmissions.
* Only valid for 9000-series devices, otherwise reserved.
* Relevant only if the %action was
* %IWL_FMAC_START_HOST_BASED_AP.
*/
uint8_t mcast_queue;
/**
* @bcast_queue:
* queue allocation for broadcast management frames.
* Only valid for 9000-series devices, otherwise reserved.
* Relevant only if the %action was
* %IWL_FMAC_START_HOST_BASED_AP.
*/
uint8_t bcast_queue;
/**
* @reserved:
* for alignment.
*/
uint8_t reserved[3];
#else
/**
* @reserved: reserved
*/
uint8_t reserved[5];
#endif
/**
* @status:
* status defined in &enum iwl_fmac_start_ap_resp_status.
*/
__le32 status;
} __packed;
/**
* enum iwl_fmac_action_host_based_ap_sta - for %FMAC_HOST_BASED_AP_STA command
* @IWL_FMAC_ADD_HOST_BASED_STA: to add a station to the host based AP
* @IWL_FMAC_REM_HOST_BASED_STA: to remove a station from the host based AP
* @IWL_FMAC_MOD_HOST_BASED_STA: to modify a station of the host based AP
*/
enum iwl_fmac_action_host_based_ap_sta {
IWL_FMAC_ADD_HOST_BASED_STA = 0,
IWL_FMAC_REM_HOST_BASED_STA = 1,
IWL_FMAC_MOD_HOST_BASED_STA = 2,
};
/**
* enum iwl_fmac_host_ap_sta_changed - describes what field is valid
* @IWL_FMAC_STA_AID_CHANGED: aid was updated
* @IWL_FMAC_STA_SUPP_RATE_CHANGED: supported_rates_bitmap was updated
* @IWL_FMAC_STA_HT_CAP_CHANGED: ht_cap was updated
* @IWL_FMAC_STA_VHT_CAP_CHANGED: vht_cap was updated
* @IWL_FMAC_STA_UAPSD_PARAMS_CHANGED: uapsd_ac/sp_length was updated
*/
enum iwl_fmac_host_ap_sta_changed {
IWL_FMAC_STA_AID_CHANGED = BIT(0),
IWL_FMAC_STA_SUPP_RATE_CHANGED = BIT(1),
IWL_FMAC_STA_HT_CAP_CHANGED = BIT(2),
IWL_FMAC_STA_VHT_CAP_CHANGED = BIT(3),
IWL_FMAC_STA_UAPSD_PARAMS_CHANGED = BIT(4),
};
/**
* enum iwl_fmac_host_ap_sta_flags - flags for the host based AP's station
* @IWL_FMAC_STA_HT_CAPABLE: the station is HT capable
* @IWL_FMAC_STA_VHT_CAPABLE: the station is VHT capable
*/
enum iwl_fmac_host_ap_sta_flags {
IWL_FMAC_STA_HT_CAPABLE = BIT(0),
IWL_FMAC_STA_VHT_CAPABLE = BIT(1),
};
/**
* struct iwl_fmac_host_ap_sta_cmd - add a station to a host based AP
* @action: see &enum iwl_fmac_action_host_based_ap_sta Note: not all fields are
* relevant for all the actions.
* @sta_id: valid only if the action isn't %IWL_FMAC_ADD.
* @vif_id: the id of the host based AP
* @flags: See &enum iwl_fmac_host_ap_sta_flags
* @addr: the MAC address of the station
* @aid: the association ID given to the station
* @changed: indicates what field changed. Note that this field must be set
* even if action is %IWL_FMAC_ADD.
* See &enum iwl_fmac_host_ap_sta_changed.
* @supp_rates_bitmap: the bitmap describing the supported non-HT rates.
* bit 0: 1Mbps bit 1: 2Mbps bit 2: 5Mbps bit 3: 11Mbps bit 4: 6Mbps
* bit 5: 9Mbps bit 6: 12Mbps bit 7: 18Mbps bit 8: 24Mbps bit 9: 36Mbps
* bit 10: 48Mbps bit 11: 54Mbps
* @ht_cap: the HT capability Information Element
* @uapsd_ac: ACs that are trigger-delivery enabled. The order of the bits is:
* 0: BK, 1: BE, 2: VI, 3: VO
* @sp_length: the actual number of frames to be sent in a Service Period
* @vht_cap: the VHT capability Information Element
*/
struct iwl_fmac_host_ap_sta_cmd {
uint8_t action;
uint8_t sta_id;
uint8_t vif_id;
uint8_t flags;
uint8_t addr[ETH_ALEN];
__le16 aid;
__le16 changed;
__le16 supp_rates_bitmap;
uint8_t ht_cap[26];
uint8_t uapsd_ac;
uint8_t sp_length;
uint8_t vht_cap[12];
} __packed;
#define IWL_FMAC_HOST_AP_INVALID_STA 0xffffffff
/**
* struct iwl_fmac_host_ap_sta_resp - response of %FMAC_HOST_BASED_AP_STA
* @sta_id: the station id. If there is no room in the station table,
* %IWL_FMAC_HOST_AP_INVALID_STA will be returned.
* For any action other than %IWL_FMAC_ADD, the value will be 0.
*/
struct iwl_fmac_host_ap_sta_resp {
__le32 sta_id;
};
/**
* enum iwl_fmac_action_temporal_key - for %FMAC_TEMPORAL_KEY command
* @IWL_FMAC_ADD_TEMPORAL_KEY: to add a temporal key
* @IWL_FMAC_REM_TEMPORAL_KEY: to remove a temporal key
*/
enum iwl_fmac_action_temporal_key {
IWL_FMAC_ADD_TEMPORAL_KEY = 0,
IWL_FMAC_REM_TEMPORAL_KEY = 1,
};
/**
* enum iwl_fmac_key_type - for %FMAC_TEMPORAL_KEY command
* @IWL_FMAC_TEMPORAL_KEY_TYPE_PTK: pairwise key
* @IWL_FMAC_TEMPORAL_KEY_TYPE_GTK: multicast key
* @IWL_FMAC_TEMPORAL_KEY_TYPE_IGTK: IGTK
*/
enum iwl_fmac_temporal_key_type {
IWL_FMAC_TEMPORAL_KEY_TYPE_PTK = 0,
IWL_FMAC_TEMPORAL_KEY_TYPE_GTK = 1,
IWL_FMAC_TEMPORAL_KEY_TYPE_IGTK = 2,
};
/**
* struct iwl_fmac_temporal_key_cmd - add a PTK (used for the host based AP or
* when external WPA is enabled)
* @action: see &enum iwl_fmac_action_temporal_key
* @sta_id: the station id to which this key relates. Can be the
* multicast station for the groupwise key.
* @keyidx: the key index
* @keylen: the length of the key material
* @cipher: one of %IWL_FMAC_CIPHER_\*
* @key: the key material
* @key_type: see &enum iwl_fmac_temporal_key_type
* @vif_id: the interface identifier returned in &iwl_fmac_add_vif_resp.
* @reserved: reserved
*/
struct iwl_fmac_temporal_key_cmd {
uint8_t action;
uint8_t sta_id;
uint8_t keyidx;
uint8_t keylen;
__le32 cipher;
uint8_t key[32];
uint8_t key_type;
uint8_t vif_id;
uint8_t reserved[2];
};
/**
* struct iwl_fmac_temporal_key_resp - response to %FMAC_KEY
* @hw_keyoffset: the index to be used in the Tx command to use this key
*/
struct iwl_fmac_temporal_key_resp {
__le32 hw_keyoffset;
};
/**
* struct iwl_fmac_sta_removed - Notify about a removed station.
* @vif_id: the interface identifier returned in &iwl_fmac_add_vif_resp.
* @sta_id: holds a station entry index associated the removed station.
* @reserved: reserved
*/
struct iwl_fmac_sta_removed {
uint8_t vif_id;
uint8_t sta_id;
uint8_t reserved[2];
} __packed;
/**
* enum iwl_fmac_dbg_trigger - triggers available
*/
enum iwl_fmac_dbg_trigger {
/**
* @IWL_FMAC_DBG_TRIGGER_INVALID:
* (reserved)
*/
IWL_FMAC_DBG_TRIGGER_INVALID = 0,
/**
* @IWL_FMAC_DBG_TRIGGER_MISSED_BEACONS:
* trigger on missed beacons
*/
IWL_FMAC_DBG_TRIGGER_MISSED_BEACONS = 3,
/**
* @IWL_FMAC_DBG_TRIGGER_CHANNEL_SWITCH:
* trigger on channel switch
*/
IWL_FMAC_DBG_TRIGGER_CHANNEL_SWITCH = 4,
/**
* @IWL_FMAC_DBG_TRIGGER_MAX:
* maximum number of triggers supported
*/
IWL_FMAC_DBG_TRIGGER_MAX /* must be last */
};
/**
* struct iwl_fmac_trigger_cmd
* @len: length of %data
* @id: &enum iwl_fmac_dbg_trigger
* @vif_type: %iwl_fmac_vif_type
* @data: trigger-dependent data
*/
struct iwl_fmac_trigger_cmd {
__le32 len;
__le32 id;
__le32 vif_type;
#ifndef _MSC_VER
uint8_t data[0];
#endif
} __packed;
#define MAX_TRIGGER_STR 64
/**
* struct iwl_fmac_trigger_notif - notification with invoked trigger info
* @id: &enum iwl_fmac_dbg_trigger
* @data: string that describes what happened
*/
struct iwl_fmac_trigger_notif {
__le32 id;
uint8_t data[MAX_TRIGGER_STR];
} __packed;
enum iwl_fmac_mcc_source {
IWL_FMAC_MCC_SOURCE_OLD_FW = 0,
IWL_FMAC_MCC_SOURCE_ME = 1,
IWL_FMAC_MCC_SOURCE_BIOS = 2,
IWL_FMAC_MCC_SOURCE_3G_LTE_HOST = 3,
IWL_FMAC_MCC_SOURCE_3G_LTE_DEVICE = 4,
IWL_FMAC_MCC_SOURCE_WIFI = 5,
IWL_FMAC_MCC_SOURCE_RESERVED = 6,
IWL_FMAC_MCC_SOURCE_DEFAULT = 7,
IWL_FMAC_MCC_SOURCE_UNINITIALIZED = 8,
IWL_FMAC_MCC_SOURCE_MCC_API = 9,
IWL_FMAC_MCC_SOURCE_GET_CURRENT = 0x10,
IWL_FMAC_MCC_SOURCE_GETTING_MCC_TEST_MODE = 0x11,
};
/**
* struct iwl_fmac_reg_cmd - send regulatory data to FW
* @mcc: country code or "ZZ" for default
* @source_id: &enum iwl_fmac_mcc_source
* @reserved: reserved
*/
struct iwl_fmac_reg_cmd {
__le16 mcc;
uint8_t source_id;
uint8_t reserved;
} __packed;
/**
* struct iwl_fmac_reg_resp - response to %FMAC_REG_CFG, %FMAC_REG_UPDATE notif
* @mcc: the current MCC
* @source_id: the MCC source, see &enum iwl_fmac_mcc_source
* @n_channels: number of channels in @channels
* @channels: channel control data map, 32bits for each channel. Only the first
* 16bits are used.
* @reserved: reserved
*
* Contains the new channel control profile map and the current MCC (mobile
* country code). The new MCC may be different than what was requested in
* FMAC_REG_CFG, if this is a cmd response.
*/
struct iwl_fmac_reg_resp {
__le16 mcc;
uint8_t source_id;
uint8_t reserved[1];
__le32 n_channels;
#ifndef _MSC_VER
__le32 channels[0];
#endif
} __packed;
/**
* struct iwl_fw_dbg_trigger_missed_bcon - configures trigger for missed
* beacons
* @stop_consec_missed_bcon: stop recording if threshold is crossed.
* stop recording means to collect the current dump data.
* @stop_consec_missed_bcon_since_rx: stop recording if threshold is crossed.
* @reserved: reserved
*/
struct iwl_fmac_dbg_trigger_missed_bcon {
__le32 stop_consec_missed_bcon;
__le32 stop_consec_missed_bcon_since_rx;
uint8_t reserved[24];
} __packed;
/**
* struct iwl_fmac_rx_eapol_notif - EAPOL RX notification
* @addr: frame source address
* @len: frame length in bytes
* @data: frame body
*
* This message is used to pass 802.1X EAPOL frames to the host.
* The host is expected to send the response EAPOL via the TX path,
* and if 802.1X authentication fails the host should disconnect with
* disconnect reason 23 (IEEE 802.1x authentication failed).
*/
struct iwl_fmac_rx_eapol_notif {
uint8_t addr[ETH_ALEN];
__le16 len;
#ifndef _MSC_VER
uint8_t data[0];
#endif
} __packed;
#ifdef CPTCFG_IWLFMAC_9000_SUPPORT
/**
* struct iwl_fmac_send_frame_notif - Ask the host to send a frame
* @vif_id: the interface identifier
* @reserved: reserved
* @len: frame length in bytes
* @dst_addr: the destination MAC address
* @src_addr: the source MAC address
* @proto: the protocol (only EAP for now)
* @data: frame body starts with a valid 802.11 MAC header
*
* This message is used to instruct the host to send a frame. This is
* used to use the host's PN pool and avoid racing between the host and
* FMAC.
*/
struct iwl_fmac_send_frame_notif {
uint8_t vif_id;
uint8_t reserved;
__le16 len;
uint8_t dst_addr[ETH_ALEN];
uint8_t src_addr[ETH_ALEN];
__be16 proto;
#ifndef _MSC_VER
uint8_t data[0];
#endif
} __packed;
#endif
#define KEY_MAX_LEN 48
/**
* enum iwl_fmac_key_type - available key types for FMAC_SET_PMK command
* @IWL_FMAC_KEY_TYPE_PMK: PMK from 802.1X authentication. The PMK length
* is 32 bytes.
* @IWL_FMAC_KEY_TYPE_PMK_EAP_LEAP: PMK from 802.1X authentication when
* EAP-LEAP is used. The PMK length is 16.
* @IWL_FMAC_KEY_TYPE_PMK_SUITE_B_192: PMK from 802.1X authentication when
* suite_b_192 is used. The PMK length is 48 bytes.
*/
enum iwl_fmac_key_type {
IWL_FMAC_KEY_TYPE_PMK,
IWL_FMAC_KEY_TYPE_PMK_EAP_LEAP,
IWL_FMAC_KEY_TYPE_PMK_SUITE_B_192,
};
/**
* struct iwl_fmac_mlme_set_pmk_cmd - set pmk command
* @vif_id: the interface identifier returned in &iwl_fmac_add_vif_resp
* @key_type: the key type as specified in &iwl_fmac_key_type. This field
* defines the used length of the key buffer.
* @aa: authenticator address
* @key: key data. The length of the data is determined by the type
* of the key as specified in &key_type. See also &enum iwl_fmac_key_type.
*/
struct iwl_fmac_mlme_set_pmk_cmd {
uint8_t vif_id;
uint8_t key_type;
uint8_t aa[ETH_ALEN];
uint8_t key[KEY_MAX_LEN];
};
/**
* struct iwl_fmac_mic_failure - Notify fmac of TKIP MMIC failures.
* @vif_id: the interface identifier connected to TKIP WLAN.
* @pairwise: whether the mic failure was on unicaseet or multicast.
* @reserved: reserved for 4 byte alignment.
*/
struct iwl_fmac_mic_failure {
uint8_t vif_id;
uint8_t pairwise;
uint8_t reserved[2];
} __packed;
/**
* enum iwl_fmac_sha_type - SHA function types
* @IWL_FMAC_SHA_TYPE_SHA1: SHA1
* @IWL_FMAC_SHA_TYPE_SHA256: SHA256
* @IWL_FMAC_SHA_TYPE_SHA384: SHA384
*/
enum iwl_fmac_sha_type {
IWL_FMAC_SHA_TYPE_SHA1,
IWL_FMAC_SHA_TYPE_SHA256,
IWL_FMAC_SHA_TYPE_SHA384,
};
#define SHA_MAX_MSG_LEN 128
/**
* struct iwl_fmac_vector_sha - vector for FIPS SHA tests
* @type: the SHA type to use. One of &enum iwl_fmac_sha_type.
* @msg_len: the length of &msg in bytes.
* @reserved: for alignment.
* @msg: the message to generate the hash for.
*/
struct iwl_fmac_vector_sha {
uint8_t type;
uint8_t msg_len;
__le16 reserved;
uint8_t msg[SHA_MAX_MSG_LEN];
} __packed;
#define HMAC_KDF_MAX_KEY_LEN 192
#define HMAC_KDF_MAX_MSG_LEN 144
/**
* struct iwl_fmac_vector_hmac_kdf - vector for FIPS HMAC/KDF tests
* @type: the SHA type to use. One of &enum iwl_fmac_sha_type.
* @res_len: requested result length in bytes.
* @key_len: the length of &key in bytes.
* @msg_len: the length of &msg in bytes.
* @key: key for HMAC/KDF operations.
* @msg: the message to generate the MAC for.
*/
struct iwl_fmac_vector_hmac_kdf {
uint8_t type;
uint8_t res_len;
uint8_t key_len;
uint8_t msg_len;
uint8_t key[HMAC_KDF_MAX_KEY_LEN];
uint8_t msg[HMAC_KDF_MAX_MSG_LEN];
} __packed;
/**
* enum iwl_fmac_fips_test_type - FIPS test types
* @IWL_FMAC_FIPS_TEST_SHA: test SHA functions.
* @IWL_FMAC_FIPS_TEST_HMAC: test HMAC functions.
* @IWL_FMAC_FIPS_TEST_KDF: test KDF functions.
*/
enum iwl_fmac_fips_test_type {
IWL_FMAC_FIPS_TEST_SHA,
IWL_FMAC_FIPS_TEST_HMAC,
IWL_FMAC_FIPS_TEST_KDF,
};
union iwl_fmac_fips_test_vector {
struct iwl_fmac_vector_sha sha_vector;
struct iwl_fmac_vector_hmac_kdf hmac_kdf_vector;
};
#define MAX_FIPS_VECTOR_LEN sizeof(union iwl_fmac_fips_test_vector)
/**
* struct iwl_fmac_test_fips_cmd - FIPS test command
* @type: test type. One of &enum iwl_fmac_fips_test_type.
* @reserved: for alignment.
* @vector: buffer with vector data. Union &iwl_fmac_fips_test_vector.
*/
struct iwl_fmac_test_fips_cmd {
uint8_t type;
uint8_t reserved[3];
uint8_t vector[MAX_FIPS_VECTOR_LEN];
} __packed;
/**
* enum iwl_fmac_fips_test_status - FIPS test result status
* @IWL_FMAC_TEST_FIPS_STATUS_SUCCESS: The requested operation was completed
* successfully. The result buffer is valid.
* @IWL_FMAC_TEST_FIPS_STATUS_FAIL: The requested operation failed.
*/
enum iwl_fmac_test_fips_status {
IWL_FMAC_TEST_FIPS_STATUS_SUCCESS,
IWL_FMAC_TEST_FIPS_STATUS_FAIL,
};
#define FIPS_MAX_RES_LEN 88
#define MAX_RES_LEN_HMAC_SHA1 20
#define MAX_RES_LEN_HMAC_SHA256 32
#define MAX_RES_LEN_HMAC_SHA384 48
/**
* struct iwl_fmac_test_fips_resp - FIPS test response
* @status: one of &enum iwl_fmac_fips_test_status.
* @len: the length of the response in bytes.
* @reserved: for alignment.
* @buf: response buffer.
*
* Note that the response buffer has valid data only if &status is
* &IWL_FMAC_TEST_FIPS_STATUS_SUCCESS. Otherwise it should be ignored.
*/
struct iwl_fmac_test_fips_resp {
uint8_t status;
uint8_t len;
__le16 reserved;
uint8_t buf[FIPS_MAX_RES_LEN];
} __packed;
/**
* struct iwl_fmac_set_monitor_chan_cmd - Set the monifor channel
* @vif_id: id of monitor vif to set
* @reserved: reserved for dword alignment
* @chandef: channel to set
*/
struct iwl_fmac_set_monitor_chan_cmd {
uint8_t vif_id;
uint8_t reserved[3];
struct iwl_fmac_chandef chandef;
} __packed;
/**
* struct iwl_fmac_roam_is_needed - Roam is needed information notification
*
* @vif_id: vif_id returned by &FMAC_ADD_VIF command
* @n_bssids: number of BSSIDs in the &bssids array.
* @bssids: array of bssids whose length is &n_bssids. this bssid list
* is the candidate list for roam.
*/
struct iwl_fmac_roam_is_needed {
uint8_t vif_id;
uint8_t n_bssids;
uint8_t bssids[IWL_FMAC_MAX_BSSIDS * ETH_ALEN];
} __packed;
/**
* enum iwl_fmac_roam_result_status - roam result status
*
* @IWL_FMAC_ROAM_RESULT_STATUS_ROAMED_NEW_AP: roamed to new ap successfully.
* @IWL_FMAC_ROAM_RESULT_STATUS_ROAM_FAILED: roamed to new ap failed.
* @IWL_FMAC_ROAM_RESULT_STATUS_LEFT_WITH_CURRENT_AP: current AP is the best
* AP, so no need to roam.
* @IWL_FMAC_ROAM_RESULT_STATUS_NOT_CONNECTED: the ctrl iface state is not
* connected.
*/
enum iwl_fmac_roam_result_status {
IWL_FMAC_ROAM_RESULT_STATUS_ROAMED_NEW_AP,
IWL_FMAC_ROAM_RESULT_STATUS_ROAM_FAILED,
IWL_FMAC_ROAM_RESULT_STATUS_LEFT_WITH_CURRENT_AP,
IWL_FMAC_ROAM_RESULT_STATUS_NOT_CONNECTED,
};
/**
* struct iwl_fmac_roam_result - Roam result information notification
*
* @status: one of &enum iwl_fmac_roam_result_status.
* @vif_id: the virtual interface identifier as returned in
* &iwl_fmac_add_vif_resp.
* @reserved: for alignment.
* @connect_result: as defined in &struct iwl_fmac_connect_result.
*/
struct iwl_fmac_roam_result {
uint8_t status;
uint8_t vif_id;
uint8_t reserved[2];
struct iwl_fmac_connect_result connect_result;
} __packed;
/**
* struct iwl_fmac_tkip_mcast_rsc - TKIP receive sequence counter
*
* @vif_id: the virtual interface identifier as returned in
* &iwl_fmac_add_vif_resp.
* @key_idx: key index
* @addr: station address
* @rsc: the new receive sequence counter
* @reserved: for alignment.
*/
struct iwl_fmac_tkip_mcast_rsc {
uint8_t vif_id;
uint8_t key_idx;
uint8_t addr[ETH_ALEN];
uint8_t rsc[6];
uint8_t reserved[2];
};
/**
* struct iwl_fmac_inactive_sta - notifies about an inactive station
* @vif_id: the id of the vif
* @sta_id: the id of the station that is inactive
* @reserved: for alignment
*/
struct iwl_fmac_inactive_sta {
uint8_t vif_id;
uint8_t sta_id;
__le16 reserved;
};
#define IWL_FMAC_RECOVERY_NUM_VIFS 4
/**
* struct iwl_fmac_recover_cmd - command to recover connetions
* @add_vif_bitmap: a bitmap of vif_id's that should be added by the recovery
* flow. If i is set, then vif i will be added.
* @restore_vif_bitmap: a bitmap of vif_id's that should be recovered. If bit
* i is set, then vif i will be recovered.
* @reserved: for alignment
* @vif_types: the type of the vifs to be restored. See &enum iwl_fmac_vif_type.
* @vif_addrs: the addresses of the vifs
* @blob: raw data read by the host upon firmware crash
*/
struct iwl_fmac_recover_cmd {
uint8_t add_vif_bitmap;
uint8_t restore_vif_bitmap;
uint8_t reserved[2];
uint8_t vif_types[IWL_FMAC_RECOVERY_NUM_VIFS];
uint8_t vif_addrs[IWL_FMAC_RECOVERY_NUM_VIFS * ETH_ALEN];
#ifndef _MSC_VER
uint8_t blob[0];
#endif
} __packed;
/**
* enum iwl_fmac_recovery_complete_status - values for the recovery status
* @IWL_FMAC_RECOV_SUCCESS: all the vifs were added
* @IWL_FMAC_RECOV_CORRUPTED: the buffer was corrupted, no vifs were added
*/
enum iwl_fmac_recovery_complete_status {
IWL_FMAC_RECOV_SUCCESS = 0,
IWL_FMAC_RECOV_CORRUPTED = 1,
};
/**
* struct iwl_fmac_recovery_complete - notifies the completion of the recovery
* @status: If %IWL_FMAC_RECOV_SUCCESS, then all the vifs that were requested
* to be recvored in the %FMAC_RECOVER command were re-added even if
* their state may not have been recovered (see &vif_id_bitmap).
* A non-0 value means that the firmware has not done anything to recover
* and the host should start by re-adding the vifs.
* @vif_id_bitmap: a bitmap of vif_id's. If bit i is set, then vif i was
* properly recovered.
* @reserved: for alignment
*/
struct iwl_fmac_recovery_complete {
uint8_t status;
uint8_t vif_id_bitmap;
uint8_t reserved[2];
} __packed;
#endif // SRC_CONNECTIVITY_WLAN_DRIVERS_THIRD_PARTY_INTEL_IWLWIFI_FW_API_FMAC_H_