/*
 * Copyright (c) 2013-2017 The Linux Foundation. All rights reserved.
 *
 * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
 *
 *
 * Permission to use, copy, modify, and/or distribute this software for
 * any purpose with or without fee is hereby granted, provided that the
 * above copyright notice and this permission notice appear in all
 * copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
 * PERFORMANCE OF THIS SOFTWARE.
 */

/*
 * This file was originally distributed by Qualcomm Atheros, Inc.
 * under proprietary terms before Copyright ownership was assigned
 * to the Linux Foundation.
 */

/**========================================================================

  \file     wma.h
  \brief    Implementation of WMA

  ========================================================================*/
/**=========================================================================
  EDIT HISTORY FOR FILE


  This section contains comments describing changes made to the module.
  Notice that changes are listed in reverse chronological order.

  $Header:$   $DateTime: $ $Author: $


  when              who           what, where, why
  --------          ---           -----------------------------------------
  12/03/2013        Ganesh        Created module for WMA
                    Kondabattini
  27/03/2013        Ganesh        Rx Mgmt Related added
                    Babu
  ==========================================================================*/
#ifndef WMA_H
#define WMA_H

#include "a_types.h"
#include "vos_types.h"
#include "osapi_linux.h"
#include "htc_packet.h"
#include "i_vos_event.h"
#include "wmi_services.h"
#include "wmi_unified.h"
#include "wmi_version.h"
#include "halTypes.h"
#include "cfgApi.h"
#include "vos_status.h"
#include "vos_sched.h"
#include "wlan_hdd_tgt_cfg.h"
#include "ol_txrx_api.h"
#include "sirMacProtDef.h"
#include "wlan_qct_wda.h"
#include "ol_txrx_types.h"
#include "wlan_qct_wda.h"
#include <linux/workqueue.h>
#include "ol_defines.h"
#include "limTypes.h"

/* Platform specific configuration for max. no. of fragments */
#define QCA_OL_11AC_TX_MAX_FRAGS            2

/** Private **/
#define WMA_CFG_NV_DNLD_TIMEOUT            500
#define WMA_READY_EVENTID_TIMEOUT          2000
#define WMA_TGT_SUSPEND_COMPLETE_TIMEOUT   6000
#define WMA_WAKE_LOCK_TIMEOUT              1000
#define WMA_MAX_RESUME_RETRY               100
#define WMA_RESUME_TIMEOUT                 6000
#define WMA_TGT_WOW_TX_COMPLETE_TIMEOUT    2000
#define MAX_MEM_CHUNKS                     32
#define WMA_CRASH_INJECT_TIMEOUT           5000
#define WMA_RESET_MAX_RATE                 10
/*
   In prima 12 HW stations are supported including BCAST STA(staId 0)
   and SELF STA(staId 1) so total ASSOC stations which can connect to Prima
   SoftAP = 12 - 1(Self STa) - 1(Bcast Sta) = 10 Stations. */

#ifdef WLAN_SOFTAP_VSTA_FEATURE
#define WMA_MAX_SUPPORTED_STAS    38
#else
#define WMA_MAX_SUPPORTED_STAS    12
#endif
#define WMA_MAX_SUPPORTED_BSS     5

#define FRAGMENT_SIZE 3072

#define WMA_MAX_MGMT_MPDU_LEN     2000

#define WMA_INVALID_VDEV_ID				0xFF
#define MAX_MEM_CHUNKS					32
#define WMA_MAX_VDEV_SIZE				20
#define WMA_VDEV_TBL_ENTRY_ADD				1
#define WMA_VDEV_TBL_ENTRY_DEL				0
#define WMA_SVC_MSG_MAX_SIZE                            1536

/* 11A/G channel boundary */
#define WMA_11A_CHANNEL_BEGIN           34
#define WMA_11A_CHANNEL_END             165
#define WMA_11G_CHANNEL_BEGIN           1
#define WMA_11G_CHANNEL_END             14

#define WMA_11P_CHANNEL_BEGIN           (170)
#define WMA_11P_CHANNEL_END             (184)

#define WMA_LOGD(args...) \
	VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_DEBUG, ## args)
#define WMA_LOGI(args...) \
	VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, ## args)
#define WMA_LOGW(args...) \
	VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_WARN, ## args)
#define WMA_LOGE(args...) \
	VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, ## args)
#define WMA_LOGP(args...) \
	VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_FATAL, ## args)

#define WMA_DEBUG_ALWAYS

#ifdef WMA_DEBUG_ALWAYS
#define WMA_LOGA(args...) \
	VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_FATAL, ## args)
#else
#define WMA_LOGA(args...)
#endif

#define     ALIGNED_WORD_SIZE       4
#define WLAN_HAL_MSG_TYPE_MAX_ENUM_SIZE    0x7FFF

/* Prefix used by scan req ids generated on the host */
#define WMA_HOST_SCAN_REQID_PREFIX	 0xA000
/* Prefix used by roam scan req ids generated on the host */
#define WMA_HOST_ROAM_SCAN_REQID_PREFIX  0xA800
/* Prefix used by scan requestor id on host */
#define WMA_HOST_SCAN_REQUESTOR_ID_PREFIX 0xA000
#define WMA_HW_DEF_SCAN_MAX_DURATION      30000 /* 30 secs */

/* Max offchannel duration */
#define WMA_BURST_SCAN_MAX_NUM_OFFCHANNELS  (3)
#define WMA_SCAN_NPROBES_DEFAULT            (2)
#define WMA_SCAN_IDLE_TIME_DEFAULT          (25)
#define WMA_P2P_SCAN_MAX_BURST_DURATION     (180)
#define WMA_CTS_DURATION_MS_MAX             (32)
#define WMA_GO_MIN_ACTIVE_SCAN_BURST_DURATION   (40)
#define WMA_GO_MAX_ACTIVE_SCAN_BURST_DURATION   (120)
#define WMA_DWELL_TIME_PASSIVE_DEFAULT          (110)
#define WMA_DWELL_TIME_PROBE_TIME_MAP_SIZE      (11)
#define WMA_3PORT_CONC_SCAN_MAX_BURST_DURATION  (25)

#define WMA_SEC_TO_USEC                     (1000000)

#define BEACON_TX_BUFFER_SIZE               (512)

/* WMA_ETHER_TYPE_OFFSET = sa(6) + da(6) */
#define WMA_ETHER_TYPE_OFFSET (6 + 6)
/* WMA_ICMP_V6_HEADER_OFFSET = sa(6) + da(6) + eth_type(2) + icmp_v6_hdr(6)*/
#define WMA_ICMP_V6_HEADER_OFFSET (6 + 6 + 2 + 6)
/* WMA_ICMP_V6_TYPE_OFFSET = sa(6) + da(6) + eth_type(2) + 40 */
#define WMA_ICMP_V6_TYPE_OFFSET (6 + 6 + 2 + 40)
/* WMA_IPV4_PROTOCOL = sa(6) + da(6) + eth_type(2) + 9 */
#define WMA_IPV4_PROTOCOL (6 + 6 + 2 + 9)

#define WMA_ICMP_V6_HEADER_TYPE (0x3A)
#define WMA_ICMP_V6_RA_TYPE (0x86)
#define WMA_ICMP_V6_NS_TYPE (0x87)
#define WMA_ICMP_V6_NA_TYPE (0x88)
#define WMA_BCAST_MAC_ADDR (0xFF)
#define WMA_MCAST_IPV4_MAC_ADDR (0x01)
#define WMA_MCAST_IPV6_MAC_ADDR (0x33)
#define WMA_ICMP_PROTOCOL (0x01)

#define WMA_EAPOL_SUBTYPE_GET_MIN_LEN     21
#define WMA_EAPOL_INFO_GET_MIN_LEN        23
#define WMA_IS_DHCP_GET_MIN_LEN           38
#define WMA_DHCP_SUBTYPE_GET_MIN_LEN      0x11D
#define WMA_DHCP_INFO_GET_MIN_LEN         50
#define WMA_ARP_SUBTYPE_GET_MIN_LEN       22
#define WMA_IPV4_PROTO_GET_MIN_LEN        24
#define WMA_IPV4_PKT_INFO_GET_MIN_LEN     42
#define WMA_ICMP_SUBTYPE_GET_MIN_LEN      35
#define WMA_IPV6_PROTO_GET_MIN_LEN        21
#define WMA_IPV6_PKT_INFO_GET_MIN_LEN     62
#define WMA_ICMPV6_SUBTYPE_GET_MIN_LEN    55

/* Beacon data rate changes */
#define WMA_BEACON_TX_RATE_HW_CODE_1_M    0x43
#define WMA_BEACON_TX_RATE_HW_CODE_2_M    0x42
#define WMA_BEACON_TX_RATE_HW_CODE_5_5_M  0x41
#define WMA_BEACON_TX_RATE_HW_CODE_11M    0x40
#define WMA_BEACON_TX_RATE_HW_CODE_6_M    0x03
#define WMA_BEACON_TX_RATE_HW_CODE_9_M    0x07
#define WMA_BEACON_TX_RATE_HW_CODE_12_M   0x02
#define WMA_BEACON_TX_RATE_HW_CODE_18_M   0x06
#define WMA_BEACON_TX_RATE_HW_CODE_24_M   0x01
#define WMA_BEACON_TX_RATE_HW_CODE_36_M   0x05
#define WMA_BEACON_TX_RATE_HW_CODE_48_M   0x00
#define WMA_BEACON_TX_RATE_HW_CODE_54_M   0x04

#define WMA_BEACON_TX_RATE_1_M            10
#define WMA_BEACON_TX_RATE_2_M            20
#define WMA_BEACON_TX_RATE_5_5_M          55
#define WMA_BEACON_TX_RATE_11_M           110
#define WMA_BEACON_TX_RATE_6_M            60
#define WMA_BEACON_TX_RATE_9_M            90
#define WMA_BEACON_TX_RATE_12_M           120
#define WMA_BEACON_TX_RATE_18_M           180
#define WMA_BEACON_TX_RATE_24_M           240
#define WMA_BEACON_TX_RATE_36_M           360
#define WMA_BEACON_TX_RATE_48_M           480
#define WMA_BEACON_TX_RATE_54_M           540

/*
 * ds_mode: distribution system mode
 * @IEEE80211_NO_DS: NO DS at either side
 * @IEEE80211_TO_DS: DS at receiver side
 * @IEEE80211_FROM_DS: DS at sender side
 * @IEEE80211_DS_TO_DS: DS at both sender and revceiver side
 */
enum ds_mode {
	IEEE80211_NO_DS,
	IEEE80211_TO_DS,
	IEEE80211_FROM_DS,
	IEEE80211_DS_TO_DS
};

