/*
 * Copyright (c) 2011-2015 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.
 */

#ifndef _HALMSGAPI_H_
#define _HALMSGAPI_H_

#include "cdf_types.h"
#include "sir_api.h"
#include "sir_params.h"


/*
 * Validate the OS Type being built
 */

#if defined(ANI_OS_TYPE_ANDROID)        /* ANDROID */

#if defined(ANI_OS_TYPE_QNX)
#error "more than one ANI_OS_TYPE_xxx is defined for this build"
#endif

#elif defined (ANI_OS_TYPE_QNX)        /* QNX */

#if defined(ANI_OS_TYPE_ANDROID)
#error "more than one ANI_OS_TYPE_xxx is defined for this build"
#endif

#elif !defined(ANI_OS_TYPE_ANDROID) && !defined(ANI_OS_TYPE_QNX)        /* NONE */
#error "NONE of the ANI_OS_TYPE_xxx are defined for this build"
#endif

/*
 * Validate the compiler
 */
#if (defined (ANI_COMPILER_TYPE_MSVC) && defined (ANI_COMPILER_TYPE_GCC) && defined (ANI_COMPILER_TYPE_RVCT))
#error "more than one ANI_COMPILER_TYPE_xxx is defined for this build"

#elif !(defined (ANI_COMPILER_TYPE_MSVC) || defined (ANI_COMPILER_TYPE_GCC) || defined (ANI_COMPILER_TYPE_RVCT))
#error "NONE of the ANI_COMPILER_TYPE_xxx are defined for this build"

#endif


#define WMA_CONFIG_PARAM_UPDATE_REQ    SIR_CFG_PARAM_UPDATE_IND

#define HAL_NUM_BSSID 2
/* operMode in ADD BSS message */
#define BSS_OPERATIONAL_MODE_AP     0
#define BSS_OPERATIONAL_MODE_STA    1
#define BSS_OPERATIONAL_MODE_IBSS   2

/* STA entry type in add sta message */
#define STA_ENTRY_SELF              0
#define STA_ENTRY_OTHER             1
#define STA_ENTRY_BSSID             2
/* Special station id for transmitting broadcast frames. */
#define STA_ENTRY_BCAST             3
#define STA_ENTRY_PEER              STA_ENTRY_OTHER
#ifdef FEATURE_WLAN_TDLS
#define STA_ENTRY_TDLS_PEER         4
#endif /* FEATURE_WLAN_TDLS */

#define STA_INVALID_IDX 0xFF

/* invalid channel id. */
#define INVALID_CHANNEL_ID 0

/*
 * From NOVA Mac Arch document
 *  Encryp. mode    The encryption mode
 *  000: Encryption functionality is not enabled
 *  001: Encryption is set to WEP
 *  010: Encryption is set to WEP 104
 *  011: Encryption is set to TKIP
 *  100: Encryption is set to AES
 *  101 - 111: Reserved for future
 */
#define ENC_POLICY_NULL        0
#define ENC_POLICY_WEP40       1
#define ENC_POLICY_WEP104      2
#define ENC_POLICY_TKIP        3
#define ENC_POLICY_AES_CCM     4

/* Max number of bytes required for stations bitmap aligned at 4 bytes boundary
 */
#define HALMSG_NUMBYTES_STATION_BITMAP(x) (((x / 32) + ((x % 32) ? 1 : 0)) * 4)


#define HAL_MAX_SUPP_CHANNELS     128
#define HAL_MAX_SUPP_OPER_CLASSES 32

/**
 * enum eFrameType - frame types
 * @TXRX_FRM_RAW: raw frame
 * @TXRX_FRM_ETH2: ethernet frame
 * @TXRX_FRM_802_3: 802.3 frame
 * @TXRX_FRM_802_11_MGMT: 802.11 mgmt frame
 * @TXRX_FRM_802_11_CTRL: 802.11 control frame
 * @TXRX_FRM_802_11_DATA: 802.11 data frame
 */
typedef enum {
	TXRX_FRM_RAW,
	TXRX_FRM_ETH2,
	TXRX_FRM_802_3,
	TXRX_FRM_802_11_MGMT,
	TXRX_FRM_802_11_CTRL,
	TXRX_FRM_802_11_DATA,
	TXRX_FRM_IGNORED,   /* This frame will be dropped */
	TXRX_FRM_MAX
} eFrameType;

/**
 * enum eFrameTxDir - frame tx direction
 * @ANI_TXDIR_IBSS: IBSS frame
 * @ANI_TXDIR_TODS: frame to DS
 * @ANI_TXDIR_FROMDS: Frame from DS
 * @ANI_TXDIR_WDS: WDS frame
 */
typedef enum {
	ANI_TXDIR_IBSS = 0,
	ANI_TXDIR_TODS,
	ANI_TXDIR_FROMDS,
	ANI_TXDIR_WDS
} eFrameTxDir;

/**
 *struct sAniBeaconStruct - Beacon structure
 * @beaconLength: beacon length
 * @macHdr: mac header for beacon
 */
typedef struct sAniBeaconStruct {
	uint32_t beaconLength;
	tSirMacMgmtHdr macHdr;
} cdf_packed tAniBeaconStruct, *tpAniBeaconStruct;

/**
 * struct sAniProbeRspStruct - probeRsp template structure
 * @macHdr: mac header for probe response
 */
typedef struct sAniProbeRspStruct {
	tSirMacMgmtHdr macHdr;
	/* probeRsp body follows here */
} cdf_packed tAniProbeRspStruct, *tpAniProbeRspStruct;

