/******************************************************************************
 *
 * Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved.
 * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH
 * 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_SCAN_H_
#define SRC_CONNECTIVITY_WLAN_DRIVERS_THIRD_PARTY_INTEL_IWLWIFI_FW_API_SCAN_H_

#include <fuchsia/wlan/ieee80211/c/banjo.h>
#include <netinet/if_ether.h>
#include <stdint.h>

#include "src/iwlwifi/platform/compiler.h"

/* Scan Commands, Responses, Notifications */

/* Max number of IEs for direct SSID scans in a command */
#define PROBE_OPTION_MAX 20

/**
 * struct iwl_ssid_ie - directed scan network information element
 *
 * Up to 20 of these may appear in REPLY_SCAN_CMD,
 * selected by "type" bit field in struct iwl_scan_channel;
 * each channel may select different ssids from among the 20 entries.
 * SSID IEs get transmitted in reverse order of entry.
 *
 * @id: element ID
 * @len: element length
 * @ssid: element (SSID) data
 */
struct iwl_ssid_ie {
  uint8_t id;
  uint8_t len;
  uint8_t ssid[fuchsia_wlan_ieee80211_MAX_SSID_BYTE_LEN];
} __packed; /* SCAN_DIRECT_SSID_IE_API_S_VER_1 */

/* scan offload */
#define IWL_SCAN_MAX_BLACKLIST_LEN 64
#define IWL_SCAN_SHORT_BLACKLIST_LEN 16
#define IWL_SCAN_MAX_PROFILES 11
#define SCAN_OFFLOAD_PROBE_REQ_SIZE 512

/* Default watchdog (in MS) for scheduled scan iteration */
#define IWL_SCHED_SCAN_WATCHDOG cpu_to_le16(15000)

#define IWL_GOOD_CRC_TH_DEFAULT cpu_to_le16(1)
#define CAN_ABORT_STATUS 1

#define IWL_FULL_SCAN_MULTIPLIER 5
#define IWL_FAST_SCHED_SCAN_ITERATIONS 3
#define IWL_MAX_SCHED_SCAN_PLANS 2
#define IWL_SCAN_MAX_NUM_OF_CHANNELS 52

enum scan_framework_client {
  SCAN_CLIENT_SCHED_SCAN = BIT(0),
  SCAN_CLIENT_NETDETECT = BIT(1),
  SCAN_CLIENT_ASSET_TRACKING = BIT(2),
};

/**
 * struct iwl_scan_offload_blacklist - SCAN_OFFLOAD_BLACKLIST_S
 * @ssid:       MAC address to filter out
 * @reported_rssi:  AP rssi reported to the host
 * @client_bitmap: clients ignore this entry  - enum scan_framework_client
 */
struct iwl_scan_offload_blacklist {
  uint8_t ssid[ETH_ALEN];
  uint8_t reported_rssi;
  uint8_t client_bitmap;
} __packed;

enum iwl_scan_offload_network_type {
  IWL_NETWORK_TYPE_BSS = 1,
  IWL_NETWORK_TYPE_IBSS = 2,
  IWL_NETWORK_TYPE_ANY = 3,
};

enum iwl_scan_offload_band_selection {
  IWL_SCAN_OFFLOAD_SELECT_2_4 = 0x4,
  IWL_SCAN_OFFLOAD_SELECT_5_2 = 0x8,
  IWL_SCAN_OFFLOAD_SELECT_ANY = 0xc,
};

/**
 * struct iwl_scan_offload_profile - SCAN_OFFLOAD_PROFILE_S
 * @ssid_index:     index to ssid list in fixed part
 * @unicast_cipher: encryption algorithm to match - bitmap
 * @auth_alg:       authentication algorithm to match - bitmap
 * @network_type:   enum iwl_scan_offload_network_type
 * @band_selection: enum iwl_scan_offload_band_selection
 * @client_bitmap:  clients waiting for match - enum scan_framework_client
 * @reserved:       reserved
 */
struct iwl_scan_offload_profile {
  uint8_t ssid_index;
  uint8_t unicast_cipher;
  uint8_t auth_alg;
  uint8_t network_type;
  uint8_t band_selection;
  uint8_t client_bitmap;
  uint8_t reserved[2];
} __packed;

/**
 * struct iwl_scan_offload_profile_cfg - SCAN_OFFLOAD_PROFILES_CFG_API_S_VER_1
 * @profiles:       profiles to search for match
 * @blacklist_len:  length of blacklist
 * @num_profiles:   num of profiles in the list
 * @match_notify:   clients waiting for match found notification
 * @pass_match:     clients waiting for the results
 * @active_clients: active clients bitmap - enum scan_framework_client
 * @any_beacon_notify:  clients waiting for match notification without match
 * @reserved:       reserved
 */
