40 #include <ti/drivers/net/wifi/simplelink.h> 41 #include <ti/drivers/net/wifi/source/protocol.h> 42 #include <ti/drivers/net/wifi/source/driver.h> 43 #include <ti/drivers/net/wifi/source/flowcont.h> 48 #ifndef SL_PLATFORM_MULTI_THREADED 50 #define GLOBAL_LOCK_CONTEXT_OWNER_APP (1) 51 #define GLOBAL_LOCK_CONTEXT_OWNER_SPAWN (2) 53 _u8 gGlobalLockContextOwner = GLOBAL_LOCK_CONTEXT_OWNER_APP;
57 _u8 gGlobalLockCntRequested=0;
58 _u8 gGlobalLockCntReleased=0;
62 static void _SlDrvUpdateApiInProgress(_i8 Value);
64 #define API_IN_PROGRESS_UPDATE_NONE (0) 65 #define API_IN_PROGRESS_UPDATE_INCREMENT (1) 66 #define API_IN_PROGRESS_UPDATE_DECREMENT (-1) 72 #define N2H_SYNC_PATTERN_SEQ_NUM_BITS ((_u32)0x00000003) 73 #define N2H_SYNC_PATTERN_SEQ_NUM_EXISTS ((_u32)0x00000004) 74 #define N2H_SYNC_PATTERN_MASK ((_u32)0xFFFFFFF8) 75 #define N2H_SYNC_SPI_BUGS_MASK ((_u32)0x7FFF7F7F) 76 #define BUF_SYNC_SPIM(pBuf) ((*(_u32 *)(pBuf)) & N2H_SYNC_SPI_BUGS_MASK) 78 #define N2H_SYNC_SPIM (N2H_SYNC_PATTERN & N2H_SYNC_SPI_BUGS_MASK) 79 #define N2H_SYNC_SPIM_WITH_SEQ(TxSeqNum) ((N2H_SYNC_SPIM & N2H_SYNC_PATTERN_MASK) | N2H_SYNC_PATTERN_SEQ_NUM_EXISTS | ((TxSeqNum) & (N2H_SYNC_PATTERN_SEQ_NUM_BITS))) 80 #define MATCH_WOUT_SEQ_NUM(pBuf) ( BUF_SYNC_SPIM(pBuf) == N2H_SYNC_SPIM ) 81 #define MATCH_WITH_SEQ_NUM(pBuf, TxSeqNum) ( BUF_SYNC_SPIM(pBuf) == (N2H_SYNC_SPIM_WITH_SEQ(TxSeqNum)) ) 82 #define N2H_SYNC_PATTERN_MATCH(pBuf, TxSeqNum) \ 84 ( (*((_u32 *)pBuf) & N2H_SYNC_PATTERN_SEQ_NUM_EXISTS) && ( MATCH_WITH_SEQ_NUM(pBuf, TxSeqNum) ) ) || \ 85 ( !(*((_u32 *)pBuf) & N2H_SYNC_PATTERN_SEQ_NUM_EXISTS) && ( MATCH_WOUT_SEQ_NUM(pBuf ) ) ) \ 88 #define OPCODE(_ptr) (((_SlResponseHeader_t *)(_ptr))->GenHeader.Opcode) 89 #define RSP_PAYLOAD_LEN(_ptr) (((_SlResponseHeader_t *)(_ptr))->GenHeader.Len - _SL_RESP_SPEC_HDR_SIZE) 90 #define SD(_ptr) (((SlSocketAddrResponse_u *)(_ptr))->IpV4.Sd) 92 #define ACT_DATA_SIZE(_ptr) (((SlSocketAddrResponse_u *)(_ptr))->IpV4.StatusOrLen) 94 #if (defined(SL_PLATFORM_MULTI_THREADED) && !defined(slcb_SocketTriggerEventHandler)) 95 #define MULTI_SELECT_MASK (~(1 << SELECT_ID)) 97 #define MULTI_SELECT_MASK (0xFFFFFFFF) 103 #if defined (EXT_LIB_REGISTERED_GENERAL_EVENTS) 105 typedef _SlEventPropogationStatus_e (*general_callback) (
SlDeviceEvent_t *);
107 static const general_callback general_callbacks[] =
109 #ifdef SlExtLib1GeneralEventHandler 110 SlExtLib1GeneralEventHandler,
113 #ifdef SlExtLib2GeneralEventHandler 114 SlExtLib2GeneralEventHandler,
117 #ifdef SlExtLib3GeneralEventHandler 118 SlExtLib3GeneralEventHandler,
121 #ifdef SlExtLib4GeneralEventHandler 122 SlExtLib4GeneralEventHandler,
125 #ifdef SlExtLib5GeneralEventHandler 126 SlExtLib5GeneralEventHandler,
130 #undef _SlDrvHandleGeneralEvents 142 for ( i = 0 ; i <
sizeof(general_callbacks)/
sizeof(general_callbacks[0]) ; i++ )
144 if (EVENT_PROPAGATION_BLOCK == general_callbacks[i](slGeneralEvent) )
152 #ifdef slcb_DeviceGeneralEvtHdlr 162 #if defined (EXT_LIB_REGISTERED_WLAN_EVENTS) 164 typedef _SlEventPropogationStatus_e (*wlan_callback) (
SlWlanEvent_t *);
166 static wlan_callback wlan_callbacks[] =
168 #ifdef SlExtLib1WlanEventHandler 169 SlExtLib1WlanEventHandler,
172 #ifdef SlExtLib2WlanEventHandler 173 SlExtLib2WlanEventHandler,
176 #ifdef SlExtLib3WlanEventHandler 177 SlExtLib3WlanEventHandler,
180 #ifdef SlExtLib4WlanEventHandler 181 SlExtLib4WlanEventHandler,
184 #ifdef SlExtLib5WlanEventHandler 185 SlExtLib5WlanEventHandler,
189 #undef _SlDrvHandleWlanEvents 201 for ( i = 0 ; i <
sizeof(wlan_callbacks)/
sizeof(wlan_callbacks[0]) ; i++ )
203 if ( EVENT_PROPAGATION_BLOCK == wlan_callbacks[i](slWlanEvent) )
211 #ifdef slcb_WlanEvtHdlr 220 #if defined (EXT_LIB_REGISTERED_NETAPP_EVENTS) 222 typedef _SlEventPropogationStatus_e (*netApp_callback) (
SlNetAppEvent_t *);
224 static const netApp_callback netApp_callbacks[] =
226 #ifdef SlExtLib1NetAppEventHandler 227 SlExtLib1NetAppEventHandler,
230 #ifdef SlExtLib2NetAppEventHandler 231 SlExtLib2NetAppEventHandler,
234 #ifdef SlExtLib3NetAppEventHandler 235 SlExtLib3NetAppEventHandler,
238 #ifdef SlExtLib4NetAppEventHandler 239 SlExtLib4NetAppEventHandler,
242 #ifdef SlExtLib5NetAppEventHandler 243 SlExtLib5NetAppEventHandler,
247 #undef _SlDrvHandleNetAppEvents 259 for ( i = 0 ; i <
sizeof(netApp_callbacks)/
sizeof(netApp_callbacks[0]) ; i++ )
261 if (EVENT_PROPAGATION_BLOCK == netApp_callbacks[i](slNetAppEvent) )
269 #ifdef slcb_NetAppEvtHdlr 278 #if defined (EXT_LIB_REGISTERED_HTTP_SERVER_EVENTS) 282 static const httpServer_callback httpServer_callbacks[] =
284 #ifdef SlExtLib1HttpServerEventHandler 285 SlExtLib1HttpServerEventHandler,
288 #ifdef SlExtLib2HttpServerEventHandler 289 SlExtLib2HttpServerEventHandler,
292 #ifdef SlExtLib3HttpServerEventHandler 293 SlExtLib3HttpServerEventHandler,
296 #ifdef SlExtLib4HttpServerEventHandler 297 SlExtLib4HttpServerEventHandler,
300 #ifdef SlExtLib5HttpServerEventHandler 301 SlExtLib5HttpServerEventHandler,
305 #undef _SlDrvHandleHttpServerEvents 317 for ( i = 0 ; i <
sizeof(httpServer_callbacks)/
sizeof(httpServer_callbacks[0]) ; i++ )
319 if ( EVENT_PROPAGATION_BLOCK == httpServer_callbacks[i](slHttpServerEvent, slHttpServerResponse) )
327 #ifdef slcb_NetAppHttpServerHdlr 336 #if defined (EXT_LIB_REGISTERED_SOCK_EVENTS) 338 typedef _SlEventPropogationStatus_e (*sock_callback) (
SlSockEvent_t *);
340 static const sock_callback sock_callbacks[] =
342 #ifdef SlExtLib1SockEventHandler 343 SlExtLib1SockEventHandler,
346 #ifdef SlExtLib2SockEventHandler 347 SlExtLib2SockEventHandler,
350 #ifdef SlExtLib3SockEventHandler 351 SlExtLib3SockEventHandler,
354 #ifdef SlExtLib4SockEventHandler 355 SlExtLib4SockEventHandler,
358 #ifdef SlExtLib5SockEventHandler 359 SlExtLib5SockEventHandler,
373 for ( i = 0 ; i <
sizeof(sock_callbacks)/
sizeof(sock_callbacks[0]) ; i++ )
375 if ( EVENT_PROPAGATION_BLOCK == sock_callbacks[i](slSockEvent) )
383 #ifdef slcb_SockEvtHdlr 392 #if defined (EXT_LIB_REGISTERED_FATAL_ERROR_EVENTS) 394 typedef _SlEventPropogationStatus_e (*fatal_error_callback) (
SlDeviceEvent_t *);
396 static const fatal_error_callback fatal_error_callbacks[] =
398 #ifdef SlExtLib1FatalErrorEventHandler 399 SlExtLib1FatalErrorEventHandler,
402 #ifdef SlExtLib2FatalErrorEventHandler 403 SlExtLib2FatalErrorEventHandler,
406 #ifdef SlExtLib3FatalErrorEventHandler 407 SlExtLib3FatalErrorEventHandler,
410 #ifdef SlExtLib4FatalErrorEventHandler 411 SlExtLib4FatalErrorEventHandler,
414 #ifdef SlExtLib5FatalErrorEventHandler 415 SlExtLib5FatalErrorEventHandler,
419 #undef _SlDrvHandleFatalErrorEvents 431 for ( i = 0 ; i <
sizeof(fatal_error_callbacks)/
sizeof(fatal_error_callbacks[0]) ; i++ )
433 if (EVENT_PROPAGATION_BLOCK == fatal_error_callbacks[i](slFatalErrorEvent) )
441 #ifdef slcb_DeviceFatalErrorEvtHdlr 449 #if defined (EXT_LIB_REGISTERED_NETAPP_REQUEST_EVENTS) 453 static const netapp_request_callback netapp_request_callbacks[] =
455 #ifdef SlExtLib1NetAppRequestEventHandler 456 SlExtLib1NetAppRequestEventHandler,
459 #ifdef SlExtLib2NetAppRequestEventHandler 460 SlExtLib2NetAppRequestEventHandler,
463 #ifdef SlExtLib3NetAppRequestEventHandler 464 SlExtLib3NetAppRequestEventHandler,
467 #ifdef SlExtLib4NetAppRequestEventHandler 468 SlExtLib4NetAppRequestEventHandler,
471 #ifdef SlExtLib5NetAppRequestEventHandler 472 SlExtLib5NetAppRequestEventHandler,
476 #undef _SlDrvHandleNetAppRequestEvents 483 void _SlDrvHandleNetAppRequestEvents(SlNetAppRequest_t *pNetAppRequest,
SlNetAppResponse_t *pNetAppResponse)
488 for ( i = 0 ; i <
sizeof(netapp_request_callbacks)/
sizeof(netapp_request_callbacks[0]) ; i++ )
490 if (EVENT_PROPAGATION_BLOCK == netapp_request_callbacks[i](pNetAppRequest, pNetAppResponse) )
498 #ifdef slcb_NetAppRequestHdlr 506 #ifndef SL_MEMORY_MGMT_DYNAMIC 510 #ifdef SL_PLATFORM_MULTI_THREADED 513 _u8 AsyncRespBuf[SL_ASYNC_MAX_MSG_LEN];
516 static _SlStatMem_t g_StatMem;
526 #ifndef SL_IF_TYPE_UART 529 _volatile _u8 RxIrqCnt;
531 _u16 g_SlDeviceStatus = 0;
532 _SlLockObj_t GlobalLockObj;
536 {ACCEPT_ID, SL_OPCODE_SOCKET_ACCEPTASYNCRESPONSE, (_SlSpawnEntryFunc_t)_SlSocketHandleAsync_Accept},
537 {CONNECT_ID, SL_OPCODE_SOCKET_CONNECTASYNCRESPONSE,(_SlSpawnEntryFunc_t)_SlSocketHandleAsync_Connect},
538 {SELECT_ID, SL_OPCODE_SOCKET_SELECTASYNCRESPONSE,(_SlSpawnEntryFunc_t)_SlSocketHandleAsync_Select},
539 {GETHOSYBYNAME_ID, SL_OPCODE_NETAPP_DNSGETHOSTBYNAMEASYNCRESPONSE,(_SlSpawnEntryFunc_t)_SlNetAppHandleAsync_DnsGetHostByName},
540 {GETHOSYBYSERVICE_ID, SL_OPCODE_NETAPP_MDNSGETHOSTBYSERVICEASYNCRESPONSE,(_SlSpawnEntryFunc_t)_SlNetAppHandleAsync_DnsGetHostByService},
541 {PING_ID, SL_OPCODE_NETAPP_PINGREPORTREQUESTRESPONSE, (_SlSpawnEntryFunc_t)_SlNetAppHandleAsync_PingResponse},
542 {NETAPP_RECEIVE_ID, SL_OPCODE_NETAPP_RECEIVE, (_SlSpawnEntryFunc_t)_SlNetAppHandleAsync_NetAppReceive},
543 {START_STOP_ID, SL_OPCODE_DEVICE_STOP_ASYNC_RESPONSE,(_SlSpawnEntryFunc_t)_SlDeviceHandleAsync_Stop},
544 {NETUTIL_CMD_ID, SL_OPCODE_NETUTIL_COMMANDASYNCRESPONSE,(_SlSpawnEntryFunc_t)_SlNetUtilHandleAsync_Cmd},
545 {CLOSE_ID, SL_OPCODE_SOCKET_SOCKETCLOSEASYNCEVENT,(_SlSpawnEntryFunc_t)_SlSocketHandleAsync_Close}
557 const OpcodeKeyVal_t OpcodeTranslateTable[] =
559 {SL_OPCODE_WLAN_STA_ASYNCCONNECTEDRESPONSE, SL_WLAN_EVENT_CONNECT},
560 {SL_OPCODE_WLAN_P2PCL_ASYNCCONNECTEDRESPONSE, SL_WLAN_EVENT_P2P_CONNECT},
561 {SL_OPCODE_WLAN_STA_ASYNCDISCONNECTEDRESPONSE, SL_WLAN_EVENT_DISCONNECT},
562 {SL_OPCODE_WLAN_P2PCL_ASYNCDISCONNECTEDRESPONSE,SL_WLAN_EVENT_P2P_DISCONNECT},
563 {SL_OPCODE_WLAN_ASYNC_STA_ADDED, SL_WLAN_EVENT_STA_ADDED},
564 {SL_OPCODE_WLAN_ASYNC_P2PCL_ADDED,SL_WLAN_EVENT_P2P_CLIENT_ADDED},
565 {SL_OPCODE_WLAN_ASYNC_STA_REMOVED, SL_WLAN_EVENT_STA_REMOVED},
566 {SL_OPCODE_WLAN_ASYNC_P2PCL_REMOVED,SL_WLAN_EVENT_P2P_CLIENT_REMOVED},
567 {SL_OPCODE_WLAN_P2P_DEV_FOUND,SL_WLAN_EVENT_P2P_DEVFOUND},
568 {SL_OPCODE_WLAN_P2P_NEG_REQ_RECEIVED, SL_WLAN_EVENT_P2P_REQUEST},
569 {SL_OPCODE_WLAN_P2P_CONNECTION_FAILED, SL_WLAN_EVENT_P2P_CONNECTFAIL},
570 {SL_OPCODE_WLAN_PROVISIONING_STATUS_ASYNC_EVENT, SL_WLAN_EVENT_PROVISIONING_STATUS},
571 {SL_OPCODE_WLAN_PROVISIONING_PROFILE_ADDED_ASYNC_RESPONSE, SL_WLAN_EVENT_PROVISIONING_PROFILE_ADDED},
572 {SL_OPCODE_WLAN_RX_FILTER_ASYNC_RESPONSE,SL_WLAN_EVENT_RXFILTER},
573 {SL_OPCODE_WLAN_LINK_QUALITY_RESPONSE, SL_WLAN_EVENT_LINK_QUALITY_TRIGGER},
575 {SL_OPCODE_NETAPP_IPACQUIRED, SL_NETAPP_EVENT_IPV4_ACQUIRED},
576 {SL_OPCODE_NETAPP_IPACQUIRED_V6, SL_NETAPP_EVENT_IPV6_ACQUIRED},
577 {SL_OPCODE_NETAPP_IP_LEASED, SL_NETAPP_EVENT_DHCPV4_LEASED},
578 {SL_OPCODE_NETAPP_IP_RELEASED, SL_NETAPP_EVENT_DHCPV4_RELEASED},
579 {SL_OPCODE_NETAPP_IP_COLLISION, SL_NETAPP_EVENT_IP_COLLISION},
580 {SL_OPCODE_NETAPP_IPV4_LOST, SL_NETAPP_EVENT_IPV4_LOST},
581 {SL_OPCODE_NETAPP_DHCP_IPV4_ACQUIRE_TIMEOUT, SL_NETAPP_EVENT_DHCP_IPV4_ACQUIRE_TIMEOUT},
582 {SL_OPCODE_NETAPP_IPV6_LOST_V6, SL_NETAPP_EVENT_IPV6_LOST},
583 {SL_OPCODE_NETAPP_NO_IP_COLLISION_DETECTED, SL_NETAPP_EVENT_NO_IPV4_COLLISION_DETECTED},
584 {SL_OPCODE_NETAPP_NO_LOCAL_IP_COLLISION_DETECTED_V6, SL_NETAPP_EVENT_NO_LOCAL_IPV6_COLLISION_DETECTED},
585 {SL_OPCODE_NETAPP_NO_GLOBAL_IP_COLLISION_DETECTED_V6, SL_NETAPP_EVENT_NO_GLOBAL_IPV6_COLLISION_DETECTED},
586 {SL_OPCODE_SOCKET_TXFAILEDASYNCRESPONSE, SL_SOCKET_TX_FAILED_EVENT},
587 {SL_OPCODE_SOCKET_SOCKETASYNCEVENT, SL_SOCKET_ASYNC_EVENT}
594 P_SL_DEV_PING_CALLBACK pPingCallBackFunc = NULL;
599 static _SlReturnVal_t _SlDrvMsgRead(_u16* outMsgReadLen, _u8** pAsyncBuf);
601 static _SlReturnVal_t _SlDrvMsgReadCmdCtx(_u16 cmdOpcode, _u8 IsLockRequired);
602 static _SlReturnVal_t _SlDrvClassifyRxMsg(_SlOpcode_t Opcode );
603 static _SlReturnVal_t _SlDrvRxHdrRead(_u8 *pBuf);
604 static void _SlDrvAsyncEventGenericHandler(_u8 bInCmdContext, _u8 *pAsyncBuffer);
605 static void _SlDrvRemoveFromList(_u8* ListIndex, _u8 ItemIndex);
606 static _SlReturnVal_t _SlDrvFindAndSetActiveObj(_SlOpcode_t Opcode, _u8 Sd);
617 _SlReturnVal_t _SlDrvDriverCBInit(
void)
623 #ifndef SL_PLATFORM_MULTI_THREADED 626 sl_Memset(&g__SlNonOsCB, 0,
sizeof(g__SlNonOsCB));
632 OSI_RET_OK_CHECK( sl_SyncObjCreate(&g_pCB->CmdSyncObj,
"CmdSyncObj") );
633 SL_DRV_SYNC_OBJ_CLEAR(&g_pCB->CmdSyncObj);
635 if (!SL_IS_GLOBAL_LOCK_INIT)
637 OSI_RET_OK_CHECK( sl_LockObjCreate(&GlobalLockObj,
"GlobalLockObj") );
638 SL_SET_GLOBAL_LOCK_INIT;
641 OSI_RET_OK_CHECK( sl_LockObjCreate(&g_pCB->ProtectionLockObj,
"ProtectionLockObj") );
642 g_pCB->NumOfDeletedSyncObj = 0;
643 #if defined(slcb_SocketTriggerEventHandler) 644 g_pCB->SocketTriggerSelect.Info.ObjPoolIdx = MAX_CONCURRENT_ACTIONS;
647 _SlDrvMemZero(&g_pCB->ObjPool[0], (_u16)(MAX_CONCURRENT_ACTIONS*
sizeof(
_SlPoolObj_t)));
649 g_pCB->FreePoolIdx = 0;
651 for (Idx = 0 ; Idx < MAX_CONCURRENT_ACTIONS ; Idx++)
653 g_pCB->ObjPool[Idx].NextIndex = Idx + 1;
654 g_pCB->ObjPool[Idx].AdditionalData = SL_MAX_SOCKETS;
656 OSI_RET_OK_CHECK( sl_SyncObjCreate(&g_pCB->ObjPool[Idx].SyncObj,
"SyncObj"));
657 SL_DRV_SYNC_OBJ_CLEAR(&g_pCB->ObjPool[Idx].SyncObj);
660 g_pCB->ActivePoolIdx = MAX_CONCURRENT_ACTIONS;
661 g_pCB->PendingPoolIdx = MAX_CONCURRENT_ACTIONS;
663 #ifdef SL_PLATFORM_MULTI_THREADED 665 #ifdef SL_MEMORY_MGMT_DYNAMIC 667 g_pCB->spawnMsgList = NULL;
669 for (Idx = 0; Idx < SL_MAX_ASYNC_BUFFERS; Idx++)
671 g_StatMem.AsyncBufPool[Idx].ActionIndex = 0xFF;
672 g_StatMem.AsyncBufPool[Idx].AsyncHndlr = NULL;
677 _SlDrvSetGlobalLockOwner(GLOBAL_LOCK_CONTEXT_OWNER_APP);
680 g_pCB->FlowContCB.TxPoolCnt = FLOW_CONT_MIN;
681 OSI_RET_OK_CHECK(sl_LockObjCreate(&g_pCB->FlowContCB.TxLockObj,
"TxLockObj"));
682 OSI_RET_OK_CHECK(sl_SyncObjCreate(&g_pCB->FlowContCB.TxSyncObj,
"TxSyncObj"));
683 g_pCB->FlowContCB.MinTxPayloadSize = 1536;
685 #if (defined(SL_PLATFORM_MULTI_THREADED) && !defined(slcb_SocketTriggerEventHandler)) 686 OSI_RET_OK_CHECK(sl_LockObjCreate(&g_pCB->MultiSelectCB.SelectLockObj,
"SelectLockObj"));
687 OSI_RET_OK_CHECK(sl_SyncObjCreate(&g_pCB->MultiSelectCB.SelectSyncObj,
"SelectSyncObj"));
688 SL_DRV_SYNC_OBJ_CLEAR(&g_pCB->MultiSelectCB.SelectSyncObj);
689 g_pCB->MultiSelectCB.CtrlSockFD = 0xFF;
691 return SL_OS_RET_CODE_OK;
697 _SlReturnVal_t _SlDrvDriverCBDeinit(
void)
699 #ifdef SL_MEMORY_MGMT_DYNAMIC 705 g_pCB->FlowContCB.TxPoolCnt = 0;
707 SL_SET_DEVICE_STATUS(0);
709 SL_UNSET_DEVICE_STARTED;
711 OSI_RET_OK_CHECK(sl_LockObjDelete(&g_pCB->FlowContCB.TxLockObj));
712 OSI_RET_OK_CHECK(sl_SyncObjDelete(&g_pCB->FlowContCB.TxSyncObj));
713 #if (defined(SL_PLATFORM_MULTI_THREADED) && !defined(slcb_SocketTriggerEventHandler)) 714 OSI_RET_OK_CHECK(sl_LockObjDelete(&g_pCB->MultiSelectCB.SelectLockObj));
715 OSI_RET_OK_CHECK(sl_SyncObjDelete(&g_pCB->MultiSelectCB.SelectSyncObj));
717 OSI_RET_OK_CHECK( sl_SyncObjDelete(&g_pCB->CmdSyncObj));
719 OSI_RET_OK_CHECK( sl_LockObjDelete(&g_pCB->ProtectionLockObj) );
721 g_pCB->FreePoolIdx = 0;
722 g_pCB->PendingPoolIdx = MAX_CONCURRENT_ACTIONS;
723 g_pCB->ActivePoolIdx = MAX_CONCURRENT_ACTIONS;
725 #ifdef SL_MEMORY_MGMT_DYNAMIC 727 pCurr = g_pCB->spawnMsgList;
728 while (NULL != pCurr)
731 sl_Free(pCurr->Buffer);
735 g_pCB->spawnMsgList = NULL;
741 return SL_OS_RET_CODE_OK;
747 _SlReturnVal_t _SlDrvRxIrqHandler(
void *pValue)
755 if (TRUE == g_pCB->WaitForCmdResp)
757 OSI_RET_OK_CHECK( sl_SyncObjSignalFromIRQ(&g_pCB->CmdSyncObj) );
761 (void)sl_Spawn((_SlSpawnEntryFunc_t)_SlDrvMsgReadSpawnCtx, NULL, SL_SPAWN_FLAG_FROM_SL_IRQ_HANDLER);
763 return SL_OS_RET_CODE_OK;
769 _SlReturnVal_t _SlDrvDriverIsApiAllowed(_u16 Silo)
771 if (!SL_IS_COMMAND_ALLOWED)
773 if (SL_IS_DEVICE_STOP_IN_PROGRESS)
775 return SL_RET_CODE_STOP_IN_PROGRESS;
778 if ((SL_IS_DEVICE_LOCKED) && (SL_OPCODE_SILO_FS != Silo))
781 return SL_RET_CODE_DEV_LOCKED;
783 if (SL_IS_RESTART_REQUIRED)
787 return SL_API_ABORTED;
790 if (!SL_IS_DEVICE_STARTED)
792 return SL_RET_CODE_DEV_NOT_STARTED;
795 if (( SL_IS_PROVISIONING_ACTIVE || SL_IS_PROVISIONING_INITIATED_BY_USER) && !(SL_IS_PROVISIONING_API_ALLOWED))
798 return SL_RET_CODE_PROVISIONING_IN_PROGRESS;
803 return SL_OS_RET_CODE_OK;
810 _SlReturnVal_t _SlDrvCmdOp(
812 void *pTxRxDescBuff ,
815 _SlReturnVal_t RetVal;
816 _u8 IsLockRequired = TRUE;
818 IsLockRequired = (SL_IS_PROVISIONING_IN_PROGRESS && (pCmdCtrl->Opcode == SL_OPCODE_DEVICE_STOP_COMMAND)) ? FALSE: TRUE;
822 _u32 GlobalLockFlags = GLOBAL_LOCK_FLAGS_UPDATE_API_IN_PROGRESS;
825 if (pCmdCtrl->Opcode == SL_OPCODE_WLAN_PROVISIONING_COMMAND)
830 if (pParams->InactivityTimeoutSec == 0)
832 GlobalLockFlags |= GLOBAL_LOCK_FLAGS_PROVISIONING_STOP_API;
837 GlobalLockFlags |= (((_u32)pCmdCtrl->Opcode) << 16);
838 SL_DRV_LOCK_GLOBAL_LOCK_FOREVER(GlobalLockFlags);
843 if (SL_IS_RESTART_REQUIRED)
847 SL_DRV_LOCK_GLOBAL_UNLOCK(TRUE);
850 return SL_API_ABORTED;
853 g_pCB->WaitForCmdResp = TRUE;
855 SL_TRACE1(DBG_MSG, MSG_312,
"\n\r_SlDrvCmdOp: call _SlDrvMsgWrite: %x\n\r", pCmdCtrl->Opcode);
858 RetVal = _SlDrvMsgWrite(pCmdCtrl, pCmdExt, pTxRxDescBuff);
860 if(SL_OS_RET_CODE_OK == RetVal)
863 RetVal = _SlDrvMsgReadCmdCtx(pCmdCtrl->Opcode, IsLockRequired);
864 SL_TRACE1(DBG_MSG, MSG_314,
"\n\r_SlDrvCmdOp: exited _SlDrvMsgReadCmdCtx: %x\n\r", pCmdCtrl->Opcode);
870 SL_DRV_LOCK_GLOBAL_UNLOCK(TRUE);
881 _SlReturnVal_t _SlDrvDataReadOp(
884 void *pTxRxDescBuff ,
887 _SlReturnVal_t RetVal;
888 _i16 ObjIdx = MAX_CONCURRENT_ACTIONS;
892 _SL_ASSERT_ERROR(NULL != pCmdExt->pRxPayload, SL_RET_CODE_INVALID_INPUT);
896 VERIFY_PROTOCOL(0 != pCmdExt->RxPayloadLen);
899 if((Sd & SL_BSD_SOCKET_ID_MASK) >= SL_MAX_SOCKETS)
901 return SL_ERROR_BSD_EBADF;
905 ObjIdx = _SlDrvWaitForPoolObj(RECV_ID, Sd & SL_BSD_SOCKET_ID_MASK);
907 if (MAX_CONCURRENT_ACTIONS == ObjIdx)
909 return SL_POOL_IS_EMPTY;
911 if (SL_RET_CODE_STOP_IN_PROGRESS == ObjIdx)
913 return SL_RET_CODE_STOP_IN_PROGRESS;
916 SL_DRV_PROTECTION_OBJ_LOCK_FOREVER();
918 pArgsData.pData = pCmdExt->pRxPayload;
919 pArgsData.pArgs = (_u8 *)pTxRxDescBuff;
920 g_pCB->ObjPool[ObjIdx].pRespArgs = (_u8 *)&pArgsData;
922 SL_DRV_PROTECTION_OBJ_UNLOCK();
926 SL_DRV_OBJ_LOCK_FOREVER(&g_pCB->FlowContCB.TxLockObj);
932 SL_DRV_SYNC_OBJ_CLEAR(&g_pCB->FlowContCB.TxSyncObj);
934 if(g_pCB->FlowContCB.TxPoolCnt <= FLOW_CONT_MIN)
939 #if (defined (SL_PLATFORM_MULTI_THREADED)) && (!defined (SL_PLATFORM_EXTERNAL_SPAWN)) 940 if (_SlDrvIsSpawnOwnGlobalLock())
946 _SlInternalSpawnWaitForEvent();
948 if (0 == sl_SyncObjWait(&g_pCB->FlowContCB.TxSyncObj, SL_OS_NO_WAIT))
957 SL_DRV_SYNC_OBJ_WAIT_FOREVER(&g_pCB->FlowContCB.TxSyncObj);
962 SL_DRV_LOCK_GLOBAL_LOCK_FOREVER(GLOBAL_LOCK_FLAGS_UPDATE_API_IN_PROGRESS);
966 if (SL_IS_RESTART_REQUIRED)
968 SL_DRV_LOCK_GLOBAL_UNLOCK(TRUE);
969 return SL_API_ABORTED;
974 VERIFY_PROTOCOL(g_pCB->FlowContCB.TxPoolCnt > (FLOW_CONT_MIN - 1));
975 g_pCB->FlowContCB.TxPoolCnt--;
977 SL_DRV_OBJ_UNLOCK(&g_pCB->FlowContCB.TxLockObj);
980 RetVal = _SlDrvMsgWrite(pCmdCtrl, pCmdExt, (_u8 *)pTxRxDescBuff);
982 SL_DRV_LOCK_GLOBAL_UNLOCK(TRUE);
984 if(SL_OS_RET_CODE_OK == RetVal)
987 if( g_pCB->SocketNonBlocking & (1<<(Sd & SL_BSD_SOCKET_ID_MASK) ))
989 _u16 opcodeAsyncEvent = (pCmdCtrl->Opcode == SL_OPCODE_SOCKET_RECV) ? SL_OPCODE_SOCKET_RECVASYNCRESPONSE : SL_OPCODE_SOCKET_RECVFROMASYNCRESPONSE;
990 RetVal = _SlDrvWaitForInternalAsyncEvent(ObjIdx, SL_DRIVER_TIMEOUT_SHORT, opcodeAsyncEvent);
996 RetVal = _SlDrvWaitForInternalAsyncEvent(ObjIdx, 0, 0);
1001 _SlDrvReleasePoolObj(ObjIdx);
1008 _SlReturnVal_t _SlDrvDataWriteOp(
1011 void *pTxRxDescBuff ,
1014 _SlReturnVal_t RetVal = SL_ERROR_BSD_EAGAIN;
1015 _u32 allocTxPoolPkts;
1020 SL_DRV_OBJ_LOCK_FOREVER(&g_pCB->FlowContCB.TxLockObj);
1025 SL_DRV_SYNC_OBJ_CLEAR(&g_pCB->FlowContCB.TxSyncObj);
1028 allocTxPoolPkts = 1 + (pCmdExt->TxPayload1Len-1) / g_pCB->FlowContCB.MinTxPayloadSize;
1030 if(g_pCB->SocketTXFailure & (1<<(Sd & SL_BSD_SOCKET_ID_MASK)))
1032 SL_DRV_OBJ_UNLOCK(&g_pCB->FlowContCB.TxLockObj);
1033 return SL_ERROR_BSD_SOC_ERROR;
1035 if(g_pCB->FlowContCB.TxPoolCnt <= FLOW_CONT_MIN + allocTxPoolPkts)
1039 if( g_pCB->SocketNonBlocking & (1<<(Sd & SL_BSD_SOCKET_ID_MASK) ))
1041 #if (defined (SL_PLATFORM_MULTI_THREADED)) && (!defined (SL_PLATFORM_EXTERNAL_SPAWN)) 1042 if (_SlDrvIsSpawnOwnGlobalLock())
1044 _SlInternalSpawnWaitForEvent();
1047 SL_DRV_OBJ_UNLOCK(&g_pCB->FlowContCB.TxLockObj);
1052 #if (defined (SL_PLATFORM_MULTI_THREADED)) && (!defined (SL_PLATFORM_EXTERNAL_SPAWN)) 1053 if (_SlDrvIsSpawnOwnGlobalLock())
1059 _SlInternalSpawnWaitForEvent();
1061 if (0 == sl_SyncObjWait(&g_pCB->FlowContCB.TxSyncObj, SL_OS_NO_WAIT))
1070 SL_DRV_SYNC_OBJ_WAIT_FOREVER(&g_pCB->FlowContCB.TxSyncObj);
1073 if(g_pCB->FlowContCB.TxPoolCnt > FLOW_CONT_MIN + allocTxPoolPkts )
1079 SL_DRV_OBJ_UNLOCK(&g_pCB->FlowContCB.TxLockObj);
1083 SL_DRV_LOCK_GLOBAL_LOCK_FOREVER(GLOBAL_LOCK_FLAGS_UPDATE_API_IN_PROGRESS);
1087 if (SL_IS_RESTART_REQUIRED)
1089 SL_DRV_LOCK_GLOBAL_UNLOCK(TRUE);
1090 return SL_API_ABORTED;
1095 VERIFY_PROTOCOL(g_pCB->FlowContCB.TxPoolCnt > (FLOW_CONT_MIN + allocTxPoolPkts -1) );
1096 g_pCB->FlowContCB.TxPoolCnt -= (_u8)allocTxPoolPkts;
1098 SL_DRV_OBJ_UNLOCK(&g_pCB->FlowContCB.TxLockObj);
1100 SL_TRACE1(DBG_MSG, MSG_312,
"\n\r_SlDrvCmdOp: call _SlDrvMsgWrite: %x\n\r", pCmdCtrl->Opcode);
1103 RetVal = _SlDrvMsgWrite(pCmdCtrl, pCmdExt, pTxRxDescBuff);
1104 SL_DRV_LOCK_GLOBAL_UNLOCK(TRUE);
1114 _u8 sendRxPayload = FALSE;
1115 _SL_ASSERT_ERROR(NULL != pCmdCtrl, SL_API_ABORTED);
1117 g_pCB->FunctionParams.pCmdCtrl = pCmdCtrl;
1118 g_pCB->FunctionParams.pTxRxDescBuff = pTxRxDescBuff;
1119 g_pCB->FunctionParams.pCmdExt = pCmdExt;
1121 g_pCB->TempProtocolHeader.Opcode = pCmdCtrl->Opcode;
1122 g_pCB->TempProtocolHeader.Len = (_u16)(_SL_PROTOCOL_CALC_LEN(pCmdCtrl, pCmdExt));
1124 if (pCmdExt && pCmdExt->RxPayloadLen < 0 )
1126 pCmdExt->RxPayloadLen = pCmdExt->RxPayloadLen * (-1);
1127 sendRxPayload = TRUE;
1128 g_pCB->TempProtocolHeader.Len = g_pCB->TempProtocolHeader.Len + pCmdExt->RxPayloadLen;
1131 #ifdef SL_START_WRITE_STAT 1132 sl_IfStartWriteSequence(g_pCB->FD);
1135 #ifdef SL_IF_TYPE_UART 1137 NWP_IF_WRITE_CHECK(g_pCB->FD, (_u8 *)&g_H2NSyncPattern.Long, 2*SYNC_PATTERN_LEN);
1140 NWP_IF_WRITE_CHECK(g_pCB->FD, (_u8 *)&g_H2NSyncPattern.Short, SYNC_PATTERN_LEN);
1144 NWP_IF_WRITE_CHECK(g_pCB->FD, (_u8 *)&g_pCB->TempProtocolHeader, _SL_CMD_HDR_SIZE);
1147 if (pTxRxDescBuff && pCmdCtrl->TxDescLen > 0)
1149 NWP_IF_WRITE_CHECK(g_pCB->FD, pTxRxDescBuff,
1150 _SL_PROTOCOL_ALIGN_SIZE(pCmdCtrl->TxDescLen));
1156 if (sendRxPayload == TRUE )
1158 NWP_IF_WRITE_CHECK(g_pCB->FD, pCmdExt->pRxPayload,
1159 _SL_PROTOCOL_ALIGN_SIZE(pCmdExt->RxPayloadLen));
1168 VERIFY_PROTOCOL(_SL_IS_PROTOCOL_ALIGNED_SIZE(pCmdCtrl->TxDescLen));
1171 if ((pCmdExt->TxPayload1Len > 0) && (pCmdExt->TxPayload2Len > 0))
1173 _u8 BuffInTheMiddle[4];
1174 _u8 FirstPayloadReminder = 0;
1175 _u8 SecondPayloadOffset = 0;
1177 FirstPayloadReminder = pCmdExt->TxPayload1Len & 3;
1180 pCmdExt->TxPayload1Len -= FirstPayloadReminder;
1183 NWP_IF_WRITE_CHECK(g_pCB->FD, pCmdExt->pTxPayload1, pCmdExt->TxPayload1Len);
1186 if (FirstPayloadReminder != 0)
1189 SecondPayloadOffset = 4 - FirstPayloadReminder;
1192 sl_Memcpy(&BuffInTheMiddle[0], pCmdExt->pTxPayload1 + pCmdExt->TxPayload1Len, FirstPayloadReminder);
1195 sl_Memcpy(&BuffInTheMiddle[FirstPayloadReminder], pCmdExt->pTxPayload2, SecondPayloadOffset);
1198 NWP_IF_WRITE_CHECK(g_pCB->FD, &BuffInTheMiddle[0], 4);
1203 if (pCmdExt->TxPayload2Len > SecondPayloadOffset)
1206 NWP_IF_WRITE_CHECK(g_pCB->FD,
1207 pCmdExt->pTxPayload2 + SecondPayloadOffset,
1208 _SL_PROTOCOL_ALIGN_SIZE(pCmdExt->TxPayload2Len - SecondPayloadOffset));
1212 else if (pCmdExt->TxPayload1Len > 0)
1215 NWP_IF_WRITE_CHECK(g_pCB->FD, pCmdExt->pTxPayload1,
1216 _SL_PROTOCOL_ALIGN_SIZE(pCmdExt->TxPayload1Len));
1218 else if (pCmdExt->TxPayload2Len > 0)
1221 NWP_IF_WRITE_CHECK(g_pCB->FD, pCmdExt->pTxPayload2,
1222 _SL_PROTOCOL_ALIGN_SIZE(pCmdExt->TxPayload2Len));
1227 _SL_DBG_CNT_INC(MsgCnt.Write);
1229 #ifdef SL_START_WRITE_STAT 1230 sl_IfEndWriteSequence(g_pCB->FD);
1233 return SL_OS_RET_CODE_OK;
1239 _SlReturnVal_t _SlDrvMsgRead(_u16* outMsgReadLen, _u8** pOutAsyncBuf)
1244 _u8 TempBuf[_SL_RESP_HDR_SIZE];
1249 _u16 AlignedLengthRecv;
1250 _u8 *pAsyncBuf = NULL;
1252 _u16 RespPayloadLen;
1253 _u8 sd = SL_MAX_SOCKETS;
1254 _SlReturnVal_t RetVal;
1255 _SlRxMsgClass_e RxMsgClass;
1258 g_pCB->FunctionParams.AsyncExt.AsyncEvtHandler = NULL;
1259 _SlDrvMemZero(&TailBuffer[0],
sizeof(TailBuffer));
1261 if (_SlDrvRxHdrRead((_u8*)(uBuf.TempBuf)) == SL_API_ABORTED)
1263 SL_DRV_LOCK_GLOBAL_UNLOCK(TRUE);
1265 _SlDrvHandleFatalError(SL_DEVICE_EVENT_FATAL_SYNC_LOSS, 0, 0);
1266 return SL_API_ABORTED;
1269 OpCode = OPCODE(uBuf.TempBuf);
1270 RespPayloadLen = (_u16)(RSP_PAYLOAD_LEN(uBuf.TempBuf));
1276 g_pCB->FlowContCB.MinTxPayloadSize = ((
_SlResponseHeader_t *)uBuf.TempBuf)->MinMaxPayload;
1280 if(g_pCB->FlowContCB.TxPoolCnt > FLOW_CONT_MIN)
1282 sl_SyncObjGetCount(&g_pCB->FlowContCB.TxSyncObj, &Count);
1285 SL_DRV_SYNC_OBJ_SIGNAL(&g_pCB->FlowContCB.TxSyncObj);
1290 _SlDrvClassifyRxMsg(OpCode);
1292 RxMsgClass = g_pCB->FunctionParams.AsyncExt.RxMsgClass;
1296 case ASYNC_EVT_CLASS:
1298 VERIFY_PROTOCOL(NULL == pAsyncBuf);
1300 #ifdef SL_MEMORY_MGMT_DYNAMIC 1301 *pOutAsyncBuf = (_u8*)sl_Malloc(SL_ASYNC_MAX_MSG_LEN);
1304 *pOutAsyncBuf = g_StatMem.AsyncRespBuf;
1307 pAsyncBuf = *pOutAsyncBuf;
1309 MALLOC_OK_CHECK(pAsyncBuf);
1312 _SlDrvMemZero(pAsyncBuf, (_u16)SL_ASYNC_MAX_MSG_LEN);
1313 sl_Memcpy(pAsyncBuf, uBuf.TempBuf, _SL_RESP_HDR_SIZE);
1316 *outMsgReadLen = _SL_RESP_HDR_SIZE;
1318 if (_SL_PROTOCOL_ALIGN_SIZE(RespPayloadLen) <= SL_ASYNC_MAX_PAYLOAD_LEN)
1320 AlignedLengthRecv = (_u16)_SL_PROTOCOL_ALIGN_SIZE(RespPayloadLen);
1324 AlignedLengthRecv = (_u16)_SL_PROTOCOL_ALIGN_SIZE(SL_ASYNC_MAX_PAYLOAD_LEN);
1328 if (RespPayloadLen > 0)
1330 NWP_IF_READ_CHECK(g_pCB->FD,
1331 pAsyncBuf + _SL_RESP_HDR_SIZE,
1333 *outMsgReadLen += AlignedLengthRecv;
1336 if ((_SL_PROTOCOL_ALIGN_SIZE(RespPayloadLen) > SL_ASYNC_MAX_PAYLOAD_LEN))
1338 AlignedLengthRecv = (_u16)(_SL_PROTOCOL_ALIGN_SIZE(RespPayloadLen) - SL_ASYNC_MAX_PAYLOAD_LEN);
1339 while (AlignedLengthRecv > 0)
1341 NWP_IF_READ_CHECK(g_pCB->FD,TailBuffer,4);
1342 AlignedLengthRecv = AlignedLengthRecv - 4;
1346 SL_DRV_PROTECTION_OBJ_LOCK_FOREVER();
1349 (SL_OPCODE_SOCKET_ACCEPTASYNCRESPONSE == OpCode) ||
1350 (SL_OPCODE_SOCKET_ACCEPTASYNCRESPONSE_V6 == OpCode) ||
1351 (SL_OPCODE_SOCKET_CONNECTASYNCRESPONSE == OpCode) ||
1352 (SL_OPCODE_SOCKET_SOCKETCLOSEASYNCEVENT == OpCode)
1356 sd = ((((
SlSocketResponse_t *)(pAsyncBuf + _SL_RESP_HDR_SIZE))->Sd) & SL_BSD_SOCKET_ID_MASK);
1358 if (SL_OPCODE_SOCKET_SOCKETASYNCEVENT == OpCode)
1361 sd = ((((
SlSocketAsyncEvent_t *)(pAsyncBuf + _SL_RESP_HDR_SIZE))->Sd) & SL_BSD_SOCKET_ID_MASK);
1364 _SlDrvFindAndSetActiveObj(OpCode, sd);
1366 SL_DRV_PROTECTION_OBJ_UNLOCK();
1371 case RECV_RESP_CLASS:
1377 case SL_OPCODE_SOCKET_RECVFROMASYNCRESPONSE:
1378 ExpArgSize = (_u8)RECVFROM_IPV4_ARGS_SIZE;
1380 case SL_OPCODE_SOCKET_RECVFROMASYNCRESPONSE_V6:
1381 ExpArgSize = (_u8)RECVFROM_IPV6_ARGS_SIZE;
1385 ExpArgSize = (_u8)RECV_ARGS_SIZE;
1390 NWP_IF_READ_CHECK(g_pCB->FD, &uBuf.TempBuf[4], RECV_ARGS_SIZE);
1393 VERIFY_PROTOCOL((SD(&uBuf.TempBuf[4])& SL_BSD_SOCKET_ID_MASK) < SL_MAX_SOCKETS);
1395 SL_DRV_PROTECTION_OBJ_LOCK_FOREVER();
1398 RetVal = _SlDrvFindAndSetActiveObj(OpCode, SD(&uBuf.TempBuf[4]) & SL_BSD_SOCKET_ID_MASK);
1400 #if (defined(SL_PLATFORM_MULTI_THREADED) && !defined(slcb_SocketTriggerEventHandler)) 1402 if((RetVal == SL_RET_OBJ_NOT_SET) && (SD(&uBuf.TempBuf[4]) == g_pCB->MultiSelectCB.CtrlSockFD))
1405 _u8 buffer[RECVFROM_IPV6_ARGS_SIZE];
1407 sl_Memcpy(&buffer[0], &uBuf.TempBuf[4], RECV_ARGS_SIZE);
1409 if(ExpArgSize > (_u8)RECV_ARGS_SIZE)
1411 NWP_IF_READ_CHECK(g_pCB->FD,
1412 &buffer[RECV_ARGS_SIZE],
1413 ExpArgSize - RECV_ARGS_SIZE);
1419 if(ACT_DATA_SIZE(&uBuf.TempBuf[4]) > 0)
1426 LengthToCopy = (_u16)(ACT_DATA_SIZE(&uBuf.TempBuf[4]) & (3));
1427 AlignedLengthRecv = (_u16)(ACT_DATA_SIZE(&uBuf.TempBuf[4]) & (~3));
1428 if( AlignedLengthRecv >= 4)
1430 NWP_IF_READ_CHECK(g_pCB->FD, &buffer[ExpArgSize], AlignedLengthRecv);
1434 SL_DRV_PROTECTION_OBJ_UNLOCK();
1442 SL_DRV_PROTECTION_OBJ_UNLOCK();
1443 SL_DRV_LOCK_GLOBAL_UNLOCK(TRUE);
1444 return SL_API_ABORTED;
1448 VERIFY_SOCKET_CB(NULL != ((
_SlArgsData_t *)(g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pData))->pArgs);
1450 sl_Memcpy( ((
_SlArgsData_t *)(g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs))->pArgs, &uBuf.TempBuf[4], RECV_ARGS_SIZE);
1452 if(ExpArgSize > (_u8)RECV_ARGS_SIZE)
1454 NWP_IF_READ_CHECK(g_pCB->FD,
1455 ((
_SlArgsData_t *)(g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs))->pArgs + RECV_ARGS_SIZE,
1456 ExpArgSize - RECV_ARGS_SIZE);
1462 if(ACT_DATA_SIZE(&uBuf.TempBuf[4]) > 0)
1464 VERIFY_SOCKET_CB(NULL != ((
_SlArgsData_t *)(g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs))->pData);
1470 LengthToCopy = (_u16)(ACT_DATA_SIZE(&uBuf.TempBuf[4]) & (3));
1471 AlignedLengthRecv = (_u16)(ACT_DATA_SIZE(&uBuf.TempBuf[4]) & (~3));
1472 if( AlignedLengthRecv >= 4)
1474 NWP_IF_READ_CHECK(g_pCB->FD,((
_SlArgsData_t *)(g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs))->pData, AlignedLengthRecv);
1477 if( LengthToCopy > 0)
1479 NWP_IF_READ_CHECK(g_pCB->FD,TailBuffer,4);
1481 sl_Memcpy(((
_SlArgsData_t *)(g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs))->pData + AlignedLengthRecv,TailBuffer,LengthToCopy);
1484 SL_DRV_SYNC_OBJ_SIGNAL(&g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].SyncObj);
1485 SL_DRV_PROTECTION_OBJ_UNLOCK();
1491 case CMD_RESP_CLASS:
1499 NWP_IF_READ_CHECK(g_pCB->FD,
1500 g_pCB->FunctionParams.pTxRxDescBuff,
1501 _SL_PROTOCOL_ALIGN_SIZE(g_pCB->FunctionParams.pCmdCtrl->RxDescLen));
1503 if((NULL != g_pCB->FunctionParams.pCmdExt) && (0 != g_pCB->FunctionParams.pCmdExt->RxPayloadLen))
1506 _i16 ActDataSize = (_i16)(RSP_PAYLOAD_LEN(uBuf.TempBuf) - g_pCB->FunctionParams.pCmdCtrl->RxDescLen);
1508 g_pCB->FunctionParams.pCmdExt->ActualRxPayloadLen = ActDataSize;
1511 if(ActDataSize <= 0)
1513 g_pCB->FunctionParams.pCmdExt->RxPayloadLen = 0;
1518 if (ActDataSize > g_pCB->FunctionParams.pCmdExt->RxPayloadLen)
1520 LengthToCopy = (_u16)(g_pCB->FunctionParams.pCmdExt->RxPayloadLen & (3));
1521 AlignedLengthRecv = (_u16)(g_pCB->FunctionParams.pCmdExt->RxPayloadLen & (~3));
1525 LengthToCopy = (_u16)(ActDataSize & (3));
1526 AlignedLengthRecv = (_u16)(ActDataSize & (~3));
1533 if( AlignedLengthRecv >= 4)
1535 NWP_IF_READ_CHECK(g_pCB->FD,
1536 g_pCB->FunctionParams.pCmdExt->pRxPayload,
1537 AlignedLengthRecv );
1541 if( LengthToCopy > 0)
1543 NWP_IF_READ_CHECK(g_pCB->FD,TailBuffer,4);
1545 sl_Memcpy(g_pCB->FunctionParams.pCmdExt->pRxPayload + AlignedLengthRecv,
1548 ActDataSize = ActDataSize-4;
1551 if (ActDataSize > g_pCB->FunctionParams.pCmdExt->RxPayloadLen)
1554 AlignedLengthRecv = (_u16)( (ActDataSize + 3 - g_pCB->FunctionParams.pCmdExt->RxPayloadLen) & (~3) );
1555 while( AlignedLengthRecv > 0)
1557 NWP_IF_READ_CHECK(g_pCB->FD,TailBuffer, 4 );
1558 AlignedLengthRecv = AlignedLengthRecv - 4;
1567 #if (defined(SL_PLATFORM_MULTI_THREADED) && !defined(slcb_SocketTriggerEventHandler)) 1568 case MULTI_SELECT_RESP_CLASS:
1575 NWP_IF_READ_CHECK(g_pCB->FD,
1576 (_u8*)(&g_pCB->MultiSelectCB.SelectCmdResp),
1579 if(g_pCB->MultiSelectCB.SelectCmdResp.status != SL_RET_CODE_OK)
1584 g_pCB->MultiSelectCB.ActiveSelect = FALSE;
1586 for(Idx = 0 ; Idx < MAX_CONCURRENT_ACTIONS ; Idx++)
1588 if(g_pCB->MultiSelectCB.SelectEntry[Idx] != NULL)
1590 sl_SyncObjSignal(&g_pCB->ObjPool[Idx].SyncObj);
1606 _SL_DBG_CNT_INC(MsgCnt.Read);
1609 sl_IfUnMaskIntHdlr();
1611 return SL_OS_RET_CODE_OK;
1618 static void _SlDrvAsyncEventGenericHandler(_u8 bInCmdContext, _u8 *pAsyncBuffer)
1620 _u32 SlAsyncEvent = 0;
1621 _u8 OpcodeFound = FALSE;
1624 _u32* pEventLocation = NULL;
1629 if (g_pCB->FunctionParams.AsyncExt.AsyncEvtHandler == NULL)
1636 if ( (( SL_IS_PROVISIONING_ACTIVE || SL_IS_PROVISIONING_INITIATED_BY_USER) && !(SL_IS_PROVISIONING_API_ALLOWED)) &&
1637 (pHdr->GenHeader.Opcode != SL_OPCODE_WLAN_PROVISIONING_STATUS_ASYNC_EVENT) &&
1638 (pHdr->GenHeader.Opcode != SL_OPCODE_DEVICE_RESET_REQUEST_ASYNC_EVENT) &&
1639 (pHdr->GenHeader.Opcode != SL_OPCODE_DEVICE_INITCOMPLETE) &&
1640 (pHdr->GenHeader.Opcode != SL_OPCODE_WLAN_PROVISIONING_PROFILE_ADDED_ASYNC_RESPONSE) &&
1641 (pHdr->GenHeader.Opcode != SL_OPCODE_NETAPP_REQUEST) )
1647 for (i=0; i< (_u8)(
sizeof(OpcodeTranslateTable) /
sizeof(OpcodeKeyVal_t)); i++)
1649 if (OpcodeTranslateTable[i].opcode == pHdr->GenHeader.Opcode)
1651 SlAsyncEvent = OpcodeTranslateTable[i].event;
1658 if (OpcodeFound == FALSE)
1660 if ((pHdr->GenHeader.Opcode & SL_OPCODE_SILO_MASK) == SL_OPCODE_SILO_DEVICE)
1664 deviceEvent.pAsyncMsgBuff = pAsyncBuffer;
1665 deviceEvent.bInCmdContext = bInCmdContext;
1667 g_pCB->FunctionParams.AsyncExt.AsyncEvtHandler(&deviceEvent);
1673 g_pCB->FunctionParams.AsyncExt.AsyncEvtHandler(pAsyncBuffer);
1679 pEventLocation = (_u32*)(pAsyncBuffer +
sizeof (
_SlResponseHeader_t) -
sizeof(SlAsyncEvent));
1682 *pEventLocation = SlAsyncEvent;
1686 g_pCB->FunctionParams.AsyncExt.AsyncEvtHandler(pEventLocation);
1694 static _SlReturnVal_t _SlDrvMsgReadCmdCtx(_u16 cmdOpcode, _u8 IsLockRequired)
1696 _u32 CmdCmpltTimeout;
1698 _u8 *pAsyncBuf = NULL;
1701 if ((cmdOpcode == SL_OPCODE_NVMEM_FILEOPEN) || (cmdOpcode == SL_OPCODE_NVMEM_NVMEMFSPROGRAMMINGCOMMAND))
1703 CmdCmpltTimeout = ((_u32)SL_DRIVER_TIMEOUT_LONG * 10);
1708 CmdCmpltTimeout = (SL_OPCODE_SILO_FS & cmdOpcode)? (_u32)(SL_DRIVER_TIMEOUT_LONG) : (_u32)SL_DRIVER_TIMEOUT_SHORT;
1717 while (TRUE == g_pCB->WaitForCmdResp)
1719 if(_SL_PENDING_RX_MSG(g_pCB))
1723 RetVal = _SlDrvMsgRead(&outMsgLen,&pAsyncBuf);
1725 if (RetVal != SL_OS_RET_CODE_OK)
1727 g_pCB->WaitForCmdResp = FALSE;
1729 if ((IsLockRequired) && (RetVal != SL_API_ABORTED))
1731 SL_DRV_LOCK_GLOBAL_UNLOCK(TRUE);
1734 return SL_API_ABORTED;
1738 if (CMD_RESP_CLASS == g_pCB->FunctionParams.AsyncExt.RxMsgClass)
1740 g_pCB->WaitForCmdResp = FALSE;
1743 SL_DRV_SYNC_OBJ_CLEAR(&g_pCB->CmdSyncObj);
1745 else if (ASYNC_EVT_CLASS == g_pCB->FunctionParams.AsyncExt.RxMsgClass)
1748 #ifdef SL_PLATFORM_MULTI_THREADED 1751 RetVal = _SlSpawnMsgListInsert(outMsgLen, pAsyncBuf);
1752 if (SL_RET_CODE_NO_FREE_ASYNC_BUFFERS_ERROR == RetVal)
1754 _SlFindAndReleasePendingCmd();
1758 _SlDrvAsyncEventGenericHandler(TRUE, pAsyncBuf);
1761 #ifdef SL_MEMORY_MGMT_DYNAMIC 1767 #if (defined(SL_PLATFORM_MULTI_THREADED) && !defined(slcb_SocketTriggerEventHandler)) 1768 else if(MULTI_SELECT_RESP_CLASS == g_pCB->FunctionParams.AsyncExt.RxMsgClass)
1770 sl_SyncObjSignal(&g_pCB->MultiSelectCB.SelectSyncObj);
1777 RetVal = sl_SyncObjWait(&g_pCB->CmdSyncObj, CmdCmpltTimeout);
1780 g_pCB->WaitForCmdResp = FALSE;
1784 SL_DRV_LOCK_GLOBAL_UNLOCK(TRUE);
1788 if (SL_IS_DEVICE_STARTED)
1790 _SlDrvHandleFatalError(SL_DEVICE_EVENT_FATAL_NO_CMD_ACK, cmdOpcode, (_u32)CmdCmpltTimeout);
1793 return SL_API_ABORTED;
1798 #ifdef SL_PLATFORM_MULTI_THREADED 1799 if (_SlSpawnMsgListGetCount() > 0)
1802 sl_Spawn((_SlSpawnEntryFunc_t)_SlDrvMsgReadSpawnCtx, NULL, SL_SPAWN_FLAG_FROM_CMD_PROCESS);
1813 SL_DRV_LOCK_GLOBAL_UNLOCK(TRUE);
1816 if(_SL_PENDING_RX_MSG(g_pCB))
1818 sl_Spawn((_SlSpawnEntryFunc_t)_SlDrvMsgReadSpawnCtx, NULL, SL_SPAWN_FLAG_FROM_CMD_CTX);
1821 return SL_OS_RET_CODE_OK;
1827 _SlReturnVal_t _SlDrvMsgReadSpawnCtx(
void *pValue)
1829 _SlReturnVal_t RetVal = SL_OS_RET_CODE_OK;
1831 _u8 *pAsyncBuf = NULL;
1833 #ifdef SL_POLLING_MODE_USED 1838 if (GlobalLockObj != NULL)
1840 RetVal = sl_LockObjLock(&GlobalLockObj, 0);
1842 if (SL_OS_RET_CODE_OK != RetVal )
1844 if (TRUE == g_pCB->WaitForCmdResp)
1846 SL_DRV_SYNC_OBJ_SIGNAL(&g_pCB->CmdSyncObj);
1847 return SL_RET_CODE_OK;
1854 while (SL_OS_RET_CODE_OK != RetVal);
1857 SL_DRV_LOCK_GLOBAL_LOCK_FOREVER(GLOBAL_LOCK_FLAGS_NONE);
1860 #ifndef SL_PLATFORM_MULTI_THREADED 1862 _SlDrvSetGlobalLockOwner(GLOBAL_LOCK_CONTEXT_OWNER_SPAWN);
1869 if(FALSE == (_SL_PENDING_RX_MSG(g_pCB)))
1871 #ifndef SL_PLATFORM_MULTI_THREADED 1873 _SlDrvSetGlobalLockOwner(GLOBAL_LOCK_CONTEXT_OWNER_APP);
1875 SL_DRV_LOCK_GLOBAL_UNLOCK(FALSE);
1877 return SL_RET_CODE_OK;
1880 if (SL_IS_DEVICE_STARTED || SL_IS_DEVICE_START_IN_PROGRESS)
1883 RetVal = _SlDrvMsgRead(&outMsgLen, &pAsyncBuf);
1885 if (RetVal != SL_OS_RET_CODE_OK)
1887 if (RetVal != SL_API_ABORTED)
1889 #ifndef SL_PLATFORM_MULTI_THREADED 1891 _SlDrvSetGlobalLockOwner(GLOBAL_LOCK_CONTEXT_OWNER_APP);
1893 SL_DRV_LOCK_GLOBAL_UNLOCK(FALSE);
1895 return SL_API_ABORTED;
1900 switch(g_pCB->FunctionParams.AsyncExt.RxMsgClass)
1902 case ASYNC_EVT_CLASS:
1905 VERIFY_PROTOCOL(NULL != pAsyncBuf);
1908 _SlDrvAsyncEventGenericHandler(FALSE, pAsyncBuf);
1910 #ifdef SL_MEMORY_MGMT_DYNAMIC 1916 case DUMMY_MSG_CLASS:
1917 case RECV_RESP_CLASS:
1920 case CMD_RESP_CLASS:
1924 #if (defined(SL_PLATFORM_MULTI_THREADED) && !defined(slcb_SocketTriggerEventHandler)) 1925 case MULTI_SELECT_RESP_CLASS:
1927 sl_SyncObjSignal(&g_pCB->MultiSelectCB.SelectSyncObj);
1931 _SL_ASSERT_ERROR(0, SL_API_ABORTED);
1933 #ifndef SL_PLATFORM_MULTI_THREADED 1935 _SlDrvSetGlobalLockOwner(GLOBAL_LOCK_CONTEXT_OWNER_APP);
1937 SL_DRV_LOCK_GLOBAL_UNLOCK(FALSE);
1938 return(SL_RET_CODE_OK);
1940 return(SL_RET_CODE_INTERFACE_CLOSED);
1956 static const _SlSpawnEntryFunc_t RxMsgClassLUT[] = {
1957 (_SlSpawnEntryFunc_t)_SlDeviceEventHandler,
1959 (_SlSpawnEntryFunc_t)_SlDrvHandleWlanEvents,
1964 (_SlSpawnEntryFunc_t)_SlDrvHandleSockEvents,
1969 (_SlSpawnEntryFunc_t)_SlDrvHandleNetAppEvents,
1975 (_SlSpawnEntryFunc_t)_SlNetUtilHandleAsync_Cmd,
1983 static _SlReturnVal_t _SlDrvClassifyRxMsg(
1986 _SlSpawnEntryFunc_t AsyncEvtHandler = NULL;
1987 _SlRxMsgClass_e RxMsgClass = CMD_RESP_CLASS;
1991 if (0 == (SL_OPCODE_SYNC & Opcode))
1994 if (SL_OPCODE_DEVICE_DEVICEASYNCDUMMY == Opcode)
1996 RxMsgClass = DUMMY_MSG_CLASS;
1998 else if ( (SL_OPCODE_SOCKET_RECVASYNCRESPONSE == Opcode) || (SL_OPCODE_SOCKET_RECVFROMASYNCRESPONSE == Opcode)
1999 || (SL_OPCODE_SOCKET_RECVFROMASYNCRESPONSE_V6 == Opcode)
2002 RxMsgClass = RECV_RESP_CLASS;
2007 RxMsgClass = ASYNC_EVT_CLASS;
2011 Silo = (_u8)((Opcode >> SL_OPCODE_SILO_OFFSET) & 0x7);
2013 VERIFY_PROTOCOL(Silo < (_u8)(
sizeof(RxMsgClassLUT)/
sizeof(_SlSpawnEntryFunc_t)));
2018 AsyncEvtHandler = RxMsgClassLUT[Silo];
2020 if ((SL_OPCODE_NETAPP_HTTPGETTOKENVALUE == Opcode) || (SL_OPCODE_NETAPP_HTTPPOSTTOKENVALUE == Opcode) ||
2021 (SL_OPCODE_NETAPP_REQUEST == Opcode) || (SL_OPCODE_NETAPP_RESPONSE == Opcode) || (SL_OPCODE_NETAPP_SEND == Opcode))
2023 AsyncEvtHandler = _SlNetAppEventHandler;
2025 else if (SL_OPCODE_NETAPP_PINGREPORTREQUESTRESPONSE == Opcode)
2027 AsyncEvtHandler = (_SlSpawnEntryFunc_t)_SlNetAppHandleAsync_PingResponse;
2031 #if (defined(SL_PLATFORM_MULTI_THREADED) && !defined(slcb_SocketTriggerEventHandler)) 2032 else if((Opcode == SL_OPCODE_SOCKET_SELECTRESPONSE) &&
2033 (g_pCB->FunctionParams.pCmdCtrl->Opcode != SL_OPCODE_SOCKET_SELECT))
2036 RxMsgClass = MULTI_SELECT_RESP_CLASS;
2039 g_pCB->FunctionParams.AsyncExt.RxMsgClass = RxMsgClass;
2040 g_pCB->FunctionParams.AsyncExt.AsyncEvtHandler = AsyncEvtHandler;
2042 return SL_RET_CODE_OK;
2049 static _SlReturnVal_t _SlDrvRxHdrRead(_u8 *pBuf)
2052 _u8 TimeoutState = TIMEOUT_STATE_INIT_VAL;
2053 _u8 SearchSync = TRUE;
2055 #if (defined(slcb_GetTimestamp)) 2059 #ifndef SL_IF_TYPE_UART 2061 NWP_IF_WRITE_CHECK(g_pCB->FD, (_u8 *)&g_H2NCnysPattern.Short, SYNC_PATTERN_LEN);
2064 #if (defined(slcb_GetTimestamp)) 2065 _SlDrvStartMeasureTimeout(&TimeoutInfo, SYNC_PATTERN_TIMEOUT_IN_MSEC);
2069 NWP_IF_READ_CHECK(g_pCB->FD, &pBuf[0], 8);
2072 while ( *(_u32 *)&pBuf[0] == *(_u32 *)&pBuf[4])
2074 NWP_IF_READ_CHECK(g_pCB->FD, &pBuf[4], 4);
2075 #if (defined(slcb_GetTimestamp)) 2076 if (_SlDrvIsTimeoutExpired(&TimeoutInfo))
2078 return SL_API_ABORTED;
2084 while (SearchSync && TimeoutState)
2087 for (ShiftIdx =0; ShiftIdx <=4 ; ShiftIdx++)
2090 sl_Memcpy(&SyncPattern[0], &pBuf[ShiftIdx], 4);
2093 if (N2H_SYNC_PATTERN_MATCH(&SyncPattern[0], g_pCB->TxSeqNum))
2096 sl_Memcpy(&pBuf[0], &pBuf[ShiftIdx + SYNC_PATTERN_LEN], 4);
2101 NWP_IF_READ_CHECK(g_pCB->FD, &pBuf[SYNC_PATTERN_LEN - ShiftIdx], ShiftIdx);
2110 if (SearchSync == TRUE)
2113 *(_u32 *)&pBuf[0] = *(_u32 *)&pBuf[4];
2116 NWP_IF_READ_CHECK(g_pCB->FD, &pBuf[4], 4);
2119 #if (defined (slcb_GetTimestamp)) 2123 if (TIMEOUT_ONE_MORE_SHOT == TimeoutState)
2125 TimeoutState = TIMEOUT_STATE_EXPIRY;
2131 if (_SlDrvIsTimeoutExpired(&TimeoutInfo))
2133 TimeoutState = TIMEOUT_ONE_MORE_SHOT;
2139 #if (defined (slcb_GetTimestamp)) 2140 if (TIMEOUT_STATE_EXPIRY == TimeoutState)
2142 return SL_API_ABORTED;
2147 while ( N2H_SYNC_PATTERN_MATCH(pBuf, g_pCB->TxSeqNum) )
2149 _SL_DBG_CNT_INC(Work.DoubleSyncPattern);
2150 NWP_IF_READ_CHECK(g_pCB->FD, &pBuf[0], SYNC_PATTERN_LEN);
2156 NWP_IF_READ_CHECK(g_pCB->FD, &pBuf[SYNC_PATTERN_LEN], _SL_RESP_SPEC_HDR_SIZE);
2158 return SL_RET_CODE_OK;
2170 _SlReturnVal_t _SlDrvBasicCmd(_SlOpcode_t Opcode)
2172 _SlBasicCmdMsg_u Msg;
2175 _SlDrvMemZero(&Msg, (_u16)
sizeof(_SlBasicCmdMsg_u));
2176 CmdCtrl.Opcode = Opcode;
2177 CmdCtrl.TxDescLen = 0;
2181 VERIFY_RET_OK(_SlDrvCmdOp((
_SlCmdCtrl_t *)&CmdCtrl, &Msg, NULL));
2183 return (_SlReturnVal_t)Msg.Rsp.status;
2192 _SlReturnVal_t _SlDrvCmdSend_noLock(
2194 void *pTxRxDescBuff ,
2197 _SlReturnVal_t RetVal;
2198 _u8 WaitForCmdRespOriginalVal;
2203 WaitForCmdRespOriginalVal = g_pCB->WaitForCmdResp;
2208 g_pCB->WaitForCmdResp = FALSE;
2210 SL_TRACE0(DBG_MSG, MSG_312,
"_SlDrvCmdSend_noLock: call _SlDrvMsgWrite");
2213 RetVal = _SlDrvMsgWrite(pCmdCtrl, pCmdExt, pTxRxDescBuff);
2216 g_pCB->WaitForCmdResp = WaitForCmdRespOriginalVal;
2228 _SlReturnVal_t _SlDrvCmdSend_noWait(
2230 void *pTxRxDescBuff ,
2233 _SlReturnVal_t RetVal;
2237 SL_TRACE1(DBG_MSG, MSG_312,
"\n\r_SlDrvCmdSend_noLock: call _SlDrvMsgWrite: %x\n\r", pCmdCtrl->Opcode);
2243 RetVal = _SlDrvMsgWrite(pCmdCtrl, pCmdExt, pTxRxDescBuff);
2255 _SlReturnVal_t _SlDrvCmdSend(
2257 void *pTxRxDescBuff ,
2260 _SlReturnVal_t RetVal;
2262 _SlDrvObjLockWaitForever(&GlobalLockObj);
2264 g_pCB->WaitForCmdResp = FALSE;
2266 SL_TRACE1(DBG_MSG, MSG_312,
"_SlDrvCmdSend: call _SlDrvMsgWrite:%x", pCmdCtrl->Opcode);
2269 RetVal = _SlDrvMsgWrite(pCmdCtrl, pCmdExt, pTxRxDescBuff);
2271 _SlDrvObjUnLock(&GlobalLockObj);
2280 _SlReturnVal_t _SlDrvProtectAsyncRespSetting(_u8 *pAsyncRsp, _SlActionID_e ActionID, _u8 SocketID)
2285 ObjIdx = _SlDrvWaitForPoolObj(ActionID, SocketID);
2287 if (SL_RET_CODE_STOP_IN_PROGRESS == ObjIdx)
2289 return SL_RET_CODE_STOP_IN_PROGRESS;
2291 else if (MAX_CONCURRENT_ACTIONS == ObjIdx)
2293 return SL_POOL_IS_EMPTY;
2297 SL_DRV_PROTECTION_OBJ_LOCK_FOREVER();
2298 g_pCB->ObjPool[ObjIdx].pRespArgs = pAsyncRsp;
2299 SL_DRV_PROTECTION_OBJ_UNLOCK();
2309 #if (!defined (SL_PLATFORM_EXTERNAL_SPAWN)) 2310 _u8 _SlDrvIsSpawnOwnGlobalLock()
2312 #ifdef SL_PLATFORM_MULTI_THREADED 2313 _u32 ThreadId = (_i32)sl_GetThreadID();
2314 return _SlInternalIsItSpawnThread(ThreadId);
2316 return (gGlobalLockContextOwner == GLOBAL_LOCK_CONTEXT_OWNER_SPAWN);
2323 _SlReturnVal_t _SlDrvWaitForPoolObj(_u8 ActionID, _u8 SocketID)
2325 _u8 CurrObjIndex = MAX_CONCURRENT_ACTIONS;
2328 SL_DRV_PROTECTION_OBJ_LOCK_FOREVER();
2330 if (MAX_CONCURRENT_ACTIONS > g_pCB->FreePoolIdx)
2333 CurrObjIndex = g_pCB->FreePoolIdx;
2335 if (MAX_CONCURRENT_ACTIONS > g_pCB->ObjPool[CurrObjIndex].NextIndex)
2337 g_pCB->FreePoolIdx = g_pCB->ObjPool[CurrObjIndex].NextIndex;
2342 g_pCB->FreePoolIdx = MAX_CONCURRENT_ACTIONS;
2347 SL_DRV_PROTECTION_OBJ_UNLOCK();
2348 return CurrObjIndex;
2350 g_pCB->ObjPool[CurrObjIndex].ActionID = (_u8)ActionID;
2351 if (SL_MAX_SOCKETS > SocketID)
2353 g_pCB->ObjPool[CurrObjIndex].AdditionalData = SocketID;
2357 while ( ( (SL_MAX_SOCKETS > SocketID) && (g_pCB->ActiveActionsBitmap & (1<<SocketID)) ) ||
2358 ( (g_pCB->ActiveActionsBitmap & ( MULTI_SELECT_MASK & (1<<ActionID))) && (SL_MAX_SOCKETS == SocketID) ) )
2362 #if (defined (SL_PLATFORM_MULTI_THREADED)) && (!defined (SL_PLATFORM_EXTERNAL_SPAWN)) 2363 if (_SlDrvIsSpawnOwnGlobalLock())
2365 g_pCB->ObjPool[CurrObjIndex].ActionID = 0;
2366 g_pCB->ObjPool[CurrObjIndex].AdditionalData = SL_MAX_SOCKETS;
2367 g_pCB->FreePoolIdx = CurrObjIndex;
2368 SL_DRV_PROTECTION_OBJ_UNLOCK();
2369 return MAX_CONCURRENT_ACTIONS;
2373 g_pCB->ObjPool[CurrObjIndex].NextIndex = g_pCB->PendingPoolIdx;
2374 g_pCB->PendingPoolIdx = CurrObjIndex;
2375 SL_DRV_PROTECTION_OBJ_UNLOCK();
2378 (void)_SlDrvSyncObjWaitForever(&g_pCB->ObjPool[CurrObjIndex].SyncObj);
2379 if (SL_IS_DEVICE_STOP_IN_PROGRESS)
2381 OSI_RET_OK_CHECK(sl_SyncObjDelete(&g_pCB->ObjPool[CurrObjIndex].SyncObj));
2382 SL_DRV_PROTECTION_OBJ_LOCK_FOREVER();
2383 g_pCB->NumOfDeletedSyncObj++;
2384 SL_DRV_PROTECTION_OBJ_UNLOCK();
2385 return SL_RET_CODE_STOP_IN_PROGRESS;
2389 SL_DRV_PROTECTION_OBJ_LOCK_FOREVER();
2393 if (SL_MAX_SOCKETS > SocketID)
2395 g_pCB->ActiveActionsBitmap |= (1<<SocketID);
2399 g_pCB->ActiveActionsBitmap |= (1<<ActionID);
2402 g_pCB->ObjPool[CurrObjIndex].NextIndex = g_pCB->ActivePoolIdx;
2403 g_pCB->ActivePoolIdx = CurrObjIndex;
2406 SL_DRV_PROTECTION_OBJ_UNLOCK();
2410 _SlDrvUpdateApiInProgress(API_IN_PROGRESS_UPDATE_INCREMENT);
2412 return CurrObjIndex;
2418 _SlReturnVal_t _SlDrvReleasePoolObj(_u8 ObjIdx)
2423 if (SL_IS_DEVICE_STOP_IN_PROGRESS)
2425 OSI_RET_OK_CHECK(sl_SyncObjDelete(&g_pCB->ObjPool[ObjIdx].SyncObj));
2426 SL_DRV_PROTECTION_OBJ_LOCK_FOREVER();
2427 g_pCB->NumOfDeletedSyncObj++;
2428 SL_DRV_PROTECTION_OBJ_UNLOCK();
2429 return SL_RET_CODE_OK;
2432 SL_DRV_PROTECTION_OBJ_LOCK_FOREVER();
2435 PendingIndex = g_pCB->PendingPoolIdx;
2437 while(MAX_CONCURRENT_ACTIONS > PendingIndex)
2440 if ( (g_pCB->ObjPool[PendingIndex].ActionID == g_pCB->ObjPool[ObjIdx].ActionID) &&
2441 ( (SL_MAX_SOCKETS == (g_pCB->ObjPool[PendingIndex].AdditionalData & SL_BSD_SOCKET_ID_MASK)) ||
2442 ((SL_MAX_SOCKETS > (g_pCB->ObjPool[ObjIdx].AdditionalData & SL_BSD_SOCKET_ID_MASK)) && ( (g_pCB->ObjPool[PendingIndex].AdditionalData & SL_BSD_SOCKET_ID_MASK) == (g_pCB->ObjPool[ObjIdx].AdditionalData & SL_BSD_SOCKET_ID_MASK) ))) )
2445 _SlDrvRemoveFromList(&g_pCB->PendingPoolIdx, PendingIndex);
2446 SL_DRV_SYNC_OBJ_SIGNAL(&g_pCB->ObjPool[PendingIndex].SyncObj);
2449 PendingIndex = g_pCB->ObjPool[PendingIndex].NextIndex;
2453 if (SL_MAX_SOCKETS > (g_pCB->ObjPool[ObjIdx].AdditionalData & SL_BSD_SOCKET_ID_MASK))
2455 if (!((1 << (g_pCB->ObjPool[ObjIdx].AdditionalData & SL_BSD_SOCKET_ID_MASK)) & g_pCB->ActiveActionsBitmap))
2457 return SL_RET_CODE_OK;
2463 if ((!((1 << g_pCB->ObjPool[ObjIdx].ActionID) & g_pCB->ActiveActionsBitmap))
2464 && ( SELECT_ID != g_pCB->ObjPool[ObjIdx].ActionID))
2466 return SL_RET_CODE_OK;
2471 if (SL_MAX_SOCKETS > (g_pCB->ObjPool[ObjIdx].AdditionalData & SL_BSD_SOCKET_ID_MASK))
2474 g_pCB->ActiveActionsBitmap &= ~(1<<(g_pCB->ObjPool[ObjIdx].AdditionalData & SL_BSD_SOCKET_ID_MASK));
2479 g_pCB->ActiveActionsBitmap &= ~(1<<g_pCB->ObjPool[ObjIdx].ActionID);
2483 g_pCB->ObjPool[ObjIdx].pRespArgs = NULL;
2484 g_pCB->ObjPool[ObjIdx].ActionID = 0;
2485 g_pCB->ObjPool[ObjIdx].AdditionalData = SL_MAX_SOCKETS;
2488 _SlDrvRemoveFromList(&g_pCB->ActivePoolIdx, ObjIdx);
2491 g_pCB->ObjPool[ObjIdx].NextIndex = g_pCB->FreePoolIdx;
2492 g_pCB->FreePoolIdx = ObjIdx;
2494 SL_DRV_PROTECTION_OBJ_UNLOCK();
2498 _SlDrvUpdateApiInProgress(API_IN_PROGRESS_UPDATE_DECREMENT);
2499 return SL_RET_CODE_OK;
2505 _SlReturnVal_t _SlDrvReleaseAllActivePendingPoolObj()
2509 SL_DRV_PROTECTION_OBJ_LOCK_FOREVER();
2512 ActiveIndex = g_pCB->ActivePoolIdx;
2514 while (MAX_CONCURRENT_ACTIONS > ActiveIndex)
2517 if (g_pCB->ObjPool[ActiveIndex].ActionID == NETUTIL_CMD_ID)
2519 ((
_SlNetUtilCmdData_t *)(g_pCB->ObjPool[ActiveIndex].pRespArgs))->Status = SL_RET_CODE_STOP_IN_PROGRESS;
2521 else if (g_pCB->ObjPool[ActiveIndex].ActionID == RECV_ID)
2528 ((
SlSocketResponse_t *)(g_pCB->ObjPool[ActiveIndex].pRespArgs))->StatusOrLen = SL_RET_CODE_STOP_IN_PROGRESS;
2531 SL_DRV_SYNC_OBJ_SIGNAL(&g_pCB->ObjPool[ActiveIndex].SyncObj);
2532 ActiveIndex = g_pCB->ObjPool[ActiveIndex].NextIndex;
2536 ActiveIndex = g_pCB->PendingPoolIdx;
2538 while (MAX_CONCURRENT_ACTIONS > ActiveIndex)
2541 SL_DRV_SYNC_OBJ_SIGNAL(&g_pCB->ObjPool[ActiveIndex].SyncObj);
2542 ActiveIndex = g_pCB->ObjPool[ActiveIndex].NextIndex;
2547 ActiveIndex = g_pCB->FreePoolIdx;
2548 while(MAX_CONCURRENT_ACTIONS > ActiveIndex)
2550 OSI_RET_OK_CHECK(sl_SyncObjDelete(&g_pCB->ObjPool[ActiveIndex].SyncObj));
2551 g_pCB->NumOfDeletedSyncObj++;
2552 ActiveIndex = g_pCB->ObjPool[ActiveIndex].NextIndex;
2555 #if defined(slcb_SocketTriggerEventHandler) 2556 if (MAX_CONCURRENT_ACTIONS != g_pCB->SocketTriggerSelect.Info.ObjPoolIdx)
2558 OSI_RET_OK_CHECK(sl_SyncObjDelete(&g_pCB->ObjPool[g_pCB->SocketTriggerSelect.Info.ObjPoolIdx].SyncObj));
2559 g_pCB->NumOfDeletedSyncObj++;
2562 SL_DRV_PROTECTION_OBJ_UNLOCK();
2563 return SL_RET_CODE_OK;
2569 static void _SlDrvRemoveFromList(_u8 *ListIndex, _u8 ItemIndex)
2573 if (MAX_CONCURRENT_ACTIONS == g_pCB->ObjPool[*ListIndex].NextIndex)
2575 *ListIndex = MAX_CONCURRENT_ACTIONS;
2578 else if (*ListIndex == ItemIndex)
2580 *ListIndex = g_pCB->ObjPool[ItemIndex].NextIndex;
2586 while(MAX_CONCURRENT_ACTIONS > Idx)
2589 if (g_pCB->ObjPool[Idx].NextIndex == ItemIndex)
2591 g_pCB->ObjPool[Idx].NextIndex = g_pCB->ObjPool[ItemIndex].NextIndex;
2595 Idx = g_pCB->ObjPool[Idx].NextIndex;
2604 static _SlReturnVal_t _SlDrvFindAndSetActiveObj(_SlOpcode_t Opcode, _u8 Sd)
2608 ActiveIndex = g_pCB->ActivePoolIdx;
2611 while (MAX_CONCURRENT_ACTIONS > ActiveIndex)
2614 if (g_pCB->ObjPool[ActiveIndex].AdditionalData & SL_NETAPP_FAMILY_MASK)
2616 Opcode &= ~SL_OPCODE_IPV6;
2619 if ((g_pCB->ObjPool[ActiveIndex].ActionID == RECV_ID) && (Sd == g_pCB->ObjPool[ActiveIndex].AdditionalData) &&
2620 ( (SL_OPCODE_SOCKET_RECVASYNCRESPONSE == Opcode) || (SL_OPCODE_SOCKET_RECVFROMASYNCRESPONSE == Opcode)
2621 || (SL_OPCODE_SOCKET_RECVFROMASYNCRESPONSE_V6 == Opcode))
2624 g_pCB->FunctionParams.AsyncExt.ActionIndex = ActiveIndex;
2625 return SL_RET_CODE_OK;
2628 if ( (_SlActionLookupTable[ g_pCB->ObjPool[ActiveIndex].ActionID - MAX_SOCKET_ENUM_IDX].ActionAsyncOpcode == Opcode) &&
2629 ( ((Sd == (g_pCB->ObjPool[ActiveIndex].AdditionalData & SL_BSD_SOCKET_ID_MASK) ) && (SL_MAX_SOCKETS > Sd)) || (SL_MAX_SOCKETS == (g_pCB->ObjPool[ActiveIndex].AdditionalData & SL_BSD_SOCKET_ID_MASK)) ) )
2632 g_pCB->FunctionParams.AsyncExt.AsyncEvtHandler = _SlActionLookupTable[ g_pCB->ObjPool[ActiveIndex].ActionID - MAX_SOCKET_ENUM_IDX].AsyncEventHandler;
2633 g_pCB->FunctionParams.AsyncExt.ActionIndex = ActiveIndex;
2634 return SL_RET_CODE_OK;
2636 ActiveIndex = g_pCB->ObjPool[ActiveIndex].NextIndex;
2639 return SL_RET_OBJ_NOT_SET;
2642 #if defined(slcb_NetAppHttpServerHdlr) || defined(EXT_LIB_REGISTERED_HTTP_SERVER_EVENTS) 2645 _SlDrvHandleHttpServerEvents (slHttpServerEvent, slHttpServerResponse);
2649 #if defined(slcb_NetAppRequestHdlr) || defined(EXT_LIB_REGISTERED_NETAPP_REQUEST_EVENTS) 2650 void _SlDrvDispatchNetAppRequestEvents(SlNetAppRequest_t *slNetAppRequestEvent,
SlNetAppResponse_t *slNetAppResponse)
2652 _SlDrvHandleNetAppRequestEvents (slNetAppRequestEvent, slNetAppResponse);
2658 _SlReturnVal_t _SlDrvSyncObjSignal(_SlSyncObj_t *pSyncObj)
2660 OSI_RET_OK_CHECK(sl_SyncObjSignal(pSyncObj));
2661 return SL_OS_RET_CODE_OK;
2664 _SlReturnVal_t _SlDrvObjLockWaitForever(_SlLockObj_t *pLockObj)
2666 OSI_RET_OK_CHECK(sl_LockObjLock(pLockObj, SL_OS_WAIT_FOREVER));
2667 return SL_OS_RET_CODE_OK;
2670 _SlReturnVal_t _SlDrvProtectionObjLockWaitForever(
void)
2672 OSI_RET_OK_CHECK(sl_LockObjLock(&g_pCB->ProtectionLockObj, SL_OS_WAIT_FOREVER));
2674 return SL_OS_RET_CODE_OK;
2677 _SlReturnVal_t _SlDrvObjUnLock(_SlLockObj_t *pLockObj)
2679 OSI_RET_OK_CHECK(sl_LockObjUnlock(pLockObj));
2681 return SL_OS_RET_CODE_OK;
2684 _SlReturnVal_t _SlDrvProtectionObjUnLock(
void)
2686 OSI_RET_OK_CHECK(sl_LockObjUnlock(&g_pCB->ProtectionLockObj));
2687 return SL_OS_RET_CODE_OK;
2690 _SlReturnVal_t _SlDrvObjGlobalLockWaitForever(_u32 Flags)
2695 _u8 UpdateApiInProgress = (Flags & GLOBAL_LOCK_FLAGS_UPDATE_API_IN_PROGRESS);
2696 _u16 IsProvStopApi = (Flags & GLOBAL_LOCK_FLAGS_PROVISIONING_STOP_API);
2698 if (SL_IS_RESTART_REQUIRED)
2700 return SL_API_ABORTED;
2703 gGlobalLockCntRequested++;
2705 ret = sl_LockObjLock(&GlobalLockObj, SL_OS_WAIT_FOREVER);
2708 if (SL_IS_DEVICE_START_IN_PROGRESS || SL_IS_DEVICE_STOP_IN_PROGRESS || SL_IS_PROVISIONING_IN_PROGRESS)
2717 Opcode = (Flags >> 16);
2718 Silo = Opcode & ((0xF << SL_OPCODE_SILO_OFFSET));
2721 if (Opcode != SL_OPCODE_DEVICE_STOP_COMMAND)
2723 _i16 Status = _SlDrvDriverIsApiAllowed(Silo);
2727 sl_LockObjUnlock(&GlobalLockObj);
2734 if ((0 == ret) && (UpdateApiInProgress))
2736 if (!SL_IS_PROVISIONING_ACTIVE || SL_IS_PROVISIONING_API_ALLOWED)
2739 _SlDrvUpdateApiInProgress(API_IN_PROGRESS_UPDATE_INCREMENT);
2742 else if (FALSE == IsProvStopApi )
2746 SL_DRV_LOCK_GLOBAL_UNLOCK(TRUE);
2747 return SL_RET_CODE_PROVISIONING_IN_PROGRESS;
2753 _SlReturnVal_t _SlDrvGlobalObjUnLock(_u8 bDecrementApiInProgress)
2755 gGlobalLockCntReleased++;
2757 OSI_RET_OK_CHECK(sl_LockObjUnlock(&GlobalLockObj));
2759 if (bDecrementApiInProgress)
2761 _SlDrvUpdateApiInProgress(API_IN_PROGRESS_UPDATE_DECREMENT);
2764 return SL_OS_RET_CODE_OK;
2767 void _SlDrvMemZero(
void* Addr, _u16 size)
2769 sl_Memset(Addr, 0, size);
2775 _SlDrvMemZero(pCmdExt, (_u16)
sizeof (
_SlCmdExt_t));
2780 _SlReturnVal_t _SlDrvSyncObjWaitForever(_SlSyncObj_t *pSyncObj)
2782 _SlReturnVal_t RetVal = sl_SyncObjWait(pSyncObj, SL_OS_WAIT_FOREVER);
2787 if (SL_IS_RESTART_REQUIRED)
2789 return SL_API_ABORTED;
2796 #if (defined(slcb_GetTimestamp)) 2802 pTimeoutInfo->Total10MSecUnits = TimeoutInMsec / 10;
2812 if (pTimeoutInfo->TSCurr >= pTimeoutInfo->TSPrev)
2814 pTimeoutInfo->DeltaTicks = pTimeoutInfo->TSCurr - pTimeoutInfo->TSPrev;
2818 pTimeoutInfo->DeltaTicks = (SL_TIMESTAMP_MAX_VALUE - pTimeoutInfo->TSPrev) + pTimeoutInfo->TSCurr;
2821 TSCount = pTimeoutInfo->DeltaTicksReminder + pTimeoutInfo->DeltaTicks;
2824 if (TSCount > SL_TIMESTAMP_TICKS_IN_10_MILLISECONDS)
2826 pTimeoutInfo->Total10MSecUnits -= (TSCount / SL_TIMESTAMP_TICKS_IN_10_MILLISECONDS);
2827 pTimeoutInfo->DeltaTicksReminder = TSCount % SL_TIMESTAMP_TICKS_IN_10_MILLISECONDS;
2829 if (pTimeoutInfo->Total10MSecUnits > 0)
2831 pTimeoutInfo->TSPrev = pTimeoutInfo->TSCurr;
2844 void _SlDrvHandleFatalError(_u32 errorId, _u32 info1, _u32 info2)
2849 _SlDrvMemZero(&FatalEvent,
sizeof(FatalEvent));
2851 if (SL_IS_RESTART_REQUIRED)
2857 SL_SET_RESTART_REQUIRED;
2861 (void)sl_LockObjDelete(&GlobalLockObj);
2864 SL_UNSET_GLOBAL_LOCK_INIT;
2867 for (i=0; i< MAX_CONCURRENT_ACTIONS; i++)
2869 SL_DRV_SYNC_OBJ_SIGNAL(&g_pCB->ObjPool[i].SyncObj);
2873 FatalEvent.Id = errorId;
2877 case SL_DEVICE_EVENT_FATAL_DEVICE_ABORT:
2880 FatalEvent.Data.DeviceAssert.Code = info1;
2883 FatalEvent.Data.DeviceAssert.Value = info2;
2887 case SL_DEVICE_EVENT_FATAL_NO_CMD_ACK:
2890 FatalEvent.Data.NoCmdAck.Code = info1;
2894 case SL_DEVICE_EVENT_FATAL_CMD_TIMEOUT:
2897 FatalEvent.Data.CmdTimeout.Code = info1;
2901 case SL_DEVICE_EVENT_FATAL_SYNC_LOSS:
2902 case SL_DEVICE_EVENT_FATAL_DRIVER_ABORT:
2908 #if defined(slcb_DeviceFatalErrorEvtHdlr) || defined (EXT_LIB_REGISTERED_FATAL_ERROR_EVENTS) 2910 _SlDrvHandleFatalErrorEvents(&FatalEvent);
2914 _SlReturnVal_t _SlDrvSyncObjWaitTimeout(_SlSyncObj_t *pSyncObj, _u32 timeoutVal, _u32 asyncEventOpcode)
2916 _SlReturnVal_t ret = sl_SyncObjWait(pSyncObj, timeoutVal);
2921 _SlDrvHandleFatalError(SL_DEVICE_EVENT_FATAL_CMD_TIMEOUT, asyncEventOpcode, timeoutVal);
2922 return SL_API_ABORTED;
2924 else if (SL_IS_RESTART_REQUIRED)
2926 return SL_API_ABORTED;
2929 return SL_RET_CODE_OK;
2933 static void _SlDrvUpdateApiInProgress(_i8 Value)
2935 SL_DRV_PROTECTION_OBJ_LOCK_FOREVER();
2937 g_pCB->ApiInProgressCnt += Value;
2939 SL_DRV_PROTECTION_OBJ_UNLOCK();
2942 _i8 _SlDrvIsApiInProgress(
void)
2946 return (g_pCB->ApiInProgressCnt > 0);
2953 #ifdef slcb_GetTimestamp 2955 void _SlDrvSleep(_u16 DurationInMsec)
2959 _SlDrvStartMeasureTimeout(&TimeoutInfo, DurationInMsec);
2961 while(!_SlDrvIsTimeoutExpired(&TimeoutInfo));
2965 #ifndef SL_PLATFORM_MULTI_THREADED 2966 void _SlDrvSetGlobalLockOwner(_u8 Owner)
2968 gGlobalLockContextOwner = Owner;
2973 _SlReturnVal_t _SlDrvWaitForInternalAsyncEvent(_u8 ObjIdx , _u32 Timeout, _SlOpcode_t Opcode)
2976 #if (defined(SL_PLATFORM_EXTERNAL_SPAWN) || !defined(SL_PLATFORM_MULTI_THREADED)) 2977 SL_DRV_SYNC_OBJ_WAIT_FOREVER(&g_pCB->ObjPool[ObjIdx].SyncObj);
2978 return SL_OS_RET_CODE_OK;
2981 if (_SlDrvIsSpawnOwnGlobalLock())
2983 #if (defined(slcb_GetTimestamp)) 2984 _SlDrvStartMeasureTimeout(&SlTimeoutInfo, Timeout);
2985 while (!Timeout || !_SlDrvIsTimeoutExpired(&SlTimeoutInfo))
2990 _SlInternalSpawnWaitForEvent();
2992 if (0 == sl_SyncObjWait(&g_pCB->ObjPool[ObjIdx].SyncObj, SL_OS_NO_WAIT))
2994 return SL_OS_RET_CODE_OK;
2998 _SlDrvHandleFatalError(SL_DEVICE_EVENT_FATAL_CMD_TIMEOUT, Opcode, Timeout);
2999 return SL_API_ABORTED;
3005 SL_DRV_SYNC_OBJ_WAIT_TIMEOUT(&g_pCB->ObjPool[ObjIdx].SyncObj, Timeout, Opcode);
3009 SL_DRV_SYNC_OBJ_WAIT_FOREVER(&g_pCB->ObjPool[ObjIdx].SyncObj);
3011 return SL_OS_RET_CODE_OK;
3017 #if (defined(SL_PLATFORM_MULTI_THREADED) && !defined(SL_MEMORY_MGMT_DYNAMIC)) 3022 while (Idx < SL_MAX_ASYNC_BUFFERS)
3024 if (0xFF == g_StatMem.AsyncBufPool[Idx].ActionIndex)
3027 return &g_StatMem.AsyncBufPool[Idx];
3035 #if defined(SL_PLATFORM_MULTI_THREADED) 3036 _SlReturnVal_t _SlSpawnMsgListInsert(_u16 AsyncEventLen, _u8 *pAsyncBuf)
3038 _SlReturnVal_t RetVal = SL_OS_RET_CODE_OK;
3041 SL_DRV_PROTECTION_OBJ_LOCK_FOREVER();
3043 #ifdef SL_MEMORY_MGMT_DYNAMIC 3050 RetVal = SL_RET_CODE_NO_FREE_ASYNC_BUFFERS_ERROR;
3051 SL_DRV_PROTECTION_OBJ_UNLOCK();
3055 pItem->Buffer = (
void*)sl_Malloc(AsyncEventLen);
3056 if (pItem->Buffer == NULL)
3059 RetVal = SL_RET_CODE_NO_FREE_ASYNC_BUFFERS_ERROR;
3060 SL_DRV_PROTECTION_OBJ_UNLOCK();
3065 if (g_pCB->spawnMsgList == NULL)
3067 g_pCB->spawnMsgList = pItem;
3071 pCurr = g_pCB->spawnMsgList;
3073 while (pCurr->next != NULL)
3075 pCurr = pCurr->next;
3078 pCurr->next = pItem;
3083 if ((NULL != pItem) && (NULL != pItem->Buffer))
3086 pItem->ActionIndex = g_pCB->FunctionParams.AsyncExt.ActionIndex;
3088 pItem->AsyncHndlr = g_pCB->FunctionParams.AsyncExt.AsyncEvtHandler;
3090 sl_Memcpy(pItem->Buffer, pAsyncBuf, AsyncEventLen);
3094 RetVal = SL_RET_CODE_NO_FREE_ASYNC_BUFFERS_ERROR;
3096 SL_DRV_PROTECTION_OBJ_UNLOCK();
3100 _SlReturnVal_t _SlSpawnMsgListProcess()
3103 #ifdef SL_MEMORY_MGMT_DYNAMIC 3108 while (pCurr != NULL)
3111 SL_DRV_LOCK_GLOBAL_LOCK_FOREVER(GLOBAL_LOCK_FLAGS_NONE);
3113 g_pCB->FunctionParams.AsyncExt.ActionIndex = pCurr->ActionIndex;
3114 g_pCB->FunctionParams.AsyncExt.AsyncEvtHandler = pCurr->AsyncHndlr;
3117 pCurr = pCurr->next;
3120 g_pCB->spawnMsgList = pCurr;
3123 _SlDrvAsyncEventGenericHandler(FALSE, pLast->Buffer);
3126 sl_Free(pLast->Buffer);
3131 SL_DRV_LOCK_GLOBAL_UNLOCK(FALSE);
3137 for (i = 0; i < SL_MAX_ASYNC_BUFFERS; i++)
3139 if (0xFF != g_StatMem.AsyncBufPool[i].ActionIndex)
3143 SL_DRV_LOCK_GLOBAL_LOCK_FOREVER(GLOBAL_LOCK_FLAGS_NONE);
3146 g_pCB->FunctionParams.AsyncExt.ActionIndex = g_StatMem.AsyncBufPool[i].ActionIndex;
3147 g_pCB->FunctionParams.AsyncExt.AsyncEvtHandler = g_StatMem.AsyncBufPool[i].AsyncHndlr;
3151 _SlDrvAsyncEventGenericHandler(FALSE, (
unsigned char *)&(g_StatMem.AsyncBufPool[i].Buffer));
3153 SL_DRV_LOCK_GLOBAL_UNLOCK(FALSE);
3155 SL_DRV_PROTECTION_OBJ_LOCK_FOREVER();
3156 g_StatMem.AsyncBufPool[i].ActionIndex = 0xFF;
3157 SL_DRV_PROTECTION_OBJ_UNLOCK();
3161 return SL_OS_RET_CODE_OK;
3164 _u16 _SlSpawnMsgListGetCount()
3166 _u16 NumOfItems = 0;
3167 #ifdef SL_MEMORY_MGMT_DYNAMIC 3171 SL_DRV_PROTECTION_OBJ_LOCK_FOREVER();
3172 while (pCurr != NULL)
3176 pCurr = pCurr->next;
3178 SL_DRV_PROTECTION_OBJ_UNLOCK();
3183 SL_DRV_PROTECTION_OBJ_LOCK_FOREVER();
3185 for (i = 0; i < SL_MAX_ASYNC_BUFFERS; i++)
3187 if (0xFF != g_StatMem.AsyncBufPool[i].ActionIndex)
3192 SL_DRV_PROTECTION_OBJ_UNLOCK();
3198 void _SlFindAndReleasePendingCmd()
3200 if(g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs != NULL)
3203 ((
SlSocketResponse_t *)(g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs))->StatusOrLen = SL_RET_CODE_NO_FREE_ASYNC_BUFFERS_ERROR;
3205 SL_DRV_SYNC_OBJ_SIGNAL(&g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].SyncObj);
void slcb_NetAppRequestHdlr(SlNetAppRequest_t *pNetAppRequest, SlNetAppResponse_t *pNetAppResponse)
General netapp async event.
void slcb_DeviceFatalErrorEvtHdlr(SlDeviceFatal_t *pSlFatalErrorEvent)
Fatal Error event for inspecting fatal error.
void slcb_SockEvtHdlr(SlSockEvent_t *pSlSockEvent)
Socket Async event handler.
_u32 slcb_GetTimestamp(void)
Get the timer counter value (timestamp). The timer must count from zero to its MAX value...
void slcb_WlanEvtHdlr(SlWlanEvent_t *pSlWlanEvent)
WLAN Async event handler.
void slcb_NetAppEvtHdlr(SlNetAppEvent_t *pSlNetAppEvent)
NETAPP Async event handler.
void slcb_NetAppHttpServerHdlr(SlNetAppHttpServerEvent_t *pSlHttpServerEvent, SlNetAppHttpServerResponse_t *pSlHttpServerResponse)
HTTP server async event.
void slcb_DeviceGeneralEvtHdlr(SlDeviceEvent_t *pSlDeviceEvent)
General async event for inspecting general events.