/**
 * struct tAddStaParams - add sta related parameters
 * @bssId: bssid of sta
 * @assocId: associd
 * @staType: 0 - Self, 1 other/remote, 2 - bssid
 * @staMac: MAC Address of STA
 * @shortPreambleSupported: is short preamble supported or not
 * @listenInterval: Listen interval
 * @wmmEnabled: Support for 11e/WMM
 * @uAPSD: U-APSD Flags: 1b per AC
 * @maxSPLen: Max SP Length
 * @htCapable: 11n HT capable STA
 * @greenFieldCapable: 11n Green Field preamble support
 * @txChannelWidthSet: TX Width Set: 0 - 20 MHz only, 1 - 20/40 MHz
 * @mimoPS: MIMO Power Save
 * @rifsMode: RIFS mode: 0 - NA, 1 - Allowed
 * @lsigTxopProtection: L-SIG TXOP Protection mechanism
 * @us32MaxAmpduDuration: in units of 32 us
 * @maxAmpduSize:  0 : 8k , 1 : 16k, 2 : 32k, 3 : 64k
 * @maxAmpduDensity: 3 : 0~7 : 2^(11nAMPDUdensity -4)
 * @maxAmsduSize: 1 : 3839 bytes, 0 : 7935 bytes
 * @fDsssCckMode40Mhz: DSSS CCK supported 40MHz
 * @fShortGI40Mhz: short GI support for 40Mhz packets
 * @fShortGI20Mhz: short GI support for 20Mhz packets
 * @supportedRates: legacy supported rates
 * @status: CDF status
 * @staIdx: station index
 * @bssIdx: BSSID of BSS to which the station is associated
 * @updateSta: pdate the existing STA entry, if this flag is set
 * @respReqd: A flag to indicate to HAL if the response message is required
 * @rmfEnabled: Robust Management Frame (RMF) enabled/disabled
 * @encryptType: The unicast encryption type in the association
 * @ucUcastSig: Unicast DPU index
 * @ucBcastSig: Broadcast DPU index
 * @sessionId: PE session id
 * @p2pCapableSta: if this is a P2P Capable Sta
 * @csaOffloadEnable: CSA offload enable flag
 * @vhtCapable: is VHT capabale or not
 * @vhtTxChannelWidthSet: VHT channel width
 * @vhtSupportedRxNss: VHT supported RX NSS
 * @vhtTxBFCapable: txbf capable or not
 * @vhtTxMUBformeeCapable: Bformee capable or not
 * @enableVhtpAid: enable VHT AID
 * @enableVhtGid: enable VHT GID
 * @enableAmpduPs: AMPDU power save
 * @enableHtSmps: enable HT SMPS
 * @htSmpsconfig: HT SMPS config
 * @htLdpcCapable: HT LDPC capable
 * @vhtLdpcCapable: VHT LDPC capable
 * @smesessionId: sme session id
 * @wpa_rsn: RSN capable
 * @capab_info: capabality info
 * @ht_caps: HT capabalities
 * @vht_caps: VHT vapabalities
 * @nwType: NW Type
 * @maxTxPower: max tx power
 * @atimIePresent: Peer Atim Info
 * @peerAtimWindowLength: peer ATIM Window length
 *
 * This structure contains parameter required for
 * add sta request of upper layer.
 */
typedef struct {
	tSirMacAddr bssId;
	uint16_t assocId;
	/* Field to indicate if this is sta entry for itself STA adding entry
	 * for itself or remote (AP adding STA after successful association.
	 * This may or may not be required in production driver.
	 */
	uint8_t staType;
	uint8_t shortPreambleSupported;
	tSirMacAddr staMac;
	uint16_t listenInterval;
	uint8_t wmmEnabled;
	uint8_t uAPSD;
	uint8_t maxSPLen;
	uint8_t htCapable;
	/* 11n Green Field preamble support
	 * 0 - Not supported, 1 - Supported
	 * Add it to RA related fields of sta entry in HAL
	 */
	uint8_t greenFieldCapable;
	uint8_t ch_width;

	tSirMacHTMIMOPowerSaveState mimoPS;
	uint8_t rifsMode;
	/* L-SIG TXOP Protection mechanism
	 * 0 - No Support, 1 - Supported
	 * SG - there is global field.
	 */
	uint8_t lsigTxopProtection;
	uint8_t us32MaxAmpduDuration;
	uint8_t maxAmpduSize;
	uint8_t maxAmpduDensity;
	uint8_t maxAmsduSize;

	/* 11n Parameters */
	/* HT STA should set it to 1 if it is enabled in BSS
	 * HT STA should set it to 0 if AP does not support it.
	 * This indication is sent to HAL and HAL uses this flag
	 * to pickup up appropriate 40Mhz rates.
	 */
	uint8_t fDsssCckMode40Mhz;
	uint8_t fShortGI40Mhz;
	uint8_t fShortGI20Mhz;
	tSirSupportedRates supportedRates;
	/*
	 * Following parameters are for returning status and station index from
	 * HAL to PE via response message. HAL does not read them.
	 */
	/* The return status of SIR_HAL_ADD_STA_REQ is reported here */
	CDF_STATUS status;
	/* Station index; valid only when 'status' field value is
	 * CDF_STATUS_SUCCESS
	 */
	uint8_t staIdx;
	/* BSSID of BSS to which the station is associated.
	 * This should be filled back in by HAL, and sent back to LIM as part of
	 * the response message, so LIM can cache it in the station entry of
	 * hash table. When station is deleted, LIM will make use of this bssIdx
	 * to delete BSS from hal tables and from softmac.
	 */
	uint8_t bssIdx;
	uint8_t updateSta;
	uint8_t respReqd;
	uint8_t rmfEnabled;
	uint32_t encryptType;
	uint8_t ucUcastSig;
	uint8_t ucBcastSig;
	uint8_t sessionId;
	uint8_t p2pCapableSta;
	uint8_t csaOffloadEnable;
	uint8_t vhtCapable;
	uint8_t vhtSupportedRxNss;
	uint8_t vhtTxBFCapable;
	uint8_t enable_su_tx_bformer;
	uint8_t vhtTxMUBformeeCapable;
	uint8_t enableVhtpAid;
	uint8_t enableVhtGid;
	uint8_t enableAmpduPs;
	uint8_t enableHtSmps;
	uint8_t htSmpsconfig;
	uint8_t htLdpcCapable;
	uint8_t vhtLdpcCapable;
	uint8_t smesessionId;
	uint8_t wpa_rsn;
	uint16_t capab_info;
	uint16_t ht_caps;
	uint32_t vht_caps;
	tSirNwType nwType;
	tPowerdBm maxTxPower;
	uint8_t atimIePresent;
	uint32_t peerAtimWindowLength;
	uint8_t nonRoamReassoc;
} tAddStaParams, *tpAddStaParams;

/**
 * struct tDeleteStaParams - parameters required for del sta request
 * @staIdx: station index
 * @assocId: association index
 * @status: status
 * @respReqd: is response required
 * @sessionId: PE session id
 * @smesessionId: SME session id
 * @staType: station type
 * @staMac: station mac
 */
typedef struct {
	uint16_t staIdx;
	uint16_t assocId;
	CDF_STATUS status;
	uint8_t respReqd;
	uint8_t sessionId;
	uint8_t smesessionId;
	uint8_t staType;
	tSirMacAddr staMac;
} tDeleteStaParams, *tpDeleteStaParams;