typedef struct probeTime_dwellTime {
	u_int8_t dwell_time;
	u_int8_t probe_time;
} t_probeTime_dwellTime;

static const t_probeTime_dwellTime
	probeTime_dwellTime_map[WMA_DWELL_TIME_PROBE_TIME_MAP_SIZE] = {
	{28, 11}, /* 0 SSID */
	{28, 20}, /* 1 SSID */
	{28, 20}, /* 2 SSID */
	{28, 20}, /* 3 SSID */
	{28, 20}, /* 4 SSID */
	{28, 20}, /* 5 SSID */
	{28, 20}, /* 6 SSID */
	{28, 11}, /* 7 SSID */
	{28, 11}, /* 8 SSID */
	{28, 11}, /* 9 SSID */
	{28, 8}   /* 10 SSID */
};

/* Roaming default values
 * All time and period values are in milliseconds.
 * All rssi values are in dB except for WMA_NOISE_FLOOR_DBM_DEFAULT.
 */

#define WMA_ROAM_SCAN_CHANNEL_SWITCH_TIME    (4)
#define WMA_NOISE_FLOOR_DBM_DEFAULT          (-96)
#define WMA_ROAM_RSSI_DIFF_DEFAULT           (5)
#define WMA_ROAM_DWELL_TIME_ACTIVE_DEFAULT   (100)
#define WMA_ROAM_DWELL_TIME_PASSIVE_DEFAULT  (110)
#define WMA_ROAM_MIN_REST_TIME_DEFAULT       (50)
#define WMA_ROAM_MAX_REST_TIME_DEFAULT       (500)
#define WMA_ROAM_LOW_RSSI_TRIGGER_DEFAULT    (20)
#define WMA_ROAM_LOW_RSSI_TRIGGER_VERYLOW    (10)
#define WMA_ROAM_BEACON_WEIGHT_DEFAULT       (14)
#define WMA_ROAM_OPP_SCAN_PERIOD_DEFAULT     (120000)
#define WMA_ROAM_OPP_SCAN_AGING_PERIOD_DEFAULT (WMA_ROAM_OPP_SCAN_PERIOD_DEFAULT * 5)
#define WMA_ROAM_PREAUTH_SCAN_TIME           (50)
#define WMA_ROAM_PREAUTH_REST_TIME           (0)
#define WMA_ROAM_PREAUTH_MAX_SCAN_TIME       (10000)
#define WMA_ROAM_BMISS_FIRST_BCNT_DEFAULT    (10)
#define WMA_ROAM_BMISS_FINAL_BCNT_DEFAULT    (10)
#define WMA_ROAM_BMISS_FIRST_BCNT_DEFAULT_P2P (15)
#define WMA_ROAM_BMISS_FINAL_BCNT_DEFAULT_P2P (45)

#define WMA_INVALID_KEY_IDX	0xff
#define WMA_DFS_RADAR_FOUND   1

#define WMA_MAX_RF_CHAINS(x)	((1 << x) - 1)
#define WMA_MIN_RF_CHAINS		(1)

#ifdef FEATURE_WLAN_EXTSCAN
#define WMA_MAX_EXTSCAN_MSG_SIZE        1536
#define WMA_EXTSCAN_REST_TIME           100
#define WMA_EXTSCAN_MAX_SCAN_TIME       50000
#define WMA_EXTSCAN_BURST_DURATION      150
#endif

#define WMA_CHAN_START_RESP         0
#define WMA_CHAN_END_RESP           1

typedef void (*txFailIndCallback)(u_int8_t *peer_mac, u_int8_t seqNo);

typedef struct {
	HTC_ENDPOINT_ID endpoint_id;
}t_cfg_nv_param;

typedef enum
{
	WMA_DRIVER_TYPE_PRODUCTION  = 0,
	WMA_DRIVER_TYPE_MFG         = 1,
	WMA_DRIVER_TYPE_DVT         = 2,
	WMA_DRIVER_TYPE_INVALID     = 0x7FFFFFFF
}t_wma_drv_type;

typedef enum {
	WMA_STATE_OPEN,
	WMA_STATE_START,
	WMA_STATE_STOP,
	WMA_STATE_CLOSE
}t_wma_state;

#ifdef FEATURE_WLAN_TDLS
typedef enum {
	WMA_TDLS_SUPPORT_NOT_ENABLED = 0,
	WMA_TDLS_SUPPORT_DISABLED, /* suppress implicit trigger and not respond to the peer */
	WMA_TDLS_SUPPORT_EXPLICIT_TRIGGER_ONLY, /* suppress implicit trigger, but respond to the peer */
	WMA_TDLS_SUPPORT_ENABLED, /* implicit trigger */
	/* External control means implicit trigger
	 * but only to a peer mac configured by user space.
	 */
	WMA_TDLS_SUPPORT_ACTIVE_EXTERNAL_CONTROL,
}t_wma_tdls_mode;

/** TDLS EVENTS */
enum wma_tdls_peer_notification {
	/** tdls discovery recommended for peer (always based
	 * on tx bytes per second > tx_discover threshold
	 * NB: notification will be re-sent after
	 *     discovery_request_interval_ms */
	WMA_TDLS_SHOULD_DISCOVER,
	/** tdls link tear down recommended for peer
	 * due to tx bytes per second below tx_teardown_threshold
	 * NB: this notification sent once */
	WMA_TDLS_SHOULD_TEARDOWN,
	/** tx peer TDLS link tear down complete */
	WMA_TDLS_PEER_DISCONNECTED,
};

enum wma_tdls_peer_reason {
	/** tdls teardown recommended due to low transmits */
	WMA_TDLS_TEARDOWN_REASON_TX,
	/** tdls tear down recommended due to packet rates < AP rates */
	WMA_TDLS_TEARDOWN_REASON_RATE,
	/** tdls link tear down recommended due to poor RSSI */
	WMA_TDLS_TEARDOWN_REASON_RSSI,
	/** tdls link tear down recommended due to offchannel scan */
	WMA_TDLS_TEARDOWN_REASON_SCAN,
	/** tdls peer disconnected due to peer deletion */
	WMA_TDLS_DISCONNECTED_REASON_PEER_DELETE,
};
#endif /* FEATURE_WLAN_TDLS */

typedef enum {
        /* Roaming preauth channel state */
        WMA_ROAM_PREAUTH_CHAN_NONE,
        WMA_ROAM_PREAUTH_CHAN_REQUESTED,
        WMA_ROAM_PREAUTH_ON_CHAN,
        WMA_ROAM_PREAUTH_CHAN_CANCEL_REQUESTED,
        WMA_ROAM_PREAUTH_CHAN_COMPLETED
} t_wma_roam_preauth_chan_state_t;
/*
 * memory chunck allocated by Host to be managed by FW
 * used only for low latency interfaces like pcie
 */
struct wma_mem_chunk {
    u_int32_t *vaddr;
    u_int32_t paddr;
    adf_os_dma_mem_context(memctx);
    u_int32_t len;
    u_int32_t req_id;
};

typedef struct s_vdev_tbl {
	u_int8_t vdev_id;
	u_int8_t sta_mac[ETH_ALEN];
	ol_txrx_vdev_handle tx_rx_vdev_handle;
	u_int32_t vdev_type;
	bool used;
}t_vdev_tbl;

struct scan_param{
	u_int32_t scan_id;
	u_int32_t scan_requestor_id;
	tSirP2pScanType p2p_scan_type;
};


#define WMA_BCN_BUF_MAX_SIZE 2500
#define WMA_NOA_IE_SIZE(num_desc) (2 + (13 * (num_desc)))
#define WMA_MAX_NOA_DESCRIPTORS 4
struct beacon_info {
	adf_nbuf_t buf;
	u_int32_t len;
	u_int8_t dma_mapped;
	u_int32_t tim_ie_offset;
	u_int8_t dtim_count;
	u_int16_t seq_no;
	u_int8_t noa_sub_ie[2 + WMA_NOA_IE_SIZE(WMA_MAX_NOA_DESCRIPTORS)];
	u_int16_t noa_sub_ie_len;
	u_int8_t *noa_ie;
	u_int16_t p2p_ie_offset;
	adf_os_spinlock_t lock;
};

struct beacon_tim_ie {
	u_int8_t tim_ie;
	u_int8_t tim_len;
	u_int8_t dtim_count;
	u_int8_t dtim_period;
	u_int8_t tim_bitctl;
	u_int8_t tim_bitmap[1];
} __ATTRIB_PACK;

#define WMA_TIM_SUPPORTED_PVB_LENGTH (HAL_NUM_STA / 8) + 1


struct pps {
	v_BOOL_t paid_match_enable;
	v_BOOL_t gid_match_enable;
	v_BOOL_t tim_clear;
	v_BOOL_t dtim_clear;
	v_BOOL_t eof_delim;
	v_BOOL_t mac_match;
	v_BOOL_t delim_fail;
	v_BOOL_t nsts_zero;
	v_BOOL_t rssi_chk;
	v_BOOL_t ebt_5g;
};

struct qpower_params {
	u_int32_t max_ps_poll_cnt;
	u_int32_t max_tx_before_wake;
	u_int32_t spec_ps_poll_wake_interval;
	u_int32_t max_spec_nodata_ps_poll;
};

typedef struct {
	u_int32_t gtxRTMask[2]; /* for HT and VHT rate masks */
	u_int32_t gtxUsrcfg; /* host request for GTX mask */
	u_int32_t gtxPERThreshold; /* default: 10% */
	u_int32_t gtxPERMargin; /* default: 2% */
	u_int32_t gtxTPCstep; /* default: 1 */
	u_int32_t gtxTPCMin; /* default: 5 */
	u_int32_t gtxBWMask; /* 20/40/80/160 Mhz */
}gtx_config_t;

typedef struct {
	u_int32_t ani_enable;
	u_int32_t ani_poll_len;
	u_int32_t ani_listen_len;
	u_int32_t ani_ofdm_level;
	u_int32_t ani_cck_level;
	u_int32_t cwmenable;
	u_int32_t cts_cbw;
	u_int32_t txchainmask;
	u_int32_t rxchainmask;
	u_int32_t txpow2g;
	u_int32_t txpow5g;
	u_int32_t burst_enable;
	u_int32_t burst_dur;
	u_int32_t chainmask_2g_tx;
	u_int32_t chainmask_5g_tx;
	u_int32_t chainmask_2g_rx;
	u_int32_t chainmask_5g_rx;
} pdev_cli_config_t;