struct iwl_scan_offload_profile_cfg {
  struct iwl_scan_offload_profile profiles[IWL_SCAN_MAX_PROFILES];
  uint8_t blacklist_len;
  uint8_t num_profiles;
  uint8_t match_notify;
  uint8_t pass_match;
  uint8_t active_clients;
  uint8_t any_beacon_notify;
  uint8_t reserved[2];
} __packed;

/**
 * struct iwl_scan_schedule_lmac - schedule of scan offload
 * @delay:      delay between iterations, in seconds.
 * @iterations:     num of scan iterations
 * @full_scan_mul:  number of partial scans before each full scan
 */
struct iwl_scan_schedule_lmac {
  __le16 delay;
  uint8_t iterations;
  uint8_t full_scan_mul;
} __packed; /* SCAN_SCHEDULE_API_S */

enum iwl_scan_offload_complete_status {
  IWL_SCAN_OFFLOAD_COMPLETED = 1,
  IWL_SCAN_OFFLOAD_ABORTED = 2,
};

enum iwl_scan_ebs_status {
  IWL_SCAN_EBS_SUCCESS,
  IWL_SCAN_EBS_FAILED,
  IWL_SCAN_EBS_CHAN_NOT_FOUND,
  IWL_SCAN_EBS_INACTIVE,
};

/**
 * struct iwl_scan_req_tx_cmd - SCAN_REQ_TX_CMD_API_S
 * @tx_flags: combination of TX_CMD_FLG_*
 * @rate_n_flags: rate for *all* Tx attempts, if TX_CMD_FLG_STA_RATE_MSK is
 *  cleared. Combination of RATE_MCS_*
 * @sta_id: index of destination station in FW station table
 * @reserved: for alignment and future use
 */
struct iwl_scan_req_tx_cmd {
  __le32 tx_flags;
  __le32 rate_n_flags;
  uint8_t sta_id;
  uint8_t reserved[3];
} __packed;

enum iwl_scan_channel_flags_lmac {
  IWL_UNIFIED_SCAN_CHANNEL_FULL = BIT(27),
  IWL_UNIFIED_SCAN_CHANNEL_PARTIAL = BIT(28),
};

/**
 * struct iwl_scan_channel_cfg_lmac - SCAN_CHANNEL_CFG_S_VER2
 * @flags:      bits 1-20: directed scan to i'th ssid
 *          other bits &enum iwl_scan_channel_flags_lmac
 * @channel_num:    channel number 1-13 etc
 * @iter_count:     scan iteration on this channel
 * @iter_interval:  interval in seconds between iterations on one channel
 */
struct iwl_scan_channel_cfg_lmac {
  __le32 flags;
  __le16 channel_num;
  __le16 iter_count;
  __le32 iter_interval;
} __packed;

/*
 * struct iwl_scan_probe_segment - PROBE_SEGMENT_API_S_VER_1
 * @offset: offset in the data block
 * @len: length of the segment
 */
struct iwl_scan_probe_segment {
  __le16 offset;
  __le16 len;
} __packed;

/* iwl_scan_probe_req - PROBE_REQUEST_FRAME_API_S_VER_2
 * @mac_header: first (and common) part of the probe
 * @band_data: band specific data
 * @common_data: last (and common) part of the probe
 * @buf: raw data block
 */
struct iwl_scan_probe_req {
  struct iwl_scan_probe_segment mac_header;
  struct iwl_scan_probe_segment band_data[2];
  struct iwl_scan_probe_segment common_data;
  uint8_t buf[SCAN_OFFLOAD_PROBE_REQ_SIZE];
} __packed;

enum iwl_scan_channel_flags {
  IWL_SCAN_CHANNEL_FLAG_EBS = BIT(0),
  IWL_SCAN_CHANNEL_FLAG_EBS_ACCURATE = BIT(1),
  IWL_SCAN_CHANNEL_FLAG_CACHE_ADD = BIT(2),
  IWL_SCAN_CHANNEL_FLAG_EBS_FRAG = BIT(3),
};

/* struct iwl_scan_channel_opt - CHANNEL_OPTIMIZATION_API_S
 * @flags: enum iwl_scan_channel_flags
 * @non_ebs_ratio: defines the ratio of number of scan iterations where EBS is
 *  involved.
 *  1 - EBS is disabled.
 *  2 - every second scan will be full scan(and so on).
 */
struct iwl_scan_channel_opt {
  __le16 flags;
  __le16 non_ebs_ratio;
} __packed;