/**
 * struct tSetStaKeyParams - set key params
 * @staIdx: station id
 * @encType: encryption type
 * @wepType: WEP type
 * @defWEPIdx: Default WEP key, valid only for static WEP, must between 0 and 3
 * @key: valid only for non-static WEP encyrptions
 * @singleTidRc: 1=Single TID based Replay Count, 0=Per TID based RC
 * @smesessionId: sme session id
 * @peerMacAddr: peer mac address
 * @status: status
 * @sessionId: session id
 * @sendRsp: send response
 *
 * This is used by PE to configure the key information on a given station.
 * When the secType is WEP40 or WEP104, the defWEPIdx is used to locate
 * a preconfigured key from a BSS the station assoicated with; otherwise
 * a new key descriptor is created based on the key field.
 */
typedef struct {
	uint16_t staIdx;
	tAniEdType encType;
	tAniWepType wepType;
	uint8_t defWEPIdx;
	tSirKeys key[SIR_MAC_MAX_NUM_OF_DEFAULT_KEYS];
	uint8_t singleTidRc;
	uint8_t smesessionId;
	tSirMacAddr peerMacAddr;
	CDF_STATUS status;
	uint8_t sessionId;
	uint8_t sendRsp;
} tSetStaKeyParams, *tpSetStaKeyParams;

/**
 * struct sLimMlmSetKeysReq - set key request parameters
 * @peerMacAddr: peer mac address
 * @sessionId: PE session id
 * @smesessionId: SME session id
 * @aid: association id
 * @edType: Encryption/Decryption type
 * @numKeys: number of keys
 * @key: key data
 */
typedef struct sLimMlmSetKeysReq {
	tSirMacAddr peerMacAddr;
	uint8_t sessionId;      /* Added For BT-AMP Support */
	uint8_t smesessionId;   /* Added for drivers based on wmi interface */
	uint16_t aid;
	tAniEdType edType;      /* Encryption/Decryption type */
	uint8_t numKeys;
	tSirKeys key[SIR_MAC_MAX_NUM_OF_DEFAULT_KEYS];
} tLimMlmSetKeysReq, *tpLimMlmSetKeysReq;

/**
 * struct tAddBssParams - parameters required for add bss params
 * @bssId: MAC Address/BSSID
 * @selfMacAddr: Self Mac Address
 * @bssType: BSS type
 * @operMode: AP - 0; STA - 1;
 * @nwType: network type
 * @shortSlotTimeSupported: is short slot time supported or not
 * @llaCoexist: is 11a coexist or not
 * @llbCoexist: 11b coexist supported or not
 * @llgCoexist: 11g coexist supported or not
 * @ht20Coexist: HT20 coexist supported or not
 * @fLsigTXOPProtectionFullSupport: TXOP protection supported or not
 * @fRIFSMode: RIFS is supported or not
 * @beaconInterval: beacon interval
 * @dtimPeriod: DTIM period
 * @cfParamSet: CF Param Set
 * @rateSet: MAC Rate Set
 * @htCapable: Enable/Disable HT capabilities
 * @obssProtEnabled: Enable/Disable OBSS protection
 * @rmfEnabled: RMF enabled/disabled
 * @htOperMode: HT Operating Mode
 * @HT Operating Mode: Dual CTS Protection: 0 - Unused, 1 - Used
 * @txChannelWidthSet: TX Width Set: 0 - 20 MHz only, 1 - 20/40 MHz
 * @currentOperChannel: Current Operating Channel
 * @currentExtChannel: Current Extension Channel, if applicable
 * @staContext: sta context
 * @status: status
 * @bssIdx: BSS index allocated by HAL
 * @updateBss: update the existing BSS entry, if this flag is set
 * @ssId: Add BSSID info for rxp filter
 * @respReqd: send the response message to LIM only when this flag is set
 * @sessionId: PE session id
 * @txMgmtPower: tx power used for mgmt frames
 * @maxTxPower: max power to be used after applying the power constraint
 * @extSetStaKeyParamValid: Ext Bss Config Msg if set
 * @extSetStaKeyParam: SetStaKeyParams for ext bss msg
 * @ucMaxProbeRespRetryLimit: probe Response Max retries
 * @bHiddenSSIDEn: To Enable Hidden ssid.
 * @bProxyProbeRespEn: To Enable Disable FW Proxy Probe Resp
 * @halPersona: Persona for the BSS can be STA,AP,GO,CLIENT value
 * @bSpectrumMgtEnabled: Spectrum Management Capability, 1:Enabled, 0:Disabled.
 * @vhtCapable: VHT capablity
 * @vhtTxChannelWidthSet: VHT tx channel width
 * @reassocReq: Set only during roaming reassociation
 * @chainMask: chain mask
 * @smpsMode: SMPS mode
 * @dot11_mode: 802.11 mode
 */
typedef struct {
	tSirMacAddr bssId;
#ifdef HAL_SELF_STA_PER_BSS
	tSirMacAddr selfMacAddr;
#endif /* HAL_SELF_STA_PER_BSS */
	tSirBssType bssType;
	uint8_t operMode;
	tSirNwType nwType;
	uint8_t shortSlotTimeSupported;
	uint8_t llaCoexist;
	uint8_t llbCoexist;
	uint8_t llgCoexist;
	uint8_t ht20Coexist;
	uint8_t llnNonGFCoexist;
	uint8_t fLsigTXOPProtectionFullSupport;
	uint8_t fRIFSMode;
	tSirMacBeaconInterval beaconInterval;
	uint8_t dtimPeriod;
	tSirMacCfParamSet cfParamSet;
	tSirMacRateSet rateSet;
	uint8_t htCapable;
	uint8_t obssProtEnabled;
	uint8_t rmfEnabled;
	tSirMacHTOperatingMode htOperMode;
	uint8_t dualCTSProtection;
	uint8_t txChannelWidthSet;
	uint8_t currentOperChannel;
	tAddStaParams staContext;
	CDF_STATUS status;
	uint16_t bssIdx;
	/* HAL should update the existing BSS entry, if this flag is set.
	 * PE will set this flag in case of reassoc, where we want to resue the
	 * the old bssID and still return success.
	 */
	uint8_t updateBss;
	tSirMacSSid ssId;
	uint8_t respReqd;
	uint8_t sessionId;
#if defined WLAN_FEATURE_VOWIFI
	tPowerdBm txMgmtPower;
	tPowerdBm maxTxPower;
#endif /* WLAN_FEATURE_VOWIFI */

#if defined WLAN_FEATURE_VOWIFI_11R
	uint8_t extSetStaKeyParamValid;
	tSetStaKeyParams extSetStaKeyParam;
#endif /* WLAN_FEATURE_VOWIFI_11R */

	uint8_t ucMaxProbeRespRetryLimit;
	uint8_t bHiddenSSIDEn;
	uint8_t bProxyProbeRespEn;
	uint8_t halPersona;
	uint8_t bSpectrumMgtEnabled;
	uint8_t vhtCapable;
	phy_ch_width ch_width;
	uint8_t ch_center_freq_seg0;
	uint8_t ch_center_freq_seg1;
	uint8_t reassocReq;     /* Set only during roaming reassociation */
	uint16_t chainMask;
	uint16_t smpsMode;
	uint8_t dot11_mode;
	uint8_t nonRoamReassoc;
	uint8_t wps_state;
	uint8_t nss;
} tAddBssParams, *tpAddBssParams;

