/** @file moal_cfg80211_util.h
 *
 * @brief This file contains the CFG80211 vendor specific defines.
 *
 *
 * Copyright 2015-2020 NXP
 *
 * This software file (the File) is distributed by NXP
 * under the terms of the GNU General Public License Version 2, June 1991
 * (the License).  You may use, redistribute and/or modify the File in
 * accordance with the terms and conditions of the License, a copy of which
 * is available by writing to the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA or on the
 * worldwide web at http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
 *
 * THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE
 * ARE EXPRESSLY DISCLAIMED.  The License provides additional details about
 * this warranty disclaimer.
 *
 */

#ifndef _MOAL_CFGVENDOR_H_
#define _MOAL_CFGVENDOR_H_

#include "moal_main.h"

#if KERNEL_VERSION(3, 14, 0) <= CFG80211_VERSION_CODE
#define RING_NAME_MAX 32
typedef int wifi_ring_buffer_id;

#define VALID_RING(id) (id >= 0 && id < RING_ID_MAX)

/** WiFi ring control structure */
typedef struct _wifi_ring_ctrl {
	/** Written bytes */
	t_u32 written_bytes;
	/** Read Bytes */
	t_u32 read_bytes;
	/** Written records */
	t_u32 written_records;
} ring_buffer_ctrl;

enum ring_state {
	/** ring is not initialized*/
	RING_STOP = 0,
	/** ring is live and logging*/
	RING_ACTIVE,
	/** ring is initialized but not logging*/
	RING_SUSPEND,
};

/** WiFi ring buffer sttructure */
typedef struct _wifi_ring_buffer {
	/** Ring ID */
	wifi_ring_buffer_id ring_id;
	/** Ring name */
	t_u8 name[RING_NAME_MAX];
	/** Ring size */
	t_u32 ring_size;
	/** Write pointer */
	t_u32 wp;
	/** Read pointer */
	t_u32 rp;
	/** Log level */
	t_u32 log_level;
	/** Threshold */
	t_u32 threshold;
	/** Ring buffer */
	void *ring_buf;
	/** Lock */
	spinlock_t lock;
	/** Buffer control */
	ring_buffer_ctrl ctrl;
	/** Ring state */
	enum ring_state state;
	/** Delayed work */
	struct delayed_work work;
	/** Interval */
	unsigned long interval;
	/** Moal priv */
	moal_private *priv;
} wifi_ring_buffer;

#define VERBOSE_RING_NAME "verbose"
#define EVENT_RING_NAME "event"

#define DEFAULT_RING_BUFFER_SIZE 1024

#define TLV_LOG_HEADER_LEN 4

#define WIFI_LOGGER_MEMORY_DUMP_SUPPORTED MBIT(0)	/* Memory dump of Fw */
#define WIFI_LOGGER_PER_PACKET_TX_RX_STATUS_SUPPORT MBIT(1)	/*PKT status */
#define WIFI_LOGGER_CONNECT_EVENT_SUPPORTED MBIT(2)	/* connectivity event */
#define WIFI_LOGGER_POWER_EVENT_SUPPORTED MBIT(3)	/* Power of driver */
#define WIFI_LOGGER_WAKE_LOCK_SUPPORTED MBIT(4)	/* Wake lock of driver */
#define WIFI_LOGGER_VERBOSE_SUPPORTED MBIT(5)	/*verbose log of Fw */
#define WIFI_LOGGER_WATCHDOG_TIMER_SUPPORTED                                   \
	MBIT(6)			/*monitor the health of Fw */

/**
 * Parameters of wifi logger events are TLVs
 * Event parameters tags are defined as:
 */
#define WIFI_TAG_VENDOR_SPECIFIC 0	// take a byte stream as parameter
#define WIFI_TAG_BSSID 1	// takes a 6 bytes MAC address as parameter
#define WIFI_TAG_ADDR 2		// takes a 6 bytes MAC address as parameter
#define WIFI_TAG_SSID 3		// takes a 32 bytes SSID address as parameter
#define WIFI_TAG_STATUS 4	// takes an integer as parameter
#define WIFI_TAG_REASON_CODE 14	// take a reason code as per 802.11 as parameter
#define WIFI_TAG_RSSI 21	// take an integer as parameter
#define WIFI_TAG_CHANNEL 22	// take an integer as parameter