/**
 * enum iwl_mvm_lmac_scan_flags - LMAC scan flags
 * @IWL_MVM_LMAC_SCAN_FLAG_PASS_ALL: pass all beacons and probe responses
 *  without filtering.
 * @IWL_MVM_LMAC_SCAN_FLAG_PASSIVE: force passive scan on all channels
 * @IWL_MVM_LMAC_SCAN_FLAG_PRE_CONNECTION: single channel scan
 * @IWL_MVM_LMAC_SCAN_FLAG_ITER_COMPLETE: send iteration complete notification
 * @IWL_MVM_LMAC_SCAN_FLAG_MULTIPLE_SSIDS: multiple SSID matching
 * @IWL_MVM_LMAC_SCAN_FLAG_FRAGMENTED: all passive scans will be fragmented
 * @IWL_MVM_LMAC_SCAN_FLAGS_RRM_ENABLED: insert WFA vendor-specific TPC report
 *  and DS parameter set IEs into probe requests.
 * @IWL_MVM_LMAC_SCAN_FLAG_EXTENDED_DWELL: use extended dwell time on channels
 *  1, 6 and 11.
 * @IWL_MVM_LMAC_SCAN_FLAG_MATCH: Send match found notification on matches
 */
enum iwl_mvm_lmac_scan_flags {
  IWL_MVM_LMAC_SCAN_FLAG_PASS_ALL = BIT(0),
  IWL_MVM_LMAC_SCAN_FLAG_PASSIVE = BIT(1),
  IWL_MVM_LMAC_SCAN_FLAG_PRE_CONNECTION = BIT(2),
  IWL_MVM_LMAC_SCAN_FLAG_ITER_COMPLETE = BIT(3),
  IWL_MVM_LMAC_SCAN_FLAG_MULTIPLE_SSIDS = BIT(4),
  IWL_MVM_LMAC_SCAN_FLAG_FRAGMENTED = BIT(5),
  IWL_MVM_LMAC_SCAN_FLAGS_RRM_ENABLED = BIT(6),
  IWL_MVM_LMAC_SCAN_FLAG_EXTENDED_DWELL = BIT(7),
  IWL_MVM_LMAC_SCAN_FLAG_MATCH = BIT(9),
};

enum iwl_scan_priority {
  IWL_SCAN_PRIORITY_LOW,
  IWL_SCAN_PRIORITY_MEDIUM,
  IWL_SCAN_PRIORITY_HIGH,
};

enum iwl_scan_priority_ext {
  IWL_SCAN_PRIORITY_EXT_0_LOWEST,
  IWL_SCAN_PRIORITY_EXT_1,
  IWL_SCAN_PRIORITY_EXT_2,
  IWL_SCAN_PRIORITY_EXT_3,
  IWL_SCAN_PRIORITY_EXT_4,
  IWL_SCAN_PRIORITY_EXT_5,
  IWL_SCAN_PRIORITY_EXT_6,
  IWL_SCAN_PRIORITY_EXT_7_HIGHEST,
};

/**
 * struct iwl_scan_req_lmac - SCAN_REQUEST_CMD_API_S_VER_1
 * @reserved1: for alignment and future use
 * @n_channels: num of channels to scan
 * @active_dwell: dwell time for active channels
 * @passive_dwell: dwell time for passive channels
 * @fragmented_dwell: dwell time for fragmented passive scan
 * @extended_dwell: dwell time for channels 1, 6 and 11 (in certain cases)
 * @reserved2: for alignment and future use
 * @rx_chain_select: PHY_RX_CHAIN_* flags
 * @scan_flags: &enum iwl_mvm_lmac_scan_flags
 * @max_out_time: max time (in TU) to be out of associated channel
 * @suspend_time: pause scan this long (TUs) when returning to service channel
 * @flags: RXON flags
 * @filter_flags: RXON filter
 * @tx_cmd: tx command for active scan; for 2GHz and for 5GHz
 * @direct_scan: list of SSIDs for directed active scan
 * @scan_prio: enum iwl_scan_priority
 * @iter_num: number of scan iterations
 * @delay: delay in seconds before first iteration
 * @schedule: two scheduling plans. The first one is finite, the second one can
 *  be infinite.
 * @channel_opt: channel optimization options, for full and partial scan
 * @data: channel configuration and probe request packet.
 */