/**
 * struct tDeleteBssParams - params required for del bss request
 * @bssIdx: BSSID
 * @status: CDF status
 * @respReqd: response message to LIM only when this flag is set
 * @sessionId: PE session id
 * @bssid: BSSID mac address
 * @smesessionId: sme session id
 */
typedef struct {
	uint8_t bssIdx;
	CDF_STATUS status;
	uint8_t respReqd;
	uint8_t sessionId;
	tSirMacAddr bssid;
	uint8_t smesessionId;
} tDeleteBssParams, *tpDeleteBssParams;

/**
 * struct sSirScanEntry - scan entry
 * @bssIdx: BSSID
 * @activeBSScnt: active BSS count
 */
typedef struct sSirScanEntry {
	uint8_t bssIdx[HAL_NUM_BSSID];
	uint8_t activeBSScnt;
} tSirScanEntry, *ptSirScanEntry;

/**
 * struct tInitScanParams - params required for init scan request
 * @bssid: BSSID
 * @notifyBss: notify BSS
 * @useNoA: use NOA
 * @notifyHost: notify UMAC if set
 * @frameLength: frame length
 * @frameType: frame type
 * @scanDuration: Indicates the scan duration (in ms)
 * @macMgmtHdr: For creation of CTS-to-Self and Data-NULL MAC packets
 * @scanEntry: scan entry
 * @checkLinkTraffic: when this flag is set, HAL should check for
 *                    link traffic prior to scan
 * @status: status
 */
typedef struct {
	tSirMacAddr bssid;
	uint8_t notifyBss;
	uint8_t useNoA;
	uint8_t notifyHost;
	uint8_t frameLength;
	uint8_t frameType;
	uint16_t scanDuration;
	tSirMacMgmtHdr macMgmtHdr;
	tSirScanEntry scanEntry;
	tSirLinkTrafficCheck checkLinkTraffic;
	CDF_STATUS status;
} tInitScanParams, *tpInitScanParams;

typedef enum eDelStaReasonCode {
	HAL_DEL_STA_REASON_CODE_KEEP_ALIVE = 0x1,
	HAL_DEL_STA_REASON_CODE_TIM_BASED = 0x2,
	HAL_DEL_STA_REASON_CODE_RA_BASED = 0x3,
	HAL_DEL_STA_REASON_CODE_UNKNOWN_A2 = 0x4
} tDelStaReasonCode;

typedef enum eSmpsModeValue {
	STATIC_SMPS_MODE = 0x0,
	DYNAMIC_SMPS_MODE = 0x1,
	SMPS_MODE_RESERVED = 0x2,
	SMPS_MODE_DISABLED = 0x3
} tSmpsModeValue;

/**
 * struct tDeleteStaContext - params required for delete sta request
 * @assocId: association id
 * @staId: station id
 * @bssId: mac address
 * @addr2: mac address
 * @reasonCode: reason code
 */
typedef struct {
	uint16_t assocId;
	uint16_t staId;
	tSirMacAddr bssId;
	tSirMacAddr addr2;
	uint16_t reasonCode;
} tDeleteStaContext, *tpDeleteStaContext;

/**
 * struct tStartScanParams - params required for start scan request
 * @scanChannel: Indicates the current scan channel
 * @status: return status
 * @startTSF: TSF value
 * @txMgmtPower: TX mgmt power
 */
typedef struct {
	uint8_t scanChannel;
	CDF_STATUS status;
#if defined WLAN_FEATURE_VOWIFI
	uint32_t startTSF[2];
	tPowerdBm txMgmtPower;
#endif /* WLAN_FEATURE_VOWIFI */
} tStartScanParams, *tpStartScanParams;

/**
 * struct tEndScanParams - params required for end scan request
 * @scanChannel: Indicates the current scan channel
 * @status: return status
 */
typedef struct {
	uint8_t scanChannel;
	CDF_STATUS status;
} tEndScanParams, *tpEndScanParams;

/**
 * struct tFinishScanParams - params required for finish scan request
 * @bssid: BSSID
 * @currentOperChannel: Current operating channel
 * @cbState: channel bond state
 * @notifyBss: notify BSS flag
 * @notifyHost: notify host flag
 * @frameLength: frame length
 * @frameType: frame type
 * @macMgmtHdr: For creation of CTS-to-Self and Data-NULL MAC packets
 * @scanEntry: scan entry
 * @status: return status
 * Request Type = SIR_HAL_FINISH_SCAN_REQ
 */
typedef struct {
	tSirMacAddr bssid;
	uint8_t currentOperChannel;
	/* If 20/40 MHz is operational, this will indicate the 40 MHz extension
	 * channel in combination with the control channel
	 */
	ePhyChanBondState cbState;
	/* For an STA, indicates if a Data NULL frame needs to be sent
	 * to the AP with FrameControl.PwrMgmt bit set to 0
	 */
	uint8_t notifyBss;
	uint8_t notifyHost;
	uint8_t frameLength;
	uint8_t frameType;
	tSirMacMgmtHdr macMgmtHdr;
	tSirScanEntry scanEntry;
	CDF_STATUS status;
} tFinishScanParams, *tpFinishScanParams;

#ifdef FEATURE_OEM_DATA_SUPPORT

#ifndef OEM_DATA_REQ_SIZE
#define OEM_DATA_REQ_SIZE 280
#endif
#ifndef OEM_DATA_RSP_SIZE
#define OEM_DATA_RSP_SIZE 1724
#endif

/**
 * struct tStartOemDataReq - start OEM Data request
 * @selfMacAddr: self mac address
 * @status: return status
 * @oemDataReq: OEM Data request
 */
typedef struct {
	tSirMacAddr selfMacAddr;
	CDF_STATUS status;
	uint8_t oemDataReq[OEM_DATA_REQ_SIZE];
} tStartOemDataReq, *tpStartOemDataReq;

/**
 * struct tStartOemDataRsp - start OEM Data response
 * @oemDataRsp: OEM Data response
 */
typedef struct {
	uint8_t oemDataRsp[OEM_DATA_RSP_SIZE];
} tStartOemDataRsp, *tpStartOemDataRsp;
#endif /* FEATURE_OEM_DATA_SUPPORT */

