blob: 77bd475b70bb79d3868021c3689bedc88e6f5d7f [file] [log] [blame]
/*
* Copyright (c) 2012-2014, 2016 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 WLAN_QCT_WDI_DP_H
#define WLAN_QCT_WDI_DP_H
/*===========================================================================
W L A N D E V I C E A B S T R A C T I O N L A Y E R
I N T E R N A L A P I F O R T H E
D A T A P A T H
DESCRIPTION
This file contains the internal API exposed by the DAL Control Path Core
module to be used by the DAL Data Path Core.
===========================================================================*/
/*===========================================================================
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
-------- --- ----------------------------------------------------------
08/19/10 lti Created module.
===========================================================================*/
#include "wlan_qct_pal_type.h"
#include "wlan_qct_wdi_i.h"
#include "wlan_qct_wdi_bd.h"
/*=========================================================================
BD Macro Defines
=========================================================================*/
/*--------------------------------------------------------------------------
BD Definitions used by the DAL data path
--------------------------------------------------------------------------*/
#define WDI_TXBD_BDRATE_DEFAULT 0
#define WDI_TXBD_BDRATE_FIRST 1
#define WDI_TXBD_BDRATE_SECOND 2
#define WDI_TXBD_BDRATE_THIRD 3
#define WDI_FRAME_TYPE_MASK 0x30
#define WDI_FRAME_TYPE_OFFSET 0x4
#define WDI_FRAME_SUBTYPE_MASK 0x0F
#define WDI_TXBD_BD_SSN_FILL_HOST 0
#define WDI_TXBD_BD_SSN_FILL_DPU_NON_QOS 1
#define WDI_TXBD_BD_SSN_FILL_DPU_QOS 2
#define WDI_ACKPOLICY_ACK_REQUIRED 0
#define WDI_ACKPOLICY_ACK_NOTREQUIRED 1
#define WDI_BDRATE_BCDATA_FRAME 1
#define WDI_BDRATE_BCMGMT_FRAME 2
#define WDI_BDRATE_CTRL_FRAME 3
/* Default values for FillTx BD */
#define WDI_DEFAULT_UNICAST_ENABLED 1
#define WDI_RMF_DISABLED 0
#define WDI_RMF_ENABLED 1
#define WDI_NO_ENCRYPTION_DISABLED 0
#define WDI_NO_ENCRYPTION_ENABLED 1
#define WDI_RX_BD_ADDR3_SELF_IDX 0
#define WDI_TXCOMP_REQUESTED_MASK 0x1 //bit 0 for TxComp intr requested.
#define WDI_USE_SELF_STA_REQUESTED_MASK 0x2 //bit 1 for STA overwrite with selfSta Requested.
#define WDI_TX_NO_ENCRYPTION_MASK 0x4 //bit 2. If set, the frame is not to be encrypted
#if defined(LIBRA_WAPI_SUPPORT)
#define WDI_WAPI_STA_MASK 0x8 //bit 3. If set, this frame is for WAPI station
#endif
#define WDI_TRIGGER_ENABLED_AC_MASK 0x10 //bit 4 for data frames belonging to trigger enabled AC
#define WDI_USE_NO_ACK_REQUESTED_MASK 0x20
#define WDI_USE_BD_RATE2_FOR_MANAGEMENT_FRAME 0x40 // Bit 6 will be used to control BD rate for Management frames
#ifdef FEATURE_WLAN_TDLS
#define HAL_TDLS_PEER_STA_MASK 0x80 //bit 7 set for TDLS peer station
#endif
#ifdef WLAN_FEATURE_RMC
#define WDI_RMC_REQUESTED_MASK 0x100
#endif
#define WDI_USE_BD_RATE_1_MASK 0x1000
#define WDI_USE_BD_RATE_2_MASK 0x2000
#define WDI_USE_BD_RATE_3_MASK 0x4000
#define WDI_USE_FW_IN_TX_PATH 0x200 //bit 9 used to route the frames to Work Queue 5
/*Macro for getting the size of the TX BD*/
#define WDI_TX_BD_HEADER_SIZE sizeof(WDI_TxBdType)
/*Macro for getting the size of the RX BD*/
#define WDI_RX_BD_HEADER_SIZE sizeof(WDI_RxBdType)
#define WDI_RX_BD_HEADER_OFFSET 0
#define WDI_DPU_FEEDBACK_OFFSET 1
#define WDI_MAC_LLC_HEADER_SIZE 8
// Frame Type definitions
#define WDI_MAC_MGMT_FRAME 0x0
#define WDI_MAC_CTRL_FRAME 0x1
#define WDI_MAC_DATA_FRAME 0x2
// Data frame subtype definitions
#define WDI_MAC_DATA_DATA 0
#define WDI_MAC_DATA_DATA_ACK 1
#define WDI_MAC_DATA_DATA_POLL 2
#define WDI_MAC_DATA_DATA_ACK_POLL 3
#define WDI_MAC_DATA_NULL 4
#define WDI_MAC_DATA_NULL_ACK 5
#define WDI_MAC_DATA_NULL_POLL 6
#define WDI_MAC_DATA_NULL_ACK_POLL 7
#define WDI_MAC_DATA_QOS_DATA 8
#define WDI_MAC_DATA_QOS_DATA_ACK 9
#define WDI_MAC_DATA_QOS_DATA_POLL 10
#define WDI_MAC_DATA_QOS_DATA_ACK_POLL 11
#define WDI_MAC_DATA_QOS_NULL 12
#define WDI_MAC_DATA_QOS_NULL_ACK 13
#define WDI_MAC_DATA_QOS_NULL_POLL 14
#define WDI_MAC_DATA_QOS_NULL_ACK_POLL 15
#define WDI_MAC_FRAME_SUBTYPE_START 0
#define WDI_MAC_FRAME_SUBTYPE_END 16
#define WDI_MAC_DATA_QOS_MASK 8
#define WDI_MAC_DATA_NULL_MASK 4
#define WDI_MAC_DATA_POLL_MASK 2
#define WDI_MAC_DATA_ACK_MASK 1
// Management frame subtype definitions
#define WDI_MAC_MGMT_ASSOC_REQ 0x0
#define WDI_MAC_MGMT_ASSOC_RSP 0x1
#define WDI_MAC_MGMT_REASSOC_REQ 0x2
#define WDI_MAC_MGMT_REASSOC_RSP 0x3
#define WDI_MAC_MGMT_PROBE_REQ 0x4
#define WDI_MAC_MGMT_PROBE_RSP 0x5
#define WDI_MAC_MGMT_BEACON 0x8
#define WDI_MAC_MGMT_ATIM 0x9
#define WDI_MAC_MGMT_DISASSOC 0xA
#define WDI_MAC_MGMT_AUTH 0xB
#define WDI_MAC_MGMT_DEAUTH 0xC
#define WDI_MAC_MGMT_ACTION 0xD
#define WDI_MAC_MGMT_RESERVED15 0xF
// Action frame categories
#define WDI_MAC_ACTION_SPECTRUM_MGMT 0
#define WDI_MAC_ACTION_QOS_MGMT 1
#define WDI_MAC_ACTION_DLP 2
#define WDI_MAC_ACTION_BLKACK 3
#define WDI_MAC_ACTION_HT 7
#define WDI_MAC_ACTION_WME 17
// QoS management action codes
#define WDI_MAC_QOS_ADD_TS_REQ 0
#define WDI_MAC_QOS_ADD_TS_RSP 1
#define WDI_MAC_QOS_DEL_TS_REQ 2
#define WDI_MAC_QOS_SCHEDULE 3
// and these are proprietary
#define WDI_MAC_QOS_DEF_BA_REQ 4
#define WDI_MAC_QOS_DEF_BA_RSP 5
#define WDI_MAC_QOS_DEL_BA_REQ 6
#define WDI_MAC_QOS_DEL_BA_RSP 7
#ifdef WLAN_PERF
/* TxBD signature fields
* serial(8): a monotonically increasing serial # whenever there is a Add/Del STA or Add/Del Key event
* macHash(16): Hash value of DA
* tid(4): TID
* ucast(1): Unicast or Broadcast data frame
*/
#define WDI_TXBD_SIG_SERIAL_OFFSET 0
#define WDI_TXBD_SIG_TID_OFFSET 8
#define WDI_TXBD_SIG_UCAST_DATA_OFFSET 9
#define WDI_TXBD_SIG_MACADDR_HASH_OFFSET 16
#define WDI_TXBD_SIG_MGMT_MAGIC 0xbdbdbdbd
#endif
/*--------------------------------------------------------------------------
BD header macros - used by the data path to get or set various values
inside the packet BD
--------------------------------------------------------------------------*/
#define WDI_RX_BD_GET_MPDU_H_OFFSET( _pvBDHeader ) (((WDI_RxBdType*)_pvBDHeader)->mpduHeaderOffset)
#define WDI_RX_BD_GET_MPDU_D_OFFSET( _pvBDHeader ) (((WDI_RxBdType*)_pvBDHeader)->mpduDataOffset)
#define WDI_RX_BD_GET_MPDU_LEN( _pvBDHeader ) (((WDI_RxBdType*)_pvBDHeader)->mpduLength)
#define WDI_RX_BD_GET_MPDU_H_LEN( _pvBDHeader ) (((WDI_RxBdType*)_pvBDHeader)->mpduHeaderLength)
#define WDI_RX_BD_GET_FT( _pvBDHeader ) (((WDI_RxBdType*)_pvBDHeader)->ft)
#define WDI_RX_BD_GET_DPU_FEEDBACK( _pvBDHeader ) (((WDI_RxBdType*)_pvBDHeader)->dpuFeedback)
#define WDI_RX_BD_GET_RX_CHANNEL( _pvBDHeader ) \
(( (((WDI_RxBdType*)_pvBDHeader)->reserved0) << 4) | (((WDI_RxBdType*)_pvBDHeader)->rxChannel))
#define WDI_FRAME_TYPE_MASK 0x30
#define WDI_FRAME_TYPE_OFFSET 0x4
#define WDI_FRAME_SUBTYPE_MASK 0x0F
#define WDI_RX_BD_GET_SUBTYPE( _pvBDHeader ) ((((WDI_RxBdType*)_pvBDHeader)->frameTypeSubtype) & WDI_FRAME_SUBTYPE_MASK)
#define WDI_RX_BD_GET_TYPE( _pvBDHeader ) (((((WDI_RxBdType*)_pvBDHeader)->frameTypeSubtype) & WDI_FRAME_TYPE_MASK) >> WDI_FRAME_TYPE_OFFSET)
#define WDI_RX_BD_GET_RTSF( _pvBDHeader ) (((WDI_RxBdType*)_pvBDHeader)->rtsf)
#define WDI_RX_BD_GET_BSF( _pvBDHeader ) (((WDI_RxBdType*)_pvBDHeader)->bsf)
#define WDI_RX_BD_GET_SCAN( _pvBDHeader ) (((WDI_RxBdType*)_pvBDHeader)->scanLearn)
#define WDI_RX_BD_GET_DPU_SIG( _pvBDHeader ) (((WDI_RxBdType*)_pvBDHeader)->dpuSignature)
#define WDI_RX_BD_GET_NE( _pvBDHeader ) (((WDI_RxBdType*)_pvBDHeader)->dpuNE)
#define WDI_RX_BD_GET_LLCR( _pvBDHeader ) (((WDI_RxBdType*)_pvBDHeader)->llcr)
#define WDI_RX_BD_GET_TIMESTAMP( _pvBDHeader ) (((WDI_RxBdType*)_pvBDHeader)->mclkRxTimestamp)
#define WDI_RX_BD_GET_RXPFLAGS( _pvBDHeader ) (((WDI_RxBdType*)_pvBDHeader)->rxpFlags)
#define WDI_RX_BD_GET_RATEINDEX( _pvBDHeader ) (((WDI_RxBdType*)_pvBDHeader)->rateIndex)
#define WDI_RX_BD_GET_AMSDU_SIZE( _pvBDHeader ) (((WDI_RxBdType*)_pvBDHeader)->totalMsduSize)
#define WDI_RX_BD_GET_LLC( _pvBDHeader ) (((WDI_RxBdType*)_pvBDHeader)->llc)
#define WDI_RX_BD_GET_TID( _pvBDHeader ) (((WDI_RxBdType*)_pvBDHeader)->tid)
#define WDI_RX_BD_GET_RFBAND( _pvBDHeader ) (((WDI_RxBdType*)_pvBDHeader)->rfBand)
#define WDI_RX_BD_GET_ASF( _pvBDHeader ) (((WDI_RxBdType*)_pvBDHeader)->asf)
#define WDI_RX_BD_GET_AEF( _pvBDHeader ) (((WDI_RxBdType*)_pvBDHeader)->aef)
#define WDI_RX_BD_GET_LSF( _pvBDHeader ) (((WDI_RxBdType*)_pvBDHeader)->lsf)
#define WDI_RX_BD_GET_ESF( _pvBDHeader ) (((WDI_RxBdType*)_pvBDHeader)->esf)
#define WDI_RX_BD_GET_STA_ID( _pvBDHeader ) (((WDI_RxBdType*)_pvBDHeader)->addr2Index)
#define WDI_RX_BD_GET_UB( _pvBDHeader ) (((WDI_RxBdType*)_pvBDHeader)->ub)
#define WDI_RX_BD_GET_ADDR3_IDX( _pvBDHeader ) (((WDI_RxBdType*)_pvBDHeader)->addr3Index)
#define WDI_RX_BD_GET_ADDR1_IDX( _pvBDHeader ) (((WDI_RxBdType*)_pvBDHeader)->addr1Index)
#define WDI_TX_BD_GET_TID( _pvBDHeader ) (((WDI_TxBdType*)_pvBDHeader)->tid)
#define WDI_TX_BD_GET_STA_ID( _pvBDHeader ) (((WDI_TxBdType*)_pvBDHeader)->staIndex)
#define WDI_RX_BD_GET_DPU_SIG( _pvBDHeader ) (((WDI_RxBdType*)_pvBDHeader)->dpuSignature)
//flow control related.
#define WDI_RX_FC_BD_GET_STA_TX_DISABLED_BITMAP( _pvBDHeader ) (((WDI_FcRxBdType*)_pvBDHeader)->fcStaTxDisabledBitmap)
#define WDI_RX_FC_BD_GET_FC( _pvBDHeader ) (((WDI_FcRxBdType*)_pvBDHeader)->fc)
#define WDI_RX_FC_BD_GET_STA_VALID_MASK( _pvBDHeader ) (((WDI_FcRxBdType*)_pvBDHeader)->fcSTAValidMask)
#ifdef WLAN_FEATURE_ROAM_SCAN_OFFLOAD
//LFR scan related
#define WDI_RX_BD_GET_OFFLOADSCANLEARN( _pvBDHeader ) (((WDI_RxBdType*)_pvBDHeader)->offloadScanLearn)
#define WDI_RX_BD_GET_ROAMCANDIDATEIND( _pvBDHeader ) (((WDI_RxBdType*)_pvBDHeader)->roamCandidateInd)
#endif
#ifdef WLAN_FEATURE_EXTSCAN
#define WDI_RX_BD_GET_EXTSCANFULLSCANRESIND( _pvBDHeader ) (((WDI_RxBdType*)_pvBDHeader)->extscanBuffer)
#endif
/*------------ RSSI and SNR Information extraction -------------*/
#define WDI_RX_BD_GET_RSSI0( _pvBDHeader ) \
(((((WDI_RxBdType*)_pvBDHeader)->phyStats0) >> 24) & 0xff)
#define WDI_RX_BD_GET_RSSI1( _pvBDHeader ) \
(((((WDI_RxBdType*)_pvBDHeader)->phyStats0) >> 16) & 0xff)
#define WDI_RX_BD_GET_RSSI2( _pvBDHeader ) \
(((((WDI_RxBdType*)_pvBDHeader)->phyStats0) >> 0) & 0xff)
#define WDI_RX_BD_GET_RSSI3( _pvBDHeader ) \
((((WDI_RxBdType*)_pvBDHeader)->phyStats0) & 0xff)
// Get the average of the 4 values.
#define WDI_GET_RSSI_AVERAGE( _pvBDHeader ) \
(((WDI_RX_BD_GET_RSSI0(_pvBDHeader)) + \
(WDI_RX_BD_GET_RSSI1(_pvBDHeader)) + \
(WDI_RX_BD_GET_RSSI2(_pvBDHeader)) + \
(WDI_RX_BD_GET_RSSI3(_pvBDHeader))) / 4)
// Get the SNR value from PHY Stats
#define WDI_RX_BD_GET_SNR( _pvBDHeader ) \
(((((WDI_RxBdType*)_pvBDHeader)->phyStats1) >> 24) & 0xff)
/*-----------------------------------------------------------------*/
#define WDI_TX_BD_SET_MPDU_DATA_OFFSET( _bd, _off ) (((WDI_TxBdType*)_bd)->mpduDataOffset = _off)
#define WDI_TX_BD_SET_MPDU_HEADER_OFFSET( _bd, _off ) (((WDI_TxBdType*)_bd)->mpduHeaderOffset = _off)
#define WDI_TX_BD_SET_MPDU_HEADER_LEN( _bd, _len ) (((WDI_TxBdType*)_bd)->mpduHeaderLength = _len)
#define WDI_TX_BD_GET_MPDU_HEADER_LEN( _bd ) (((WDI_TxBdType*)_bd)->mpduHeaderLength)
#define WDI_TX_BD_SET_MPDU_LEN( _bd, _len ) (((WDI_TxBdType*)_bd)->mpduLength = _len)
#define WDI_RX_BD_GET_BA_OPCODE(_pvBDHeader) (((WDI_RxBdType*)_pvBDHeader)->reorderOpcode)
#define WDI_RX_BD_GET_BA_FI(_pvBDHeader) (((WDI_RxBdType*)_pvBDHeader)->reorderFwdIdx)
#define WDI_RX_BD_GET_BA_SI(_pvBDHeader) (((WDI_RxBdType*)_pvBDHeader)->reorderSlotIdx)
#define WDI_RX_BD_GET_BA_CSN(_pvBDHeader) (((WDI_RxBdType*)_pvBDHeader)->currentPktSeqNo)
#define WDI_RX_BD_GET_BA_ESN(_pvBDHeader) (((WDI_RxBdType*)_pvBDHeader)->expectedPktSeqNo)
#define WDI_RX_BD_GET_RXP_FLAGS(_pvBDHeader) (((WDI_RxBdType*)_pvBDHeader)->rxpFlags)
#define WDI_RX_BD_GET_PMICMD_20TO23(_pvBDHeader) (((WDI_RxBdType*)_pvBDHeader)->pmiCmd4to23[4])
#define WDI_RX_BD_GET_PMICMD_24TO25(_pvBDHeader) (((WDI_RxBdType*)_pvBDHeader)->pmiCmd24to25)
#ifdef WLAN_FEATURE_11W
#define WDI_RX_BD_GET_RMF( _pvBDHeader ) (((WDI_RxBdType*)_pvBDHeader)->rmf)
#endif
#define WDI_RX_BD_ASF_SET 1 /*The value of the field when set and pkt is AMSDU*/
#define WDI_RX_BD_FSF_SET 1
#define WDI_RX_BD_LSF_SET 1
#define WDI_RX_BD_AEF_SET 1
#define WDI_RX_BD_LLC_PRESENT 0 /*The value of the field when LLC is present*/
#define WDI_RX_BD_FT_DONE 1 /* The value of the field when frame xtl was done*/
/*=========================================================================
API Definition
=========================================================================*/
/**
@brief WDI_RxBD_GetFrameTypeSubType - Called by the data path
to retrieve the type/subtype of the received frame.
@param pvBDHeader: Void pointer to the RxBD buffer.
usFrmCtrl: the frame ctrl of the 802.11 header
@return A byte which contains both type and subtype info. LSB four bytes
(b0 to b3)is subtype and b5-b6 is type info.
*/
wpt_uint8
WDI_RxBD_GetFrameTypeSubType
(
void* _pvBDHeader,
wpt_uint16 usFrmCtrl
);
/**
@brief WDI_FillTxBd - Called by the data path to fill the TX BD
@param pWDICtx: Context to the WDI
ucTypeSubtype: of the frame
pDestMacAddr: destination MAC address
pTid: pointer to the TID (in/out value in case DAL Ctrl causes
a TID downgrade - not done for now)
ucDisableFrmXtl: set to 1 if this frame is not to be translated by HW
pTxBd: pointer to the TX BD
ucTxFlag: can have appropriate bit setting as required
ucProtMgmtFrame: for management frames, whether the frame is
protected (protect bit is set in FC)
uTimestamp: pkt timestamp
@return success or not
*/
WDI_Status
WDI_FillTxBd
(
WDI_ControlBlockType* pWDICtx,
wpt_uint8 ucTypeSubtype,
void* pDestMacAddr,
void* pAddr2,
wpt_uint8* pTid,
wpt_uint8 ucDisableFrmXtl,
void* pTxBd,
wpt_uint32 ucTxFlag,
wpt_uint8 ucProtMgmtFrame,
wpt_uint32 uTimeStamp,
wpt_uint8 isEapol,
wpt_uint8* staIndex,
wpt_uint32 txBdToken
);
/**
@brief WDI_SwapRxBd swaps the RX BD.
@param pBd - pointer to the BD (in/out)
@return None
*/
void
WDI_SwapRxBd
(
wpt_uint8 *pBd
);
/**
@brief WDI_SwapTxBd - Swaps the TX BD
@param pBd - pointer to the BD (in/out)
@return none
*/
void
WDI_SwapTxBd
(
wpt_uint8 *pBd
);
/**
@brief WDI_RxAmsduBdFix - fix for HW issue for AMSDU
@param pWDICtx: Context to the WDI
pBDHeader - pointer to the BD header
@return None
*/
void
WDI_RxAmsduBdFix
(
WDI_ControlBlockType* pWDICtx,
void* pBDHeader
);
#ifdef WLAN_PERF
/**
@brief WDI_TxBdFastFwd - evaluates if a frame can be fast
forwarded
@param pWDICtx: Context to the WDI
pDestMac: Destination MAC
ucTid: packet TID pBDHeader
ucUnicastDst: is packet unicast
pTxBd: pointer to the BD header
usMpduLength: len
@return 1 - if the frame can be fast fwd-ed ; 0 if not
*/
wpt_uint32
WDI_TxBdFastFwd
(
WDI_ControlBlockType* pWDICtx,
wpt_uint8* pDestMac,
wpt_uint8 ucTid,
wpt_uint8 ucUnicastDst,
void* pTxBd,
wpt_uint16 usMpduLength);
#endif /*WLAN_PERF*/
/**
@brief WDI_DP_UtilsInit - Intializes the parameters required to
interact with the data path
@param pWDICtx: pointer to the main WDI Ctrl Block
@return success always
*/
WDI_Status
WDI_DP_UtilsInit
(
WDI_ControlBlockType* pWDICtx
);
/**
@brief WDI_DP_UtilsExit - Clears the parameters required to
interact with the data path
@param pWDICtx: pointer to the main WDI Ctrl Block
@return success always
*/
WDI_Status
WDI_DP_UtilsExit
(
WDI_ControlBlockType* pWDICtx
);
#endif /*WLAN_QCT_WDI_DP_H*/