struct iwl_scan_req_lmac {
  /* SCAN_REQUEST_FIXED_PART_API_S_VER_7 */
  __le32 reserved1;
  uint8_t n_channels;
  uint8_t active_dwell;
  uint8_t passive_dwell;
  uint8_t fragmented_dwell;
  uint8_t extended_dwell;
  uint8_t reserved2;
  __le16 rx_chain_select;
  __le32 scan_flags;
  __le32 max_out_time;
  __le32 suspend_time;
  /* RX_ON_FLAGS_API_S_VER_1 */
  __le32 flags;
  __le32 filter_flags;
  struct iwl_scan_req_tx_cmd tx_cmd[2];
  struct iwl_ssid_ie direct_scan[PROBE_OPTION_MAX];
  __le32 scan_prio;
  /* SCAN_REQ_PERIODIC_PARAMS_API_S */
  __le32 iter_num;
  __le32 delay;
  struct iwl_scan_schedule_lmac schedule[IWL_MAX_SCHED_SCAN_PLANS];
  struct iwl_scan_channel_opt channel_opt[2];
  uint8_t data[];
} __packed;

/**
 * struct iwl_scan_results_notif - scan results for one channel -
 *  SCAN_RESULT_NTF_API_S_VER_3
 * @channel: which channel the results are from
 * @band: 0 for 5.2 GHz, 1 for 2.4 GHz
 * @probe_status: SCAN_PROBE_STATUS_*, indicates success of probe request
 * @num_probe_not_sent: # of request that weren't sent due to not enough time
 * @duration: duration spent in channel, in usecs
 */
struct iwl_scan_results_notif {
  uint8_t channel;
  uint8_t band;
  uint8_t probe_status;
  uint8_t num_probe_not_sent;
  __le32 duration;
} __packed;

/**
 * struct iwl_lmac_scan_complete_notif - notifies end of scanning (all channels)
 *  SCAN_COMPLETE_NTF_API_S_VER_3
 * @scanned_channels: number of channels scanned (and number of valid results)
 * @status: one of SCAN_COMP_STATUS_*
 * @bt_status: BT on/off status
 * @last_channel: last channel that was scanned
 * @tsf_low: TSF timer (lower half) in usecs
 * @tsf_high: TSF timer (higher half) in usecs
 * @results: an array of scan results, only "scanned_channels" of them are valid
 */
struct iwl_lmac_scan_complete_notif {
  uint8_t scanned_channels;
  uint8_t status;
  uint8_t bt_status;
  uint8_t last_channel;
  __le32 tsf_low;
  __le32 tsf_high;
  struct iwl_scan_results_notif results[];
} __packed;

/**
 * struct iwl_scan_offload_complete - PERIODIC_SCAN_COMPLETE_NTF_API_S_VER_2
 * @last_schedule_line: last schedule line executed (fast or regular)
 * @last_schedule_iteration: last scan iteration executed before scan abort
 * @status: &enum iwl_scan_offload_complete_status
 * @ebs_status: EBS success status &enum iwl_scan_ebs_status
 * @time_after_last_iter: time in seconds elapsed after last iteration
 * @reserved: reserved
 */
struct iwl_periodic_scan_complete {
  uint8_t last_schedule_line;
  uint8_t last_schedule_iteration;
  uint8_t status;
  uint8_t ebs_status;
  __le32 time_after_last_iter;
  __le32 reserved;
} __packed;

/* UMAC Scan API */

/* The maximum of either of these cannot exceed 8, because we use an
 * 8-bit mask (see IWL_MVM_SCAN_MASK in mvm.h).
 */
#define IWL_MVM_MAX_UMAC_SCANS 8
#define IWL_MVM_MAX_LMAC_SCANS 1

enum scan_config_flags {
  SCAN_CONFIG_FLAG_ACTIVATE = BIT(0),
  SCAN_CONFIG_FLAG_DEACTIVATE = BIT(1),
  SCAN_CONFIG_FLAG_FORBID_CHUB_REQS = BIT(2),
  SCAN_CONFIG_FLAG_ALLOW_CHUB_REQS = BIT(3),
  SCAN_CONFIG_FLAG_SET_TX_CHAINS = BIT(8),
  SCAN_CONFIG_FLAG_SET_RX_CHAINS = BIT(9),
  SCAN_CONFIG_FLAG_SET_AUX_STA_ID = BIT(10),
  SCAN_CONFIG_FLAG_SET_ALL_TIMES = BIT(11),
  SCAN_CONFIG_FLAG_SET_EFFECTIVE_TIMES = BIT(12),
  SCAN_CONFIG_FLAG_SET_CHANNEL_FLAGS = BIT(13),
  SCAN_CONFIG_FLAG_SET_LEGACY_RATES = BIT(14),
  SCAN_CONFIG_FLAG_SET_MAC_ADDR = BIT(15),
  SCAN_CONFIG_FLAG_SET_FRAGMENTED = BIT(16),
  SCAN_CONFIG_FLAG_CLEAR_FRAGMENTED = BIT(17),
  SCAN_CONFIG_FLAG_SET_CAM_MODE = BIT(18),
  SCAN_CONFIG_FLAG_CLEAR_CAM_MODE = BIT(19),
  SCAN_CONFIG_FLAG_SET_PROMISC_MODE = BIT(20),
  SCAN_CONFIG_FLAG_CLEAR_PROMISC_MODE = BIT(21),
  SCAN_CONFIG_FLAG_SET_LMAC2_FRAGMENTED = BIT(22),
  SCAN_CONFIG_FLAG_CLEAR_LMAC2_FRAGMENTED = BIT(23),

/* Bits 26-31 are for num of channels in channel_array */
#define SCAN_CONFIG_N_CHANNELS(n) ((n) << 26)
};

