hal_ti/simplelink/source/ti/drivers/net/wifi/source/driver.h

528 lines
21 KiB
C

/*
* driver.h - CC31xx/CC32xx Host Driver Implementation
*
* Copyright (C) 2017 Texas Instruments Incorporated - http://www.ti.com/
*
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the
* distribution.
*
* Neither the name of Texas Instruments Incorporated nor the names of
* its contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/
#ifndef __DRIVER_INT_H__
#define __DRIVER_INT_H__
#ifdef __cplusplus
extern "C" {
#endif
#include <ti/drivers/net/wifi/source/protocol.h>
#define TIMEOUT_STATE_EXPIRY (0)
#define TIMEOUT_ONE_MORE_SHOT (1)
#define TIMEOUT_STATE_INIT_VAL (2)
/* Timeouts for the sync objects */
#ifndef SL_DRIVER_TIMEOUT_SHORT
#define SL_DRIVER_TIMEOUT_SHORT (10000) /* msec units */
#endif
#ifndef SL_DRIVER_TIMEOUT_LONG
#define SL_DRIVER_TIMEOUT_LONG (65535) /* msec units */
#endif
#define INIT_COMPLETE_TIMEOUT SL_DRIVER_TIMEOUT_LONG
#define STOP_DEVICE_TIMEOUT SL_DRIVER_TIMEOUT_LONG
#ifndef SYNC_PATTERN_TIMEOUT_IN_MSEC
#define SYNC_PATTERN_TIMEOUT_IN_MSEC (50) /* the sync patttern timeout in milliseconds units */
#endif
#define GLOBAL_LOCK_FLAGS_NONE (0x0)
#define GLOBAL_LOCK_FLAGS_UPDATE_API_IN_PROGRESS (0x1) /* Bit 0 */
#define GLOBAL_LOCK_FLAGS_PROVISIONING_STOP_API (0x2) /* Bit 1*/
#define GLOBAL_LOCK_FLAGS_STARTING_DEVICE (0x4) /* Bit 2 */
/*****************************************************************************/
/* Macro declarations */
/*****************************************************************************/
#ifndef CPU_FREQ_IN_MHZ
#define CPU_FREQ_IN_MHZ (200)
#endif
#define USEC_DELAY (50)
#define SL_DRV_PROTECTION_OBJ_UNLOCK() LOCK_OK_CHECK(_SlDrvProtectionObjUnLock());
#define SL_DRV_PROTECTION_OBJ_LOCK_FOREVER() LOCK_OK_CHECK(_SlDrvProtectionObjLockWaitForever());
#define SL_DRV_OBJ_UNLOCK(pObj) LOCK_OK_CHECK(_SlDrvObjUnLock(pObj));
#define SL_DRV_OBJ_LOCK_FOREVER(pObj) LOCK_OK_CHECK(_SlDrvObjLockWaitForever(pObj));
#define SL_DRV_SYNC_OBJ_SIGNAL(pObj) _SlDrvSyncObjSignal(pObj);
#define SL_DRV_SYNC_OBJ_SIGNAL_FROM_IRQ(pObj) sl_SyncObjSignalFromIRQ(pObj);
#define SL_DRV_SYNC_OBJ_CLEAR(pObj) sl_SyncObjWait(pObj,SL_OS_NO_WAIT);
#define SL_DRV_SYNC_OBJ_WAIT_FOREVER(SyncObj) { \
if (SL_API_ABORTED == _SlDrvSyncObjWaitForever(SyncObj)) \
{ \
return SL_API_ABORTED; \
} \
}
#define SL_DRV_SYNC_OBJ_WAIT_TIMEOUT(SyncObj, timeoutVal, opcode) { \
if (SL_API_ABORTED == _SlDrvSyncObjWaitTimeout(SyncObj, timeoutVal, opcode)) \
{ \
_SlDrvReleasePoolObj(g_pCB->FunctionParams.AsyncExt.ActionIndex); \
return SL_API_ABORTED; \
} \
}
#define SL_DRV_LOCK_GLOBAL_LOCK_FOREVER(Flags) { \
_SlReturnVal_t retVal; \
\
retVal = _SlDrvObjGlobalLockWaitForever(Flags); \
if (retVal) \
{ \
return retVal; \
} \
}
#define SL_DRV_LOCK_GLOBAL_UNLOCK(bDecrementApiInProgress) { \
_SlReturnVal_t retVal; \
\
retVal = _SlDrvGlobalObjUnLock(bDecrementApiInProgress); \
if (retVal) \
{ \
return retVal; \
} \
}
#define SL_IS_RESTART_REQUIRED (g_SlDeviceStatus & _SL_DRV_STATUS_BIT_RESTART_REQUIRED) /* bit 8 indicates restart is required due to fatal error */
#define SL_IS_DEVICE_STARTED (g_SlDeviceStatus & _SL_DRV_STATUS_BIT_DEVICE_STARTED) /* bit 9 indicates device is started */
#define SL_IS_DEVICE_LOCKED (g_SlDeviceStatus & _SL_DEV_STATUS_BIT_LOCKED) /* bits 0-7 devStatus from NWP, bit 2 = device locked */
#define SL_IS_PROVISIONING_ACTIVE (!!(g_SlDeviceStatus & _SL_DEV_STATUS_BIT_PROVISIONING_ACTIVE)) /* bits 0-7 devStatus from NWP, bit 3 = provisioning active */
#define SL_IS_PROVISIONING_INITIATED_BY_USER (!!(g_SlDeviceStatus & _SL_DEV_STATUS_BIT_PROVISIONING_USER_INITIATED)) /* bits 0-7 devStatus from NWP, bit 4 = provisioning initiated by the user */
#define SL_IS_PROVISIONING_API_ALLOWED (!!(g_SlDeviceStatus & _SL_DEV_STATUS_BIT_PROVISIONING_ENABLE_API))
#define SL_IS_DEVICE_STOP_IN_PROGRESS (!!(g_SlDeviceStatus & _SL_DRV_STATUS_BIT_STOP_IN_PROGRESS))
#define SL_IS_DEVICE_START_IN_PROGRESS (!!(g_SlDeviceStatus & _SL_DRV_STATUS_BIT_START_IN_PROGRESS))
#define SL_IS_PROVISIONING_IN_PROGRESS (!!(g_SlDeviceStatus & ( _SL_DEV_STATUS_BIT_PROVISIONING_USER_INITIATED | _SL_DEV_STATUS_BIT_PROVISIONING_ACTIVE)))
#define SL_IS_WLAN_RX_STAT_IN_PROGRESS (g_SlDeviceStatus & _SL_DRV_STATUS_BIT_RX_STAT_IN_PROGRESS) /* bit 13 indicates there is RX-statistics-start in progress */
#define SL_IS_DEVICE_STAT_IN_PROGRESS (g_SlDeviceStatus & _SL_DRV_STATUS_BIT_DEVICE_STAT_IN_PROGRESS) /* bit 14 indicates there is device-statistics-start in progress */
/* Check the following conditions:
1. Device started
2. Restart device is not required
3. Provisioning is active
4. Provisioning was already initiated by the user
5. Device is not locked
*/
#define SL_IS_COMMAND_ALLOWED ((g_SlDeviceStatus & (_SL_DRV_STATUS_BIT_DEVICE_STARTED | \
_SL_DRV_STATUS_BIT_RESTART_REQUIRED | \
_SL_DEV_STATUS_BIT_PROVISIONING_ACTIVE | \
_SL_DEV_STATUS_BIT_PROVISIONING_USER_INITIATED | \
_SL_DRV_STATUS_BIT_STOP_IN_PROGRESS | \
_SL_DEV_STATUS_BIT_LOCKED)) == 0x200)
#define SL_IS_GLOBAL_LOCK_INIT (g_SlDeviceStatus & _SL_DRV_STATUS_BIT_GLOBAL_LOCK_INIT)
#define SL_SET_GLOBAL_LOCK_INIT (g_SlDeviceStatus |= _SL_DRV_STATUS_BIT_GLOBAL_LOCK_INIT)
#define SL_UNSET_GLOBAL_LOCK_INIT (g_SlDeviceStatus &= (~ _SL_DRV_STATUS_BIT_GLOBAL_LOCK_INIT))
#define SL_SET_RESTART_REQUIRED (g_SlDeviceStatus |= _SL_DRV_STATUS_BIT_RESTART_REQUIRED) /* bit 8 indicates restart is required due to fatal error */
#define SL_UNSET_RESTART_REQUIRED (g_SlDeviceStatus &= (~_SL_DRV_STATUS_BIT_RESTART_REQUIRED)) /* bit 8 indicates restart is required due to fatal error */
#define SL_SET_DEVICE_STARTED (g_SlDeviceStatus |= _SL_DRV_STATUS_BIT_DEVICE_STARTED) /* bit 9 indicates device is started */
#define SL_UNSET_DEVICE_STARTED (g_SlDeviceStatus &= (~_SL_DRV_STATUS_BIT_DEVICE_STARTED)) /* bit 9 indicates device is started */
#define SL_SET_DEVICE_STOP_IN_PROGRESS (g_SlDeviceStatus |= _SL_DRV_STATUS_BIT_STOP_IN_PROGRESS) /* bit 10 indicates there is stop in progress */
#define SL_UNSET_DEVICE_STOP_IN_PROGRESS (g_SlDeviceStatus &= (~_SL_DRV_STATUS_BIT_STOP_IN_PROGRESS)) /* bit 10 indicates there is stop in progress */
/* Start in progress */
#define SL_SET_DEVICE_START_IN_PROGRESS (g_SlDeviceStatus |= _SL_DRV_STATUS_BIT_START_IN_PROGRESS) /* bit 11 indicates there is start in progress */
#define SL_UNSET_DEVICE_START_IN_PROGRESS (g_SlDeviceStatus &= (~_SL_DRV_STATUS_BIT_START_IN_PROGRESS)) /* bit 11 indicates there is start in progress */
/* Statistics flags - Rx stat and device state cannot run in parallel */
/* Rx statistics start in progress */
#define SL_SET_WLAN_RX_STAT_IN_PROGRESS (g_SlDeviceStatus |= _SL_DRV_STATUS_BIT_RX_STAT_IN_PROGRESS) /* bit 13 indicates there is RX-statistics-start in progress */
#define SL_UNSET_WLAN_RX_STAT_IN_PROGRESS (g_SlDeviceStatus &= (~_SL_DRV_STATUS_BIT_RX_STAT_IN_PROGRESS)) /* bit 13 indicates there is RX-statistics-start in progress */
/* Device statistics start in progress */
#define SL_SET_DEVICE_STAT_IN_PROGRESS (g_SlDeviceStatus |= _SL_DRV_STATUS_BIT_DEVICE_STAT_IN_PROGRESS) /* bit 14 indicates there is device-statistics-start in progress*/
#define SL_UNSET_DEVICE_STAT_IN_PROGRESS (g_SlDeviceStatus &= (~_SL_DRV_STATUS_BIT_DEVICE_STAT_IN_PROGRESS)) /* bit 14 indicates there is device-statistics-start in progress */
#define SL_SET_DEVICE_STATUS(x) (g_SlDeviceStatus = ((g_SlDeviceStatus & 0xFF00) | (_u16)x) ) /* bits 0-7 devStatus from NWP */
#define _SL_PENDING_RX_MSG(pDriverCB) (RxIrqCnt != (pDriverCB)->RxDoneCnt)
/*****************************************************************************/
/* Structure/Enum declarations */
/*****************************************************************************/
typedef struct _SlSpawnMsgItem_s
{
_SlSpawnEntryFunc_t AsyncHndlr;
_u8 ActionIndex;
void *Buffer;
struct _SlSpawnMsgItem_s *next;
} _SlSpawnMsgItem_t;
typedef struct
{
_u32 TSPrev;
_u32 TSCurr;
_u32 DeltaTicks;
_u32 DeltaTicksReminder;
_i32 Total10MSecUnits;
} _SlTimeoutParams_t;
typedef struct
{
_u8 *pAsyncMsgBuff;
_u8 bInCmdContext;
} DeviceEventInfo_t;
typedef struct
{
_SlOpcode_t Opcode;
_SlArgSize_t TxDescLen;
_SlArgSize_t RxDescLen;
}_SlCmdCtrl_t;
typedef struct
{
_u16 TxPayload1Len;
_u16 TxPayload2Len;
_i16 RxPayloadLen;
_i16 ActualRxPayloadLen;
_u8 *pTxPayload1;
_u8 *pTxPayload2;
_u8 *pRxPayload;
}_SlCmdExt_t;
typedef struct _SlArgsData_t
{
_u8 *pArgs;
_u8 *pData;
} _SlArgsData_t;
typedef struct _SlPoolObj_t
{
_SlSyncObj_t SyncObj;
_u8 *pRespArgs;
_u8 ActionID;
_u8 AdditionalData; /* use for socketID and one bit which indicate supprt IPV6 or not (1=support, 0 otherwise) */
_u8 NextIndex;
} _SlPoolObj_t;
typedef enum
{
SOCKET_0,
SOCKET_1,
SOCKET_2,
SOCKET_3,
SOCKET_4,
SOCKET_5,
SOCKET_6,
SOCKET_7,
SOCKET_8,
SOCKET_9,
SOCKET_10,
SOCKET_11,
SOCKET_12,
SOCKET_13,
SOCKET_14,
SOCKET_15,
MAX_SOCKET_ENUM_IDX,
ACCEPT_ID = MAX_SOCKET_ENUM_IDX,
CONNECT_ID,
SELECT_ID,
GETHOSYBYNAME_ID,
GETHOSYBYSERVICE_ID,
PING_ID,
NETAPP_RECEIVE_ID,
START_STOP_ID,
NETUTIL_CMD_ID,
CLOSE_ID,
START_TLS_ID,
/**********/
RECV_ID /* Please note!! this member must be the last in this action enum */
}_SlActionID_e;
typedef struct _SlActionLookup_t
{
_u8 ActionID;
_u16 ActionAsyncOpcode;
_SlSpawnEntryFunc_t AsyncEventHandler;
} _SlActionLookup_t;
typedef struct
{
_u8 TxPoolCnt;
_u16 MinTxPayloadSize;
_SlLockObj_t TxLockObj;
_SlSyncObj_t TxSyncObj;
}_SlFlowContCB_t;
typedef enum
{
RECV_RESP_CLASS,
CMD_RESP_CLASS,
ASYNC_EVT_CLASS,
#if (defined(SL_PLATFORM_MULTI_THREADED) && !defined(slcb_SocketTriggerEventHandler))
MULTI_SELECT_RESP_CLASS,
#endif
DUMMY_MSG_CLASS
}_SlRxMsgClass_e;
typedef struct
{
_u8 ActionIndex;
_SlSpawnEntryFunc_t AsyncEvtHandler; /* place to write pointer to AsyncEvent handler (calc-ed by Opcode) */
_SlRxMsgClass_e RxMsgClass; /* type of Rx message */
} AsyncExt_t;
typedef _u8 _SlSd_t;
typedef struct
{
_SlCmdCtrl_t *pCmdCtrl;
_u8 *pTxRxDescBuff;
_SlCmdExt_t *pCmdExt;
AsyncExt_t AsyncExt;
}_SlFunctionParams_t;
#if (defined(SL_PLATFORM_MULTI_THREADED) && !defined(slcb_SocketTriggerEventHandler))
typedef struct SlSelectEntry_t
{
SlSelectAsyncResponse_t Response;
_u32 TimeStamp;
_u16 readlist;
_u16 writelist;
_i16 ObjIdx;
}_SlSelectEntry_t;
typedef struct _SlMultiSelectCB_t
{
_u16 readsds;
_u16 writesds;
_u16 CtrlSockFD;
_u8 ActiveSelect;
_u8 ActiveWaiters;
_BasicResponse_t SelectCmdResp;
_SlSyncObj_t SelectSyncObj;
_SlLockObj_t SelectLockObj;
_SlSelectEntry_t* SelectEntry[MAX_CONCURRENT_ACTIONS];
}_SlMultiSelectCB_t;
#else
typedef enum
{
SOCK_TRIGGER_READY,
SOCK_TRIGGER_WAITING_FOR_RESP,
SOCK_TRIGGER_RESP_RECEIVED
} _SlSockTriggerState_e;
typedef struct
{
_SlSockTriggerState_e State;
_u8 ObjPoolIdx;
} _SlSockTriggerData_t;
typedef struct
{
_SlSockTriggerData_t Info;
SlSelectAsyncResponse_t Resp;
} _SlSockTriggerSelect_t;
#endif
typedef struct
{
_SlFd_t FD;
_SlCommandHeader_t TempProtocolHeader;
P_INIT_CALLBACK pInitCallback;
_SlPoolObj_t ObjPool[MAX_CONCURRENT_ACTIONS];
_u8 FreePoolIdx;
_u8 PendingPoolIdx;
_u8 ActivePoolIdx;
_u32 ActiveActionsBitmap;
_SlLockObj_t ProtectionLockObj;
_SlSyncObj_t CmdSyncObj;
_u8 WaitForCmdResp;
_SlFlowContCB_t FlowContCB;
_u8 TxSeqNum;
_u8 RxDoneCnt;
_u16 SocketNonBlocking;
_u16 SocketTXFailure;
/* for stack reduction the parameters are globals */
_SlFunctionParams_t FunctionParams;
_u8 ActionIndex;
_i8 ApiInProgressCnt; /* Counts how many APIs are in progress */
#if (defined(SL_PLATFORM_MULTI_THREADED) && !defined(slcb_SocketTriggerEventHandler))
/* Multiple Select Control block */
_SlMultiSelectCB_t MultiSelectCB;
#endif
#if defined(slcb_SocketTriggerEventHandler)
/* Trigger mode control block */
_SlSockTriggerSelect_t SocketTriggerSelect;
#endif
#ifdef SL_MEMORY_MGMT_DYNAMIC
_SlSpawnMsgItem_t *spawnMsgList;
#endif
_u8 NumOfDeletedSyncObj;
}_SlDriverCb_t;
typedef struct
{
_SlSpawnEntryFunc_t AsyncHndlr;
_u8 ActionIndex;
_u8 Buffer[SL_ASYNC_MAX_MSG_LEN];
}_SlAsyncRespBuf_t;
extern _volatile _u8 RxIrqCnt;
extern _SlLockObj_t GlobalLockObj;
extern _u16 g_SlDeviceStatus;
extern _SlDriverCb_t* g_pCB;
extern P_SL_DEV_PING_CALLBACK pPingCallBackFunc;
/*****************************************************************************/
/* Function prototypes */
/*****************************************************************************/
extern _SlReturnVal_t _SlDrvDriverCBInit(void);
extern _SlReturnVal_t _SlDrvDriverCBDeinit(void);
extern _SlReturnVal_t _SlDrvRxIrqHandler(void *pValue);
extern _SlReturnVal_t _SlDrvCmdOp(_SlCmdCtrl_t *pCmdCtrl , void* pTxRxDescBuff , _SlCmdExt_t* pCmdExt);
extern _SlReturnVal_t _SlDrvCmdSend_noLock(_SlCmdCtrl_t *pCmdCtrl , void* pTxRxDescBuff , _SlCmdExt_t* pCmdExt);
extern _SlReturnVal_t _SlDrvCmdSend_noWait(_SlCmdCtrl_t *pCmdCtrl , void* pTxRxDescBuff , _SlCmdExt_t* pCmdExt);
extern _SlReturnVal_t _SlDrvCmdSend(_SlCmdCtrl_t *pCmdCtrl , void *pTxRxDescBuff , _SlCmdExt_t *pCmdExt);
extern _SlReturnVal_t _SlDrvDataReadOp(_SlSd_t Sd, _SlCmdCtrl_t *pCmdCtrl , void* pTxRxDescBuff , _SlCmdExt_t* pCmdExt);
extern _SlReturnVal_t _SlDrvDataWriteOp(_SlSd_t Sd, _SlCmdCtrl_t *pCmdCtrl , void* pTxRxDescBuff , _SlCmdExt_t* pCmdExt);
extern _SlReturnVal_t _SlDeviceHandleAsync_InitComplete(void *pVoidBuf);
extern _SlReturnVal_t _SlSocketHandleAsync_Connect(void *pVoidBuf);
extern _SlReturnVal_t _SlSocketHandleAsync_Close(void *pVoidBuf);
extern _SlReturnVal_t _SlDrvGlobalObjUnLock(_u8 bDecrementApiInProgress);
extern _SlReturnVal_t _SlDrvObjGlobalLockWaitForever(_u32 Flags);
extern _SlReturnVal_t _SlDrvDriverIsApiAllowed(_u16 Silo);
extern _SlReturnVal_t _SlDrvMsgReadSpawnCtx(void *pValue);
extern void _SlInternalSpawnWaitForEvent(void);
extern void _SlDrvSetGlobalLockOwner(_u8 Owner);
#if (!defined (SL_PLATFORM_EXTERNAL_SPAWN))
extern _u8 _SlDrvIsSpawnOwnGlobalLock();
#endif
extern _SlReturnVal_t _SlDrvBasicCmd(_SlOpcode_t Opcode);
extern _SlReturnVal_t _SlSocketHandleAsync_Accept(void *pVoidBuf);
extern _SlReturnVal_t _SlNetAppHandleAsync_DnsGetHostByService(void *pVoidBuf);
extern _SlReturnVal_t _SlSocketHandleAsync_Select(void *pVoidBuf);
extern _SlReturnVal_t _SlSocketHandleAsync_StartTLS(void *pVoidBuf);
extern _SlReturnVal_t _SlDrvReleaseAllActivePendingPoolObj();
#ifdef slcb_GetTimestamp
extern void _SlDrvStartMeasureTimeout(_SlTimeoutParams_t *pTimeoutInfo, _u32 TimeoutInMsec);
extern _u8 _SlDrvIsTimeoutExpired(_SlTimeoutParams_t *pTimeoutInfo);
extern void _SlDrvSleep(_u16 DurationInMsec);
#endif
#if defined(SL_PLATFORM_MULTI_THREADED)
/* Note: pthread_self() previously declared here */
#endif
extern _SlReturnVal_t _SlNetAppHandleAsync_DnsGetHostByName(void *pVoidBuf);
extern _SlReturnVal_t _SlNetAppHandleAsync_DnsGetHostByAddr(void *pVoidBuf);
extern _SlReturnVal_t _SlNetAppHandleAsync_PingResponse(void *pVoidBuf);
extern _SlReturnVal_t _SlNetAppEventHandler(void* pArgs);
#if defined(slcb_NetAppHttpServerHdlr) || defined(EXT_LIB_REGISTERED_HTTP_SERVER_EVENTS)
extern void _SlDrvDispatchHttpServerEvents(SlNetAppHttpServerEvent_t *slHttpServerEvent, SlNetAppHttpServerResponse_t *slHttpServerResponse);
#endif
#if defined(slcb_NetAppRequestHdlr) || defined(EXT_LIB_REGISTERED_NETAPP_REQUEST_EVENTS)
extern void _SlDrvDispatchNetAppRequestEvents(SlNetAppRequest_t *slNetAppRequestEvent, SlNetAppResponse_t *slNetAppResponse);
#endif
extern void _SlDeviceHandleAsync_Stop(void *pVoidBuf);
extern void _SlNetUtilHandleAsync_Cmd(void *pVoidBuf);
extern _SlReturnVal_t _SlDrvWaitForPoolObj(_u8 ActionID, _u8 SocketID);
extern _SlReturnVal_t _SlDrvReleasePoolObj(_u8 pObj);
extern void _SlDrvReleaseAllPendingPoolObj();
extern _SlReturnVal_t _SlDrvAlignSize(_u16 msgLen);
extern _SlReturnVal_t _SlDrvProtectAsyncRespSetting(_u8 *pAsyncRsp, _SlActionID_e ActionID, _u8 SocketID);
extern void _SlNetAppHandleAsync_NetAppReceive(void *pVoidBuf);
extern _SlReturnVal_t _SlDeviceEventHandler(void* pEventInfo);
extern _SlReturnVal_t _SlDrvSyncObjWaitForever(_SlSyncObj_t *pSyncObj);
extern _SlReturnVal_t _SlDrvObjLockWaitForever(_SlLockObj_t *pLockObj);
extern _SlReturnVal_t _SlDrvSyncObjWaitTimeout(_SlSyncObj_t *pSyncObj,
_u32 timeoutVal,
_u32 asyncEventOpcode);
extern _SlReturnVal_t _SlDrvSyncObjSignal(_SlSyncObj_t *pSyncObj);
extern _SlReturnVal_t _SlDrvObjLock(_SlLockObj_t *pLockObj, _SlTime_t Timeout);
extern _SlReturnVal_t _SlDrvProtectionObjLockWaitForever(void);
extern _SlReturnVal_t _SlDrvObjUnLock(_SlLockObj_t *pLockObj);
extern _SlReturnVal_t _SlDrvProtectionObjUnLock(void);
extern void _SlDrvMemZero(void* Addr, _u16 size);
extern void _SlDrvResetCmdExt(_SlCmdExt_t* pCmdExt);
extern _i8 _SlDrvIsApiInProgress(void);
extern void _SlDrvHandleResetRequest(const void* pIfHdl, _i8* pDevName);
extern _SlReturnVal_t _SlDrvWaitForInternalAsyncEvent(_u8 ObjIdx, _u32 Timeout, _SlOpcode_t Opcode);
extern _SlReturnVal_t _SlSpawnMsgListInsert(_u16 AsyncEventLen, _u8 *pAsyncBuf);
extern _SlReturnVal_t _SlSpawnMsgListProcess(void);
extern _u16 _SlSpawnMsgListGetCount(void);
extern void _SlDrvHandleFatalError(_u32 errorId, _u32 info1, _u32 info2);
extern void _SlDrvHandleAssert(void);
extern void _SlFindAndReleasePendingCmd();
#define _SL_PROTOCOL_ALIGN_SIZE(msgLen) (((msgLen)+3) & (~3))
#define _SL_IS_PROTOCOL_ALIGNED_SIZE(msgLen) (!((msgLen) & 3))
#define _SL_PROTOCOL_CALC_LEN(pCmdCtrl,pCmdExt) ((pCmdExt) ? \
(_SL_PROTOCOL_ALIGN_SIZE(pCmdCtrl->TxDescLen) + _SL_PROTOCOL_ALIGN_SIZE(pCmdExt->TxPayload1Len + pCmdExt->TxPayload2Len)) : \
(_SL_PROTOCOL_ALIGN_SIZE(pCmdCtrl->TxDescLen)))
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* __DRIVER_INT_H__ */