#define RING_ENTRY_SIZE (sizeof(wifi_ring_buffer_entry))
#define ENTRY_LENGTH(hdr) (hdr->entry_size + RING_ENTRY_SIZE)
#define READ_AVAIL_SPACE(ring)                                                 \
	(ring->ctrl.written_bytes - ring->ctrl.read_bytes)

enum logger_attributes {
	ATTR_WIFI_LOGGER_INVALID = 0,
	ATTR_WIFI_LOGGER_RING_ID,
	ATTR_WIFI_LOGGER_FLAGS,
	ATTR_WIFI_LOGGER_VERBOSE_LEVEL,
	ATTR_WIFI_LOGGER_MIN_DATA_SIZE,
	ATTR_RING_BUFFER_STATUS,
	ATTR_NUM_RINGS,
	ATTR_WIFI_LOGGER_FEATURE_SET,
	ATTR_WIFI_LOGGER_MAX_INTERVAL_SEC,
	ATTR_RING_BUFFER,
	ATTR_NAME,
	ATTR_MEM_DUMP,
	ATTR_ERR_CODE,
	ATTR_RING_DATA,
	ATTR_WAKE_REASON_STAT,
	ATTR_PACKET_FATE_TX,
	ATTR_PACKET_FATE_RX,
	ATTR_PACKET_FATE_DATA,
	ATTR_FW_DUMP_PATH = 20,
	ATTR_DRV_DUMP_PATH = 21,
	ATTR_WIFI_LOGGER_AFTER_LAST,
	ATTR_WIFI_LOGGER_MAX = ATTR_WIFI_LOGGER_AFTER_LAST - 1
};

/* Below events refer to the wifi_connectivity_event ring and shall be supported
 */
enum {
	WIFI_EVENT_ASSOCIATION_REQUESTED = 0,
	WIFI_EVENT_AUTH_COMPLETE,
	WIFI_EVENT_ASSOC_COMPLETE,
};

enum {
	/* set for binary entries */
	RING_BUFFER_ENTRY_FLAGS_HAS_BINARY = (1 << (0)),
	/* set if 64 bits timestamp is present */
	RING_BUFFER_ENTRY_FLAGS_HAS_TIMESTAMP = (1 << (1))
};

enum {
	ENTRY_TYPE_CONNECT_EVENT = 1,
	ENTRY_TYPE_PKT,
	ENTRY_TYPE_WAKE_LOCK,
	ENTRY_TYPE_POWER_EVENT,
	ENTRY_TYPE_DATA
};

/** WiFi ring buffer entry structure */
typedef struct {
	/** size of payload excluding the header */
	t_u16 entry_size;
	/** Flags */
	t_u8 flags;
	/** entry type */
	t_u8 type;
	/** present if has_timestamp bit is set. */
	t_u64 timestamp;
} __attribute__ ((packed)) wifi_ring_buffer_entry;

/** WiFi ring buffer status structure*/
typedef struct _wifi_ring_buffer_status {
	/** Ring name */
	t_u8 name[RING_NAME_MAX];
	/** Flag */
	t_u32 flag;
	/** Ring ID */
	wifi_ring_buffer_id ring_id;
	/** Buffer size */
	t_u32 ring_buffer_byte_size;
	/** Verbose Level */
	t_u32 verbose_level;
	/** Written bytes */
	t_u32 written_bytes;
	/** Read bytes */
	t_u32 read_bytes;
	/** Written records */
	t_u32 written_records;
} wifi_ring_buffer_status;

/** TLV log structure */
typedef struct {
	/** Tag */
	u16 tag;
	/** Length of value*/
	u16 length;
	/** Value */
	u8 value[];
} __attribute__ ((packed)) tlv_log;

/** WiFi ring buffer driver structure */
typedef struct {
	/** event */
	u16 event;
	/** TLV log structure array */
	tlv_log tlvs[];
	/** separate parameter structure per event to be provided and optional
	 * data the event_data is expected to include an official android part,
	 * with some parameter as transmit rate, num retries, num scan result
	 * found etc... as well, event_data can include a vendor proprietary
	 * part which is understood by the developer only
	 */
} __attribute__ ((packed)) wifi_ring_buffer_driver_connectivity_event;