/**
 * struct tBeaconGenParams - params required for beacon gen request
 * @bssIdx: Identifies the BSSID for which it is time to generate a beacon
 * @bssId: BSSID
 * @numOfSta: Number of stations in power save, who have data pending
 * @numOfStaWithoutData: Number of stations in power save,
 *                       who don't have any data pending
 * @fBroadcastTrafficPending: broadcast traffic pending flag
 * @dtimCount: DTIM count
 * @rsvd: reserved(padding)
 */
typedef struct sBeaconGenParams {
	uint8_t bssIdx;
	tSirMacAddr bssId;
#ifdef FIXME_VOLANS
	uint8_t numOfSta;
	uint8_t numOfStaWithoutData;
	uint8_t fBroadcastTrafficPending;
	uint8_t dtimCount;
#endif /* FIXME_VOLANS */
	uint8_t rsvd[3];
} tBeaconGenParams, *tpBeaconGenParams;

/**
 * struct tSendbeaconParams - send beacon parameters
 * @bssId: BSSID mac address
 * @beacon: beacon data
 * @beaconLength: beacon length of template
 * @timIeOffset: TIM IE offset
 * @p2pIeOffset: P2P IE offset
 */
typedef struct {
	tSirMacAddr bssId;
	uint8_t *beacon;
	uint32_t beaconLength;
	uint32_t timIeOffset;
	uint16_t p2pIeOffset;
} tSendbeaconParams, *tpSendbeaconParams;

/**
 * struct tSendProbeRespParams - send probe response parameters
 * @bssId: BSSID
 * @pProbeRespTemplate: probe response template
 * @probeRespTemplateLen: probe response template length
 * @ucProxyProbeReqValidIEBmap: valid IE bitmap
 */
typedef struct sSendProbeRespParams {
	tSirMacAddr bssId;
	uint8_t *pProbeRespTemplate;
	uint32_t probeRespTemplateLen;
	uint32_t ucProxyProbeReqValidIEBmap[8];
} tSendProbeRespParams, *tpSendProbeRespParams;

/**
 * struct tSetBssKeyParams - BSS key parameters
 * @bssIdx: BSSID index
 * @encType: encryption Type
 * @numKeys: number of keys
 * @key: key data
 * @singleTidRc: 1=Single TID based Replay Count, 0=Per TID based RC
 * @smesessionId: sme session id
 * @status: return status of command
 * @sessionId: PE session id
 */
typedef struct {
	uint8_t bssIdx;
	tAniEdType encType;
	uint8_t numKeys;
	tSirKeys key[SIR_MAC_MAX_NUM_OF_DEFAULT_KEYS];
	uint8_t singleTidRc;
	uint8_t smesessionId;
	CDF_STATUS status;
	uint8_t sessionId;
} tSetBssKeyParams, *tpSetBssKeyParams;

/**
 * struct tUpdateBeaconParams - update beacon request parameters
 * @bssIdx: BSSID index
 * @fShortPreamble: shortPreamble mode
 * @fShortSlotTime: short Slot time
 * @beaconInterval: Beacon Interval
 * @llaCoexist: 11a coexist
 * @llbCoexist: 11b coexist
 * @llgCoexist: 11g coexist
 * @ht20MhzCoexist: HT 20MHz coexist
 * @fLsigTXOPProtectionFullSupport: TXOP protection supported or not
 * @fRIFSMode: RIFS mode
 * @paramChangeBitmap: change bitmap
 * @smeSessionId: SME  session id
 */
typedef struct {
	uint8_t bssIdx;
	uint8_t fShortPreamble;
	uint8_t fShortSlotTime;
	uint16_t beaconInterval;
	uint8_t llaCoexist;
	uint8_t llbCoexist;
	uint8_t llgCoexist;
	uint8_t ht20MhzCoexist;
	uint8_t llnNonGFCoexist;
	uint8_t fLsigTXOPProtectionFullSupport;
	uint8_t fRIFSMode;
	uint16_t paramChangeBitmap;
	uint8_t smeSessionId;
} tUpdateBeaconParams, *tpUpdateBeaconParams;

#ifdef WLAN_FEATURE_11AC
/**
 * struct tUpdateVHTOpMode - VHT operating mode
 * @opMode: VHT operating mode
 * @staId: station id
 * @smesessionId: SME session id
 * @peer_mac: peer mac address
 */
typedef struct {
	uint16_t opMode;
	uint16_t staId;
	uint16_t smesessionId;
	tSirMacAddr peer_mac;
} tUpdateVHTOpMode, *tpUpdateVHTOpMode;

/**
 * struct tUpdateRxNss - update rx nss parameters
 * @rxNss: rx nss value
 * @staId: station id
 * @smesessionId: sme session id
 * @peer_mac: peer mac address
 */
typedef struct {
	uint16_t rxNss;
	uint16_t staId;
	uint16_t smesessionId;
	tSirMacAddr peer_mac;
} tUpdateRxNss, *tpUpdateRxNss;

/**
 * struct tUpdateMembership - update membership parmaters
 * @membership: membership value
 * @staId: station id
 * @smesessionId: SME session id
 * @peer_mac: peer mac address
 */
typedef struct {
	uint32_t membership;
	uint16_t staId;
	uint16_t smesessionId;
	tSirMacAddr peer_mac;
} tUpdateMembership, *tpUpdateMembership;

/**
 * struct tUpdateUserPos - update user position parmeters
 * @userPos: user position
 * @staId: station id
 * @smesessionId: sme session id
 * @peer_mac: peer mac address
 */
typedef struct {
	uint32_t userPos;
	uint16_t staId;
	uint16_t smesessionId;
	tSirMacAddr peer_mac;
} tUpdateUserPos, *tpUpdateUserPos;

#endif /* WLAN_FEATURE_11AC */

/**
 * struct tUpdateCFParams -CF parameters
 * @bssIdx: BSSID index
 * @cfpCount: CFP count
 * @cfpPeriod: the number of DTIM intervals between the start of CFPs
 */
typedef struct {
	uint8_t bssIdx;
	/*
	 * cfpCount indicates how many DTIMs (including the current frame)
	 * appear before the next CFP start. A CFPCount of 0 indicates that
	 * the current DTIM marks the start of the CFP.
	 */
	uint8_t cfpCount;
	uint8_t cfpPeriod;
} tUpdateCFParams, *tpUpdateCFParams;

/**
 * struct tSwitchChannelParams - switch channel request parameter
 * @channelNumber: channel number
 * @localPowerConstraint: local power constraint
 * @secondaryChannelOffset: scondary channel offset
 * @peSessionId: PE session id
 * @txMgmtPower: TX mgmt power
 * @maxTxPower: max tx power
 * @selfStaMacAddr: self mac address
 * @bssId: bssid
 * @status: CDF status
 * @chainMask: chanin mask
 * @smpsMode: SMPS mode
 * @isDfsChannel: is DFS channel
 * @vhtCapable: VHT capable
 * @dot11_mode: 802.11 mode
 */