typedef struct {
	u_int32_t nss;
	u_int32_t ldpc;
	u_int32_t tx_stbc;
	u_int32_t rx_stbc;
	u_int32_t shortgi;
	u_int32_t rtscts_en;
	u_int32_t chwidth;
	u_int32_t tx_rate;
	u_int32_t ampdu;
	u_int32_t amsdu;
	u_int32_t erx_adjust;
	u_int32_t erx_bmiss_num;
	u_int32_t erx_bmiss_cycle;
	u_int32_t erx_slop_step;
	u_int32_t erx_init_slop;
	u_int32_t erx_adj_pause;
	u_int32_t erx_dri_sample;
        struct pps pps_params;
	struct qpower_params qpower_params;
	gtx_config_t gtx_info;
} vdev_cli_config_t;

#define WMA_WOW_PTRN_MASK_VALID     0xFF
#define WMA_NUM_BITS_IN_BYTE           8

#define WMA_AP_WOW_DEFAULT_PTRN_MAX    4
#define WMA_STA_WOW_DEFAULT_PTRN_MAX   5

struct wma_wow_ptrn_cache {
	u_int8_t vdev_id;
	u_int8_t *ptrn;
	u_int8_t ptrn_len;
	u_int8_t ptrn_offset;
	u_int8_t *mask;
	u_int8_t mask_len;
};

struct wma_wow {
	struct wma_wow_ptrn_cache *cache[WOW_MAX_BITMAP_FILTERS];
	u_int8_t no_of_ptrn_cached;

	u_int8_t free_ptrn_id[WOW_MAX_BITMAP_FILTERS];
	u_int8_t total_free_ptrn_id;
	u_int8_t used_free_ptrn_id;

	v_BOOL_t magic_ptrn_enable;
	v_BOOL_t wow_enable;
	v_BOOL_t wow_enable_cmd_sent;
	v_BOOL_t deauth_enable;
	v_BOOL_t disassoc_enable;
	v_BOOL_t bmiss_enable;
	v_BOOL_t gtk_pdev_enable;
	v_BOOL_t gtk_err_enable[WMA_MAX_SUPPORTED_BSS];
#ifdef FEATURE_WLAN_LPHB
	/* currently supports only vdev 0.
	 * cache has two entries: one for TCP and one for UDP.
	 */
	tSirLPHBReq lphb_cache[2];
#endif
};
#ifdef WLAN_FEATURE_11W
#define CMAC_IPN_LEN         (6)
#define WMA_IGTK_KEY_INDEX_4 (4)
#define WMA_IGTK_KEY_INDEX_5 (5)

typedef struct {
	u_int8_t  ipn[CMAC_IPN_LEN];
} wma_igtk_ipn_t;

typedef struct {
	u_int16_t key_length;
	u_int8_t  key[CSR_AES_KEY_LEN];

	/* IPN is maintained per iGTK keyID
	 * 0th index for iGTK keyID = 4;
	 * 1st index for iGTK KeyID = 5
	*/
        wma_igtk_ipn_t key_id[2];
} wma_igtk_key_t;
#endif

#define WMA_BSS_STATUS_STARTED 0x1
#define WMA_BSS_STATUS_STOPPED 0x2

typedef struct {
	A_UINT32 vdev_id;
	wmi_ssid ssid;
	A_UINT32 flags;
	A_UINT32 requestor_id;
	A_UINT32  disable_hw_ack;
	wmi_channel chan;
	adf_os_atomic_t hidden_ssid_restart_in_progress;
	tANI_U8 ssidHidden;
} vdev_restart_params_t;

struct wma_txrx_node {
	u_int8_t addr[ETH_ALEN];
	u_int8_t bssid[ETH_ALEN];
	void *handle;
	struct beacon_info *beacon;
	vdev_restart_params_t vdev_restart_params;
	vdev_cli_config_t config;
	struct scan_param scan_info;
	u_int32_t type;
	u_int32_t sub_type;
#ifdef FEATURE_WLAN_SCAN_PNO
	v_BOOL_t nlo_match_evt_received;
	v_BOOL_t pno_in_progress;
#endif
#if defined(FEATURE_WLAN_ESE) && defined(FEATURE_WLAN_ESE_UPLOAD)
	v_BOOL_t plm_in_progress;
#endif
	v_BOOL_t ptrn_match_enable;
	v_BOOL_t conn_state;
	/* BSS parameters cached for use in WDA_ADD_STA */
	tSirMacBeaconInterval   beaconInterval;
	tANI_U8                 llbCoexist;
	tANI_U8                 shortSlotTimeSupported;
	tANI_U8                 dtimPeriod;
	WLAN_PHY_MODE           chanmode;
	tANI_U8                 vht_capable;
	tANI_U8                 ht_capable;
	A_UINT32                mhz; /* channel frequency  in KHZ */
	bool vdev_active;
	v_BOOL_t vdev_up;
	u_int64_t tsfadjust;
	void     *addBssStaContext;
	/* Have a back up of arp offload req */
	tSirHostOffloadReq arp_offload_req;
	/* tSirHostOffloadReq of ns offload req */
	tSirHostOffloadReq ns_offload_req;
	tANI_U8 aid;
	/* Robust Management Frame (RMF) enabled/disabled */
	tANI_U8 rmfEnabled;
#ifdef WLAN_FEATURE_11W
	wma_igtk_key_t key;
#endif /* WLAN_FEATURE_11W */
	u_int32_t uapsd_cached_val;
	tAniGetPEStatsRsp       *stats_rsp;
	tANI_U8                 fw_stats_set;
	void *del_staself_req;
	adf_os_atomic_t bss_status;
	tANI_U8 rate_flags;
	tANI_U8 nss;
	v_BOOL_t is_channel_switch;
	u_int16_t pause_bitmap;
	tPowerdBm  tx_power; /* TX power in dBm */
	tPowerdBm  max_tx_power; /* max Tx power in dBm */
        u_int32_t  nwType;
#if defined WLAN_FEATURE_VOWIFI_11R
        void    *staKeyParams;
#endif
	u_int32_t dtim_policy;
	u_int32_t peer_count;
	v_BOOL_t roam_synch_in_progress;
	void *plink_status_req;
	void *psnr_req;
	u_int8_t delay_before_vdev_stop;
#ifdef FEATURE_WLAN_EXTSCAN
	bool extscan_in_progress;
#endif
	uint32_t alt_modulated_dtim;
	bool alt_modulated_dtim_enabled;
	uint8_t wps_state;
	uint8_t nss_2g;
	uint8_t nss_5g;
	uint32_t tx_aggregation_size;
	uint32_t rx_aggregation_size;

	uint8_t wep_default_key_idx;
	bool is_vdev_valid;
	uint16_t channelwidth;
	struct action_frame_random_filter *action_frame_filter;
	uint8_t in_bmps;
	uint8_t in_imps;
};

#if defined(QCA_WIFI_FTM)
#define MAX_UTF_EVENT_LENGTH	2048
#define MAX_WMI_UTF_LEN		252
#define SYS_MSG_COOKIE		(0xFACE)

typedef struct {
	A_UINT32 len;
	A_UINT32 msgref;
	A_UINT32 segmentInfo;
	A_UINT32 pad;
} SEG_HDR_INFO_STRUCT;

struct utf_event_info {
	u_int8_t *data;
	u_int32_t length;
	adf_os_size_t offset;
	u_int8_t currentSeq;
	u_int8_t expectedSeq;
};
#endif

typedef struct {
	u_int8_t vdev_id;
	u_int32_t scan_id;
}scan_timer_info;

typedef struct {
	u_int32_t atimWindowLength;
	u_int32_t isPowerSaveAllowed;
	u_int32_t isPowerCollapseAllowed;
	u_int32_t isAwakeonTxRxEnabled;
	u_int32_t inactivityCount;
	u_int32_t txSPEndInactivityTime;
	u_int32_t ibssPsWarmupTime;
	u_int32_t ibssPs1RxChainInAtimEnable;
}ibss_power_save_params;

#define MAX_REQUEST_HANDLERS 20

struct wma_handle;
typedef VOS_STATUS (*wma_request_handler)(struct wma_handle *wma_handle,
			void *request, void **response);

typedef struct request_handler_entry {
	int request_type;
	wma_request_handler handler;
} request_handler_entry_t;

struct wma_runtime_pm_context {
	void *ap;
	void *resume;
};