/** Assoc logger data structure */
typedef struct _assoc_logger {
	/** vendor specific */
	t_u8 oui[3];
	/** BSSID */
	t_u8 bssid[MLAN_MAC_ADDR_LENGTH];
	/** SSID */
	t_u8 ssid[MLAN_MAX_SSID_LENGTH];
	/** RSSI */
	t_s32 rssi;
	/** Channel */
	t_u32 channel;
} assoc_logger_data;

int woal_ring_event_logger(moal_private *priv, int ring_id,
			   pmlan_event pmevent);

int woal_wake_reason_logger(moal_private *priv,
			    mlan_ds_hs_wakeup_reason wake_reason);

#define MD5_PREFIX_LEN 4
#define MAX_FATE_LOG_LEN 32
#define MAX_FRAME_LEN_ETHERNET 1518
#define MAX_FRAME_LEN_80211_MGMT 2352

/** packet_fate_packet_type */
typedef enum {
	PACKET_TYPE_TX,
	PACKET_TYPE_RX,
} packet_fate_packet_type;

/** packet fate frame_type */
typedef enum {
	FRAME_TYPE_UNKNOWN,
	FRAME_TYPE_ETHERNET_II,
	FRAME_TYPE_80211_MGMT,
} frame_type;

/** wifi_tx_packet_fate */
typedef enum {
	/** Sent over air and ACKed. */
	TX_PKT_FATE_ACKED,

	/** Sent over air but not ACKed. (Normal for broadcast/multicast.) */
	TX_PKT_FATE_SENT,

	/** Queued within firmware, but not yet sent over air. */
	TX_PKT_FATE_FW_QUEUED,

	/** Dropped by firmware as invalid. E.g. bad source address, bad
	 *  checksum, or invalid for current state.
	 */
	TX_PKT_FATE_FW_DROP_INVALID,

	/** Dropped by firmware due to lack of buffer space. */
	TX_PKT_FATE_FW_DROP_NOBUFS,

	/** Dropped by firmware for any other reason. Includes frames that were
	 *  sent by driver to firmware, but unaccounted for by firmware.
	 */
	TX_PKT_FATE_FW_DROP_OTHER,

	/** Queued within driver, not yet sent to firmware. */
	TX_PKT_FATE_DRV_QUEUED,

	/** Dropped by driver as invalid. E.g. bad source address, or invalid
	 *  for current state.
	 */
	TX_PKT_FATE_DRV_DROP_INVALID,

	/** Dropped by driver due to lack of buffer space. */
	TX_PKT_FATE_DRV_DROP_NOBUFS,

	/** Dropped by driver for any other reason. */
	TX_PKT_FATE_DRV_DROP_OTHER,
} wifi_tx_packet_fate;

/** wifi_rx_packet_fate */
typedef enum {
	/** Valid and delivered to network stack (e.g., netif_rx()). */
	RX_PKT_FATE_SUCCESS,

	/** Queued within firmware, but not yet sent to driver. */
	RX_PKT_FATE_FW_QUEUED,

	/** Dropped by firmware due to host-programmable filters. */
	RX_PKT_FATE_FW_DROP_FILTER,

	/** Dropped by firmware as invalid. E.g. bad checksum, decrypt failed,
	 *  or invalid for current state.
	 */
	RX_PKT_FATE_FW_DROP_INVALID,

	/** Dropped by firmware due to lack of buffer space. */
	RX_PKT_FATE_FW_DROP_NOBUFS,

	/** Dropped by firmware for any other reason. */
	RX_PKT_FATE_FW_DROP_OTHER,

	/** Queued within driver, not yet delivered to network stack. */
	RX_PKT_FATE_DRV_QUEUED,

	/** Dropped by driver due to filter rules. */
	RX_PKT_FATE_DRV_DROP_FILTER,

	/** Dropped by driver as invalid. E.g. not permitted in current state.
	 */
	RX_PKT_FATE_DRV_DROP_INVALID,

	/** Dropped by driver due to lack of buffer space. */
	RX_PKT_FATE_DRV_DROP_NOBUFS,

	/** Dropped by driver for any other reason. */
	RX_PKT_FATE_DRV_DROP_OTHER,
} wifi_rx_packet_fate;

/** frame_info_i */
typedef struct {
	/** Payload Type */
	frame_type payload_type;
	/** Driver timestamp in uS */
	u32 driver_timestamp_usec;
	/** FW timestamp in uS */
	u32 firmware_timestamp_usec;
	/** Frame Length */
	u32 frame_len;
} frame_info_i;