enum scan_config_rates {
  /* OFDM basic rates */
  SCAN_CONFIG_RATE_6M = BIT(0),
  SCAN_CONFIG_RATE_9M = BIT(1),
  SCAN_CONFIG_RATE_12M = BIT(2),
  SCAN_CONFIG_RATE_18M = BIT(3),
  SCAN_CONFIG_RATE_24M = BIT(4),
  SCAN_CONFIG_RATE_36M = BIT(5),
  SCAN_CONFIG_RATE_48M = BIT(6),
  SCAN_CONFIG_RATE_54M = BIT(7),
  /* CCK basic rates */
  SCAN_CONFIG_RATE_1M = BIT(8),
  SCAN_CONFIG_RATE_2M = BIT(9),
  SCAN_CONFIG_RATE_5M = BIT(10),
  SCAN_CONFIG_RATE_11M = BIT(11),

/* Bits 16-27 are for supported rates */
#define SCAN_CONFIG_SUPPORTED_RATE(rate) ((rate) << 16)
};

enum iwl_channel_flags {
  IWL_CHANNEL_FLAG_EBS = BIT(0),
  IWL_CHANNEL_FLAG_ACCURATE_EBS = BIT(1),
  IWL_CHANNEL_FLAG_EBS_ADD = BIT(2),
  IWL_CHANNEL_FLAG_PRE_SCAN_PASSIVE2ACTIVE = BIT(3),
};

/**
 * struct iwl_scan_dwell
 * @active:     default dwell time for active scan
 * @passive:        default dwell time for passive scan
 * @fragmented:     default dwell time for fragmented scan
 * @extended:       default dwell time for channels 1, 6 and 11
 */
struct iwl_scan_dwell {
  uint8_t active;
  uint8_t passive;
  uint8_t fragmented;
  uint8_t extended;
} __packed;

/**
 * struct iwl_scan_config
 * @flags:          enum scan_config_flags
 * @tx_chains:          valid_tx antenna - ANT_* definitions
 * @rx_chains:          valid_rx antenna - ANT_* definitions
 * @legacy_rates:       default legacy rates - enum scan_config_rates
 * @out_of_channel_time:    default max out of serving channel time
 * @suspend_time:       default max suspend time
 * @dwell:          dwells for the scan
 * @mac_addr:           default mac address to be used in probes
 * @bcast_sta_id:       the index of the station in the fw
 * @channel_flags:      default channel flags - enum iwl_channel_flags
 *              scan_config_channel_flag
 * @channel_array:      default supported channels
 */
struct iwl_scan_config_v1 {
  __le32 flags;
  __le32 tx_chains;
  __le32 rx_chains;
  __le32 legacy_rates;
  __le32 out_of_channel_time;
  __le32 suspend_time;
  struct iwl_scan_dwell dwell;
  uint8_t mac_addr[ETH_ALEN];
  uint8_t bcast_sta_id;
  uint8_t channel_flags;
  uint8_t channel_array[];
} __packed; /* SCAN_CONFIG_DB_CMD_API_S */

#define SCAN_TWO_LMACS 2
#define SCAN_LB_LMAC_IDX 0
#define SCAN_HB_LMAC_IDX 1

struct iwl_scan_config {
  __le32 flags;
  __le32 tx_chains;
  __le32 rx_chains;
  __le32 legacy_rates;
  __le32 out_of_channel_time[SCAN_TWO_LMACS];
  __le32 suspend_time[SCAN_TWO_LMACS];
  struct iwl_scan_dwell dwell;
  uint8_t mac_addr[ETH_ALEN];
  uint8_t bcast_sta_id;
  uint8_t channel_flags;
  uint8_t channel_array[];
} __packed; /* SCAN_CONFIG_DB_CMD_API_S_3 */

/**
 * enum iwl_umac_scan_flags - UMAC scan flags
 * @IWL_UMAC_SCAN_FLAG_PREEMPTIVE: scan process triggered by this scan request
 *  can be preempted by other scan requests with higher priority.
 *  The low priority scan will be resumed when the higher proirity scan is
 *  completed.
 * @IWL_UMAC_SCAN_FLAG_START_NOTIF: notification will be sent to the driver
 *  when scan starts.
 */