typedef struct {
	uint8_t channelNumber;
#ifndef WLAN_FEATURE_VOWIFI
	uint8_t localPowerConstraint;
#endif /* WLAN_FEATURE_VOWIFI  */
	uint8_t peSessionId;
#if defined WLAN_FEATURE_VOWIFI
	tPowerdBm txMgmtPower;
	tPowerdBm maxTxPower;
#endif /* WLAN_FEATURE_VOWIFI */
	tSirMacAddr selfStaMacAddr;
	/* the request has power constraints, this should be applied only to
	 * that session
	 * VO Wifi comment: BSSID is needed to identify which session issued
	 * this request. As the request has power constraints, this should be
	 * applied only to that session
	 * V IMP: Keep bssId field at the end of this msg.
	 * It is used to mantain backward compatbility by way of ignoring if
	 * using new host/old FW or old host/new FW since it is at the end of
	 * this struct
	 */
	tSirMacAddr bssId;
	CDF_STATUS status;
	uint16_t chainMask;
	uint16_t smpsMode;
	uint8_t isDfsChannel;
	uint8_t vhtCapable;
	phy_ch_width ch_width;
	uint8_t ch_center_freq_seg0;
	uint8_t ch_center_freq_seg1;
	uint8_t dot11_mode;

	uint8_t restart_on_chan_switch;
	uint8_t nss;
} tSwitchChannelParams, *tpSwitchChannelParams;

/**
 * struct tpCSAOffloadParams - CSA offload request parameters
 * @channel: channel
 * @switchmode: switch mode
 * @sec_chan_offset: second channel offset
 * @new_ch_width: new channel width
 * @new_ch_freq_seg1: channel center freq 1
 * @new_ch_freq_seg2: channel center freq 2
 * @ies_present_flag: IE present flag
 */
typedef struct CSAOffloadParams {
	uint8_t channel;
	uint8_t switchmode;
	uint8_t sec_chan_offset;
	uint8_t new_ch_width;
	uint8_t new_ch_freq_seg1;
	uint8_t new_ch_freq_seg2;
	uint32_t ies_present_flag;
	tSirMacAddr bssId;
} *tpCSAOffloadParams, tCSAOffloadParams;

typedef void (*tpSetLinkStateCallback)(tpAniSirGlobal pMac, void *msgParam,
		bool status);

/**
 * struct tLinkStateParams - link state parameters
 * @bssid: BSSID
 * @selfMacAddr: self mac address
 * @state: link state
 * @callback: callback function pointer
 * @callbackArg: callback argument
 * @session: session context
 */
typedef struct sLinkStateParams {
	/* SIR_HAL_SET_LINK_STATE */
	tSirMacAddr bssid;
	tSirMacAddr selfMacAddr;
	tSirLinkState state;
	tpSetLinkStateCallback callback;
	void *callbackArg;
#ifdef WLAN_FEATURE_VOWIFI_11R
	int ft;
	void *session;
#endif /* WLAN_FEATURE_VOWIFI_11R */
	bool status;
} tLinkStateParams, *tpLinkStateParams;

/**
 * struct tAddTsParams - ADDTS related parameters
 * @staIdx: station index
 * @tspecIdx: TSPEC handler uniquely identifying a TSPEC for a STA in a BSS
 * @tspec: tspec value
 * @status: CDF status
 * @sessionId: session id
 * @tsm_interval: TSM interval period passed from lim to WMA
 * @setRICparams: RIC parameters
 * @sme_session_id: sme session id
 */
typedef struct {
	uint16_t staIdx;
	uint16_t tspecIdx;
	tSirMacTspecIE tspec;
	CDF_STATUS status;
	uint8_t sessionId;
#ifdef FEATURE_WLAN_ESE
	uint16_t tsm_interval;
#endif /* FEATURE_WLAN_ESE */
#ifdef WLAN_FEATURE_ROAM_OFFLOAD
	uint8_t setRICparams;
#endif /* WLAN_FEATURE_ROAM_OFFLOAD */
	uint8_t sme_session_id;
} tAddTsParams, *tpAddTsParams;

/**
 * struct tDelTsParams - DELTS related parameters
 * @staIdx: station index
 * @tspecIdx: TSPEC identifier uniquely identifying a TSPEC for a STA in a BSS
 * @bssId: BSSID
 * @sessionId: session id
 * @userPrio: user priority
 * @delTsInfo: DELTS info
 * @setRICparams: RIC parameters
 */
typedef struct {
	uint16_t staIdx;
	uint16_t tspecIdx;
	tSirMacAddr bssId;
	uint8_t sessionId;
	uint8_t userPrio;
#ifdef WLAN_FEATURE_ROAM_OFFLOAD
	tSirDeltsReqInfo delTsInfo;
	uint8_t setRICparams;
#endif /* WLAN_FEATURE_ROAM_OFFLOAD */
} tDelTsParams, *tpDelTsParams;

#ifdef WLAN_FEATURE_VOWIFI_11R

#define HAL_QOS_NUM_TSPEC_MAX 2
#define HAL_QOS_NUM_AC_MAX 4

/**
 * struct tAggrAddTsParams - ADDTS parameters
 * @staIdx: station index
 * @tspecIdx: TSPEC handler uniquely identifying a TSPEC for a STA in a BSS
 * @tspec: tspec value
 * @status: CDF status
 * @sessionId: session id
 */
typedef struct {
	uint16_t staIdx;
	uint16_t tspecIdx;
	tSirMacTspecIE tspec[HAL_QOS_NUM_AC_MAX];
	CDF_STATUS status[HAL_QOS_NUM_AC_MAX];
	uint8_t sessionId;
} tAggrAddTsParams, *tpAggrAddTsParams;

#endif /* WLAN_FEATURE_VOWIFI_11R */

typedef tSirRetStatus (*tHalMsgCallback)(tpAniSirGlobal pMac, uint32_t mesgId,
					 void *mesgParam);

/**
 * struct tEdcaParams - EDCA parameters
 * @bssIdx: BSSID index
 * @acbe: best effort access catagory
 * @acbk: Background access catagory
 * @acvi: video access catagory
 * @acvo: voice access catagory
 */
typedef struct {
	uint16_t bssIdx;
	tSirMacEdcaParamRecord acbe;
	tSirMacEdcaParamRecord acbk;
	tSirMacEdcaParamRecord acvi;
	tSirMacEdcaParamRecord acvo;
} tEdcaParams, *tpEdcaParams;