/** wifi_tx_report_i */
typedef struct {
	/** MD5 prefix */
	char md5_prefix[MD5_PREFIX_LEN];
	/** TX packet fate */
	wifi_tx_packet_fate fate;
	/** frame information */
	frame_info_i frame_inf;
} wifi_tx_report_i;

/** wifi_rx_report_i */
typedef struct {
	/** MD5 prefix */
	char md5_prefix[MD5_PREFIX_LEN];
	/** TX packet fate */
	wifi_rx_packet_fate fate;
	/** frame information */
	frame_info_i frame_inf;
} wifi_rx_report_i;

/** packet_fate_report_t */
typedef struct packet_fate_report_t {
	union {
		wifi_tx_report_i tx_report_i;
		wifi_rx_report_i rx_report_i;
	} u;
} PACKET_FATE_REPORT;

int woal_packet_fate_monitor(moal_private *priv,
			     packet_fate_packet_type pkt_type, t_u8 fate,
			     frame_type payload_type,
			     t_u32 driver_timestamp_usec,
			     t_u32 firmware_timestamp_usec, t_u8 *data,
			     t_u32 len);

/** =========== Define Copied from apf.h START =========== */
/* Number of memory slots, see ldm/stm instructions. */
#define MEM_ITEMS 16
/* Upon program execution starting some memory slots are prefilled: */
/* 4*([APF_FRAME_HEADER_SIZE]&15) */
#define MEM_OFFSET_IPV4_HEADER_SIZE 13
/* Size of packet in bytes. */
#define MEM_OFFSET_PKT_SIZE 14
/* Age since filter installed in seconds. */
#define MEM_OFFSET_FILTER_AGE 15

/* Leave 0 opcode unused as it's a good indicator of accidental incorrect
 * execution (e.g. data).
 */
/* Load 1 byte from immediate offset, e.g. "ldb R0, [5]" */
#define NXP_LDB_OPCODE 1
/* Load 2 bytes from immediate offset, e.g. "ldh R0, [5]" */
#define NXP_LDH_OPCODE 2
/* Load 4 bytes from immediate offset, e.g. "ldw R0, [5]" */
#define NXP_LDW_OPCODE 3
/* Load 1 byte from immediate offset plus register, e.g. "ldbx R0, [5]R0" */
#define NXP_LDBX_OPCODE 4
/* Load 2 byte from immediate offset plus register, e.g. "ldhx R0, [5]R0" */
#define NXP_LDHX_OPCODE 5
/* Load 4 byte from immediate offset plus register, e.g. "ldwx R0, [5]R0" */
#define NXP_LDWX_OPCODE 6
/* Add, e.g. "add R0,5" */
#define NXP_ADD_OPCODE 7
/* Multiply, e.g. "mul R0,5" */
#define NXP_MUL_OPCODE 8
/* Divide, e.g. "div R0,5" */
#define NXP_DIV_OPCODE 9
/* And, e.g. "and R0,5" */
#define NXP_AND_OPCODE 10
/* Or, e.g. "or R0,5" */
#define NXP_OR_OPCODE 11
/* Left shift, e.g, "sh R0, 5" or "sh R0, -5" (shifts right) */
#define NXP_SH_OPCODE 12
/* Load immediate, e.g. "li R0,5" (immediate encoded as signed value) */
#define NXP_LI_OPCODE 13
/* Unconditional jump, e.g. "jmp label" */
#define NXP_JMP_OPCODE 14
/* Compare equal and branch, e.g. "jeq R0,5,label" */
#define NXP_JEQ_OPCODE 15
/* Compare not equal and branch, e.g. "jne R0,5,label" */
#define NXP_JNE_OPCODE 16
/* Compare greater than and branch, e.g. "jgt R0,5,label" */
#define NXP_JGT_OPCODE 17
/* Compare less than and branch, e.g. "jlt R0,5,label" */
#define NXP_JLT_OPCODE 18
/* Compare any bits set and branch, e.g. "jset R0,5,label" */
#define NXP_JSET_OPCODE 19
/* Compare not equal byte sequence, e.g. "jnebs R0,5,label,0x1122334455" */
#define NXP_JNEBS_OPCODE 20
/* Immediate value is one of *_EXT_OPCODE
 * Extended opcodes. These all have an opcode of EXT_OPCODE
 * and specify the actual opcode in the immediate field.
 */