typedef struct wma_handle {
	void *wmi_handle;
	void *htc_handle;
	void *vos_context;
	void *mac_context;

	vos_event_t wma_ready_event;
	vos_event_t wma_resume_event;
	vos_event_t target_suspend;
	vos_event_t wow_tx_complete;
	vos_event_t runtime_suspend;
	vos_event_t recovery_event;

	t_cfg_nv_param cfg_nv;

	v_U16_t max_station;
	v_U16_t max_bssid;
	v_U32_t frame_xln_reqd;
	t_wma_drv_type driver_type;

	/* TODO: Check below 2 parameters are required for ROME/PRONTO ? */
	u_int8_t myaddr[ETH_ALEN]; /* current mac address */
	u_int8_t hwaddr[ETH_ALEN]; /* mac address from EEPROM */

	wmi_abi_version target_abi_vers; /* The target firmware version */
	/* The final negotiated ABI version to be used for communicating */
	wmi_abi_version final_abi_vers;
	v_U32_t target_fw_version; /* Target f/w build version */
#ifdef WLAN_FEATURE_LPSS
	v_U8_t lpss_support; /* LPSS feature is supported in target or not */
#endif
	uint8_t ap_arpns_support;
#ifdef FEATURE_GREEN_AP
	bool egap_support;
#endif
	bool wmi_ready;
	u_int32_t wlan_init_status;
	adf_os_device_t adf_dev;
	u_int32_t phy_capability; /* PHY Capability from Target*/
	u_int32_t max_frag_entry; /* Max number of Fragment entry */
	u_int32_t wmi_service_bitmap[WMI_SERVICE_BM_SIZE]; /* wmi services bitmap received from Target */
	wmi_resource_config   wlan_resource_config;
	u_int32_t frameTransRequired;
	tBssSystemRole       wmaGlobalSystemRole;

	/* Tx Frame Compl Cb registered by umac */
	pWDATxRxCompFunc tx_frm_download_comp_cb;

	/* Event to wait for tx download completion */
	vos_event_t tx_frm_download_comp_event;

	/*
	 * Dummy event to wait for draining MSDUs left in hardware tx
	 * queue and before requesting VDEV_STOP. Nobody will set this
	 * and wait will timeout, and code will poll the pending tx
	 * descriptors number to be zero.
	 */
	vos_event_t tx_queue_empty_event;

	/* Ack Complete Callback registered by umac */
	pWDAAckFnTxComp umac_ota_ack_cb[SIR_MAC_MGMT_RESERVED15];
	pWDAAckFnTxComp umac_data_ota_ack_cb;

	/* timestamp when OTA of last umac data was done */
	v_TIME_t last_umac_data_ota_timestamp;
	/* cache nbuf ptr for the last umac data buf */
	adf_nbuf_t last_umac_data_nbuf;

	v_BOOL_t needShutdown;
	u_int32_t num_mem_chunks;
	struct wma_mem_chunk mem_chunks[MAX_MEM_CHUNKS];
	wda_tgt_cfg_cb tgt_cfg_update_cb;
   /*Callback to indicate radar to HDD*/
   wda_dfs_radar_indication_cb dfs_radar_indication_cb;
	wda_dfs_block_tx_cb dfs_block_tx_cb;
	HAL_REG_CAPABILITIES reg_cap;
	u_int32_t scan_id;
	struct wma_txrx_node *interfaces;
	pdev_cli_config_t pdevconfig;
	struct list_head vdev_resp_queue;
	adf_os_spinlock_t vdev_respq_lock;
        adf_os_spinlock_t vdev_detach_lock;
	u_int32_t ht_cap_info;
#ifdef WLAN_FEATURE_11AC
	u_int32_t vht_cap_info;
	u_int32_t  vht_supp_mcs;
#endif
	u_int32_t num_rf_chains;

#if defined(QCA_WIFI_FTM)
	/* UTF event information */
	struct utf_event_info utf_event_info;
#endif
	u_int8_t is_fw_assert;
	struct wma_wow wow;
	u_int8_t no_of_suspend_ind;
	u_int8_t no_of_resume_ind;

	struct wma_tx_ack_work_ctx *ack_work_ctx;
	u_int8_t powersave_mode;
	v_BOOL_t ptrn_match_enable_all_vdev;
	void* pGetRssiReq;
	v_S7_t first_rssi;
	bool get_sta_peer_info;
	v_MACADDR_t peer_macaddr;
	t_thermal_mgmt thermal_mgmt_info;
        v_BOOL_t  roam_offload_enabled;
        t_wma_roam_preauth_chan_state_t roam_preauth_scan_state;
        u_int32_t roam_preauth_scan_id;
        u_int16_t roam_preauth_chanfreq;
        void *roam_preauth_chan_context;
	adf_os_spinlock_t roam_preauth_lock;
#ifdef WLAN_FEATURE_ROAM_OFFLOAD
	adf_os_spinlock_t roam_synch_lock;
#endif
	/* Here ol_ini_info is used to store ini
	 * status of arp offload, ns offload
	 * and others. Currently 1st bit is used
	 * for arp off load and 2nd bit for ns
	 * offload currently, rest bits are unused
	 */
	u_int8_t ol_ini_info;
	v_BOOL_t ssdp;
	bool enable_mc_list;
	bool enable_bcst_ptrn;
#ifdef FEATURE_RUNTIME_PM
	v_BOOL_t runtime_pm;
	u_int32_t auto_time;
#endif
        u_int8_t ibss_started;
        tSetBssKeyParams ibsskey_info;

   /*DFS umac interface information*/
   struct ieee80211com *dfs_ic;

        txFailIndCallback hddTxFailCb;

#ifdef FEATURE_WLAN_SCAN_PNO
	vos_wake_lock_t pno_wake_lock;
#endif
#ifdef FEATURE_WLAN_EXTSCAN
	vos_wake_lock_t extscan_wake_lock;
#endif
	vos_wake_lock_t wow_wake_lock;
	vos_wake_lock_t wow_auth_req_wl;
	vos_wake_lock_t wow_assoc_req_wl;
	vos_wake_lock_t wow_deauth_rec_wl;
	vos_wake_lock_t wow_disassoc_rec_wl;
	vos_wake_lock_t wow_ap_assoc_lost_wl;
	vos_wake_lock_t wow_auto_shutdown_wl;

	int wow_nack;
	u_int32_t ap_client_cnt;
	adf_os_atomic_t is_wow_bus_suspended;
	adf_os_atomic_t dfs_wmi_event_pending;
	adf_os_atomic_t dfs_wmi_event_dropped;

	vos_timer_t wma_scan_comp_timer;
	scan_timer_info wma_scan_timer_info;

	u_int8_t dfs_phyerr_filter_offload;
	v_BOOL_t suitable_ap_hb_failure;
	/* record the RSSI when suitable_ap_hb_failure for later usage to
	 * report RSSI at beacon miss scenario
	 */
	uint32_t suitable_ap_hb_failure_rssi;

	/* IBSS Power Save config Parameters */
	ibss_power_save_params wma_ibss_power_save_params;
#ifdef FEATURE_WLAN_RA_FILTERING
	v_BOOL_t IsRArateLimitEnabled;
	u_int16_t RArateLimitInterval;
#endif
#ifdef WLAN_FEATURE_LPSS
	bool is_lpass_enabled;
#endif

#ifdef WLAN_FEATURE_NAN
	bool is_nan_enabled;
#endif
	bool is_mib_enabled;

	/* Powersave Configuration Parameters */
	u_int8_t staMaxLIModDtim;
	u_int8_t staModDtim;
	u_int8_t staDynamicDtim;

	u_int8_t enable_mhf_offload;
	/* timestamp when last entries where set */
	v_TIME_t last_mhf_entries_timestamp;

	int32_t dfs_pri_multiplier;

	u_int32_t hw_bd_id;
	u_int32_t hw_bd_info[HW_BD_INFO_SIZE];

#ifdef FEATURE_WLAN_D0WOW
	atomic_t in_d0wow;
#endif

	/* OCB request contexts */
	struct sir_ocb_config *ocb_config_req;

	uint32_t miracast_value;
	vos_timer_t log_completion_timer;
	uint32_t txrx_chainmask;
	uint8_t per_band_chainmask_supp;
	uint16_t self_gen_frm_pwr;
	bool tx_chain_mask_cck;

	uint32_t num_of_diag_events_logs;
	uint32_t *events_logs_list;

	uint32_t wow_pno_match_wake_up_count;
	uint32_t wow_pno_complete_wake_up_count;
	uint32_t wow_gscan_wake_up_count;
	uint32_t wow_low_rssi_wake_up_count;
	uint32_t wow_rssi_breach_wake_up_count;
	uint32_t wow_pwr_save_fail_detected_wake_up_count;
	uint32_t wow_ucast_wake_up_count;
	uint32_t wow_bcast_wake_up_count;
	uint32_t wow_ipv4_mcast_wake_up_count;
	uint32_t wow_ipv6_mcast_wake_up_count;
	uint32_t wow_ipv6_mcast_ra_stats;
	uint32_t wow_ipv6_mcast_ns_stats;
	uint32_t wow_ipv6_mcast_na_stats;
	uint32_t wow_icmpv4_count;
	uint32_t wow_icmpv6_count;
	uint32_t wow_oem_response_wake_up_count;
	uint32_t wow_wakeup_enable_mask[4];
	uint32_t wow_wakeup_disable_mask[4];
	uint16_t max_mgmt_tx_fail_count;
	uint32_t ccmp_replays_attack_cnt;

	struct wma_runtime_pm_context runtime_context;
	uint32_t fine_time_measurement_cap;
	bool bpf_enabled;
	bool bpf_packet_filter_enable;
	bool pause_other_vdev_on_mcc_start;

	/* NAN datapath support enabled in firmware */
	bool nan_datapath_enabled;
	tSirLLStatsResults *link_stats_results;
	vos_timer_t wma_fw_time_sync_timer;
	struct sir_allowed_action_frames allowed_action_frames;
	tSirAddonPsReq psSetting;
	bool sub_20_support;
	bool get_one_peer_info;
}t_wma_handle, *tp_wma_handle;

struct wma_target_cap {
	u_int32_t wmi_service_bitmap[WMI_SERVICE_BM_SIZE]; /* wmi services bitmap received from Target */
	wmi_resource_config wlan_resource_config; /* default resource config,the os shim can overwrite it */
};

/********** The following structures are referenced from legacy prima code *********/
typedef enum {
	QWLAN_ISOC_START_CMDID = 0x4000,
	QWLAN_ISOC_END_CMDID   = 0x4FFF,

	FW_CFG_DOWNLOAD_REQ = QWLAN_ISOC_START_CMDID,
	FW_NV_DOWNLOAD_REQ,
	FW_WLAN_HAL_STOP_REQ,
	/* Add additional commands here */

	QWLAN_ISOC_MAX_CMDID = QWLAN_ISOC_END_CMDID - 1
}QWLAN_CMD_ID;
/* The shared memory between WDI and HAL is 4K so maximum data can be transferred
from WDI to HAL is 4K.This 4K should also include the Message header so sending 4K
of NV fragment is nt possbile.The next multiple of 1Kb is 3K */

typedef struct
{
  v_VOID_t *pConfigBuffer;

  /*Length of the config buffer above*/
  v_U16_t usConfigBufferLen;

  /*Production or FTM driver*/
  t_wma_drv_type driver_type;

  /*The user data passed in by UMAC, it will be sent back when the above
    function pointer will be called */
  v_VOID_t *pUserData;

  /*The user data passed in by UMAC, it will be sent back when the indication
    function pointer will be called */
  v_VOID_t *pIndUserData;
}t_wma_start_req;

