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