#define NXP_EXT_OPCODE 21
/* Load from memory, e.g. "ldm R0,5"
 * Values 0-15 represent loading the different memory slots.
 */
#define NXP_LDM_EXT_OPCODE 0
/* Store to memory, e.g. "stm R0,5" *
 * Values 16-31 represent storing to the different memory slots.
 */
#define NXP_STM_EXT_OPCODE 16
/* Not, e.g. "not R0" */
#define NXP_NOT_EXT_OPCODE 32
/* Negate, e.g. "neg R0" */
#define NXP_NEG_EXT_OPCODE 33
/* Swap, e.g. "swap R0,R1" */
#define NXP_SWAP_EXT_OPCODE 34
/* Move, e.g. "move R0,R1" */
#define NXP_MOV_EXT_OPCODE 35

#define GET_OPCODE(i) (((i) >> 3) & 31)
#define GET_REGISTER(i) ((i)&1)
#define GET_IMM_LENGTH(i) (((i) >> 1) & 3)
/** =========== Define Copied from apf.h END =========== */

/** =========== Define Copied from apf_interpreter.h START =========== */
/**
 * Version of APF instruction set processed by accept_packet().
 * Should be returned by wifi_get_packet_filter_info.
 */
#define APF_VERSION 2
/** =========== Define Copied from apf_interpreter.h END =========== */

/** =========== Define Copied from apf_interpreter.c START =========== */
/* Return code indicating "packet" should accepted. */
#define PASS_PKT 1
/* Return code indicating "packet" should be dropped. */
#define DROP_PKT 0
/* If "c" is of an unsigned type, generate a compile warning that gets promoted
 * to an error. This makes bounds checking simpler because ">= 0" can be
 * avoided. Otherwise adding superfluous ">= 0" with unsigned expressions
 * generates compile warnings.
 */
#define ENFORCE_UNSIGNED(c) ((c) == (uint32_t)(c))
/** =========== Define Copied from apf_interpreter.c END =========== */

/** depend on the format of skb->data */
#define APF_FRAME_HEADER_SIZE 14
#define PACKET_FILTER_MAX_LEN 1024

enum {
	PACKET_FILTER_STATE_INIT = 0,
	PACKET_FILTER_STATE_STOP,
	PACKET_FILTER_STATE_START,
};

enum wifi_attr_packet_filter {
	ATTR_PACKET_FILTER_INVALID = 0,
	ATTR_PACKET_FILTER_TOTAL_LENGTH,
	ATTR_PACKET_FILTER_PROGRAM,
	ATTR_PACKET_FILTER_VERSION,
	ATTR_PACKET_FILTER_MAX_LEN,
	ATTR_PACKET_FILTER_AFTER_LAST,
	ATTR_PACKET_FILTER_MAX = ATTR_PACKET_FILTER_AFTER_LAST - 1
};

/** Packet filter structure */
typedef struct _packet_filter {
	spinlock_t lock;
	t_u8 state;
	t_u8 packet_filter_program[PACKET_FILTER_MAX_LEN];
	t_u8 packet_filter_len;
	t_u32 packet_filter_version;
	t_u32 packet_filter_max_len;
} packet_filter;

int woal_filter_packet(moal_private *priv, t_u8 *data, t_u32 len,
		       t_u32 filter_age);

int woal_init_wifi_hal(moal_private *priv);
int woal_deinit_wifi_hal(moal_private *priv);

#define ATTRIBUTE_U32_LEN (nla_total_size(NLA_HDRLEN + 4))
#define VENDOR_ID_OVERHEAD ATTRIBUTE_U32_LEN
#define VENDOR_SUBCMD_OVERHEAD ATTRIBUTE_U32_LEN
#define VENDOR_DATA_OVERHEAD (nla_total_size(NLA_HDRLEN))

#define VENDOR_REPLY_OVERHEAD                                                  \
	(VENDOR_ID_OVERHEAD + VENDOR_SUBCMD_OVERHEAD + VENDOR_DATA_OVERHEAD)

