blob: 9290401c742ac352afdc9dbd4ca29a4cb7b6f5e7 [file] [log] [blame]
/*
* Copyright (c) 2012-2013 Qualcomm Atheros, Inc.
* All Rights Reserved.
* Qualcomm Atheros Confidential and Proprietary.
*/
#if !defined( __WLAN_QCT_PAL_PACKET_H )
#define __WLAN_QCT_PAL_PACKET_H
/**=========================================================================
\file wlan_qct_pal_packet.h
\brief define PAL packet. wpt = (Wlan Pal Type)
Definitions for platform independent.
========================================================================*/
#include "wlan_qct_pal_type.h"
#include "wlan_qct_pal_status.h"
#include "vos_types.h"
#ifdef FEATURE_WLAN_DIAG_SUPPORT
#include "vos_diag_core_log.h"
#endif /* FEATURE_WLAN_DIAG_SUPPORT */
// The size of the data buffer in vos/pal packets
// Explanation:
// MTU size = 1500 bytes
// Max number of BD/PDUs required to hold payload of 1500 =
// 12 PDUs (124 bytes each) + 1 BD (12 bytes for payload) =
// 13 BD/PDUs = 13 x 128 = 1664 bytes
//
// In case of A-MSDU with each MSDU having payload of 1500 bytes:
// 1st MSDU = requires 13 BD/PDUs as per the above equation.
// 2nd MSDU = HW inserts an extra BD to hold the information of the 2nd
// MSDU and the payload portion of this BD is unused which means to cover
// 1500 bytes we require 13 PDUs.
// So 13 PDUs + 1 BD = 14 BD/PDUs = 1792 bytes.
//
// HOWEVER
// In case of A-MSDU with errors, the ADU will push to the host up to
// 2346 bytes. If that is the 2nd or later MSDU the worst case is:
// 1 Prepended BD/PDU
// 1 BD/PDU containing the 1st 4 bytes of the delimiter
// 1 BD/PDU containing the last 10 bytes of the delimiter
// plus the first 114 of the payload
// 18 BD/PDUs containing the remaining 2232 bytes of the payload
// 2346 - 114 = 2232; 2232 / 124 = 18
// So 21 BD/PDUs are required
//The size of AMSDU frame per spec can be a max of 3839 bytes
// in BD/PDUs that means 30 (one BD = 128 bytes)
// we must add the size of the 802.11 header to that
#define VPKT_SIZE_BUFFER ((30 * 128) + 32)
/* Transport channel count to report DIAG */
#define WPT_NUM_TRPT_CHANNEL 4
/* Transport channel name string size */
#define WPT_TRPT_CHANNEL_NAME 4
typedef enum
{
///Packet is used to transmit 802.11 Management frames.
eWLAN_PAL_PKT_TYPE_TX_802_11_MGMT,
///Packet is used to transmit 802.11 Data frames.
eWLAN_PAL_PKT_TYPE_TX_802_11_DATA,
///Packet is used to transmit 802.3 Data frames.
eWLAN_PAL_PKT_TYPE_TX_802_3_DATA,
///Packet contains Received data of an unknown frame type
eWLAN_PAL_PKT_TYPE_RX_RAW
} wpt_packet_type;
typedef struct swpt_packet
{
/*
Pointer to a buffer for BD for TX packets
For RX packets. The pBD MUST set to NULL.
PAL packet shall set the pointer point to the start of the flat buffer
where the BD starts.
*/
void *pBD;
//Physical address for pBD for DMA-able devices
void *pBDPhys;
//OS dependent strucutre used only by OS specific code.
void *pOSStruct;
void *pktMetaInfo;
wpt_packet_type pktType;
//The number of bytes pBD uses. It MUST be set to 0 for RX packets
wpt_uint16 BDLength;
//Internal data for PAL packet implementation usage only
void *pInternalData;
} wpt_packet;
typedef struct swpt_iterator
{
void *pNext;
void *pCur;
void *pContext;
} wpt_iterator;
/* Each specific channel dedicated information should be logged */
typedef struct
{
char channelName[WPT_TRPT_CHANNEL_NAME];
v_U32_t numDesc;
v_U32_t numFreeDesc;
v_U32_t numRsvdDesc;
v_U32_t headDescOrder;
v_U32_t tailDescOrder;
v_U32_t ctrlRegVal;
v_U32_t statRegVal;
v_U32_t numValDesc;
v_U32_t numInvalDesc;
} wpt_log_data_stall_channel_type;
/* Transport log context */
typedef struct
{
v_U32_t PowerState;
v_U32_t numFreeBd;
wpt_log_data_stall_channel_type dxeChannelInfo[WPT_NUM_TRPT_CHANNEL];
} wpt_log_data_stall_type;
//pPkt is a pointer to wpt_packet
#define WPAL_PACKET_SET_BD_POINTER(pPkt, pBd) ( (pPkt)->pBD = (pBd) )
#define WPAL_PACKET_GET_BD_POINTER(pPkt) ( (pPkt)->pBD )
//Access the physical address of BD
#define WPAL_PACKET_SET_BD_PHYS(pPkt, pBdPhys) ( (pPkt)->pBDPhys = (pBdPhys) )
#define WPAL_PACKET_GET_BD_PHYS(pPkt) ( (pPkt)->pBDPhys )
#define WPAL_PACKET_SET_BD_LENGTH(pPkt, len) ( (pPkt)->BDLength = (len) )
#define WPAL_PACKET_GET_BD_LENGTH(pPkt) ( (pPkt)->BDLength )
#define WPAL_PACKET_SET_METAINFO_POINTER(pPkt, p) ( (pPkt)->pktMetaInfo = (p) )
#define WPAL_PACKET_GET_METAINFO_POINTER(pPkt) ( (pPkt)->pktMetaInfo )
#define WPAL_PACKET_SET_TYPE(pPkt, type) ( (pPkt)->pktType = (type) )
#define WPAL_PACKET_GET_TYPE(pPkt) ( (pPkt)->pktType )
#define WPAL_PACKET_SET_OS_STRUCT_POINTER(pPkt, pStruct) ( (pPkt)->pOSStruct = (pStruct) )
#define WPAL_PACKET_GET_OS_STRUCT_POINTER(pPkt) ( (pPkt)->pOSStruct )
#define WPAL_PACKET_IS_FLAT_BUF(pktType) ( (eWLAN_PAL_PKT_TYPE_RX_RAW == (pktType)) || \
(eWLAN_PAL_PKT_TYPE_TX_802_11_MGMT == (pktType)) )
/* RX RAW packet alloc fail due to out of resource CB function type */
typedef void ( *wpalPacketLowPacketCB )( wpt_packet *pPacket, void *usrData );
/*---------------------------------------------------------------------------
wpalPacketInit – Initialize all wpt_packet related objects. Allocate memory for wpt_packet.
Allocate memory for TX management frames and RX frames.
For our legacy UMAC, it is not needed because vos_packet contains wpt_packet.
Param:
pPalContext – A context PAL uses??
Return:
eWLAN_PAL_STATUS_SUCCESS -- success
---------------------------------------------------------------------------*/
wpt_status wpalPacketInit(void *pPalContext);
/*---------------------------------------------------------------------------
wpalPacketClose – Free all allocated resource by wpalPacketInit.
For our legacy UMAC, it is not needed because vos_packet contains pal_packet.
Param:
pPalContext – A context PAL uses??
Return:
eWLAN_PAL_STATUS_SUCCESS -- success
---------------------------------------------------------------------------*/
wpt_status wpalPacketClose(void *pPalContext);
/*---------------------------------------------------------------------------
wpalPacketAlloc – Allocate a wpt_packet from PAL.
Param:
pPalContext – A context PAL uses??
pktType – specify the type of wpt_packet to allocate
nPktSize - specify the maximum size of the packet buffer.
Return:
A pointer to the wpt_packet. NULL means fail.
---------------------------------------------------------------------------*/
wpt_packet * wpalPacketAlloc(wpt_packet_type pktType, wpt_uint32 nPktSize,
wpalPacketLowPacketCB rxLowCB, void *usrdata);
/*---------------------------------------------------------------------------
wpalPacketFree – Free a wpt_packet chain for one particular type.
Packet type is carried in wpt_packet structure.
Param:
pPalContext – A context PAL uses??
pPkt - pointer to a packet to be freed.
Return:
eWLAN_PAL_STATUS_SUCCESS - success
---------------------------------------------------------------------------*/
wpt_status wpalPacketFree(wpt_packet *pPkt);
/*---------------------------------------------------------------------------
wpalPacketGetLength – Get number of bytes in a wpt_packet.
Param:
pPalContext – PAL context returned from PAL open
pPkt - pointer to a packet to be freed.
Return:
Length of the data include layer-2 headers. For example, if the frame is 802.3,
the length includes the ethernet header.
---------------------------------------------------------------------------*/
wpt_uint32 wpalPacketGetLength(wpt_packet *pPkt);
/*---------------------------------------------------------------------------
wpalPacketRawTrimHead – Move the starting offset and reduce packet length.
The function can only be used with raw packets,
whose buffer is one piece and allocated by WLAN driver.
Param:
pPkt - pointer to a wpt_packet.
size – number of bytes to take off the head.
Return:
eWPAL_STATUS_SUCCESS - success. Fail otherwise.
---------------------------------------------------------------------------*/
wpt_status wpalPacketRawTrimHead(wpt_packet *pPkt, wpt_uint32 size);
/*---------------------------------------------------------------------------
wpalPacketRawTrimTail – reduce the length of the packet. The function can
only be used with raw packets, whose buffer is one piece and
allocated by WLAN driver. This also reduce the length of the packet.
Param:
pPkt - pointer to a wpt_packet.
size – number of bytes to take of the packet length
Return:
eWLAN_PAL_STATUS_SUCCESS – success. Otherwise fail.
---------------------------------------------------------------------------*/
wpt_status wpalPacketRawTrimTail(wpt_packet *pPkt, wpt_uint32 size);
/*---------------------------------------------------------------------------
wpalPacketGetRawBuf – Return the starting buffer's virtual address for the RAW flat buffer
It is inline in hope of faster implementation for certain platform.
Param:
pPkt - pointer to a wpt_packet.
Return:
NULL - fail.
Otherwise the address of the starting of the buffer
---------------------------------------------------------------------------*/
extern wpt_uint8 *wpalPacketGetRawBuf(wpt_packet *pPkt);
/*---------------------------------------------------------------------------
wpalPacketSetRxLength – Set the valid data length on a RX packet. This function must
be called once per RX packet per receiving. It indicates the available data length from
the start of the buffer.
Param:
pPkt - pointer to a wpt_packet.
Return:
NULL - fail.
Otherwise the address of the starting of the buffer
---------------------------------------------------------------------------*/
extern wpt_status wpalPacketSetRxLength(wpt_packet *pPkt, wpt_uint32 len);
/*---------------------------------------------------------------------------
wpalIteratorInit – Initialize an interator by updating pCur to first item.
Param:
pIter – pointer to a caller allocated wpt_iterator
pPacket – pointer to a wpt_packet
Return:
eWLAN_PAL_STATUS_SUCCESS - success
---------------------------------------------------------------------------*/
wpt_status wpalIteratorInit(wpt_iterator *pIter, wpt_packet *pPacket);
/*---------------------------------------------------------------------------
wpalIteratorNext – Get the address for the next item
Param:
pIter – pointer to a caller allocated wpt_iterator
pPacket – pointer to a wpt_packet
ppAddr – Caller allocated pointer to return the address of the item. For DMA-able devices, this is the physical address of the item.
pLen – To return the number of bytes in the item.
Return:
eWLAN_PAL_STATUS_SUCCESS - success
---------------------------------------------------------------------------*/
wpt_status wpalIteratorNext(wpt_iterator *pIter, wpt_packet *pPacket, void **ppAddr, wpt_uint32 *pLen);
/*---------------------------------------------------------------------------
wpalLockPacketForTransfer – Packet must be locked before transfer can begin,
the lock will ensure that the DMA engine has access to the data packet
in a cache coherent manner
Param:
pPacket – pointer to a wpt_packet
Return:
eWLAN_PAL_STATUS_SUCCESS - success
---------------------------------------------------------------------------*/
wpt_status wpalLockPacketForTransfer( wpt_packet *pPacket);
/*---------------------------------------------------------------------------
wpalUnlockPacket – Once the transfer has been completed the packet should
be unlocked so that normal operation may resume
Param:
pPacket – pointer to a wpt_packet
Return:
eWLAN_PAL_STATUS_SUCCESS - success
---------------------------------------------------------------------------*/
wpt_status wpalUnlockPacket( wpt_packet *pPacket);
/*---------------------------------------------------------------------------
wpalPacketGetFragCount – Get count of memory chains (fragments)
in a packet
Param:
pPacket – pointer to a wpt_packet
Return:
memory fragment count in a packet
---------------------------------------------------------------------------*/
wpt_int32 wpalPacketGetFragCount(wpt_packet *pPkt);
/*---------------------------------------------------------------------------
wpalIsPacketLocked – Check whether the Packet is locked for DMA.
Param:
pPacket – pointer to a wpt_packet
Return:
eWLAN_PAL_STATUS_SUCCESS
eWLAN_PAL_STATUS_E_FAILURE
eWLAN_PAL_STATUS_E_INVAL
---------------------------------------------------------------------------*/
wpt_status wpalIsPacketLocked( wpt_packet *pPacket);
/*---------------------------------------------------------------------------
wpalGetNumRxRawPacket Query available RX RAW total buffer count
param:
numRxResource pointer of queried value
return:
eWLAN_PAL_STATUS_SUCCESS
---------------------------------------------------------------------------*/
wpt_status wpalGetNumRxRawPacket(wpt_uint32 *numRxResource);
/*---------------------------------------------------------------------------
wpalPacketStallUpdateInfo – Update each channel information when stall
detected, also power state and free resource count
Param:
powerState ? WLAN system power state when stall detected
numFreeBd ? Number of free resource count in HW
channelInfo ? Each channel specific information when stall happen
channelNum ? Channel number update information
Return:
NONE
---------------------------------------------------------------------------*/
void wpalPacketStallUpdateInfo
(
v_U32_t *powerState,
v_U32_t *numFreeBd,
wpt_log_data_stall_channel_type *channelInfo,
v_U8_t channelNum
);
#ifdef FEATURE_WLAN_DIAG_SUPPORT
/*---------------------------------------------------------------------------
wpalPacketStallDumpLog – Trigger to send log packet to DIAG
Updated transport system information will be sent to DIAG
Param:
NONE
Return:
NONE
---------------------------------------------------------------------------*/
void wpalPacketStallDumpLog
(
void
);
#endif /* FEATURE_WLAN_DIAG_SUPPORT */
#endif // __WLAN_QCT_PAL_PACKET_H