/**
 * struct tSetMIMOPS - MIMO power save related parameters
 * @staIdx: station index
 * @htMIMOPSState: MIMO Power Save State
 * @status: response status
 * @fsendRsp: send response flag
 * @peerMac: peer mac address
 * @sessionId: session id
 */
typedef struct sSet_MIMOPS {
	uint16_t staIdx;
	tSirMacHTMIMOPowerSaveState htMIMOPSState;
	CDF_STATUS status;
	uint8_t fsendRsp;
	tSirMacAddr peerMac;
	uint8_t sessionId;
} tSetMIMOPS, *tpSetMIMOPS;

/**
 * struct tUapsdParams - Uapsd related parameters
 * @bkDeliveryEnabled: BK delivery enable flag
 * @beDeliveryEnabled: BE delivery enable flag
 * @viDeliveryEnabled: VI delivery enable flag
 * @voDeliveryEnabled: VO delivery enable flag
 * @bkTriggerEnabled: BK trigger enable flag
 * @beTriggerEnabled: BE trigger enable flag
 * @viTriggerEnabled: VI trigger enable flag
 * @voTriggerEnabled: VO trigger enable flag
 * @status: response status
 * @bssIdx: BSSID index
 * Request Type = SIR_HAL_ENTER_UAPSD_REQ
 */
typedef struct sUapsdParams {
	uint8_t bkDeliveryEnabled:1;
	uint8_t beDeliveryEnabled:1;
	uint8_t viDeliveryEnabled:1;
	uint8_t voDeliveryEnabled:1;
	uint8_t bkTriggerEnabled:1;
	uint8_t beTriggerEnabled:1;
	uint8_t viTriggerEnabled:1;
	uint8_t voTriggerEnabled:1;
	CDF_STATUS status;
	uint8_t bssIdx;
} tUapsdParams, *tpUapsdParams;

/**
 * struct tHalIndCB - hal message indication callback
 * @pHalIndCB: hal message indication callabck
 */
typedef struct tHalIndCB {
	tHalMsgCallback pHalIndCB;
} tHalIndCB, *tpHalIndCB;

/**
 * struct sControlTxParams - control tx parameters
 * @stopTx: stop transmission
 * @fCtrlGlobal:  Master flag to stop or resume all transmission
 * @ctrlSta: If this flag is set, staBitmap
 * @ctrlBss: If this flag is set, bssBitmap and beaconBitmap is valid
 * @bssBitmap: bitmap of BSS indices to be stopped for resumed
 * @beaconBitmap: this bitmap contains bitmap of BSS indices to be
 *                stopped for resumed for beacon transmission
 */
typedef struct sControlTxParams {
	bool stopTx;
	uint8_t fCtrlGlobal;
	uint8_t ctrlSta;
	uint8_t ctrlBss;
	/* When ctrlBss is set, this bitmap contains bitmap of BSS indices to be
	 * stopped for resumed for transmission.
	 * This is 32 bit bitmap, not array of bytes.
	 */
	uint32_t bssBitmap;
	/* When ctrlBss is set, this bitmap contains bitmap of BSS indices to be
	 * stopped for resumed for beacon transmission.
	 */
	uint32_t beaconBitmap;
} tTxControlParams, *tpTxControlParams;

/**
 * struct tMaxTxPowerParams - Max Tx Power parameters
 * @bssId: BSSID is needed to identify which session issued this request
 * @selfStaMacAddr: self mac address
 * @power: tx power in dbm
 * @dev_mode: device mode
 * Request Type = SIR_HAL_SET_MAX_TX_POWER_REQ
 */
typedef struct sMaxTxPowerParams {
	tSirMacAddr bssId;
	tSirMacAddr selfStaMacAddr;
	/* In request,
	 * power == MaxTx power to be used.
	 * In response,
	 * power == tx power used for management frames.
	 */
	tPowerdBm power;
	tCDF_CON_MODE dev_mode;
} tMaxTxPowerParams, *tpMaxTxPowerParams;

/**
 * struct tMaxTxPowerPerBandParams - max tx power per band info
 * @bandInfo: band info
 * @power: power in dbm
 */
typedef struct sMaxTxPowerPerBandParams {
	eCsrBand bandInfo;
	tPowerdBm power;
} tMaxTxPowerPerBandParams, *tpMaxTxPowerPerBandParams;

/**
 * struct add_sta_self_params - Add Sta Self params
 * @self_mac_addr: self MAC Address
 * @curr_device_mode: operating device mode
 * @type: Vdev Type
 * @sub_type: Vdev Sub Type
 * @session_id: SME Session ID
 * @status: response status code
 */
struct add_sta_self_params {
	tSirMacAddr self_mac_addr;
	tCDF_CON_MODE curr_device_mode;
	uint32_t type;
	uint32_t sub_type;
	uint8_t session_id;
	uint32_t status;
};

#ifdef FEATURE_WLAN_TDLS

#define HAL_TDLS_MAX_SUPP_CHANNELS       128
#define HAL_TDLS_MAX_SUPP_OPER_CLASSES   32

/**
 * struct tTdlsPeerCapParams - TDLS peer capablities parameters
 * @isPeerResponder: is peer responder or not
 * @peerUapsdQueue: peer uapsd queue
 * @peerMaxSp: peer max SP value
 * @peerBuffStaSupport: peer buffer sta supported or not
 * @peerOffChanSupport: peer offchannel support
 * @peerCurrOperClass: peer current operating class
 * @selfCurrOperClass: self current operating class
 * @peerChanLen: peer channel length
 * @peerChan: peer channel list
 * @peerOperClassLen: peer operating class length
 * @peerOperClass: peer operating class
 * @prefOffChanNum: peer offchannel number
 * @prefOffChanBandwidth: peer offchannel bandwidth
 * @opClassForPrefOffChan: operating class for offchannel
 */
typedef struct {
	uint8_t isPeerResponder;
	uint8_t peerUapsdQueue;
	uint8_t peerMaxSp;
	uint8_t peerBuffStaSupport;
	uint8_t peerOffChanSupport;
	uint8_t peerCurrOperClass;
	uint8_t selfCurrOperClass;
	uint8_t peerChanLen;
	tSirUpdateChanParam peerChan[HAL_TDLS_MAX_SUPP_CHANNELS];
	uint8_t peerOperClassLen;
	uint8_t peerOperClass[HAL_TDLS_MAX_SUPP_OPER_CLASSES];
	uint8_t prefOffChanNum;
	uint8_t prefOffChanBandwidth;
	uint8_t opClassForPrefOffChan;
} tTdlsPeerCapParams;

/**
 * struct tTdlsPeerStateParams - TDLS peer state parameters
 * @vdevId: vdev id
 * @peerMacAddr: peer mac address
 * @peerCap: peer capabality
 */