/* Features Enums*/
#define WLAN_FEATURE_INFRA 0x0001	// Basic infrastructure mode support
#define WLAN_FEATURE_INFRA_5G 0x0002	// 5 GHz Band support
#define WLAN_FEATURE_HOTSPOT 0x0004	// GAS/ANQP support
#define WLAN_FEATURE_P2P 0x0008	// Wifi-Direct/P2P
#define WLAN_FEATURE_SOFT_AP 0x0010	// Soft AP support
#define WLAN_FEATURE_GSCAN 0x0020	// Google-Scan APIsi support
#define WLAN_FEATURE_NAN 0x0040	// Neighbor Awareness Networking (NAN)
#define WLAN_FEATURE_D2D_RTT 0x0080	// Device-to-device RTT support
#define WLAN_FEATURE_D2AP_RTT 0x0100	// Device-to-AP RTT support
#define WLAN_FEATURE_BATCH_SCAN 0x0200	// Batched Scan (legacy) support
#define WLAN_FEATURE_PNO 0x0400	// Preferred network offload support
#define WLAN_FEATURE_ADDITIONAL_STA 0x0800	// Two STAs support
#define WLAN_FEATURE_TDLS 0x1000	// Tunnel directed link setup (TDLS)
#define WLAN_FEATURE_TDLS_OFFCHANNEL 0x2000	// TDLS off channel support
#define WLAN_FEATURE_EPR 0x4000	// Enhanced power reporting support
#define WLAN_FEATURE_AP_STA 0x8000	// AP STA Concurrency support
#define WLAN_FEATURE_LINK_LAYER_STATS                                          \
	0x10000			// Link layer stats collection support
#define WLAN_FEATURE_LOGGER 0x20000	// WiFi Logger support
#define WLAN_FEATURE_HAL_EPNO 0x40000	// WiFi enhanced PNO support
#define WLAN_FEATURE_RSSI_MONITOR 0x80000	// RSSI Monitor support
#define WLAN_FEATURE_MKEEP_ALIVE 0x100000	// WiFi mkeep_alive support
#define WLAN_FEATURE_CONFIG_NDO 0x200000	// ND offload configure support
#define WLAN_FEATURE_TX_TRANSMIT_POWER                                         \
	0x400000		// Capture Tx transmit power levels
#define WLAN_FEATURE_CONTROL_ROAMING 0x800000	// Enable/Disable firmware roaming
#define WLAN_FEATURE_IE_WHITELIST 0x1000000	// Probe IE white listing support
#define WLAN_FEATURE_SCAN_RAND                                                 \
	0x2000000		// MAC & Probe Sequence Number randomization Support
#define WLAN_FEATURE_SET_LATENCY_MODE 0x40000000 // Support Latency mode setting
// Add more features here

#define MAX_CHANNEL_NUM 200

/** Wifi Band */
typedef enum {
	WIFI_BAND_UNSPECIFIED,
	/** 2.4 GHz */
	WIFI_BAND_BG = 1,
	/** 5 GHz without DFS */
	WIFI_BAND_A = 2,
	/** 5 GHz DFS only */
	WIFI_BAND_A_DFS = 4,
	/** 5 GHz with DFS */
	WIFI_BAND_A_WITH_DFS = 6,
	/** 2.4 GHz + 5 GHz; no DFS */
	WIFI_BAND_ABG = 3,
	/** 2.4 GHz + 5 GHz with DFS */
	WIFI_BAND_ABG_WITH_DFS = 7,

	/** Keep it last */
	WIFI_BAND_LAST,
	WIFI_BAND_MAX = WIFI_BAND_LAST - 1,
} wifi_band;

typedef enum wifi_attr {
	ATTR_FEATURE_SET_INVALID = 0,
	ATTR_SCAN_MAC_OUI_SET = 1,
	ATTR_FEATURE_SET = 2,
	ATTR_NODFS_VALUE = 3,
	ATTR_COUNTRY_CODE = 4,
	ATTR_CHANNELS_BAND = 5,
	ATTR_NUM_CHANNELS = 6,
	ATTR_CHANNEL_LIST = 7,
	ATTR_GET_CONCURRENCY_MATRIX_SET_SIZE_MAX = 8,
	ATTR_GET_CONCURRENCY_MATRIX_SET_SIZE = 9,
	ATTR_GET_CONCURRENCY_MATRIX_SET = 10,
	ATTR_WIFI_LATENCY_MODE = 11,
	ATTR_WIFI_AFTER_LAST,
	ATTR_WIFI_MAX = ATTR_WIFI_AFTER_LAST - 1
} wifi_attr_t;

enum mrvl_wlan_vendor_attr_wifi_logger {
	MRVL_WLAN_VENDOR_ATTR_NAME = 10,
};