/* Message types for messages exchanged between WDI and HAL */
typedef enum
{
   //Init/De-Init
   WLAN_HAL_START_REQ = 0,
   WLAN_HAL_START_RSP = 1,
   WLAN_HAL_STOP_REQ  = 2,
   WLAN_HAL_STOP_RSP  = 3,

   //Scan
   WLAN_HAL_INIT_SCAN_REQ    = 4,
   WLAN_HAL_INIT_SCAN_RSP    = 5,
   WLAN_HAL_START_SCAN_REQ   = 6,
   WLAN_HAL_START_SCAN_RSP   = 7 ,
   WLAN_HAL_END_SCAN_REQ     = 8,
   WLAN_HAL_END_SCAN_RSP     = 9,
   WLAN_HAL_FINISH_SCAN_REQ  = 10,
   WLAN_HAL_FINISH_SCAN_RSP  = 11,

   // HW STA configuration/deconfiguration
   WLAN_HAL_CONFIG_STA_REQ   = 12,
   WLAN_HAL_CONFIG_STA_RSP   = 13,
   WLAN_HAL_DELETE_STA_REQ   = 14,
   WLAN_HAL_DELETE_STA_RSP   = 15,
   WLAN_HAL_CONFIG_BSS_REQ   = 16,
   WLAN_HAL_CONFIG_BSS_RSP   = 17,
   WLAN_HAL_DELETE_BSS_REQ   = 18,
   WLAN_HAL_DELETE_BSS_RSP   = 19,

   //Infra STA asscoiation
   WLAN_HAL_JOIN_REQ         = 20,
   WLAN_HAL_JOIN_RSP         = 21,
   WLAN_HAL_POST_ASSOC_REQ   = 22,
   WLAN_HAL_POST_ASSOC_RSP   = 23,

   //Security
   WLAN_HAL_SET_BSSKEY_REQ   = 24,
   WLAN_HAL_SET_BSSKEY_RSP   = 25,
   WLAN_HAL_SET_STAKEY_REQ   = 26,
   WLAN_HAL_SET_STAKEY_RSP   = 27,
   WLAN_HAL_RMV_BSSKEY_REQ   = 28,
   WLAN_HAL_RMV_BSSKEY_RSP   = 29,
   WLAN_HAL_RMV_STAKEY_REQ   = 30,
   WLAN_HAL_RMV_STAKEY_RSP   = 31,

   //Qos Related
   WLAN_HAL_ADD_TS_REQ          = 32,
   WLAN_HAL_ADD_TS_RSP          = 33,
   WLAN_HAL_DEL_TS_REQ          = 34,
   WLAN_HAL_DEL_TS_RSP          = 35,
   WLAN_HAL_UPD_EDCA_PARAMS_REQ = 36,
   WLAN_HAL_UPD_EDCA_PARAMS_RSP = 37,
   WLAN_HAL_ADD_BA_REQ          = 38,
   WLAN_HAL_ADD_BA_RSP          = 39,
   WLAN_HAL_DEL_BA_REQ          = 40,
   WLAN_HAL_DEL_BA_RSP          = 41,

   WLAN_HAL_CH_SWITCH_REQ       = 42,
   WLAN_HAL_CH_SWITCH_RSP       = 43,
   WLAN_HAL_SET_LINK_ST_REQ     = 44,
   WLAN_HAL_SET_LINK_ST_RSP     = 45,
   WLAN_HAL_GET_STATS_REQ       = 46,
   WLAN_HAL_GET_STATS_RSP       = 47,
   WLAN_HAL_UPDATE_CFG_REQ      = 48,
   WLAN_HAL_UPDATE_CFG_RSP      = 49,

   WLAN_HAL_MISSED_BEACON_IND           = 50,
   WLAN_HAL_UNKNOWN_ADDR2_FRAME_RX_IND  = 51,
   WLAN_HAL_MIC_FAILURE_IND             = 52,
   WLAN_HAL_FATAL_ERROR_IND             = 53,
   WLAN_HAL_SET_KEYDONE_MSG             = 54,

   //NV Interface
   WLAN_HAL_DOWNLOAD_NV_REQ             = 55,
   WLAN_HAL_DOWNLOAD_NV_RSP             = 56,

   WLAN_HAL_ADD_BA_SESSION_REQ          = 57,
   WLAN_HAL_ADD_BA_SESSION_RSP          = 58,
   WLAN_HAL_TRIGGER_BA_REQ              = 59,
   WLAN_HAL_TRIGGER_BA_RSP              = 60,
   WLAN_HAL_UPDATE_BEACON_REQ           = 61,
   WLAN_HAL_UPDATE_BEACON_RSP           = 62,
   WLAN_HAL_SEND_BEACON_REQ             = 63,
   WLAN_HAL_SEND_BEACON_RSP             = 64,

   WLAN_HAL_SET_BCASTKEY_REQ               = 65,
   WLAN_HAL_SET_BCASTKEY_RSP               = 66,
   WLAN_HAL_DELETE_STA_CONTEXT_IND         = 67,
   WLAN_HAL_UPDATE_PROBE_RSP_TEMPLATE_REQ  = 68,
   WLAN_HAL_UPDATE_PROBE_RSP_TEMPLATE_RSP  = 69,

  // PTT interface support
   WLAN_HAL_PROCESS_PTT_REQ   = 70,
   WLAN_HAL_PROCESS_PTT_RSP   = 71,

   WLAN_HAL_TL_HAL_FLUSH_AC_REQ     = 74,
   WLAN_HAL_TL_HAL_FLUSH_AC_RSP     = 75,

   WLAN_HAL_ENTER_IMPS_REQ           = 76,
   WLAN_HAL_EXIT_IMPS_REQ            = 77,
   WLAN_HAL_ENTER_BMPS_REQ           = 78,
   WLAN_HAL_EXIT_BMPS_REQ            = 79,
   WLAN_HAL_ENTER_UAPSD_REQ          = 80,
   WLAN_HAL_EXIT_UAPSD_REQ           = 81,
   WLAN_HAL_UPDATE_UAPSD_PARAM_REQ   = 82,
   WLAN_HAL_CONFIGURE_RXP_FILTER_REQ = 83,
   WLAN_HAL_ADD_BCN_FILTER_REQ       = 84,
   WLAN_HAL_REM_BCN_FILTER_REQ       = 85,
   WLAN_HAL_ADD_WOWL_BCAST_PTRN      = 86,
   WLAN_HAL_DEL_WOWL_BCAST_PTRN      = 87,
   WLAN_HAL_ENTER_WOWL_REQ           = 88,
   WLAN_HAL_EXIT_WOWL_REQ            = 89,
   WLAN_HAL_HOST_OFFLOAD_REQ         = 90,
   WLAN_HAL_SET_RSSI_THRESH_REQ      = 91,
   WLAN_HAL_GET_RSSI_REQ             = 92,
   WLAN_HAL_SET_UAPSD_AC_PARAMS_REQ  = 93,
   WLAN_HAL_CONFIGURE_APPS_CPU_WAKEUP_STATE_REQ = 94,

   WLAN_HAL_ENTER_IMPS_RSP           = 95,
   WLAN_HAL_EXIT_IMPS_RSP            = 96,
   WLAN_HAL_ENTER_BMPS_RSP           = 97,
   WLAN_HAL_EXIT_BMPS_RSP            = 98,
   WLAN_HAL_ENTER_UAPSD_RSP          = 99,
   WLAN_HAL_EXIT_UAPSD_RSP           = 100,
   WLAN_HAL_SET_UAPSD_AC_PARAMS_RSP  = 101,
   WLAN_HAL_UPDATE_UAPSD_PARAM_RSP   = 102,
   WLAN_HAL_CONFIGURE_RXP_FILTER_RSP = 103,
   WLAN_HAL_ADD_BCN_FILTER_RSP       = 104,
   WLAN_HAL_REM_BCN_FILTER_RSP       = 105,
   WLAN_HAL_SET_RSSI_THRESH_RSP      = 106,
   WLAN_HAL_HOST_OFFLOAD_RSP         = 107,
   WLAN_HAL_ADD_WOWL_BCAST_PTRN_RSP  = 108,
   WLAN_HAL_DEL_WOWL_BCAST_PTRN_RSP  = 109,
   WLAN_HAL_ENTER_WOWL_RSP           = 110,
   WLAN_HAL_EXIT_WOWL_RSP            = 111,
   WLAN_HAL_RSSI_NOTIFICATION_IND    = 112,
   WLAN_HAL_GET_RSSI_RSP             = 113,
   WLAN_HAL_CONFIGURE_APPS_CPU_WAKEUP_STATE_RSP = 114,

   //11k related events
   WLAN_HAL_SET_MAX_TX_POWER_REQ   = 115,
   WLAN_HAL_SET_MAX_TX_POWER_RSP   = 116,

   //11R related msgs
   WLAN_HAL_AGGR_ADD_TS_REQ        = 117,
   WLAN_HAL_AGGR_ADD_TS_RSP        = 118,

   //P2P  WLAN_FEATURE_P2P
   WLAN_HAL_SET_P2P_GONOA_REQ      = 119,
   WLAN_HAL_SET_P2P_GONOA_RSP      = 120,

   //WLAN Dump commands
   WLAN_HAL_DUMP_COMMAND_REQ       = 121,
   WLAN_HAL_DUMP_COMMAND_RSP       = 122,

   //OEM_DATA FEATURE SUPPORT
   WLAN_HAL_START_OEM_DATA_REQ   = 123,
   WLAN_HAL_START_OEM_DATA_RSP   = 124,

   //ADD SELF STA REQ and RSP
   WLAN_HAL_ADD_STA_SELF_REQ       = 125,
   WLAN_HAL_ADD_STA_SELF_RSP       = 126,

   //DEL SELF STA SUPPORT
   WLAN_HAL_DEL_STA_SELF_REQ       = 127,
   WLAN_HAL_DEL_STA_SELF_RSP       = 128,

   // Coex Indication
   WLAN_HAL_COEX_IND               = 129,

   // Tx Complete Indication
   WLAN_HAL_OTA_TX_COMPL_IND       = 130,

   //Host Suspend/resume messages
   WLAN_HAL_HOST_SUSPEND_IND       = 131,
   WLAN_HAL_HOST_RESUME_REQ        = 132,
   WLAN_HAL_HOST_RESUME_RSP        = 133,

   WLAN_HAL_SET_TX_POWER_REQ       = 134,
   WLAN_HAL_SET_TX_POWER_RSP       = 135,
   WLAN_HAL_GET_TX_POWER_REQ       = 136,
   WLAN_HAL_GET_TX_POWER_RSP       = 137,

   WLAN_HAL_P2P_NOA_ATTR_IND       = 138,

   WLAN_HAL_ENABLE_RADAR_DETECT_REQ  = 139,
   WLAN_HAL_ENABLE_RADAR_DETECT_RSP  = 140,
   WLAN_HAL_GET_TPC_REPORT_REQ       = 141,
   WLAN_HAL_GET_TPC_REPORT_RSP       = 142,
   WLAN_HAL_RADAR_DETECT_IND         = 143,
   WLAN_HAL_RADAR_DETECT_INTR_IND    = 144,
   WLAN_HAL_KEEP_ALIVE_REQ           = 145,
   WLAN_HAL_KEEP_ALIVE_RSP           = 146,

   /*PNO messages*/
   WLAN_HAL_SET_PREF_NETWORK_REQ     = 147,
   WLAN_HAL_SET_PREF_NETWORK_RSP     = 148,
   WLAN_HAL_SET_RSSI_FILTER_REQ      = 149,
   WLAN_HAL_SET_RSSI_FILTER_RSP      = 150,
   WLAN_HAL_UPDATE_SCAN_PARAM_REQ    = 151,
   WLAN_HAL_UPDATE_SCAN_PARAM_RSP    = 152,
   WLAN_HAL_PREF_NETW_FOUND_IND      = 153,

   WLAN_HAL_SET_TX_PER_TRACKING_REQ  = 154,
   WLAN_HAL_SET_TX_PER_TRACKING_RSP  = 155,
   WLAN_HAL_TX_PER_HIT_IND           = 156,

   WLAN_HAL_8023_MULTICAST_LIST_REQ   = 157,
   WLAN_HAL_8023_MULTICAST_LIST_RSP   = 158,

   WLAN_HAL_SET_PACKET_FILTER_REQ     = 159,
   WLAN_HAL_SET_PACKET_FILTER_RSP     = 160,
   WLAN_HAL_PACKET_FILTER_MATCH_COUNT_REQ   = 161,
   WLAN_HAL_PACKET_FILTER_MATCH_COUNT_RSP   = 162,
   WLAN_HAL_CLEAR_PACKET_FILTER_REQ         = 163,
   WLAN_HAL_CLEAR_PACKET_FILTER_RSP         = 164,
   /*This is temp fix. Should be removed once
    * Host and Riva code is in sync*/
   WLAN_HAL_INIT_SCAN_CON_REQ               = 165,

   WLAN_HAL_SET_POWER_PARAMS_REQ            = 166,
   WLAN_HAL_SET_POWER_PARAMS_RSP            = 167,

   WLAN_HAL_TSM_STATS_REQ                   = 168,
   WLAN_HAL_TSM_STATS_RSP                   = 169,

   // wake reason indication (WOW)
   WLAN_HAL_WAKE_REASON_IND                 = 170,
   // GTK offload support
   WLAN_HAL_GTK_OFFLOAD_REQ                 = 171,
   WLAN_HAL_GTK_OFFLOAD_RSP                 = 172,
   WLAN_HAL_GTK_OFFLOAD_GETINFO_REQ         = 173,
   WLAN_HAL_GTK_OFFLOAD_GETINFO_RSP         = 174,

   WLAN_HAL_FEATURE_CAPS_EXCHANGE_REQ       = 175,
   WLAN_HAL_FEATURE_CAPS_EXCHANGE_RSP       = 176,
   WLAN_HAL_EXCLUDE_UNENCRYPTED_IND         = 177,

   WLAN_HAL_SET_THERMAL_MITIGATION_REQ      = 178,
   WLAN_HAL_SET_THERMAL_MITIGATION_RSP      = 179,

  WLAN_HAL_UPDATE_VHT_OP_MODE_REQ          = 182,
  WLAN_HAL_UPDATE_VHT_OP_MODE_RSP          = 183,

   WLAN_HAL_P2P_NOA_START_IND               = 184,

   WLAN_HAL_CLASS_B_STATS_IND               = 187,
   WLAN_HAL_DEL_BA_IND                      = 188,
   WLAN_HAL_DHCP_START_IND                  = 189,
   WLAN_HAL_DHCP_STOP_IND                   = 190,

  WLAN_HAL_MSG_MAX = WLAN_HAL_MSG_TYPE_MAX_ENUM_SIZE
}tHalHostMsgType;