typedef struct sTdlsPeerStateParams {
	uint32_t vdevId;
	tSirMacAddr peerMacAddr;
	uint32_t peerState;
	tTdlsPeerCapParams peerCap;
} tTdlsPeerStateParams;

/**
 * struct tdls_chan_switch_params - channel switch parameter structure
 * @vdev_id: vdev ID
 * @peer_mac_addr: Peer mac address
 * @tdls_off_ch_bw_offset: Target off-channel bandwitdh offset
 * @tdls_off_ch: Target Off Channel
 * @oper_class: Operating class for target channel
 * @is_responder: Responder or initiator
 */
typedef struct tdls_chan_switch_params_struct {
	uint32_t    vdev_id;
	tSirMacAddr peer_mac_addr;
	uint16_t    tdls_off_ch_bw_offset;
	uint8_t     tdls_off_ch;
	uint8_t     tdls_sw_mode;
	uint8_t     oper_class;
	uint8_t     is_responder;
} tdls_chan_switch_params;

#endif /* FEATURE_WLAN_TDLS */

/**
 * struct tAbortScanParams - Abort scan parameters
 * @SessionId: session id
 */
typedef struct sAbortScanParams {
	uint8_t SessionId;
	uint32_t scan_id;
} tAbortScanParams, *tpAbortScanParams;

/**
 * struct del_sta_self_params - Del Sta Self params
 * @session_id: SME Session ID
 * @status: response status code
 */
struct del_sta_self_params {
	tSirMacAddr self_mac_addr;
	uint8_t session_id;
	uint32_t status;
};

/**
 * struct tP2pPsParams - P2P powersave related params
 * @opp_ps: opportunistic power save
 * @ctWindow: CT window
 * @count: count
 * @duration: duration
 * @interval: interval
 * @single_noa_duration: single shot noa duration
 * @psSelection: power save selection
 * @sessionId: session id
 */
typedef struct sP2pPsParams {
	uint8_t opp_ps;
	uint32_t ctWindow;
	uint8_t count;
	uint32_t duration;
	uint32_t interval;
	uint32_t single_noa_duration;
	uint8_t psSelection;
	uint8_t sessionId;
} tP2pPsParams, *tpP2pPsParams;

/**
 * struct tTdlsLinkEstablishParams - TDLS Link establish parameters
 * @staIdx: station index
 * @isResponder: responder flag
 * @uapsdQueues: uapsd queue
 * @maxSp: max SP period
 * @isBufsta: is station flag
 * @isOffChannelSupported: offchannel supported or not
 * @peerCurrOperClass: peer current operating class
 * @selfCurrOperClass: self current operating class
 * @validChannelsLen: valid channel length
 * @validChannels: valid channels
 * @validOperClassesLen: valid operating class length
 * @validOperClasses: valid operating class
 * @status: return status of command
 */
typedef struct sTdlsLinkEstablishParams {
	uint16_t staIdx;
	uint8_t isResponder;
	uint8_t uapsdQueues;
	uint8_t maxSp;
	uint8_t isBufsta;
	uint8_t isOffChannelSupported;
	uint8_t peerCurrOperClass;
	uint8_t selfCurrOperClass;
	uint8_t validChannelsLen;
	uint8_t validChannels[HAL_MAX_SUPP_CHANNELS];
	uint8_t validOperClassesLen;
	uint8_t validOperClasses[HAL_MAX_SUPP_OPER_CLASSES];
	uint32_t status;
} tTdlsLinkEstablishParams, *tpTdlsLinkEstablishParams;

/**
 * struct tHalHiddenSsidVdevRestart - hidden ssid vdev restart params
 * @ssidHidden: is hidden ssid or not
 * @sessionId: session id
 */
typedef struct tHalHiddenSsidVdevRestart {
	uint8_t ssidHidden;
	uint8_t sessionId;
} tHalHiddenSsidVdevRestart, *tpHalHiddenSsidVdevRestart;


extern void sys_process_mmh_msg(tpAniSirGlobal pMac, tSirMsgQ *pMsg);

/**
 * struct tBeaconFilterMsg - Beacon Filtering data structure
 * @capabilityInfo: capability info
 * @capabilityMask: capabality mask
 * @beaconInterval: beacon interval
 * @ieNum: IE number
 * @reserved: reserved
 */
typedef struct sBeaconFilterMsg {
	uint16_t capabilityInfo;
	uint16_t capabilityMask;
	uint16_t beaconInterval;
	uint16_t ieNum;
	uint8_t bssIdx;
	uint8_t reserved;
} cdf_packed tBeaconFilterMsg, *tpBeaconFilterMsg;

/**
 * struct tEidByteInfo - Eid byte info
 * @offset: offset
 * @value: value
 * @bitMask: BIT mask
 * @ref: refrence
 */
typedef struct sEidByteInfo {
	uint8_t offset;
	uint8_t value;
	uint8_t bitMask;
	uint8_t ref;
} cdf_packed tEidByteInfo, *tpEidByteInfo;

/**
 * struct tBeaconFilterIe - beacon filter IE
 * @elementId: element IE
 * @checkIePresence: check IE presence
 * @byte: Eid byte info
 */
typedef struct sBeaconFilterIe {
	uint8_t elementId;
	uint8_t checkIePresence;
	tEidByteInfo byte;
} cdf_packed tBeaconFilterIe, *tpBeaconFilterIe;

/**
 * struct tDisableIntraBssFwd - intra bss forward parameters
 * @sessionId: session id
 * @disableintrabssfwd: disable intra bss forward flag
 */
typedef struct sDisableIntraBssFwd {
	uint16_t sessionId;
	bool disableintrabssfwd;
} cdf_packed tDisableIntraBssFwd, *tpDisableIntraBssFwd;

#ifdef WLAN_FEATURE_STATS_EXT
/**
 * struct tStatsExtRequest - ext stats request
 * @vdev_id: vdev id
 * @request_data_len: request data length
 * @request_data: request data
 */
typedef struct sStatsExtRequest {
	uint32_t vdev_id;
	uint32_t request_data_len;
	uint8_t request_data[];
} tStatsExtRequest, *tpStatsExtRequest;
#endif /* WLAN_FEATURE_STATS_EXT */

#ifdef WLAN_FEATURE_NAN
/**
 * struct tNanRequest - NAN request params
 * @request_data_len: request data length
 * @request_data: request data
 */
typedef struct sNanRequest {
	uint16_t request_data_len;
	uint8_t request_data[];
} tNanRequest, *tpNanRequest;
#endif /* WLAN_FEATURE_NAN */

#endif /* _HALMSGAPI_H_ */
