blob: 05304fc2e0c360df3912dbf24e82277e24e251ca [file] [log] [blame]
/*
* 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.
*/
/*
*
* Date Modified by Modification Information
* --------------------------------------------------------------------
*/
#ifndef WLAN_QCT_HAL_H
#define WLAN_QCT_HAL_H
#include "vos_status.h"
#include "halTypes.h"
#ifndef PALTYPES_H__
/// unsigned 8-bit types
#define tANI_U8 v_U8_t
/// unsigned 16-bit types
#define tANI_U16 v_U16_t
/// unsigned 32-bit types
#define tANI_U32 v_U32_t
/// signed 8-bit types
#define tANI_S8 v_S7_t
/// signed 16-bit types
#define tANI_S16 v_S15_t
/// signed 32-bit types
#define tANI_S32 v_S31_t
#define eHalStatus VOS_STATUS
#endif
#define QWLAN_HAL_DXE0_MASTERID 5
typedef struct sHalBdGeneric {
/* 0x00 */
// ENDIAN BEGIN
tANI_U32 dpuRF : 8;
tANI_U32 dpuSignature:3; /* Signature on RA's DPU descriptor */
tANI_U32 staSignature:3;
tANI_U32 reserved : 14;
tANI_U32 dpuNE : 1;
tANI_U32 dpuNC : 1;
tANI_U32 bdt : 2; /* BD type */
// ENDIAN END
/* 0x04 */
// ENDIAN BEGIN
tANI_U32 reserved1:32;
// ENDIAN END
/* 0x08 */
// ENDIAN BEGIN
tANI_U32 headPduIdx : 16; /* Head PDU index */
tANI_U32 tailPduIdx : 16; /* Tail PDU index */
// ENDIAN END
/* 0x0c */
// ENDIAN BEGIN
tANI_U32 mpduHeaderLength : 8; /* MPDU header length */
tANI_U32 mpduHeaderOffset : 8; /* MPDU header start offset */
tANI_U32 mpduDataOffset : 9; /* MPDU data start offset */
tANI_U32 pduCount : 7; /* PDU count */
// ENDIAN END
/* 0x10 */
// ENDIAN BEGIN
tANI_U32 mpduLength : 16; /* MPDU length */
tANI_U32 reserved3:4; /* DPU compression feedback */
tANI_U32 tid : 4; /* Traffic identifier, tid */
tANI_U32 rateIndex : 8;
// ENDIAN END
/* 0x14 */
// ENDIAN BEGIN
tANI_U32 dpuDescIdx : 8;
tANI_U32 addr1Index : 8; //A1 index after RxP binary search
tANI_U32 addr2Index : 8; //A2 index after RxP binary search
tANI_U32 addr3Index : 8; //A3 index after RxP binary search
// ENDIAN END
//}__ani_attr_packed __ani_attr_aligned_4 tHalBdGeneric, *tpHalBdGeneric;
} tHalBdGeneric, *tpHalBdGeneric;
/*
* PDU without BD
*/
typedef struct sHalPdu {
tANI_U8 payload[124];
tANI_U32 nextPduIdx; /* LSB 16 bits */
//} __ani_attr_packed __ani_attr_aligned_4 tHalPdu, *tpHalPdu;
} tHalPdu, *tpHalPdu;
/* UAPSD parameters passed per AC to HAL from TL */
typedef struct sUapsdInfo {
tANI_U8 staidx; // STA index
tANI_U8 ac; // Access Category
tANI_U8 up; // User Priority
tANI_U32 srvInterval; // Service Interval
tANI_U32 susInterval; // Suspend Interval
tANI_U32 delayInterval; // Delay Interval
} tUapsdInfo, tpUapsdInfo;
#define HAL_TXBD_BDRATE_DEFAULT 0
#define HAL_TXBD_BDRATE_FIRST 1
#define HAL_TXBD_BDRATE_SECOND 2
#define HAL_TXBD_BDRATE_THIRD 3
#define HAL_FRAME_TYPE_MASK 0x30
#define HAL_FRAME_TYPE_OFFSET 0x4
#define HAL_FRAME_SUBTYPE_MASK 0x0F
#define HAL_TXBD_BD_SSN_FILL_HOST 0
#define HAL_TXBD_BD_SSN_FILL_DPU_NON_QOS 1
#define HAL_TXBD_BD_SSN_FILL_DPU_QOS 2
#define HAL_ACKPOLICY_ACK_REQUIRED 0
#define HAL_ACKPOLICY_ACK_NOTREQUIRED 1
#define HAL_BDRATE_BCDATA_FRAME 1
#define HAL_BDRATE_BCMGMT_FRAME 2
#define HAL_BDRATE_CTRL_FRAME 3
/* Default values for FillTx BD */
#define HAL_DEFAULT_UNICAST_ENABLED 1
#define HAL_RMF_DISABLED 0
#define HAL_RMF_ENABLED 1
#define HAL_NO_ENCRYPTION_DISABLED 0
#define HAL_NO_ENCRYPTION_ENABLED 1
#define WLANHAL_RX_BD_ADDR3_SELF_IDX 0
// Should not use tHalTxBd nor tHalRxBd. UMAC doesn't know these HAL structure.
#define WLANHAL_TX_BD_HEADER_SIZE 40
#define WLANHAL_RX_BD_HEADER_SIZE 76
#define WLANHAL_RX_BD_HEADER_OFFSET 0
#define WLANHAL_RX_BD_GET_MPDU_H_OFFSET( _pvBDHeader ) (((tpHalRxBd)_pvBDHeader)->mpduHeaderOffset)
#define WLANHAL_RX_BD_GET_MPDU_D_OFFSET( _pvBDHeader ) (((tpHalRxBd)_pvBDHeader)->mpduDataOffset)
#define WLANHAL_RX_BD_GET_MPDU_LEN( _pvBDHeader ) (((tpHalRxBd)_pvBDHeader)->mpduLength)
#define WLANHAL_RX_BD_GET_MPDU_H_LEN( _pvBDHeader ) (((tpHalRxBd)_pvBDHeader)->mpduHeaderLength)
#define WLANHAL_RX_BD_GET_FT( _pvBDHeader ) (((tpHalRxBd)_pvBDHeader)->ft)
#define WLANHAL_RX_BD_GET_LLC( _pvBDHeader ) (((tpHalRxBd)_pvBDHeader)->llc)
#define WLANHAL_RX_BD_GET_TID( _pvBDHeader ) (((tpHalRxBd)_pvBDHeader)->tid)
#define WLANHAL_RX_BD_GET_ASF( _pvBDHeader ) (((tpHalRxBd)_pvBDHeader)->asf)
#define WLANHAL_RX_BD_GET_AEF( _pvBDHeader ) (((tpHalRxBd)_pvBDHeader)->aef)
#define WLANHAL_RX_BD_GET_LSF( _pvBDHeader ) (((tpHalRxBd)_pvBDHeader)->lsf)
#define WLANHAL_RX_BD_GET_ESF( _pvBDHeader ) (((tpHalRxBd)_pvBDHeader)->esf)
#define WLANHAL_RX_BD_GET_STA_ID( _pvBDHeader ) (((tpHalRxBd)_pvBDHeader)->addr2Index)
#define WLANHAL_RX_BD_GET_ADDR3_IDX( _pvBDHeader ) (((tpHalRxBd)_pvBDHeader)->addr3Index)
#define WLANHAL_RX_BD_GET_ADDR1_IDX( _pvBDHeader ) (((tpHalRxBd)_pvBDHeader)->addr1Index)
#define WLANHAL_TX_BD_GET_TID( _pvBDHeader ) (((tpHalTxBd)_pvBDHeader)->tid)
#define WLANHAL_TX_BD_GET_STA_ID( _pvBDHeader ) (((tpHalTxBd)_pvBDHeader)->staIndex)
#define WLANHAL_RX_BD_GET_DPU_SIG( _pvBDHeader ) (((tpHalRxBd)_pvBDHeader)->dpuSignature)
#define WLANHAL_FC_RX_BD_REPORT_CONTENT_SIZE (2 * HAL_NUM_STA * sizeof(tANI_U8)) // size of fcSTATxQLen[HAL_NUM_STA]+fcSTACurTxRate[HAL_NUM_STA]
#define WLANHAL_FC_TX_BD_HEADER_SIZE sizeof(tHalFcTxBd)
#define WLANHAL_RX_BD_GET_FC( _pvBDHeader ) (((tpHalFcRxBd)_pvBDHeader)->fc)
#define WLANHAL_RX_BD_GET_RX_TIME_STAMP( _pvBDHeader ) (((tpHalFcRxBd)_pvBDHeader)->mclkRxTimestamp)
#define WLANHAL_RX_BD_GET_STA_VALID_MASK( _pvBDHeader ) (((tpHalFcRxBd)_pvBDHeader)->fcSTAValidMask)
#define WLANHAL_RX_BD_GET_STA_PS_STATE( _pvBDHeader ) (((tpHalFcRxBd)_pvBDHeader)->fcSTAPwrSaveStateMask)
#define WLANHAL_RX_BD_GET_STA_TH_IND( _pvBDHeader ) (((tpHalFcRxBd)_pvBDHeader)->fcSTAThreshIndMask)
#define WLANHAL_RX_BD_GET_STA_TXQ_STATUS( _pvBDHeader ) (((tpHalFcRxBd)_pvBDHeader)->fcSTATxQStatus)
#define WLANHAL_RX_BD_GET_STA_TXQ_LEN( _pvBDHeader, staIdx ) (((tpHalFcRxBd)_pvBDHeader)->fcSTATxQLen[staIdx])
#define WLANHAL_RX_BD_GET_STA_CUR_TX_RATE( _pvBDHeader, staIdx ) (((tpHalFcRxBd)_pvBDHeader)->fcSTACurTxRate[staIdx])
#define WLANHAL_TX_BD_GET_RMF(_pvBDHeader) (((tpHalRxBd)_pvBDHeader)->rmf)
#define WLANHAL_TX_BD_GET_UB(_pvBDHeader) (((tpHalRxBd)_pvBDHeader)->ub)
#define WLANHAL_RX_BD_GET_RMF(_pvBDHeader) (((tpHalRxBd)_pvBDHeader)->rmf)
#define WLANHAL_RX_BD_GET_UB(_pvBDHeader) (((tpHalRxBd)_pvBDHeader)->ub)
#define WLANHAL_RX_BD_GET_RATEINDEX(_pvBDHeader) (((tpHalRxBd)_pvBDHeader)->rateIndex)
#define WLANHAL_RX_BD_GET_TIMESTAMP(_pvBDHeader) (((tpHalRxBd)_pvBDHeader)->mclkRxTimestamp)
#define tHalFcRxBd halFcRxBd_type
#define tpHalFcRxBd phalFcRxBd_type
#define tHalFcTxBd halFcTxBd_type
#define tpHalFcTxBd pHalFcTxBd_type
#define tHalFcTxParams tFcTxParams_type
#define tHalFcRxParams tFcRxParams_type
#define tpHalFcTxParams pFcTxParams_type
#define tpHalFcRxParams pFcRxParams_type
/*------------ RSSI and SNR Information extraction -------------*/
#define WLANHAL_RX_BD_GET_RSSI0( _pvBDHeader ) \
(((((tpHalRxBd)_pvBDHeader)->phyStats0) >> 24) & 0xff)
#define WLANHAL_RX_BD_GET_RSSI1( _pvBDHeader ) \
(((((tpHalRxBd)_pvBDHeader)->phyStats0) >> 16) & 0xff)
#define WLANHAL_RX_BD_GET_RSSI2( _pvBDHeader ) \
(((((tpHalRxBd)_pvBDHeader)->phyStats0) >> 0) & 0xff)
#define WLANHAL_RX_BD_GET_RSSI3( _pvBDHeader ) \
((((tpHalRxBd)_pvBDHeader)->phyStats0) & 0xff)
// Get the average of the 4 values.
#define WLANHAL_GET_RSSI_AVERAGE( _pvBDHeader ) \
(((WLANHAL_RX_BD_GET_RSSI0(_pvBDHeader)) + \
(WLANHAL_RX_BD_GET_RSSI1(_pvBDHeader)) + \
(WLANHAL_RX_BD_GET_RSSI2(_pvBDHeader)) + \
(WLANHAL_RX_BD_GET_RSSI3(_pvBDHeader))) / 4)
// Get the SNR value from PHY Stats
#define WLANHAL_RX_BD_GET_SNR( _pvBDHeader ) \
(((((tpHalRxBd)_pvBDHeader)->phyStats1) >> 24) & 0xff)
/*-----------------------------------------------------------------*/
#define WLANHAL_RX_BD_GET_DPU_SIG( _pvBDHeader ) (((tpHalRxBd)_pvBDHeader)->dpuSignature)
#define WLANHAL_TX_BD_SET_MPDU_DATA_OFFSET( _bd, _off ) (((tpHalTxBd)_bd)->mpduDataOffset = _off)
#define WLANHAL_TX_BD_SET_MPDU_HEADER_OFFSET( _bd, _off ) (((tpHalTxBd)_bd)->mpduHeaderOffset = _off)
#define WLANHAL_TX_BD_SET_MPDU_HEADER_LEN( _bd, _len ) (((tpHalTxBd)_bd)->mpduHeaderLength = _len)
#define WLANHAL_TX_BD_SET_MPDU_LEN( _bd, _len ) (((tpHalTxBd)_bd)->mpduLength = _len)
#define WLANHAL_RX_BD_GET_BA_OPCODE(_pvBDHeader) (((tpHalRxBd)_pvBDHeader)->reorderOpcode)
#define WLANHAL_RX_BD_GET_BA_FI(_pvBDHeader) (((tpHalRxBd)_pvBDHeader)->reorderFwdIdx)
#define WLANHAL_RX_BD_GET_BA_SI(_pvBDHeader) (((tpHalRxBd)_pvBDHeader)->reorderSlotIdx)
#define WLANHAL_RX_BD_GET_BA_CSN(_pvBDHeader) (((tpHalRxBd)_pvBDHeader)->currentPktSeqNo)
#define WLANHAL_RX_BD_GET_BA_ESN(_pvBDHeader) (((tpHalRxBd)_pvBDHeader)->expectedPktSeqNo)
#define WLANHAL_RX_BD_GET_RXP_FLAGS(_pvBDHeader) (((tpHalRxBd)_pvBDHeader)->rxpFlags)
#define WLANHAL_RX_BD_GET_TYPE_SUBTYPE(_pvBDHeader) (((tpHalRxBd)_pvBDHeader)->frameTypeSubtype)
#define WLANHAL_RX_BD_SET_TYPE_SUBTYPE( _bd, _typeSubtype ) (((tpHalRxBd)_bd)->frameTypeSubtype = _typeSubtype)
#define WLANHAL_RX_BD_ASF_SET 1 /*The value of the field when set and pkt is AMSDU*/
#define WLANHAL_RX_BD_FSF_SET 1
#define WLANHAL_RX_BD_LSF_SET 1
#define WLANHAL_RX_BD_AEF_SET 1
#define WLANHAL_RX_BD_LLC_PRESENT 0 /*The value of the field when LLC is present*/
#define WLANHAL_RX_BD_FT_DONE 1 /* The value of the field when frame xtl was done*/
/*DPU_FEEDBACK_WPI_UNPROTECTED macro defined in volansdefs.h which is not available
for UMAC in prima so declared it here */
#define DPU_FEEDBACK_WPI_UNPROTECTED 0x20
#define WLANHAL_RX_IS_UNPROTECTED_WPI_FRAME(_pvBDHeader) \
(DPU_FEEDBACK_WPI_UNPROTECTED == ((WDI_RxBdType *)_pvBDHeader)->dpuFeedback)
/*==========================================================================
FUNCTION WLANHAL_RxBD_GetFrameTypeSubType
DESCRIPTION
Called by TL to retrieve the type/subtype of the received frame.
DEPENDENCIES
TL should pass a valid RxBD buffer pointer.
PARAMETERS
IN
pvBDHeader: Void pointer to the RxBD buffer.
usFrmCtrl:the frame ctrl of the 802.11 header
RETURN VALUE
A byte which contains both type and subtype info. LSB four bytes (b0 to b3)
is subtype and b5-b6 is type info.
SIDE EFFECTS
============================================================================*/
tANI_U8 WLANHAL_RxBD_GetFrameTypeSubType(v_PVOID_t _pvBDHeader, tANI_U16 usFrmCtrl);
#define HAL_TXCOMP_REQUESTED_MASK 0x1 //bit 0 for TxComp intr requested.
#define HAL_USE_SELF_STA_REQUESTED_MASK 0x2 //bit 1 for STA overwrite with selfSta Requested.
#define HAL_TX_NO_ENCRYPTION_MASK 0x4 //bit 2. If set, the frame is not to be encrypted
#if defined(LIBRA_WAPI_SUPPORT)
#define HAL_WAPI_STA_MASK 0x8 //bit 3. If set, this frame is for WAPI station
#endif
#define HAL_TRIGGER_ENABLED_AC_MASK 0x10 //bit 4 for data frames belonging to trigger enabled AC
#define HAL_USE_NO_ACK_REQUESTED_MASK 0x20
#define HAL_USE_BD_RATE2_FOR_MANAGEMENT_FRAME 0x40 // Bit 6 will be used to control BD rate for Management frames
#define HAL_USE_PEER_STA_REQUESTED_MASK 0x80 //bit 7 will be used to control frames for p2p interface
#ifdef FEATURE_WLAN_TDLS
#define HAL_TDLS_PEER_STA_MASK 0x80 //bit 7 set for TDLS peer station
#endif
/*==========================================================================
FUNCTION WLANHAL_FillTxBd
DESCRIPTION
Called by PE to register as a client for management frames delivery.
DEPENDENCIES
TL must be initialized before this API can be called.
PARAMETERS
IN
pAdapter: pointer to the global adapter context;a handle to TL's
control block can be extracted from its context
vosFrmBuf: pointer to a vOSS buffer containing the management
frame to be transmitted
usFrmLen: the length of the frame to be transmitted; information
is already included in the vOSS buffer
wFrmType: the type of the frame being transmitted
tid: tid used to transmit this frame
pfnCompTxFunc: function pointer to the transmit complete routine
voosBDHeader: pointer to the BD header
txFlag: can have appropriate bit setting as required
#define HAL_TXCOMP_REQUESTED_MASK 0x1 //bit 0 for TxComp intr requested.
#define HAL_USE_SELF_STA_REQUESTED_MASK 0x2 //bit 1 for STA overwrite with selfSta Requested.
#define HAL_TX_NO_ENCRYPTION_MASK 0x4 //bit 2. If set, the frame is not to be encrypted
#if defined(FEATURE_WLAN_WAPI)
#define HAL_WAPI_STA_MASK 0x8 //bit 3. If set, this frame is for WAPI station
#endif
uTimestamp: pkt timestamp
RETURN VALUE
The result code associated with performing the operation
SIDE EFFECTS
============================================================================*/
VOS_STATUS WLANHAL_FillTxBd(void *pAdapter, tANI_U8 typeSubtype, void *pDestMacAddr, void *pAddr2,
tANI_U8* ptid, tANI_U8 disableFrmXtl, void *pTxBd, tANI_U8 txFlag, tANI_U32 timeStamp);
VOS_STATUS WLANHAL_FillFcTxBd(void *pVosGCtx, void *pFcParams, void *pFcTxBd);
/** To swap the report part of FC RxBD */
void WLANHAL_SwapFcRxBd(tANI_U8 *pBd);
/* To swap the data */
void WLANHAL_Swap32Bytes(tANI_U8* pData, tANI_U32 size);
/** To swap the RxBD */
void WLANHAL_SwapRxBd(tANI_U8 *pBd);
void WLANHAL_RxAmsduBdFix(void *pVosGCtx,v_PVOID_t _pvBDHeader);
#ifdef WLAN_PERF
tANI_U32 WLANHAL_TxBdFastFwd(void *pAdapter, tANI_U8 *pDestMac, tANI_U8 tid, tANI_U8 unicastDst, void *pTxBd, tANI_U16);
#endif
VOS_STATUS WLANHAL_EnableUapsdAcParams(void* pVosGCtx, tANI_U8 staIdx, tUapsdInfo *pUapsdInfo);
VOS_STATUS WLANHAL_DisableUapsdAcParams(void* pVosGCtx, tANI_U8 staIdx, tANI_U8 ac);
VOS_STATUS WLANHAL_EnableIdleBdPduInterrupt(void* pVosGCtx, tANI_U8 idleBdPduThreshold);
#ifdef FEATURE_ON_CHIP_REORDERING
tANI_U8 WLANHAL_IsOnChipReorderingEnabledForTID(void* pVosGCtx, tANI_U8 staIdx, tANI_U8 tid);
#endif
#ifdef WLAN_SOFTAP_VSTA_FEATURE
v_BOOL_t WLANHAL_IsHwFrameTxTranslationCapable(v_PVOID_t pVosGCtx, tANI_U8 staIdx);
#endif
#define tHalRxBd halRxBd_type
#define tpHalRxBd phalRxBd_type
#define tHalTxBd halTxBd_type
#define tpHalTxBd pHalTxBd_type
/*===============================================
*
* TL <-> HAL structures
*
*===============================================
*/
//
// TL -> HAL
// tSirMsgQ.type = SIR_HAL_TL_FLUSH_AC_REQ
//
typedef struct sFlushACReq
{
// Message Type
tANI_U16 mesgType;
// Message Length
tANI_U16 mesgLen;
// Station Index. originates from HAL
tANI_U8 ucSTAId;
// TID for which the transmit queue is being flushed
tANI_U8 ucTid;
} tFlushACReq, *tpFlushACReq;
//
//
// HAL -> TL
// tSirMsgQ.type = SIR_HAL_TL_FLUSH_AC_RSP
//
typedef struct sFlushACRsp
{
// Message Type
tANI_U16 mesgType;
// Message Length
tANI_U16 mesgLen;
// Station Index. originates from HAL
tANI_U8 ucSTAId;
// TID for which the transmit queue is being flushed
tANI_U8 ucTid;
// status of the Flush operation
tANI_U8 status;
} tFlushACRsp, *tpFlushACRsp;
#endif