enum iwl_umac_scan_flags {
  IWL_UMAC_SCAN_FLAG_PREEMPTIVE = BIT(0),
  IWL_UMAC_SCAN_FLAG_START_NOTIF = BIT(1),
};

enum iwl_umac_scan_uid_offsets {
  IWL_UMAC_SCAN_UID_TYPE_OFFSET = 0,
  IWL_UMAC_SCAN_UID_SEQ_OFFSET = 8,
};

enum iwl_umac_scan_general_flags {
  IWL_UMAC_SCAN_GEN_FLAGS_PERIODIC = BIT(0),
  IWL_UMAC_SCAN_GEN_FLAGS_OVER_BT = BIT(1),
  IWL_UMAC_SCAN_GEN_FLAGS_PASS_ALL = BIT(2),
  IWL_UMAC_SCAN_GEN_FLAGS_PASSIVE = BIT(3),
  IWL_UMAC_SCAN_GEN_FLAGS_PRE_CONNECT = BIT(4),
  IWL_UMAC_SCAN_GEN_FLAGS_ITER_COMPLETE = BIT(5),
  IWL_UMAC_SCAN_GEN_FLAGS_MULTIPLE_SSID = BIT(6),
  IWL_UMAC_SCAN_GEN_FLAGS_FRAGMENTED = BIT(7),
  IWL_UMAC_SCAN_GEN_FLAGS_RRM_ENABLED = BIT(8),
  IWL_UMAC_SCAN_GEN_FLAGS_MATCH = BIT(9),
  IWL_UMAC_SCAN_GEN_FLAGS_EXTENDED_DWELL = BIT(10),
  /* Extended dwell is obselete when adaptive dwell is used, making this
   * bit reusable. Hence, probe request defer is used only when adaptive
   * dwell is supported. */
  IWL_UMAC_SCAN_GEN_FLAGS_PROB_REQ_DEFER_SUPP = BIT(10),
  IWL_UMAC_SCAN_GEN_FLAGS_LMAC2_FRAGMENTED = BIT(11),
  IWL_UMAC_SCAN_GEN_FLAGS_ADAPTIVE_DWELL = BIT(13),
  IWL_UMAC_SCAN_GEN_FLAGS_MAX_CHNL_TIME = BIT(14),
  IWL_UMAC_SCAN_GEN_FLAGS_PROB_REQ_HIGH_TX_RATE = BIT(15),
};

/**
 * enum iwl_umac_scan_general_flags2 - UMAC scan general flags #2
 * @IWL_UMAC_SCAN_GEN_FLAGS2_NOTIF_PER_CHNL: Whether to send a complete
 *  notification per channel or not.
 * @IWL_UMAC_SCAN_GEN_FLAGS2_ALLOW_CHNL_REORDER: Whether to allow channel
 *  reorder optimization or not.
 */
enum iwl_umac_scan_general_flags2 {
  IWL_UMAC_SCAN_GEN_FLAGS2_NOTIF_PER_CHNL = BIT(0),
  IWL_UMAC_SCAN_GEN_FLAGS2_ALLOW_CHNL_REORDER = BIT(1),
};

/**
 * struct iwl_scan_channel_cfg_umac
 * @flags:      bitmap - 0-19:  directed scan to i'th ssid.
 * @channel_num:    channel number 1-13 etc.
 * @iter_count:     repetition count for the channel.
 * @iter_interval:  interval between two scan iterations on one channel.
 */
struct iwl_scan_channel_cfg_umac {
  __le32 flags;
  uint8_t channel_num;
  uint8_t iter_count;
  __le16 iter_interval;
} __packed; /* SCAN_CHANNEL_CFG_S_VER2 */

/**
 * struct iwl_scan_umac_schedule
 * @interval: interval in seconds between scan iterations
 * @iter_count: num of scan iterations for schedule plan, 0xff for infinite loop
 * @reserved: for alignment and future use
 */
struct iwl_scan_umac_schedule {
  __le16 interval;
  uint8_t iter_count;
  uint8_t reserved;
} __packed; /* SCAN_SCHED_PARAM_API_S_VER_1 */

/**
 * struct iwl_scan_req_umac_tail - the rest of the UMAC scan request command
 *      parameters following channels configuration array.
 * @schedule: two scheduling plans.
 * @delay: delay in TUs before starting the first scan iteration
 * @reserved: for future use and alignment
 * @preq: probe request with IEs blocks
 * @direct_scan: list of SSIDs for directed active scan
 */