/* Enumeration for Version */
typedef enum
{
   WLAN_HAL_MSG_VERSION0 = 0,
   WLAN_HAL_MSG_VERSION1 = 1,
   WLAN_HAL_MSG_WCNSS_CTRL_VERSION = 0x7FFF, /*define as 2 bytes data*/
   WLAN_HAL_MSG_VERSION_MAX_FIELD  = WLAN_HAL_MSG_WCNSS_CTRL_VERSION
} tHalHostMsgVersion;

/* 4-byte control message header used by HAL*/
typedef PACKED_PRE struct PACKED_POST
{
   tHalHostMsgType  msgType:16;
   tHalHostMsgVersion msgVersion:16;
   tANI_U32         msgLen;
} tHalMsgHeader, *tpHalMsgHeader;

/*---------------------------------------------------------------------------
  WLAN_HAL_START_REQ
  ---------------------------------------------------------------------------*/

typedef PACKED_PRE struct PACKED_POST sHalMacStartParameter
{
	/* Drive Type - Production or FTM etc */
	tDriverType  driverType;

	/*Length of the config buffer*/
	tANI_U32  uConfigBufferLen;

	/* Following this there is a TLV formatted buffer of length
	 * "uConfigBufferLen" bytes containing all config values.
	 * The TLV is expected to be formatted like this:
	 * 0           15            31           31+CFG_LEN-1        length-1
	 * |   CFG_ID   |   CFG_LEN   |   CFG_BODY    |  CFG_ID  |......|
	 */
} tHalMacStartParameter, *tpHalMacStartParameter;

typedef PACKED_PRE struct PACKED_POST
{
   /* Note: The length specified in tHalMacStartReqMsg messages should be
    * header.msgLen = sizeof(tHalMacStartReqMsg) + uConfigBufferLen */
   tHalMsgHeader header;
   tHalMacStartParameter startReqParams;
}  tHalMacStartReqMsg, *tpHalMacStartReqMsg;

extern v_BOOL_t sys_validateStaConfig(void *pImage, unsigned long cbFile,
                               void **ppStaConfig, v_SIZE_t *pcbStaConfig);
extern void vos_WDAComplete_cback(v_PVOID_t pVosContext);
extern void wma_send_regdomain_info(u_int32_t reg_dmn, u_int16_t regdmn2G,
				    u_int16_t regdmn5G, int8_t ctl2G,
				    int8_t ctl5G);

void wma_get_modeselect(tp_wma_handle wma, u_int32_t *modeSelect);

void wma_set_dfs_regdomain(tp_wma_handle wma, uint8_t dfs_region);

/**
  * Frame index
  */
enum frame_index {
	GENERIC_NODOWNLD_NOACK_COMP_INDEX,
	GENERIC_DOWNLD_COMP_NOACK_COMP_INDEX,
	GENERIC_DOWNLD_COMP_ACK_COMP_INDEX,
	GENERIC_NODOWLOAD_ACK_COMP_INDEX,
	FRAME_INDEX_MAX
};

VOS_STATUS wma_update_vdev_tbl(tp_wma_handle wma_handle, u_int8_t vdev_id,
		ol_txrx_vdev_handle tx_rx_vdev_handle, u_int8_t *mac,
		u_int32_t vdev_type, bool add_del);

int32_t regdmn_get_regdmn_for_country(u_int8_t *alpha2);
void regdmn_get_ctl_info(struct regulatory *reg, u_int32_t modesAvail,
			 u_int32_t modeSelect);

/*get the ctl from regdomain*/
u_int8_t regdmn_get_ctl_for_regdmn(u_int32_t reg_dmn);
u_int16_t get_regdmn_5g(u_int32_t reg_dmn);

#define WMA_FW_PHY_STATS	0x1
#define WMA_FW_RX_REORDER_STATS 0x2
#define WMA_FW_RX_RC_STATS	0x3
#define WMA_FW_TX_PPDU_STATS	0x4
#define WMA_FW_TX_CONCISE_STATS 0x5
#define WMA_FW_TX_RC_STATS	0x6
#define WMA_FW_RX_REM_RING_BUF 0xc
#define WMA_FW_RX_TXBF_MUSU_NDPA 0xf
#define WMA_FW_TXRX_FWSTATS_RESET 0x1f

/*
 * Setting the Tx Comp Timeout to 1 secs.
 * TODO: Need to Revist the Timing
 */
#define WMA_TX_FRAME_COMPLETE_TIMEOUT  1000
#define WMA_TX_FRAME_BUFFER_NO_FREE    0
#define WMA_TX_FRAME_BUFFER_FREE       1

struct wma_tx_ack_work_ctx {
	tp_wma_handle wma_handle;
	u_int16_t sub_type;
	int32_t status;
	struct work_struct ack_cmp_work;
};

#define WMA_TARGET_REQ_TYPE_VDEV_START 0x1
#define WMA_TARGET_REQ_TYPE_VDEV_STOP  0x2
#define WMA_TARGET_REQ_TYPE_VDEV_DEL   0x3

#define WMA_VDEV_START_REQUEST_TIMEOUT (3000) /* 3 seconds */
#define WMA_VDEV_STOP_REQUEST_TIMEOUT  (3000) /* 3 seconds */

struct wma_target_req {
	vos_timer_t event_timeout;
	struct list_head node;
	void *user_data;
	u_int32_t msg_type;
	u_int8_t vdev_id;
	u_int8_t type;
};

struct wma_vdev_start_req {
	u_int32_t beacon_intval;
	u_int32_t dtim_period;
	int32_t max_txpow;
	ePhyChanBondState chan_offset;
	bool is_dfs;
	u_int8_t vdev_id;
	u_int8_t chan;
	u_int8_t oper_mode;
	tSirMacSSid ssid;
	u_int8_t hidden_ssid;
	u_int8_t pmf_enabled;
	u_int8_t vht_capable;
	u_int8_t ht_capable;
	int32_t dfs_pri_multiplier;
	u_int8_t dot11_mode;
	bool is_half_rate;
	bool is_quarter_rate;
	u_int16_t beacon_tx_rate;
	uint16_t channelwidth;
};

struct wma_set_key_params {
	u_int8_t vdev_id;
	/* def_key_idx can be used to see if we have to read the key from cfg */
	u_int32_t def_key_idx;
	u_int16_t key_len;
	u_int8_t peer_mac[ETH_ALEN];
	u_int8_t singl_tid_rc;
	enum eAniEdType key_type;
	u_int32_t key_idx;
	bool unicast;
	u_int8_t key_data[SIR_MAC_MAX_KEY_LENGTH];
	u_int8_t key_rsc[SIR_MAC_MAX_KEY_RSC_LEN];
};

typedef struct {
	u_int16_t minTemp;
	u_int16_t maxTemp;
	u_int8_t thermalEnable;
} t_thermal_cmd_params, *tp_thermal_cmd_params;

/* Powersave Related */
/* Default InActivity Time is 200 ms */
#define POWERSAVE_DEFAULT_INACTIVITY_TIME 200

/* Default Listen Interval */
#define POWERSAVE_DEFAULT_LISTEN_INTERVAL 1

/*
 * TODO: Add WMI_CMD_ID_MAX as part of WMI_CMD_ID
 * instead of assigning it to the last valid wmi
 * cmd+1 to avoid updating this when a command is
 * added/deleted.
 */
#define WMI_CMDID_MAX (WMI_TXBF_CMDID + 1)

/*
 * wma cmd ids for configuration request which
 * does not involve sending a wmi command.
 */
enum wma_cfg_cmd_id {
	WMA_VDEV_TXRX_FWSTATS_ENABLE_CMDID = WMI_CMDID_MAX,
	WMA_VDEV_TXRX_FWSTATS_RESET_CMDID,
	/* Set time latency and time quota for MCC home channels */
	WMA_VDEV_MCC_SET_TIME_LATENCY,
	WMA_VDEV_MCC_SET_TIME_QUOTA,

	/* IBSS Power Save Parameters */
	WMA_VDEV_IBSS_SET_ATIM_WINDOW_SIZE,
	WMA_VDEV_IBSS_SET_POWER_SAVE_ALLOWED,
	WMA_VDEV_IBSS_SET_POWER_COLLAPSE_ALLOWED,
	WMA_VDEV_IBSS_SET_AWAKE_ON_TX_RX,
	WMA_VDEV_IBSS_SET_INACTIVITY_TIME,
	WMA_VDEV_IBSS_SET_TXSP_END_INACTIVITY_TIME,
	WMA_VDEV_IBSS_PS_SET_WARMUP_TIME_SECS,
	WMA_VDEV_IBSS_PS_SET_1RX_CHAIN_IN_ATIM_WINDOW,