/**vendor event*/
enum vendor_event {
	event_hang = 0,
	event_fw_dump_done = 1,
	event_rssi_monitor = 0x1501,
	event_cloud_keep_alive = 0x10003,
	event_dfs_radar_detected = 0x10004,
	event_dfs_cac_started = 0x10005,
	event_dfs_cac_finished = 0x10006,
	event_dfs_cac_aborted = 0x10007,
	event_dfs_nop_finished = 0x10008,
	event_wifi_logger_ring_buffer_data = 0x1000b,
	event_wifi_logger_alert,
	event_packet_fate_monitor,
	event_wake_reason_report,
	event_max,
};

/** struct dfs_event */
typedef struct _dfs_event {
	/** Frequency */
	int freq;
	/** HT enable */
	int ht_enabled;
	/** Channel Offset */
	int chan_offset;
	/** Channel width */
	enum nl80211_chan_width chan_width;
	/** Center Frequency 1 */
	int cf1;
	/** Center Frequency 2 */
	int cf2;
} dfs_event;

void woal_cfg80211_dfs_vendor_event(moal_private *priv, int event,
				    struct cfg80211_chan_def *chandef);

enum ATTR_LINK_LAYER_STAT {
	ATTR_LL_STATS_INVALID,
	ATTR_LL_STATS_MPDU_SIZE_THRESHOLD,
	ATTR_LL_STATS_AGGRESSIVE_STATS_GATHERING,
	ATTR_LL_STATS_IFACE,
	ATTR_LL_STATS_NUM_RADIO,
	ATTR_LL_STATS_RADIO,
	ATTR_LL_STATS_CLEAR_REQ_MASK,
	ATTR_LL_STATS_STOP_REQ,
	ATTR_LL_STATS_CLEAR_RSP_MASK,
	ATTR_LL_STATS_STOP_RSP,
	ATTR_LL_STATS_AFTER_LAST,
	ATTR_LL_STATS_MAX = ATTR_LL_STATS_AFTER_LAST - 1,
};

enum ATTR_RSSI_MONITOR {
	ATTR_RSSI_MONITOR_INVALID,
	ATTR_RSSI_MONITOR_CONTROL,
	ATTR_RSSI_MONITOR_MIN_RSSI,
	ATTR_RSSI_MONITOR_MAX_RSSI,
	ATTR_RSSI_MONITOR_CUR_BSSID,
	ATTR_RSSI_MONITOR_CUR_RSSI,
	ATTR_RSSI_MONITOR_AFTER_LAST,
	ATTR_RSSI_MONITOR_MAX = ATTR_RSSI_MONITOR_AFTER_LAST - 1,
};
void woal_cfg80211_rssi_monitor_event(moal_private *priv, t_s16 rssi);

/**vendor sub command*/
enum vendor_sub_command {
	sub_cmd_set_drvdbg = 0,
	sub_cmd_start_keep_alive = 0x0003,
	sub_cmd_stop_keep_alive = 0x0004,
	sub_cmd_dfs_capability = 0x0005,
	sub_cmd_set_scan_mac_oui = 0x0007,
	sub_cmd_set_packet_filter = 0x0011,
	sub_cmd_get_packet_filter_capability,
	sub_cmd_nd_offload = 0x0100,
	sub_cmd_link_statistic_set = 0x1200,
	sub_cmd_link_statistic_get = 0x1201,
	sub_cmd_link_statistic_clr = 0x1202,
	sub_cmd_get_valid_channels = 0x1009,
	sub_cmd_get_wifi_supp_feature_set = 0x100a,
	sub_cmd_set_country_code = 0x100d,
	sub_cmd_set_latency_mode = 0x1015,
	sub_cmd_get_fw_version = 0x1404,
	sub_cmd_get_drv_version = 0x1406,
	sub_cmd_start_logging = 0x1400,
	sub_cmd_get_wifi_logger_supp_feature_set,
	sub_cmd_get_ring_buff_data,
	sub_cmd_get_ring_buff_status,
	sub_cmd_get_fw_mem_dump = 0x1405,
	sub_cmd_get_drv_mem_dump = 0x1407,
	sub_cmd_start_packet_fate_monitor = 0x1408,
	sub_cmd_rssi_monitor = 0x1500,
	/*Sub-command for wifi hal */
	sub_cmd_get_roaming_capability = 0x1700,
	sub_cmd_fw_roaming_enable = 0x1701,
	sub_cmd_fw_roaming_config = 0x1702,
	sub_cmd_max,
};