struct iwl_scan_req_umac_tail {
  /* SCAN_PERIODIC_PARAMS_API_S_VER_1 */
  struct iwl_scan_umac_schedule schedule[IWL_MAX_SCHED_SCAN_PLANS];
  __le16 delay;
  __le16 reserved;
  /* SCAN_PROBE_PARAMS_API_S_VER_1 */
  struct iwl_scan_probe_req preq;
  struct iwl_ssid_ie direct_scan[PROBE_OPTION_MAX];
} __packed;

/**
 * struct iwl_scan_umac_chan_param
 * @flags: channel flags &enum iwl_scan_channel_flags
 * @count: num of channels in scan request
 * @reserved: for future use and alignment
 */
struct iwl_scan_umac_chan_param {
  uint8_t flags;
  uint8_t count;
  __le16 reserved;
} __packed; /*SCAN_CHANNEL_PARAMS_API_S_VER_1 */

/**
 * struct iwl_scan_req_umac
 * @flags: &enum iwl_umac_scan_flags
 * @uid: scan id, &enum iwl_umac_scan_uid_offsets
 * @ooc_priority: out of channel priority - &enum iwl_scan_priority
 * @general_flags: &enum iwl_umac_scan_general_flags
 * @scan_start_mac_id: report the scan start TSF time according to this mac TSF
 * @extended_dwell: dwell time for channels 1, 6 and 11
 * @active_dwell: dwell time for active scan per LMAC
 * @passive_dwell: dwell time for passive scan per LMAC
 * @fragmented_dwell: dwell time for fragmented passive scan
 * @adwell_default_n_aps: for adaptive dwell the default number of APs
 *  per channel
 * @adwell_default_n_aps_social: for adaptive dwell the default
 *  number of APs per social (1,6,11) channel
 * @general_flags2: &enum iwl_umac_scan_general_flags2
 * @adwell_max_budget: for adaptive dwell the maximal budget of TU to be added
 *  to total scan time
 * @max_out_time: max out of serving channel time, per LMAC - for CDB there
 *  are 2 LMACs
 * @suspend_time: max suspend time, per LMAC - for CDB there are 2 LMACs
 * @scan_priority: scan internal prioritization &enum iwl_scan_priority
 * @num_of_fragments: Number of fragments needed for full coverage per band.
 *  Relevant only for fragmented scan.
 * @channel: &struct iwl_scan_umac_chan_param
 * @reserved: for future use and alignment
 * @reserved3: for future use and alignment
 * @data: &struct iwl_scan_channel_cfg_umac and
 *  &struct iwl_scan_req_umac_tail
 */
struct iwl_scan_req_umac {
  __le32 flags;
  __le32 uid;
  __le32 ooc_priority;
  __le16 general_flags;
  uint8_t reserved;
  uint8_t scan_start_mac_id;
  union {
    struct {
      uint8_t extended_dwell;
      uint8_t active_dwell;
      uint8_t passive_dwell;
      uint8_t fragmented_dwell;
      __le32 max_out_time;
      __le32 suspend_time;
      __le32 scan_priority;
      struct iwl_scan_umac_chan_param channel;
      uint8_t data[];
    } v1; /* SCAN_REQUEST_CMD_UMAC_API_S_VER_1 */
    struct {
      uint8_t extended_dwell;
      uint8_t active_dwell;
      uint8_t passive_dwell;
      uint8_t fragmented_dwell;
      __le32 max_out_time[SCAN_TWO_LMACS];
      __le32 suspend_time[SCAN_TWO_LMACS];
      __le32 scan_priority;
      struct iwl_scan_umac_chan_param channel;
      uint8_t data[];
    } v6; /* SCAN_REQUEST_CMD_UMAC_API_S_VER_6 */
    struct {
      uint8_t active_dwell;
      uint8_t passive_dwell;
      uint8_t fragmented_dwell;
      uint8_t adwell_default_n_aps;
      uint8_t adwell_default_n_aps_social;
      uint8_t reserved3;
      __le16 adwell_max_budget;
      __le32 max_out_time[SCAN_TWO_LMACS];
      __le32 suspend_time[SCAN_TWO_LMACS];
      __le32 scan_priority;
      struct iwl_scan_umac_chan_param channel;
      uint8_t data[];
    } v7; /* SCAN_REQUEST_CMD_UMAC_API_S_VER_7 */
    struct {
      uint8_t active_dwell[SCAN_TWO_LMACS];
      uint8_t reserved2;
      uint8_t adwell_default_n_aps;
      uint8_t adwell_default_n_aps_social;
      uint8_t general_flags2;
      __le16 adwell_max_budget;
      __le32 max_out_time[SCAN_TWO_LMACS];
      __le32 suspend_time[SCAN_TWO_LMACS];
      __le32 scan_priority;
      uint8_t passive_dwell[SCAN_TWO_LMACS];
      uint8_t num_of_fragments[SCAN_TWO_LMACS];
      struct iwl_scan_umac_chan_param channel;
      uint8_t data[];
    } v8; /* SCAN_REQUEST_CMD_UMAC_API_S_VER_8 */
  };
} __packed;