	/* dfs control interface */
	WMA_VDEV_DFS_CONTROL_CMDID,
	WMA_VDEV_TXRX_GET_IPA_UC_FW_STATS_CMDID,

	/* Add any new command before this */
	WMA_CMD_ID_MAX
};

typedef struct wma_trigger_uapsd_params
{
	u_int32_t wmm_ac;
	u_int32_t user_priority;
	u_int32_t service_interval;
	u_int32_t suspend_interval;
	u_int32_t delay_interval;
}t_wma_trigger_uapsd_params, *tp_wma_trigger_uapsd_params;

VOS_STATUS wma_trigger_uapsd_params(tp_wma_handle wma_handle, u_int32_t vdev_id,
			tp_wma_trigger_uapsd_params trigger_uapsd_params);

/* added to get average snr for both data and beacon */
VOS_STATUS wma_send_snr_request(tp_wma_handle wma_handle, void *pGetRssiReq,
				v_S7_t first_rssi);


#define WMA_NLO_FREQ_THRESH          1000         /* in MHz */
#define WMA_SEC_TO_MSEC(sec)         (sec * 1000) /* sec to msec */
#define WMA_MSEC_TO_USEC(msec)       (msec * 1000) /* msec to usec */

/* Default rssi threshold defined in CFG80211 */
#define WMA_RSSI_THOLD_DEFAULT   -300

#ifdef FEATURE_WLAN_SCAN_PNO
#define WMA_PNO_MATCH_WAKE_LOCK_TIMEOUT		(5 * 1000) /* in msec */
#define WMA_PNO_SCAN_COMPLETE_WAKE_LOCK_TIMEOUT	(2 * 1000) /* in msec */
#endif
#define WMA_AUTH_REQ_RECV_WAKE_LOCK_TIMEOUT	(5 * 1000) /* in msec */
#define WMA_ASSOC_REQ_RECV_WAKE_LOCK_DURATION	(5 * 1000) /* in msec */
#define WMA_DEAUTH_RECV_WAKE_LOCK_DURATION	(5 * 1000) /* in msec */
#define WMA_DISASSOC_RECV_WAKE_LOCK_DURATION	(5 * 1000) /* in msec */
#ifdef FEATURE_WLAN_AUTO_SHUTDOWN
#define WMA_AUTO_SHUTDOWN_WAKE_LOCK_DURATION    (5 * 1000) /* in msec */
#else
#define WMA_AUTO_SHUTDOWN_WAKE_LOCK_DURATION 0
#endif
#define WMA_BMISS_EVENT_WAKE_LOCK_DURATION      (4 * 1000) /* in msec */

/* U-APSD maximum service period of peer station */
enum uapsd_peer_param_max_sp {
	UAPSD_MAX_SP_LEN_UNLIMITED = 0,
	UAPSD_MAX_SP_LEN_2 = 2,
	UAPSD_MAX_SP_LEN_4 = 4,
	UAPSD_MAX_SP_LEN_6 = 6
};

/* U-APSD Enabled AC's of peer station */
enum uapsd_peer_param_enabled_ac {
	UAPSD_VO_ENABLED = 0x01,
	UAPSD_VI_ENABLED = 0x02,
	UAPSD_BK_ENABLED = 0x04,
	UAPSD_BE_ENABLED = 0x08
};

#define WMA_TXMIC_LEN 8
#define WMA_RXMIC_LEN 8

/*
 * Length = (2 octets for Index and CTWin/Opp PS) and
 * (13 octets for each NOA Descriptors)
 */

#define WMA_P2P_NOA_IE_OPP_PS_SET (0x80)
#define WMA_P2P_NOA_IE_CTWIN_MASK (0x7F)

#define WMA_P2P_IE_ID 0xdd
#define WMA_P2P_WFA_OUI { 0x50,0x6f,0x9a }
#define WMA_P2P_WFA_VER 0x09                 /* ver 1.0 */
#define WMA_WSC_OUI { 0x00,0x50,0xF2 }       /* Microsoft WSC OUI byte */

/* P2P Sub element defintions (according to table 5 of Wifi's P2P spec) */
#define WMA_P2P_SUB_ELEMENT_STATUS                    0
#define WMA_P2P_SUB_ELEMENT_MINOR_REASON              1
#define WMA_P2P_SUB_ELEMENT_CAPABILITY                2
#define WMA_P2P_SUB_ELEMENT_DEVICE_ID                 3
#define WMA_P2P_SUB_ELEMENT_GO_INTENT                 4
#define WMA_P2P_SUB_ELEMENT_CONFIGURATION_TIMEOUT     5
#define WMA_P2P_SUB_ELEMENT_LISTEN_CHANNEL            6
#define WMA_P2P_SUB_ELEMENT_GROUP_BSSID               7
#define WMA_P2P_SUB_ELEMENT_EXTENDED_LISTEN_TIMING    8
#define WMA_P2P_SUB_ELEMENT_INTENDED_INTERFACE_ADDR   9
#define WMA_P2P_SUB_ELEMENT_MANAGEABILITY             10
#define WMA_P2P_SUB_ELEMENT_CHANNEL_LIST              11
#define WMA_P2P_SUB_ELEMENT_NOA                       12
#define WMA_P2P_SUB_ELEMENT_DEVICE_INFO               13
#define WMA_P2P_SUB_ELEMENT_GROUP_INFO                14
#define WMA_P2P_SUB_ELEMENT_GROUP_ID                  15
#define WMA_P2P_SUB_ELEMENT_INTERFACE                 16
#define WMA_P2P_SUB_ELEMENT_OP_CHANNEL                17
#define WMA_P2P_SUB_ELEMENT_INVITATION_FLAGS          18
#define WMA_P2P_SUB_ELEMENT_VENDOR                    221

/* Macros for handling unaligned memory accesses */
#define P2PIE_PUT_LE16(a, val)          \
	do {                    \
		(a)[1] = ((u16) (val)) >> 8;    \
		(a)[0] = ((u16) (val)) & 0xff;  \
	} while (0)

#define P2PIE_PUT_LE32(a, val)                  \
	do {                            \
		(a)[3] = (u8) ((((u32) (val)) >> 24) & 0xff);   \
		(a)[2] = (u8) ((((u32) (val)) >> 16) & 0xff);   \
		(a)[1] = (u8) ((((u32) (val)) >> 8) & 0xff);    \
		(a)[0] = (u8) (((u32) (val)) & 0xff);       \
	} while (0)

/*
 * P2P IE structural definition.
 */
struct p2p_ie {
	u_int8_t  p2p_id;
	u_int8_t  p2p_len;
	u_int8_t  p2p_oui[3];
	u_int8_t  p2p_oui_type;
} __packed;

struct p2p_noa_descriptor {
	u_int8_t   type_count; /* 255: continuous schedule, 0: reserved */
	u_int32_t  duration ;  /* Absent period duration in micro seconds */
	u_int32_t  interval;   /* Absent period interval in micro seconds */
	u_int32_t  start_time; /* 32 bit tsf time when in starts */
} __packed;

struct p2p_sub_element_noa {
	u_int8_t p2p_sub_id;
	u_int8_t p2p_sub_len;
	u_int8_t index;           /* identifies instance of NOA su element */
	u_int8_t oppPS:1,         /* oppPS state of the AP */
		 ctwindow:7;      /* ctwindow in TUs */
	u_int8_t num_descriptors; /* number of NOA descriptors */
	struct p2p_noa_descriptor noa_descriptors[WMA_MAX_NOA_DESCRIPTORS];
};

struct wma_decap_info_t {
	u_int8_t hdr[sizeof(struct ieee80211_qosframe_addr4)];
	int32_t hdr_len;
};


#define WMA_DEFAULT_MAX_PSPOLL_BEFORE_WAKE 1

typedef enum {
	/* set packet power save */
	WMI_VDEV_PPS_PAID_MATCH = 0,
	WMI_VDEV_PPS_GID_MATCH = 1,
	WMI_VDEV_PPS_EARLY_TIM_CLEAR = 2,
	WMI_VDEV_PPS_EARLY_DTIM_CLEAR = 3,
	WMI_VDEV_PPS_EOF_PAD_DELIM = 4,
	WMI_VDEV_PPS_MACADDR_MISMATCH = 5,
	WMI_VDEV_PPS_DELIM_CRC_FAIL = 6,
	WMI_VDEV_PPS_GID_NSTS_ZERO = 7,
	WMI_VDEV_PPS_RSSI_CHECK = 8,
	WMI_VDEV_VHT_SET_GID_MGMT = 9,
	WMI_VDEV_PPS_5G_EBT = 10
} packet_power_save;

typedef enum {
    WMI_VDEV_PARAM_GTX_HT_MCS,
    WMI_VDEV_PARAM_GTX_VHT_MCS,
    WMI_VDEV_PARAM_GTX_USR_CFG,
    WMI_VDEV_PARAM_GTX_THRE,
    WMI_VDEV_PARAM_GTX_MARGIN,
    WMI_VDEV_PARAM_GTX_STEP,
    WMI_VDEV_PARAM_GTX_MINTPC,
    WMI_VDEV_PARAM_GTX_BW_MASK,
}green_tx_param;

#define WMA_DEFAULT_QPOWER_MAX_PSPOLL_BEFORE_WAKE 1
#define WMA_DEFAULT_QPOWER_TX_WAKE_THRESHOLD 2
#define WMA_DEFAULT_SIFS_BURST_DURATION      8160

#define WMA_VHT_PPS_PAID_MATCH 1
#define WMA_VHT_PPS_GID_MATCH 2
#define WMA_VHT_PPS_DELIM_CRC_FAIL 3

#ifdef FEATURE_WLAN_TDLS
typedef struct wma_tdls_params
{
	tANI_U32    vdev_id;
	tANI_U32    tdls_state;
	tANI_U32    notification_interval_ms;
	tANI_U32    tx_discovery_threshold;
	tANI_U32    tx_teardown_threshold;
	tANI_S32    rssi_teardown_threshold;
	tANI_S32    rssi_delta;
	tANI_U32    tdls_options;
	tANI_U32    peer_traffic_ind_window;
	tANI_U32    peer_traffic_response_timeout;
	tANI_U32    puapsd_mask;
	tANI_U32    puapsd_inactivity_time;
	tANI_U32    puapsd_rx_frame_threshold;
	uint32_t    teardown_notification_ms;
	uint32_t    tdls_peer_kickout_threshold;
} t_wma_tdls_params;