void woal_register_cfg80211_vendor_command(struct wiphy *wiphy);
int woal_cfg80211_vendor_event(moal_private *priv, int event,
			       t_u8 *data, int len);

enum mrvl_wlan_vendor_attr {
	MRVL_WLAN_VENDOR_ATTR_INVALID = 0,
	/* Used by MRVL_NL80211_VENDOR_SUBCMD_DFS_CAPABILITY */
	MRVL_WLAN_VENDOR_ATTR_DFS = 1,
	MRVL_WLAN_VENDOR_ATTR_AFTER_LAST,

	MRVL_WLAN_VENDOR_ATTR_MAX = MRVL_WLAN_VENDOR_ATTR_AFTER_LAST - 1,
};

typedef enum {
	ATTR_ND_OFFLOAD_INVALID = 0,
	ATTR_ND_OFFLOAD_CONTROL,
	ATTR_ND_OFFLOAD_AFTER_LAST,
	ATTR_ND_OFFLOAD_MAX = ATTR_ND_OFFLOAD_AFTER_LAST - 1,
} ND_OFFLOAD_ATTR;

#define MKEEP_ALIVE_IP_PKT_MAX 256
enum mkeep_alive_attributes {
	MKEEP_ALIVE_ATTRIBUTE_INVALID = 0,
	MKEEP_ALIVE_ATTRIBUTE_ID,
	MKEEP_ALIVE_ATTRIBUTE_ETHER_TYPE,
	MKEEP_ALIVE_ATTRIBUTE_IP_PKT,
	MKEEP_ALIVE_ATTRIBUTE_IP_PKT_LEN,
	MKEEP_ALIVE_ATTRIBUTE_SRC_MAC_ADDR,
	MKEEP_ALIVE_ATTRIBUTE_DST_MAC_ADDR,
	MKEEP_ALIVE_ATTRIBUTE_PERIOD_MSEC,
	MKEEP_ALIVE_ATTRIBUTE_RETRY_INTERVAL,
	MKEEP_ALIVE_ATTRIBUTE_RETRY_CNT,
	MKEEP_ALIVE_ATTRIBUTE_AFTER_LAST,
	MKEEP_ALIVE_ATTRIBUTE_MAX = MKEEP_ALIVE_ATTRIBUTE_AFTER_LAST - 1
};

/** WiFi roaming capabilities structure */
typedef struct {
	/** max blacklist size */
	u32 max_blacklist_size;
	/** max whitelist size */
	u32 max_whitelist_size;
} wifi_roaming_capabilities;

/** WiFi BSSID params structure */
typedef struct {
	/** Num of BSSID */
	u32 num_bssid;
	/** List of AP mac address */
	t_u8 mac_addr[MAX_AP_LIST][MLAN_MAC_ADDR_LENGTH];
} wifi_bssid_params;

/** SSID structure */
typedef struct {
	/** Length */
	u32 length;
	/** SSID */
	char ssid[MLAN_MAX_SSID_LENGTH];
} ssid_t;

/** WiFi SSID params structure */
typedef struct {
	/** No of SSID */
	u32 num_ssid;
	/** Whitelist SSID */
	ssid_t whitelist_ssid[MAX_SSID_NUM];
} wifi_ssid_params;

/*Attribute for wifi hal*/
enum mrvl_wlan_vendor_attr_fw_roaming {
	MRVL_WLAN_VENDOR_ATTR_FW_ROAMING_INVALID = 0,
	MRVL_WLAN_VENDOR_ATTR_FW_ROAMING_CAPA,
	MRVL_WLAN_VENDOR_ATTR_FW_ROAMING_CONTROL,
	MRVL_WLAN_VENDOR_ATTR_FW_ROAMING_CONFIG_BSSID,
	MRVL_WLAN_VENDOR_ATTR_FW_ROAMING_CONFIG_SSID,
	/* keep last */
	MRVL_WLAN_VENDOR_ATTR_FW_ROAMING_AFTER_LAST,
	MRVL_WLAN_VENDOR_ATTR_FW_ROAMING_MAX =
		MRVL_WLAN_VENDOR_ATTR_FW_ROAMING_AFTER_LAST - 1
};

#endif
#endif /* _MOAL_CFGVENDOR_H_ */