#define IWL_SCAN_REQ_UMAC_SIZE_V8 sizeof(struct iwl_scan_req_umac)
#define IWL_SCAN_REQ_UMAC_SIZE_V7 48
#define IWL_SCAN_REQ_UMAC_SIZE_V6 44
#define IWL_SCAN_REQ_UMAC_SIZE_V1 36

/**
 * struct iwl_umac_scan_abort
 * @uid: scan id, &enum iwl_umac_scan_uid_offsets
 * @flags: reserved
 */
struct iwl_umac_scan_abort {
  __le32 uid;
  __le32 flags;
} __packed; /* SCAN_ABORT_CMD_UMAC_API_S_VER_1 */

/**
 * struct iwl_umac_scan_complete
 * @uid: scan id, &enum iwl_umac_scan_uid_offsets
 * @last_schedule: last scheduling line
 * @last_iter: last scan iteration number
 * @status: &enum iwl_scan_offload_complete_status
 * @ebs_status: &enum iwl_scan_ebs_status
 * @time_from_last_iter: time elapsed from last iteration
 * @reserved: for future use
 */
struct iwl_umac_scan_complete {
  __le32 uid;
  uint8_t last_schedule;
  uint8_t last_iter;
  uint8_t status;
  uint8_t ebs_status;
  __le32 time_from_last_iter;
  __le32 reserved;
} __packed; /* SCAN_COMPLETE_NTF_UMAC_API_S_VER_1 */

#define SCAN_OFFLOAD_MATCHING_CHANNELS_LEN 5
/**
 * struct iwl_scan_offload_profile_match - match information
 * @bssid: matched bssid
 * @reserved: reserved
 * @channel: channel where the match occurred
 * @energy: energy
 * @matching_feature: feature matches
 * @matching_channels: bitmap of channels that matched, referencing
 *  the channels passed in tue scan offload request
 */
struct iwl_scan_offload_profile_match {
  uint8_t bssid[ETH_ALEN];
  __le16 reserved;
  uint8_t channel;
  uint8_t energy;
  uint8_t matching_feature;
  uint8_t matching_channels[SCAN_OFFLOAD_MATCHING_CHANNELS_LEN];
} __packed; /* SCAN_OFFLOAD_PROFILE_MATCH_RESULTS_S_VER_1 */

/**
 * struct iwl_scan_offload_profiles_query - match results query response
 * @matched_profiles: bitmap of matched profiles, referencing the
 *  matches passed in the scan offload request
 * @last_scan_age: age of the last offloaded scan
 * @n_scans_done: number of offloaded scans done
 * @gp2_d0u: GP2 when D0U occurred
 * @gp2_invoked: GP2 when scan offload was invoked
 * @resume_while_scanning: not used
 * @self_recovery: obsolete
 * @reserved: reserved
 * @matches: array of match information, one for each match
 */
struct iwl_scan_offload_profiles_query {
  __le32 matched_profiles;
  __le32 last_scan_age;
  __le32 n_scans_done;
  __le32 gp2_d0u;
  __le32 gp2_invoked;
  uint8_t resume_while_scanning;
  uint8_t self_recovery;
  __le16 reserved;
  struct iwl_scan_offload_profile_match matches[IWL_SCAN_MAX_PROFILES];
} __packed; /* SCAN_OFFLOAD_PROFILES_QUERY_RSP_S_VER_2 */

/**
 * struct iwl_umac_scan_iter_complete_notif - notifies end of scanning iteration
 * @uid: scan id, &enum iwl_umac_scan_uid_offsets
 * @scanned_channels: number of channels scanned and number of valid elements in
 *  results array
 * @status: one of SCAN_COMP_STATUS_*
 * @bt_status: BT on/off status
 * @last_channel: last channel that was scanned
 * @start_tsf: TSF timer in usecs of the scan start time for the mac specified
 *  in &struct iwl_scan_req_umac.
 * @results: array of scan results, length in @scanned_channels
 */
struct iwl_umac_scan_iter_complete_notif {
  __le32 uid;
  uint8_t scanned_channels;
  uint8_t status;
  uint8_t bt_status;
  uint8_t last_channel;
  __le64 start_tsf;
  struct iwl_scan_results_notif results[];
} __packed; /* SCAN_ITER_COMPLETE_NTF_UMAC_API_S_VER_2 */

#endif  // SRC_CONNECTIVITY_WLAN_DRIVERS_THIRD_PARTY_INTEL_IWLWIFI_FW_API_SCAN_H_