typedef struct {
	/** unique id identifying the VDEV */
	A_UINT32        vdev_id;
	/** peer MAC address */
	wmi_mac_addr    peer_macaddr;
	/** TDLS peer status (wma_tdls_peer_notification)*/
	A_UINT32        peer_status;
	/** TDLS peer reason (wma_tdls_peer_reason) */
	A_UINT32        peer_reason;
} wma_tdls_peer_event;

#endif /* FEATURE_WLAN_TDLS */

#define WMA_DFS_MAX_20M_SUB_CH 8

struct wma_dfs_radar_channel_list {
	A_UINT32	nchannels;
	/*Channel number including bonded channels on which the RADAR is present */
	u_int8_t	channels[WMA_DFS_MAX_20M_SUB_CH];
};

/*
 * Structure to indicate RADAR
 */

struct wma_dfs_radar_indication {
	/* unique id identifying the VDEV */
	A_UINT32        vdev_id;
	/* Channel list on which RADAR is detected */
	struct wma_dfs_radar_channel_list chan_list;
	/* Flag to Indicate RADAR presence on the
	 * current operating channel
	 */
	u_int32_t       dfs_radar_status;
	/* Flag to indicate use NOL */
	int             use_nol;
};

/*
 * WMA-DFS Hooks
 */
int ol_if_dfs_attach(struct ieee80211com *ic, void *ptr, void *radar_info);
u_int64_t ol_if_get_tsf64(struct ieee80211com *ic);
int ol_if_dfs_disable(struct ieee80211com *ic);
struct ieee80211_channel * ieee80211_find_channel(struct ieee80211com *ic,
                                     int freq, u_int32_t flags);
int ol_if_dfs_enable(struct ieee80211com *ic, int *is_fastclk, void *pe);
u_int32_t ieee80211_ieee2mhz(u_int32_t chan, u_int32_t flags);
int ol_if_dfs_get_ext_busy(struct ieee80211com *ic);
int ol_if_dfs_get_mib_cycle_counts_pct(struct ieee80211com *ic,
          u_int32_t *rxc_pcnt, u_int32_t *rxf_pcnt, u_int32_t *txf_pcnt);
u_int16_t ol_if_dfs_usenol(struct ieee80211com *ic);
void ieee80211_mark_dfs(struct ieee80211com *ic,
                               struct ieee80211_channel *ichan);
/**
 * wma_update_dfs_cac_block_tx - to set dfs_cac_block_tx flag
 * @cac_block_tx: value to be set
 *
 * Return: none
 */
void wma_update_dfs_cac_block_tx(bool cac_block_tx);
/**
 * ieee80211_update_dfs_cac_block_tx() - to set dfs_cac_block_tx flag
 * @cac_block_tx: value to be set
 *
 * Return: none
 */
static inline void ieee80211_update_dfs_cac_block_tx(bool cac_block_tx) {
	wma_update_dfs_cac_block_tx(cac_block_tx);
}
int  wma_dfs_indicate_radar(struct ieee80211com *ic,
                               struct ieee80211_channel *ichan);
u_int16_t   dfs_usenol(struct ieee80211com *ic);

#define WMA_SMPS_MASK_LOWER_16BITS 0xFF
#define WMA_SMPS_MASK_UPPER_3BITS 0x7
#define WMA_SMPS_PARAM_VALUE_S 29

#define WMA_MAX_SCAN_ID        0x00FF

/* U-APSD Access Categories */
enum uapsd_ac {
	UAPSD_BE,
	UAPSD_BK,
	UAPSD_VI,
	UAPSD_VO
};

VOS_STATUS wma_disable_uapsd_per_ac(tp_wma_handle wma_handle,
					u_int32_t vdev_id,
					enum uapsd_ac ac);

/* U-APSD User Priorities */
enum uapsd_up {
	UAPSD_UP_BE,
	UAPSD_UP_BK,
	UAPSD_UP_RESV,
	UAPSD_UP_EE,
	UAPSD_UP_CL,
	UAPSD_UP_VI,
	UAPSD_UP_VO,
	UAPSD_UP_NC,
	UAPSD_UP_MAX
};

#ifdef FEATURE_WLAN_D0WOW
void wma_set_d0wow_flag(tp_wma_handle wma_handle, A_BOOL flag);
A_BOOL wma_read_d0wow_flag(tp_wma_handle wma_handle);
#endif

A_UINT32 eCsrAuthType_to_rsn_authmode (eCsrAuthType authtype,
                                       eCsrEncryptionType encr);
A_UINT32 eCsrEncryptionType_to_rsn_cipherset (eCsrEncryptionType encr);

/*
 * The firmware value has been changed recently to 0x127
 * But, to maintain backward compatibility, the old
 * value is also preserved.
 */
#define WMA_TGT_INVALID_SNR_OLD (-1)
#define WMA_TGT_INVALID_SNR_NEW 0x127

#define WMA_TX_Q_RECHECK_TIMER_WAIT      2    // 2 ms
#define WMA_TX_Q_RECHECK_TIMER_MAX_WAIT  20   // 20 ms
#define WMA_MAX_NUM_ARGS 8
typedef struct wma_unit_test_cmd
{
    v_UINT_t vdev_id;
    WLAN_MODULE_ID module_id;
    v_U32_t num_args;
    v_U32_t args[WMA_MAX_NUM_ARGS];
}t_wma_unit_test_cmd;

typedef struct wma_roam_invoke_cmd
{
    v_UINT_t vdev_id;
    u_int8_t bssid[6];
    v_U32_t channel;
}t_wma_roam_invoke_cmd;

struct wma_target_req *wma_fill_vdev_req(tp_wma_handle wma, u_int8_t vdev_id,
	u_int32_t msg_type, u_int8_t type, void *params, u_int32_t timeout);

VOS_STATUS wma_vdev_start(tp_wma_handle wma, struct wma_vdev_start_req *req,
	v_BOOL_t isRestart);

void wma_remove_vdev_req(tp_wma_handle wma, u_int8_t vdev_id, u_int8_t type);

#ifdef REMOVE_PKT_LOG
static inline void wma_set_wifi_start_packet_stats(void *wma_handle,
					struct sir_wifi_start_log *start_log)
{
	return;
}
#endif

/* API's to enable HDD to suspsend FW.
 * This are active only if Bus Layer aggreed to suspend.
 * This will be called for only for SDIO driver, for others
 * by default HIF return failure, as we suspend FW in bus
 * suspend callbacks
 */
int wma_suspend_fw(void);
int wma_resume_fw(void);

void wma_send_flush_logs_to_fw(tp_wma_handle wma_handle);
struct wma_txrx_node *wma_get_interface_by_vdev_id(uint8_t vdev_id);
bool wma_is_vdev_up(uint8_t vdev_id);

int wma_btc_set_bt_wlan_interval(tp_wma_handle wma_handle,
			WMI_COEX_CONFIG_CMD_fixed_param *interval);


int wma_crash_inject(tp_wma_handle wma_handle, uint32_t type,
			uint32_t delay_time_ms);

uint32_t wma_get_vht_ch_width(void);

VOS_STATUS wma_get_wakelock_stats(struct sir_wake_lock_stats *wake_lock_stats);
VOS_STATUS wma_set_tx_rx_aggregation_size
	(struct sir_set_tx_rx_aggregation_size *tx_rx_aggregation_size);
VOS_STATUS wma_set_powersave_config(uint8_t vdev_id, uint8_t val);

/**
 * wma_find_vdev_by_id() - Find vdev handle for given vdev id.
 * @wma: WMA handle
 * @vdev_id: vdev ID
 * Return: Returns vdev handle if given vdev id is valid.
 *         Otherwise returns NULL.
 */
static inline void *wma_find_vdev_by_id(tp_wma_handle wma, u_int8_t vdev_id)
{
	if (vdev_id > wma->max_bssid)
		return NULL;

	return wma->interfaces[vdev_id].handle;
}

/**
 * wma_find_vdev_by_addr() - Find vdev handle for given vdev mac addr.
 * @wma: WMA handle
 * @addr: mac address of the vdev
 * @vdev_id: out parameter to update with vdev ID
 *
 * Return: vdev handle if found NULL otherwise
 */
static inline void *wma_find_vdev_by_addr(tp_wma_handle wma, u_int8_t *addr,
				   u_int8_t *vdev_id)
{
	u_int8_t i;

	for (i = 0; i < wma->max_bssid; i++) {
		if (vos_is_macaddr_equal(
			(v_MACADDR_t *) wma->interfaces[i].addr,
			(v_MACADDR_t *) addr) == VOS_TRUE) {
			*vdev_id = i;
			return wma->interfaces[i].handle;
		}
	}
	return NULL;
}


int wmi_unified_vdev_set_param_send(wmi_unified_t wmi_handle, u_int32_t if_id,
				u_int32_t param_id, u_int32_t param_value);

void wma_set_bss_rate_flags(struct wma_txrx_node *iface,
				tpAddBssParams add_bss);

void wma_send_msg(tp_wma_handle wma_handle, u_int16_t msg_type,
				void *body_ptr, u_int32_t body_val);

/**
 * struct wma_version_info - Store wmi version info
 * @major: wmi major version
 * @minor: wmi minor version
 * @revision: wmi revision number
 */
struct wma_version_info {
	u_int32_t major;
	u_int32_t minor;
	u_int32_t revision;
};

/**
 * wma_stop_radar_delay_timer() - stop radar delay found event timer
 *
 * Return: none
 */
void wma_stop_radar_delay_timer(void);

/**
 * wma_ignore_radar_soon_after_assoc() - ignore radar found 300ms after assoc
 *
 * Return: none
 */
void wma_ignore_radar_soon_after_assoc(void);

void wma_remove_peer(tp_wma_handle wma, u_int8_t *bssid,
			u_int8_t vdev_id, ol_txrx_peer_handle peer,
			v_BOOL_t roam_synch_in_progress);

#define WOW_BITMAP_FIELD_SIZE 32
void wma_add_wow_wakeup_event(tp_wma_handle wma, WOW_WAKE_EVENT_TYPE event,
			bool enable);
VOS_STATUS wma_create_peer(tp_wma_handle wma, ol_txrx_pdev_handle pdev,
			   ol_txrx_vdev_handle vdev, u8 peer_addr[6],
			   u_int32_t peer_type, u_int8_t vdev_id,
			   v_BOOL_t roam_synch_in_progress);
WLAN_PHY_MODE wma_chan_to_mode(uint8_t chan, ePhyChanBondState chan_offset,
		uint8_t vht_capable, uint8_t dot11_mode);

#define RESET_BEACON_INTERVAL_TIMEOUT 200
struct wma_beacon_interval_reset_req {
	vos_timer_t event_timeout;
	uint8_t vdev_id;
	uint16_t interval;
};
#endif
