18 #include <ti/drivers/net/wifi/simplelink.h>
19 #include <ti/drivers/net/wifi/source/protocol.h>
20 #include <ti/drivers/net/wifi/source/driver.h>
21 #include <ti/drivers/net/wifi/source/flowcont.h>
22 #ifdef SL_INC_INTERNAL_ERRNO
23 #include <ti/drivers/net/wifi/sys/errno.h>
29 _u8 gGlobalLockCntRequested=0;
30 _u8 gGlobalLockCntReleased=0;
32 #if (defined(SL_INC_INTERNAL_ERRNO) && defined(SL_PLATFORM_MULTI_THREADED))
33 extern void * pthread_self(
void);
36 static void _SlDrvUpdateApiInProgress(_i8 Value);
39 #define API_IN_PROGRESS_UPDATE_NONE (0)
40 #define API_IN_PROGRESS_UPDATE_INCREMENT (1)
41 #define API_IN_PROGRESS_UPDATE_DECREMENT (-1)
43 #define GLOBAL_LOCK_FLAGS_NONE (0x0)
44 #define GLOBAL_LOCK_FLAGS_UPDATE_API_IN_PROGRESS (0x1)
45 #define GLOBAL_LOCK_FLAGS_PROVISIONING_STOP_API (0x2)
46 #define GLOBAL_LOCK_FLAGS_STARTING_DEVICE (0x4)
52 #define N2H_SYNC_PATTERN_SEQ_NUM_BITS ((_u32)0x00000003)
53 #define N2H_SYNC_PATTERN_SEQ_NUM_EXISTS ((_u32)0x00000004)
54 #define N2H_SYNC_PATTERN_MASK ((_u32)0xFFFFFFF8)
55 #define N2H_SYNC_SPI_BUGS_MASK ((_u32)0x7FFF7F7F)
56 #define BUF_SYNC_SPIM(pBuf) ((*(_u32 *)(pBuf)) & N2H_SYNC_SPI_BUGS_MASK)
58 #define N2H_SYNC_SPIM (N2H_SYNC_PATTERN & N2H_SYNC_SPI_BUGS_MASK)
59 #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)))
60 #define MATCH_WOUT_SEQ_NUM(pBuf) ( BUF_SYNC_SPIM(pBuf) == N2H_SYNC_SPIM )
61 #define MATCH_WITH_SEQ_NUM(pBuf, TxSeqNum) ( BUF_SYNC_SPIM(pBuf) == (N2H_SYNC_SPIM_WITH_SEQ(TxSeqNum)) )
62 #define N2H_SYNC_PATTERN_MATCH(pBuf, TxSeqNum) \
64 ( (*((_u32 *)pBuf) & N2H_SYNC_PATTERN_SEQ_NUM_EXISTS) && ( MATCH_WITH_SEQ_NUM(pBuf, TxSeqNum) ) ) || \
65 ( !(*((_u32 *)pBuf) & N2H_SYNC_PATTERN_SEQ_NUM_EXISTS) && ( MATCH_WOUT_SEQ_NUM(pBuf ) ) ) \
68 #define OPCODE(_ptr) (((_SlResponseHeader_t *)(_ptr))->GenHeader.Opcode)
69 #define RSP_PAYLOAD_LEN(_ptr) (((_SlResponseHeader_t *)(_ptr))->GenHeader.Len - _SL_RESP_SPEC_HDR_SIZE)
70 #define SD(_ptr) (((SlSocketAddrResponse_u *)(_ptr))->IpV4.Sd)
72 #define ACT_DATA_SIZE(_ptr) (((SlSocketAddrResponse_u *)(_ptr))->IpV4.StatusOrLen)
79 #if defined (EXT_LIB_REGISTERED_GENERAL_EVENTS)
81 typedef _SlEventPropogationStatus_e (*general_callback) (
SlDeviceEvent_t *);
83 static const general_callback general_callbacks[] =
85 #ifdef SlExtLib1GeneralEventHandler
86 SlExtLib1GeneralEventHandler,
89 #ifdef SlExtLib2GeneralEventHandler
90 SlExtLib2GeneralEventHandler,
93 #ifdef SlExtLib3GeneralEventHandler
94 SlExtLib3GeneralEventHandler,
97 #ifdef SlExtLib4GeneralEventHandler
98 SlExtLib4GeneralEventHandler,
101 #ifdef SlExtLib5GeneralEventHandler
102 SlExtLib5GeneralEventHandler,
106 #undef _SlDrvHandleGeneralEvents
118 for ( i = 0 ; i <
sizeof(general_callbacks)/
sizeof(general_callbacks[0]) ; i++ )
120 if (EVENT_PROPAGATION_BLOCK == general_callbacks[i](slGeneralEvent) )
128 #ifdef slcb_DeviceGeneralEvtHdlr
139 #if defined (EXT_LIB_REGISTERED_WLAN_EVENTS)
141 typedef _SlEventPropogationStatus_e (*wlan_callback) (
SlWlanEvent_t *);
143 static wlan_callback wlan_callbacks[] =
145 #ifdef SlExtLib1WlanEventHandler
146 SlExtLib1WlanEventHandler,
149 #ifdef SlExtLib2WlanEventHandler
150 SlExtLib2WlanEventHandler,
153 #ifdef SlExtLib3WlanEventHandler
154 SlExtLib3WlanEventHandler,
157 #ifdef SlExtLib4WlanEventHandler
158 SlExtLib4WlanEventHandler,
161 #ifdef SlExtLib5WlanEventHandler
162 SlExtLib5WlanEventHandler,
166 #undef _SlDrvHandleWlanEvents
178 for ( i = 0 ; i <
sizeof(wlan_callbacks)/
sizeof(wlan_callbacks[0]) ; i++ )
180 if ( EVENT_PROPAGATION_BLOCK == wlan_callbacks[i](slWlanEvent) )
188 #ifdef slcb_WlanEvtHdlr
197 #if defined (EXT_LIB_REGISTERED_NETAPP_EVENTS)
199 typedef _SlEventPropogationStatus_e (*netApp_callback) (
SlNetAppEvent_t *);
201 static const netApp_callback netApp_callbacks[] =
203 #ifdef SlExtLib1NetAppEventHandler
204 SlExtLib1NetAppEventHandler,
207 #ifdef SlExtLib2NetAppEventHandler
208 SlExtLib2NetAppEventHandler,
211 #ifdef SlExtLib3NetAppEventHandler
212 SlExtLib3NetAppEventHandler,
215 #ifdef SlExtLib4NetAppEventHandler
216 SlExtLib4NetAppEventHandler,
219 #ifdef SlExtLib5NetAppEventHandler
220 SlExtLib5NetAppEventHandler,
224 #undef _SlDrvHandleNetAppEvents
236 for ( i = 0 ; i <
sizeof(netApp_callbacks)/
sizeof(netApp_callbacks[0]) ; i++ )
238 if (EVENT_PROPAGATION_BLOCK == netApp_callbacks[i](slNetAppEvent) )
246 #ifdef slcb_NetAppEvtHdlr
255 #if defined (EXT_LIB_REGISTERED_HTTP_SERVER_EVENTS)
259 static const httpServer_callback httpServer_callbacks[] =
261 #ifdef SlExtLib1HttpServerEventHandler
262 SlExtLib1HttpServerEventHandler,
265 #ifdef SlExtLib2HttpServerEventHandler
266 SlExtLib2HttpServerEventHandler,
269 #ifdef SlExtLib3HttpServerEventHandler
270 SlExtLib3HttpServerEventHandler,
273 #ifdef SlExtLib4HttpServerEventHandler
274 SlExtLib4HttpServerEventHandler,
277 #ifdef SlExtLib5HttpServerEventHandler
278 SlExtLib5HttpServerEventHandler,
282 #undef _SlDrvHandleHttpServerEvents
294 for ( i = 0 ; i <
sizeof(httpServer_callbacks)/
sizeof(httpServer_callbacks[0]) ; i++ )
296 if ( EVENT_PROPAGATION_BLOCK == httpServer_callbacks[i](slHttpServerEvent, slHttpServerResponse) )
304 #ifdef slcb_NetAppHttpServerHdlr
313 #if defined (EXT_LIB_REGISTERED_SOCK_EVENTS)
315 typedef _SlEventPropogationStatus_e (*sock_callback) (
SlSockEvent_t *);
317 static const sock_callback sock_callbacks[] =
319 #ifdef SlExtLib1SockEventHandler
320 SlExtLib1SockEventHandler,
323 #ifdef SlExtLib2SockEventHandler
324 SlExtLib2SockEventHandler,
327 #ifdef SlExtLib3SockEventHandler
328 SlExtLib3SockEventHandler,
331 #ifdef SlExtLib4SockEventHandler
332 SlExtLib4SockEventHandler,
335 #ifdef SlExtLib5SockEventHandler
336 SlExtLib5SockEventHandler,
350 for ( i = 0 ; i <
sizeof(sock_callbacks)/
sizeof(sock_callbacks[0]) ; i++ )
352 if ( EVENT_PROPAGATION_BLOCK == sock_callbacks[i](slSockEvent) )
360 #ifdef slcb_SockEvtHdlr
371 #if defined (EXT_LIB_REGISTERED_FATAL_ERROR_EVENTS)
373 typedef _SlEventPropogationStatus_e (*fatal_error_callback) (
SlDeviceEvent_t *);
375 static const fatal_error_callback fatal_error_callbacks[] =
377 #ifdef SlExtLib1FatalErrorEventHandler
378 SlExtLib1FatalErrorEventHandler,
381 #ifdef SlExtLib2FatalErrorEventHandler
382 SlExtLib2FatalErrorEventHandler,
385 #ifdef SlExtLib3FatalErrorEventHandler
386 SlExtLib3FatalErrorEventHandler,
389 #ifdef SlExtLib4FatalErrorEventHandler
390 SlExtLib4FatalErrorEventHandler,
393 #ifdef SlExtLib5FatalErrorEventHandler
394 SlExtLib5FatalErrorEventHandler,
398 #undef _SlDrvHandleFatalErrorEvents
410 for ( i = 0 ; i <
sizeof(fatal_error_callbacks)/
sizeof(fatal_error_callbacks[0]) ; i++ )
412 if (EVENT_PROPAGATION_BLOCK == fatal_error_callbacks[i](slFatalErrorEvent) )
420 #ifdef slcb_DeviceFatalErrorEvtHdlr
428 #if defined (EXT_LIB_REGISTERED_NETAPP_REQUEST_EVENTS)
432 static const netapp_request_callback netapp_request_callbacks[] =
434 #ifdef SlExtLib1NetAppRequestEventHandler
435 SlExtLib1NetAppRequestEventHandler,
438 #ifdef SlExtLib2NetAppRequestEventHandler
439 SlExtLib2NetAppRequestEventHandler,
442 #ifdef SlExtLib3NetAppRequestEventHandler
443 SlExtLib3NetAppRequestEventHandler,
446 #ifdef SlExtLib4NetAppRequestEventHandler
447 SlExtLib4NetAppRequestEventHandler,
450 #ifdef SlExtLib5NetAppRequestEventHandler
451 SlExtLib5NetAppRequestEventHandler,
455 #undef _SlDrvHandleNetAppRequestEvents
462 void _SlDrvHandleNetAppRequestEvents(SlNetAppRequest_t *pNetAppRequest,
SlNetAppResponse_t *pNetAppResponse)
467 for ( i = 0 ; i <
sizeof(netapp_request_callbacks)/
sizeof(netapp_request_callbacks[0]) ; i++ )
469 if (EVENT_PROPAGATION_BLOCK == netapp_request_callbacks[i](pNetAppRequest, pNetAppResponse) )
477 #ifdef slcb_NetAppRequestHdlr
486 #ifndef SL_MEMORY_MGMT_DYNAMIC
491 _u8 AsyncRespBuf[SL_ASYNC_MAX_MSG_LEN];
494 static _SlStatMem_t g_StatMem;
497 #if (defined(SL_INC_INTERNAL_ERRNO) && defined(SL_PLATFORM_MULTI_THREADED))
505 _i32* _SlDrvallocateErrno(_i32 Errno)
507 _i8 Index, Found = -1;
509 if( SL_OS_RET_CODE_OK == sl_LockObjLock(&(g_pCB->ErrnoLockObj), SL_OS_WAIT_FOREVER))
511 Id = (_i32)pthread_self();
515 for(Index = 0; Index < MAX_CONCURRENT_ACTIONS; Index++ )
517 if(Id == g_pCB->Errno[Index].Id)
524 if(0 == g_pCB->Errno[Index].Id)
535 for(Index = 0; Index < MAX_CONCURRENT_ACTIONS; Index++ )
537 if((g_pCB->Errno[Index].Flags & SL_DRVER_ERRNO_FLAGS_UNREAD))
544 if((SL_ERROR_BSD_EAGAIN != g_pCB->Errno[Index].Errno) && (SL_ERROR_BSD_EALREADY != g_pCB->Errno[Index].Errno)
545 && (SL_ERROR_BSD_ESECCERTIFICATEREVOKED != g_pCB->Errno[Index].Errno) && (SL_ERROR_BSD_ESECUNKNOWNROOTCA != g_pCB->Errno[Index].Errno)
546 && (SL_ERROR_BSD_ESECSNOVERIFY != g_pCB->Errno[Index].Errno) && (SL_ERROR_BSD_ESECDATEERROR != g_pCB->Errno[Index].Errno))
548 if((g_pCB->ErrnoIndex - g_pCB->Errno[Index].Index) > g_pCB->ErrnoIndex - g_pCB->Errno[Found].Index )
557 g_pCB->Errno[Found].Errno = Errno;
558 g_pCB->Errno[Found].Id = Id;
559 g_pCB->Errno[Found].Flags = SL_DRVER_ERRNO_FLAGS_UNREAD;
560 g_pCB->Errno[Found].Index = g_pCB->ErrnoIndex;
564 sl_LockObjUnlock(&(g_pCB->ErrnoLockObj));
566 return (_i32 *)(&g_pCB->Errno[Found].Errno);
580 _i32 _SlDrvSetErrno(_i32 Errno)
593 #if ERROR != SL_ERROR_BSD_SOC_ERROR
594 case SL_ERROR_BSD_SOC_ERROR:
598 #if INEXE != SL_ERROR_BSD_INEXE
599 case SL_ERROR_BSD_INEXE:
603 #if EBADF != SL_ERROR_BSD_EBADF
604 case SL_ERROR_BSD_EBADF:
608 #if ENSOCK != SL_ERROR_BSD_ENSOCK
609 case SL_ERROR_BSD_ENSOCK:
613 #if EAGAIN != SL_ERROR_BSD_EAGAIN
614 case SL_ERROR_BSD_EAGAIN:
618 #if ENOMEM != SL_ERROR_BSD_ENOMEM
619 case SL_ERROR_BSD_ENOMEM:
623 #if EACCES != SL_ERROR_BSD_EACCES
624 case SL_ERROR_BSD_EACCES:
628 #if EFAULT != SL_ERROR_BSD_EFAULT
629 case SL_ERROR_BSD_EFAULT:
633 #if EINVAL != SL_ERROR_BSD_EINVAL
634 case SL_ERROR_BSD_EINVAL:
638 #if EDESTADDRREQ != SL_ERROR_BSD_EDESTADDRREQ
639 case SL_ERROR_BSD_EDESTADDRREQ:
640 Errno = EDESTADDRREQ;
643 #if EPROTOTYPE != SL_ERROR_BSD_EPROTOTYPE
644 case SL_ERROR_BSD_EPROTOTYPE:
648 #if ENOPROTOOPT != SL_ERROR_BSD_ENOPROTOOPT
649 case SL_ERROR_BSD_ENOPROTOOPT:
653 #if EPROTONOSUPPORT != SL_ERROR_BSD_EPROTONOSUPPORT
654 case SL_ERROR_BSD_EPROTONOSUPPORT:
655 Errno = EPROTONOSUPPORT;
658 #if ESOCKTNOSUPPORT != SL_ERROR_BSD_ESOCKTNOSUPPORT
659 case SL_ERROR_BSD_ESOCKTNOSUPPORT:
660 Errno = ESOCKTNOSUPPORT;
663 #if EOPNOTSUPP != SL_ERROR_BSD_EOPNOTSUPP
664 case SL_ERROR_BSD_EOPNOTSUPP:
668 #if EAFNOSUPPORT != SL_ERROR_BSD_EAFNOSUPPORT
669 case SL_ERROR_BSD_EAFNOSUPPORT:
670 Errno = EAFNOSUPPORT;
673 #if EADDRINUSE != SL_ERROR_BSD_EADDRINUSE
674 case SL_ERROR_BSD_EADDRINUSE:
678 #if EADDRNOTAVAIL != SL_ERROR_BSD_EADDRNOTAVAIL
679 case SL_ERROR_BSD_EADDRNOTAVAIL:
680 Errno = EADDRNOTAVAIL;
683 #if ENETUNREACH != SL_ERROR_BSD_ENETUNREACH
684 case SL_ERROR_BSD_ENETUNREACH:
688 #if ENOBUFS != SL_ERROR_BSD_ENOBUFS
689 case SL_ERROR_BSD_ENOBUFS:
693 #if EISCONN != SL_ERROR_BSD_EISCONN
694 case SL_ERROR_BSD_EISCONN:
698 #if ENOTCONN != SL_ERROR_BSD_ENOTCONN
699 case SL_ERROR_BSD_ENOTCONN:
703 #if ETIMEDOUT != SL_ERROR_BSD_ETIMEDOUT
704 case SL_ERROR_BSD_ETIMEDOUT:
708 #if ECONNREFUSED != SL_ERROR_BSD_ECONNREFUSED
709 case SL_ERROR_BSD_ECONNREFUSED:
710 Errno = ECONNREFUSED;
717 case SL_POOL_IS_EMPTY:
720 case SL_RET_CODE_INVALID_INPUT:
725 case SL_RET_CODE_STOP_IN_PROGRESS:
726 case SL_RET_CODE_DEV_LOCKED:
728 case SL_RET_CODE_DEV_NOT_STARTED:
729 case SL_RET_CODE_PROVISIONING_IN_PROGRESS:
740 #ifdef SL_INC_INTERNAL_ERRNO
741 #ifdef SL_PLATFORM_MULTI_THREADED
744 _SlDrvallocateErrno(Errno);
751 g_pCB->Errno[0].Errno = Errno;
757 slcb_SetErrno(Errno);
760 return SL_ERROR_BSD_SOC_ERROR;
763 #ifdef SL_INC_INTERNAL_ERRNO
774 #ifdef SL_PLATFORM_MULTI_THREADED
775 _i8 Index, Found = -1;
778 if( SL_OS_RET_CODE_OK == sl_LockObjLock(&(g_pCB->ErrnoLockObj), SL_OS_WAIT_FOREVER))
780 Id = (_i32)pthread_self();
781 for(Index = 0; Index < MAX_CONCURRENT_ACTIONS; Index++ )
783 if(Id == g_pCB->Errno[Index].Id)
791 Ret = (
int*)(&g_pCB->Errno[Index].Errno);
792 g_pCB->Errno[Index].Flags &= ~(SL_DRVER_ERRNO_FLAGS_UNREAD);
795 sl_LockObjUnlock(&(g_pCB->ErrnoLockObj));
804 Ret = (
int *)(_SlDrvallocateErrno(SL_ERROR_BSD_SOC_ERROR));
809 Ret = (
int *)(&g_pCB->Errno[0].Errno);
817 _u8 _SlDrvProtectAsyncRespSetting(_u8 *pAsyncRsp, _SlActionID_e ActionID, _u8 SocketID)
822 ObjIdx = (_u8)_SlDrvWaitForPoolObj(ActionID, SocketID);
824 if (MAX_CONCURRENT_ACTIONS != ObjIdx)
826 SL_DRV_PROTECTION_OBJ_LOCK_FOREVER();
827 g_pCB->ObjPool[ObjIdx].pRespArgs = pAsyncRsp;
828 SL_DRV_PROTECTION_OBJ_UNLOCK();
840 #ifndef SL_IF_TYPE_UART
843 _volatile _u8 RxIrqCnt;
845 _u16 g_SlDeviceStatus = 0;
846 _SlLockObj_t GlobalLockObj;
854 {ACCEPT_ID, SL_OPCODE_SOCKET_ACCEPTASYNCRESPONSE, (_SlSpawnEntryFunc_t)_SlSocketHandleAsync_Accept},
855 {CONNECT_ID, SL_OPCODE_SOCKET_CONNECTASYNCRESPONSE,(_SlSpawnEntryFunc_t)_SlSocketHandleAsync_Connect},
856 {SELECT_ID, SL_OPCODE_SOCKET_SELECTASYNCRESPONSE,(_SlSpawnEntryFunc_t)_SlSocketHandleAsync_Select},
857 {GETHOSYBYNAME_ID, SL_OPCODE_NETAPP_DNSGETHOSTBYNAMEASYNCRESPONSE,(_SlSpawnEntryFunc_t)_SlNetAppHandleAsync_DnsGetHostByName},
858 {GETHOSYBYSERVICE_ID, SL_OPCODE_NETAPP_MDNSGETHOSTBYSERVICEASYNCRESPONSE,(_SlSpawnEntryFunc_t)_SlNetAppHandleAsync_DnsGetHostByService},
859 {PING_ID, SL_OPCODE_NETAPP_PINGREPORTREQUESTRESPONSE, (_SlSpawnEntryFunc_t)_SlNetAppHandleAsync_PingResponse},
860 {NETAPP_RECEIVE_ID, SL_OPCODE_NETAPP_RECEIVE, (_SlSpawnEntryFunc_t)_SlNetAppHandleAsync_NetAppReceive},
861 {START_STOP_ID, SL_OPCODE_DEVICE_STOP_ASYNC_RESPONSE,(_SlSpawnEntryFunc_t)_SlDeviceHandleAsync_Stop},
862 {NETUTIL_CMD_ID, SL_OPCODE_NETUTIL_COMMANDASYNCRESPONSE,(_SlSpawnEntryFunc_t)_SlNetUtilHandleAsync_Cmd},
863 {CLOSE_ID, SL_OPCODE_SOCKET_SOCKETCLOSEASYNCEVENT,(_SlSpawnEntryFunc_t)_SlSocketHandleAsync_Close}
868 {CONNECT_ID, SL_OPCODE_SOCKET_CONNECTASYNCRESPONSE,(_SlSpawnEntryFunc_t)_SlSocketHandleAsync_Connect},
869 {GETHOSYBYNAME_ID, SL_OPCODE_NETAPP_DNSGETHOSTBYNAMEASYNCRESPONSE,(_SlSpawnEntryFunc_t)_SlNetAppHandleAsync_DnsGetHostByName},
870 {START_STOP_ID, SL_OPCODE_DEVICE_STOP_ASYNC_RESPONSE,(_SlSpawnEntryFunc_t)_SlDeviceHandleAsync_Stop},
871 {CLOSE_ID, SL_OPCODE_SOCKET_SOCKETCLOSEASYNCEVENT,(_SlSpawnEntryFunc_t)_SlSocketHandleAsync_Close}
885 const OpcodeKeyVal_t OpcodeTranslateTable[] =
887 {SL_OPCODE_WLAN_STA_ASYNCCONNECTEDRESPONSE, SL_WLAN_EVENT_CONNECT},
888 {SL_OPCODE_WLAN_P2PCL_ASYNCCONNECTEDRESPONSE, SL_WLAN_EVENT_P2P_CONNECT},
889 {SL_OPCODE_WLAN_STA_ASYNCDISCONNECTEDRESPONSE, SL_WLAN_EVENT_DISCONNECT},
890 {SL_OPCODE_WLAN_P2PCL_ASYNCDISCONNECTEDRESPONSE,SL_WLAN_EVENT_P2P_DISCONNECT},
891 {SL_OPCODE_WLAN_ASYNC_STA_ADDED, SL_WLAN_EVENT_STA_ADDED},
892 {SL_OPCODE_WLAN_ASYNC_P2PCL_ADDED,SL_WLAN_EVENT_P2P_CLIENT_ADDED},
893 {SL_OPCODE_WLAN_ASYNC_STA_REMOVED, SL_WLAN_EVENT_STA_REMOVED},
894 {SL_OPCODE_WLAN_ASYNC_P2PCL_REMOVED,SL_WLAN_EVENT_P2P_CLIENT_REMOVED},
895 {SL_OPCODE_WLAN_P2P_DEV_FOUND,SL_WLAN_EVENT_P2P_DEVFOUND},
896 {SL_OPCODE_WLAN_P2P_NEG_REQ_RECEIVED, SL_WLAN_EVENT_P2P_REQUEST},
897 {SL_OPCODE_WLAN_P2P_CONNECTION_FAILED, SL_WLAN_EVENT_P2P_CONNECTFAIL},
898 {SL_OPCODE_WLAN_PROVISIONING_STATUS_ASYNC_EVENT, SL_WLAN_EVENT_PROVISIONING_STATUS},
899 {SL_OPCODE_WLAN_PROVISIONING_PROFILE_ADDED_ASYNC_RESPONSE, SL_WLAN_EVENT_PROVISIONING_PROFILE_ADDED},
900 {SL_OPCODE_WLAN_RX_FILTER_ASYNC_RESPONSE,SL_WLAN_EVENT_RXFILTER},
902 {SL_OPCODE_NETAPP_IPACQUIRED, SL_NETAPP_EVENT_IPV4_ACQUIRED},
903 {SL_OPCODE_NETAPP_IPACQUIRED_V6, SL_NETAPP_EVENT_IPV6_ACQUIRED},
904 {SL_OPCODE_NETAPP_IP_LEASED, SL_NETAPP_EVENT_DHCPV4_LEASED},
905 {SL_OPCODE_NETAPP_IP_RELEASED, SL_NETAPP_EVENT_DHCPV4_RELEASED},
906 {SL_OPCODE_NETAPP_IP_COLLISION, SL_NETAPP_EVENT_IP_COLLISION},
907 {SL_OPCODE_NETAPP_IPV4_LOST, SL_NETAPP_EVENT_IPV4_LOST},
908 {SL_OPCODE_NETAPP_DHCP_IPV4_ACQUIRE_TIMEOUT, SL_NETAPP_EVENT_DHCP_IPV4_ACQUIRE_TIMEOUT},
909 {SL_OPCODE_NETAPP_IPV6_LOST_V6, SL_NETAPP_EVENT_IPV6_LOST},
911 {SL_OPCODE_SOCKET_TXFAILEDASYNCRESPONSE, SL_SOCKET_TX_FAILED_EVENT},
912 {SL_OPCODE_SOCKET_SOCKETASYNCEVENT, SL_SOCKET_ASYNC_EVENT}
919 P_SL_DEV_PING_CALLBACK pPingCallBackFunc = NULL;
924 static _SlReturnVal_t _SlDrvMsgRead(
void);
926 static _SlReturnVal_t _SlDrvMsgReadCmdCtx(_u16 cmdOpcode, _u8 IsLockRequired);
927 static _SlReturnVal_t _SlDrvClassifyRxMsg(_SlOpcode_t Opcode );
928 static _SlReturnVal_t _SlDrvRxHdrRead(_u8 *pBuf);
929 static void _SlDrvAsyncEventGenericHandler(_u8 bInCmdContext);
930 static void _SlDrvRemoveFromList(_u8* ListIndex, _u8 ItemIndex);
931 static _SlReturnVal_t _SlDrvFindAndSetActiveObj(_SlOpcode_t Opcode, _u8 Sd);
932 static _SlReturnVal_t _SlDrvObjGlobalLockWaitForever(_u32 Flags);
943 _SlReturnVal_t _SlDrvDriverCBInit(
void)
947 #ifdef SL_MEMORY_MGMT_DYNAMIC
950 g_pCB = &(g_StatMem.DriverCB);
952 MALLOC_OK_CHECK(g_pCB);
954 #ifndef SL_PLATFORM_MULTI_THREADED
957 sl_Memset(&g__SlNonOsCB, 0,
sizeof(g__SlNonOsCB));
963 OSI_RET_OK_CHECK( sl_SyncObjCreate(&g_pCB->CmdSyncObj,
"CmdSyncObj") );
964 SL_DRV_SYNC_OBJ_CLEAR(&g_pCB->CmdSyncObj);
966 if (GlobalLockObj == NULL)
968 OSI_RET_OK_CHECK( sl_LockObjCreate(&GlobalLockObj,
"GlobalLockObj") );
971 #if (defined(SL_INC_INTERNAL_ERRNO) && defined(SL_PLATFORM_MULTI_THREADED))
974 OSI_RET_OK_CHECK( sl_LockObjCreate(&(g_pCB->ErrnoLockObj),
"ErrnoLockObj") );
976 OSI_RET_OK_CHECK( sl_LockObjCreate(&g_pCB->ProtectionLockObj,
"ProtectionLockObj") );
979 _SlDrvMemZero(&g_pCB->ObjPool[0], (_u16)(MAX_CONCURRENT_ACTIONS*
sizeof(
_SlPoolObj_t)));
982 g_pCB->FreePoolIdx = 0;
984 for (Idx = 0 ; Idx < MAX_CONCURRENT_ACTIONS ; Idx++)
986 g_pCB->ObjPool[Idx].NextIndex = Idx + 1;
987 g_pCB->ObjPool[Idx].AdditionalData = SL_MAX_SOCKETS;
989 OSI_RET_OK_CHECK( sl_SyncObjCreate(&g_pCB->ObjPool[Idx].SyncObj,
"SyncObj"));
990 SL_DRV_SYNC_OBJ_CLEAR(&g_pCB->ObjPool[Idx].SyncObj);
993 g_pCB->ActivePoolIdx = MAX_CONCURRENT_ACTIONS;
994 g_pCB->PendingPoolIdx = MAX_CONCURRENT_ACTIONS;
997 g_pCB->FlowContCB.TxPoolCnt = FLOW_CONT_MIN;
998 OSI_RET_OK_CHECK(sl_LockObjCreate(&g_pCB->FlowContCB.TxLockObj,
"TxLockObj"));
999 OSI_RET_OK_CHECK(sl_SyncObjCreate(&g_pCB->FlowContCB.TxSyncObj,
"TxSyncObj"));
1000 g_pCB->FlowContCB.MinTxPayloadSize = 1536;
1002 return SL_OS_RET_CODE_OK;
1008 _SlReturnVal_t _SlDrvDriverCBDeinit(
void)
1013 g_pCB->FlowContCB.TxPoolCnt = 0;
1015 SL_SET_DEVICE_STATUS(0);
1017 SL_UNSET_DEVICE_STARTED;
1019 OSI_RET_OK_CHECK(sl_LockObjDelete(&g_pCB->FlowContCB.TxLockObj));
1020 OSI_RET_OK_CHECK(sl_SyncObjDelete(&g_pCB->FlowContCB.TxSyncObj));
1022 OSI_RET_OK_CHECK( sl_SyncObjDelete(&g_pCB->CmdSyncObj) );
1024 OSI_RET_OK_CHECK( sl_LockObjDelete(&g_pCB->ProtectionLockObj) );
1027 for (Idx = 0; Idx < MAX_CONCURRENT_ACTIONS; Idx++)
1030 OSI_RET_OK_CHECK( sl_SyncObjDelete(&g_pCB->ObjPool[Idx].SyncObj) );
1033 #if (defined(SL_INC_INTERNAL_ERRNO) && defined(SL_PLATFORM_MULTI_THREADED))
1034 sl_LockObjDelete(&g_pCB->ErrnoLockObj);
1036 g_pCB->FreePoolIdx = 0;
1037 g_pCB->PendingPoolIdx = MAX_CONCURRENT_ACTIONS;
1038 g_pCB->ActivePoolIdx = MAX_CONCURRENT_ACTIONS;
1040 #ifdef SL_MEMORY_MGMT_DYNAMIC
1048 SL_UNSET_RESTART_REQUIRED;
1050 return SL_OS_RET_CODE_OK;
1056 _SlReturnVal_t _SlDrvRxIrqHandler(
void *pValue)
1064 if (TRUE == g_pCB->WaitForCmdResp)
1066 OSI_RET_OK_CHECK( sl_SyncObjSignalFromIRQ(&g_pCB->CmdSyncObj) );
1070 (void)sl_Spawn((_SlSpawnEntryFunc_t)_SlDrvMsgReadSpawnCtx, NULL, SL_SPAWN_FLAG_FROM_SL_IRQ_HANDLER);
1072 return SL_OS_RET_CODE_OK;
1078 _SlReturnVal_t _SlDrvDriverIsApiAllowed(_u16 Silo)
1080 if (!SL_IS_COMMAND_ALLOWED)
1082 if (SL_IS_DEVICE_STOP_IN_PROGRESS)
1084 return SL_RET_CODE_STOP_IN_PROGRESS;
1087 if ((SL_IS_DEVICE_LOCKED) && (SL_OPCODE_SILO_FS != Silo))
1090 return SL_RET_CODE_DEV_LOCKED;
1092 if (SL_IS_RESTART_REQUIRED)
1096 return SL_API_ABORTED;
1099 if (!SL_IS_DEVICE_STARTED)
1101 return SL_RET_CODE_DEV_NOT_STARTED;
1104 if (( SL_IS_PROVISIONING_ACTIVE || SL_IS_PROVISIONING_INITIATED_BY_USER) && !(SL_IS_PROVISIONING_API_ALLOWED))
1107 return SL_RET_CODE_PROVISIONING_IN_PROGRESS;
1112 return SL_OS_RET_CODE_OK;
1119 _SlReturnVal_t _SlDrvCmdOp(
1121 void *pTxRxDescBuff ,
1124 _SlReturnVal_t RetVal;
1125 _u8 IsLockRequired = TRUE;
1127 IsLockRequired = (SL_IS_PROVISIONING_IN_PROGRESS && (pCmdCtrl->Opcode == SL_OPCODE_DEVICE_STOP_COMMAND)) ? FALSE: TRUE;
1131 _u32 GlobalLockFlags = GLOBAL_LOCK_FLAGS_UPDATE_API_IN_PROGRESS;
1134 if (pCmdCtrl->Opcode == SL_OPCODE_WLAN_PROVISIONING_COMMAND)
1139 if (pParams->InactivityTimeoutSec == 0)
1141 GlobalLockFlags |= GLOBAL_LOCK_FLAGS_PROVISIONING_STOP_API;
1146 GlobalLockFlags |= (((_u32)pCmdCtrl->Opcode) << 16);
1147 SL_DRV_LOCK_GLOBAL_LOCK_FOREVER(GlobalLockFlags);
1153 if (SL_IS_RESTART_REQUIRED)
1157 SL_DRV_LOCK_GLOBAL_UNLOCK(TRUE);
1160 return SL_API_ABORTED;
1164 g_pCB->WaitForCmdResp = TRUE;
1166 SL_TRACE0(DBG_MSG, MSG_312,
"_SlDrvCmdOp: call _SlDrvMsgWrite");
1169 RetVal = _SlDrvMsgWrite(pCmdCtrl, pCmdExt, pTxRxDescBuff);
1171 if(SL_OS_RET_CODE_OK == RetVal)
1174 RetVal = _SlDrvMsgReadCmdCtx(pCmdCtrl->Opcode, IsLockRequired);
1175 SL_TRACE0(DBG_MSG, MSG_314,
"_SlDrvCmdOp: exited _SlDrvMsgReadCmdCtx");
1181 SL_DRV_LOCK_GLOBAL_UNLOCK(TRUE);
1194 _SlReturnVal_t _SlDrvDataReadOp(
1197 void *pTxRxDescBuff ,
1200 _SlReturnVal_t RetVal;
1201 _u8 ObjIdx = MAX_CONCURRENT_ACTIONS;
1205 VERIFY_PROTOCOL(NULL != pCmdExt->pRxPayload);
1209 VERIFY_PROTOCOL(0 != pCmdExt->RxPayloadLen);
1212 if((Sd & SL_BSD_SOCKET_ID_MASK) >= SL_MAX_SOCKETS)
1214 return SL_ERROR_BSD_EBADF;
1218 ObjIdx = (_u8)_SlDrvWaitForPoolObj(RECV_ID, Sd & SL_BSD_SOCKET_ID_MASK);
1220 if (MAX_CONCURRENT_ACTIONS == ObjIdx)
1222 return SL_POOL_IS_EMPTY;
1225 SL_DRV_PROTECTION_OBJ_LOCK_FOREVER();
1227 pArgsData.pData = pCmdExt->pRxPayload;
1228 pArgsData.pArgs = (_u8 *)pTxRxDescBuff;
1229 g_pCB->ObjPool[ObjIdx].pRespArgs = (_u8 *)&pArgsData;
1231 SL_DRV_PROTECTION_OBJ_UNLOCK();
1235 SL_DRV_OBJ_LOCK_FOREVER(&g_pCB->FlowContCB.TxLockObj);
1241 SL_DRV_SYNC_OBJ_CLEAR(&g_pCB->FlowContCB.TxSyncObj);
1243 if(g_pCB->FlowContCB.TxPoolCnt <= FLOW_CONT_MIN)
1248 SL_DRV_SYNC_OBJ_WAIT_FOREVER(&g_pCB->FlowContCB.TxSyncObj);
1252 SL_DRV_LOCK_GLOBAL_LOCK_FOREVER(GLOBAL_LOCK_FLAGS_UPDATE_API_IN_PROGRESS);
1257 if (SL_IS_RESTART_REQUIRED)
1259 SL_DRV_LOCK_GLOBAL_UNLOCK(TRUE);
1260 return SL_API_ABORTED;
1266 VERIFY_PROTOCOL(g_pCB->FlowContCB.TxPoolCnt > (FLOW_CONT_MIN - 1));
1267 g_pCB->FlowContCB.TxPoolCnt--;
1269 SL_DRV_OBJ_UNLOCK(&g_pCB->FlowContCB.TxLockObj);
1272 RetVal = _SlDrvMsgWrite(pCmdCtrl, pCmdExt, (_u8 *)pTxRxDescBuff);
1274 SL_DRV_LOCK_GLOBAL_UNLOCK(TRUE);
1276 if(SL_OS_RET_CODE_OK == RetVal)
1280 if( g_pCB->SocketNonBlocking & (1<<(Sd & SL_BSD_SOCKET_ID_MASK) ))
1282 _u16 opcodeAsyncEvent = (pCmdCtrl->Opcode == SL_OPCODE_SOCKET_RECV) ? SL_OPCODE_SOCKET_RECVASYNCRESPONSE : SL_OPCODE_SOCKET_RECVFROMASYNCRESPONSE;
1284 SL_DRV_SYNC_OBJ_WAIT_TIMEOUT(&g_pCB->ObjPool[ObjIdx].SyncObj,
1285 SL_DRIVER_TIMEOUT_SHORT,
1293 SL_DRV_SYNC_OBJ_WAIT_FOREVER(&g_pCB->ObjPool[ObjIdx].SyncObj);
1298 _SlDrvReleasePoolObj(ObjIdx);
1305 _SlReturnVal_t _SlDrvDataWriteOp(
1308 void *pTxRxDescBuff ,
1311 _SlReturnVal_t RetVal = SL_ERROR_BSD_EAGAIN;
1312 _u32 allocTxPoolPkts;
1318 SL_DRV_OBJ_LOCK_FOREVER(&g_pCB->FlowContCB.TxLockObj);
1323 SL_DRV_SYNC_OBJ_CLEAR(&g_pCB->FlowContCB.TxSyncObj);
1326 allocTxPoolPkts = 1 + (pCmdExt->TxPayload1Len-1) / g_pCB->FlowContCB.MinTxPayloadSize;
1328 if(g_pCB->SocketTXFailure & (1<<(Sd & SL_BSD_SOCKET_ID_MASK)))
1330 SL_DRV_OBJ_UNLOCK(&g_pCB->FlowContCB.TxLockObj);
1331 return SL_ERROR_BSD_SOC_ERROR;
1333 if(g_pCB->FlowContCB.TxPoolCnt <= FLOW_CONT_MIN + allocTxPoolPkts)
1337 if( g_pCB->SocketNonBlocking & (1<<(Sd & SL_BSD_SOCKET_ID_MASK) ))
1339 SL_DRV_OBJ_UNLOCK(&g_pCB->FlowContCB.TxLockObj);
1345 SL_DRV_SYNC_OBJ_WAIT_FOREVER(&g_pCB->FlowContCB.TxSyncObj);
1347 if(g_pCB->FlowContCB.TxPoolCnt > FLOW_CONT_MIN + allocTxPoolPkts )
1353 SL_DRV_OBJ_UNLOCK(&g_pCB->FlowContCB.TxLockObj);
1357 SL_DRV_LOCK_GLOBAL_LOCK_FOREVER(GLOBAL_LOCK_FLAGS_UPDATE_API_IN_PROGRESS);
1362 if (SL_IS_RESTART_REQUIRED)
1364 SL_DRV_LOCK_GLOBAL_UNLOCK(TRUE);
1365 return SL_API_ABORTED;
1371 VERIFY_PROTOCOL(g_pCB->FlowContCB.TxPoolCnt > (FLOW_CONT_MIN + allocTxPoolPkts -1) );
1372 g_pCB->FlowContCB.TxPoolCnt -= (_u8)allocTxPoolPkts;
1374 SL_DRV_OBJ_UNLOCK(&g_pCB->FlowContCB.TxLockObj);
1377 RetVal = _SlDrvMsgWrite(pCmdCtrl, pCmdExt, pTxRxDescBuff);
1379 SL_DRV_LOCK_GLOBAL_UNLOCK(TRUE);
1389 _u8 sendRxPayload = FALSE;
1390 VERIFY_PROTOCOL(NULL != pCmdCtrl);
1392 g_pCB->FunctionParams.pCmdCtrl = pCmdCtrl;
1393 g_pCB->FunctionParams.pTxRxDescBuff = pTxRxDescBuff;
1394 g_pCB->FunctionParams.pCmdExt = pCmdExt;
1396 g_pCB->TempProtocolHeader.Opcode = pCmdCtrl->Opcode;
1397 g_pCB->TempProtocolHeader.Len = (_u16)(_SL_PROTOCOL_CALC_LEN(pCmdCtrl, pCmdExt));
1399 if (pCmdExt && pCmdExt->RxPayloadLen < 0 )
1401 pCmdExt->RxPayloadLen = pCmdExt->RxPayloadLen * (-1);
1402 sendRxPayload = TRUE;
1403 g_pCB->TempProtocolHeader.Len = g_pCB->TempProtocolHeader.Len + pCmdExt->RxPayloadLen;
1406 #ifdef SL_START_WRITE_STAT
1407 sl_IfStartWriteSequence(g_pCB->FD);
1410 #ifdef SL_IF_TYPE_UART
1412 NWP_IF_WRITE_CHECK(g_pCB->FD, (_u8 *)&g_H2NSyncPattern.Long, 2*SYNC_PATTERN_LEN);
1415 NWP_IF_WRITE_CHECK(g_pCB->FD, (_u8 *)&g_H2NSyncPattern.Short, SYNC_PATTERN_LEN);
1419 NWP_IF_WRITE_CHECK(g_pCB->FD, (_u8 *)&g_pCB->TempProtocolHeader, _SL_CMD_HDR_SIZE);
1422 if (pTxRxDescBuff && pCmdCtrl->TxDescLen > 0)
1424 NWP_IF_WRITE_CHECK(g_pCB->FD, pTxRxDescBuff,
1425 _SL_PROTOCOL_ALIGN_SIZE(pCmdCtrl->TxDescLen));
1431 if (sendRxPayload == TRUE )
1433 NWP_IF_WRITE_CHECK(g_pCB->FD, pCmdExt->pRxPayload,
1434 _SL_PROTOCOL_ALIGN_SIZE(pCmdExt->RxPayloadLen));
1443 VERIFY_PROTOCOL(_SL_IS_PROTOCOL_ALIGNED_SIZE(pCmdCtrl->TxDescLen));
1446 if ((pCmdExt->TxPayload1Len > 0) && (pCmdExt->TxPayload2Len > 0))
1448 _u8 BuffInTheMiddle[4];
1449 _u8 FirstPayloadReminder = 0;
1450 _u8 SecondPayloadOffset = 0;
1452 FirstPayloadReminder = pCmdExt->TxPayload1Len & 3;
1455 pCmdExt->TxPayload1Len -= FirstPayloadReminder;
1458 NWP_IF_WRITE_CHECK(g_pCB->FD, pCmdExt->pTxPayload1, pCmdExt->TxPayload1Len);
1461 if (FirstPayloadReminder != 0)
1464 SecondPayloadOffset = 4 - FirstPayloadReminder;
1467 sl_Memcpy(&BuffInTheMiddle[0], pCmdExt->pTxPayload1 + pCmdExt->TxPayload1Len, FirstPayloadReminder);
1470 sl_Memcpy(&BuffInTheMiddle[FirstPayloadReminder], pCmdExt->pTxPayload2, SecondPayloadOffset);
1473 NWP_IF_WRITE_CHECK(g_pCB->FD, &BuffInTheMiddle[0], 4);
1478 if (pCmdExt->TxPayload2Len > SecondPayloadOffset)
1481 NWP_IF_WRITE_CHECK(g_pCB->FD,
1482 pCmdExt->pTxPayload2 + SecondPayloadOffset,
1483 _SL_PROTOCOL_ALIGN_SIZE(pCmdExt->TxPayload2Len - SecondPayloadOffset));
1487 else if (pCmdExt->TxPayload1Len > 0)
1490 NWP_IF_WRITE_CHECK(g_pCB->FD, pCmdExt->pTxPayload1,
1491 _SL_PROTOCOL_ALIGN_SIZE(pCmdExt->TxPayload1Len));
1493 else if (pCmdExt->TxPayload2Len > 0)
1496 NWP_IF_WRITE_CHECK(g_pCB->FD, pCmdExt->pTxPayload2,
1497 _SL_PROTOCOL_ALIGN_SIZE(pCmdExt->TxPayload2Len));
1502 _SL_DBG_CNT_INC(MsgCnt.Write);
1504 #ifdef SL_START_WRITE_STAT
1505 sl_IfEndWriteSequence(g_pCB->FD);
1508 return SL_OS_RET_CODE_OK;
1514 _SlReturnVal_t _SlDrvMsgRead(
void)
1519 _u8 TempBuf[_SL_RESP_HDR_SIZE];
1524 _u16 AlignedLengthRecv;
1525 _u8 *pAsyncBuf = NULL;
1527 _u16 RespPayloadLen;
1528 _u8 sd = SL_MAX_SOCKETS;
1529 _SlRxMsgClass_e RxMsgClass;
1532 g_pCB->FunctionParams.AsyncExt.pAsyncBuf = NULL;
1533 g_pCB->FunctionParams.AsyncExt.AsyncEvtHandler= NULL;
1538 VERIFY_RET_OK(_SlDrvRxHdrRead((_u8*)(uBuf.TempBuf)));
1540 if (_SlDrvRxHdrRead((_u8*)(uBuf.TempBuf)) == SL_API_ABORTED)
1542 SL_DRV_LOCK_GLOBAL_UNLOCK(TRUE);
1544 _SlDrvHandleFatalError(SL_DEVICE_EVENT_FATAL_SYNC_LOSS, 0, 0);
1545 return SL_API_ABORTED;
1548 OpCode = OPCODE(uBuf.TempBuf);
1549 RespPayloadLen = (_u16)(RSP_PAYLOAD_LEN(uBuf.TempBuf));
1555 g_pCB->FlowContCB.MinTxPayloadSize = ((
_SlResponseHeader_t *)uBuf.TempBuf)->MinMaxPayload;
1559 if(g_pCB->FlowContCB.TxPoolCnt > FLOW_CONT_MIN)
1561 SL_DRV_SYNC_OBJ_SIGNAL(&g_pCB->FlowContCB.TxSyncObj);
1567 _SlDrvClassifyRxMsg(OpCode);
1569 RxMsgClass = g_pCB->FunctionParams.AsyncExt.RxMsgClass;
1574 case ASYNC_EVT_CLASS:
1576 VERIFY_PROTOCOL(NULL == pAsyncBuf);
1578 #ifdef SL_MEMORY_MGMT_DYNAMIC
1579 g_pCB->FunctionParams.AsyncExt.pAsyncBuf = (_u8*)sl_Malloc(SL_ASYNC_MAX_MSG_LEN);
1581 g_pCB->FunctionParams.AsyncExt.pAsyncBuf = g_StatMem.AsyncRespBuf;
1584 pAsyncBuf = g_pCB->FunctionParams.AsyncExt.pAsyncBuf;
1586 MALLOC_OK_CHECK(pAsyncBuf);
1589 _SlDrvMemZero(pAsyncBuf, (_u16)SL_ASYNC_MAX_MSG_LEN);
1592 sl_Memcpy(pAsyncBuf, uBuf.TempBuf, _SL_RESP_HDR_SIZE);
1593 if (_SL_PROTOCOL_ALIGN_SIZE(RespPayloadLen) <= SL_ASYNC_MAX_PAYLOAD_LEN)
1595 AlignedLengthRecv = (_u16)_SL_PROTOCOL_ALIGN_SIZE(RespPayloadLen);
1599 AlignedLengthRecv = (_u16)_SL_PROTOCOL_ALIGN_SIZE(SL_ASYNC_MAX_PAYLOAD_LEN);
1603 if (RespPayloadLen > 0)
1605 NWP_IF_READ_CHECK(g_pCB->FD,
1606 pAsyncBuf + _SL_RESP_HDR_SIZE,
1610 if ((_SL_PROTOCOL_ALIGN_SIZE(RespPayloadLen) > SL_ASYNC_MAX_PAYLOAD_LEN))
1612 AlignedLengthRecv = (_u16)(_SL_PROTOCOL_ALIGN_SIZE(RespPayloadLen) - SL_ASYNC_MAX_PAYLOAD_LEN);
1613 while (AlignedLengthRecv > 0)
1615 NWP_IF_READ_CHECK(g_pCB->FD,TailBuffer,4);
1616 AlignedLengthRecv = AlignedLengthRecv - 4;
1620 SL_DRV_PROTECTION_OBJ_LOCK_FOREVER();
1624 (SL_OPCODE_SOCKET_ACCEPTASYNCRESPONSE == OpCode) ||
1625 (SL_OPCODE_SOCKET_ACCEPTASYNCRESPONSE_V6 == OpCode) ||
1627 (SL_OPCODE_SOCKET_CONNECTASYNCRESPONSE == OpCode) ||
1628 (SL_OPCODE_SOCKET_SOCKETCLOSEASYNCEVENT == OpCode)
1632 sd = ((((
SlSocketResponse_t *)(pAsyncBuf + _SL_RESP_HDR_SIZE))->Sd) & SL_BSD_SOCKET_ID_MASK);
1635 (void)_SlDrvFindAndSetActiveObj(OpCode, sd);
1637 SL_DRV_PROTECTION_OBJ_UNLOCK();
1640 case RECV_RESP_CLASS:
1646 case SL_OPCODE_SOCKET_RECVFROMASYNCRESPONSE:
1647 ExpArgSize = (_u8)RECVFROM_IPV4_ARGS_SIZE;
1650 case SL_OPCODE_SOCKET_RECVFROMASYNCRESPONSE_V6:
1651 ExpArgSize = (_u8)RECVFROM_IPV6_ARGS_SIZE;
1656 ExpArgSize = (_u8)RECV_ARGS_SIZE;
1661 NWP_IF_READ_CHECK(g_pCB->FD, &uBuf.TempBuf[4], RECV_ARGS_SIZE);
1664 VERIFY_PROTOCOL((SD(&uBuf.TempBuf[4])& SL_BSD_SOCKET_ID_MASK) < SL_MAX_SOCKETS);
1666 SL_DRV_PROTECTION_OBJ_LOCK_FOREVER();
1669 VERIFY_RET_OK(_SlDrvFindAndSetActiveObj(OpCode,SD(&uBuf.TempBuf[4]) & SL_BSD_SOCKET_ID_MASK));
1672 VERIFY_SOCKET_CB(NULL != ((
_SlArgsData_t *)(g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pData))->pArgs);
1674 sl_Memcpy( ((
_SlArgsData_t *)(g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs))->pArgs, &uBuf.TempBuf[4], RECV_ARGS_SIZE);
1676 if(ExpArgSize > (_u8)RECV_ARGS_SIZE)
1678 NWP_IF_READ_CHECK(g_pCB->FD,
1679 ((
_SlArgsData_t *)(g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs))->pArgs + RECV_ARGS_SIZE,
1680 ExpArgSize - RECV_ARGS_SIZE);
1686 if(ACT_DATA_SIZE(&uBuf.TempBuf[4]) > 0)
1688 VERIFY_SOCKET_CB(NULL != ((
_SlArgsData_t *)(g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs))->pData);
1694 LengthToCopy = (_u16)(ACT_DATA_SIZE(&uBuf.TempBuf[4]) & (3));
1695 AlignedLengthRecv = (_u16)(ACT_DATA_SIZE(&uBuf.TempBuf[4]) & (~3));
1696 if( AlignedLengthRecv >= 4)
1698 NWP_IF_READ_CHECK(g_pCB->FD,((
_SlArgsData_t *)(g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs))->pData,AlignedLengthRecv );
1701 if( LengthToCopy > 0)
1703 NWP_IF_READ_CHECK(g_pCB->FD,TailBuffer,4);
1705 sl_Memcpy(((
_SlArgsData_t *)(g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs))->pData + AlignedLengthRecv,TailBuffer,LengthToCopy);
1708 SL_DRV_SYNC_OBJ_SIGNAL(&g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].SyncObj);
1709 SL_DRV_PROTECTION_OBJ_UNLOCK();
1713 case CMD_RESP_CLASS:
1721 NWP_IF_READ_CHECK(g_pCB->FD,
1722 g_pCB->FunctionParams.pTxRxDescBuff,
1723 _SL_PROTOCOL_ALIGN_SIZE(g_pCB->FunctionParams.pCmdCtrl->RxDescLen));
1725 if((NULL != g_pCB->FunctionParams.pCmdExt) && (0 != g_pCB->FunctionParams.pCmdExt->RxPayloadLen))
1728 _i16 ActDataSize = (_i16)(RSP_PAYLOAD_LEN(uBuf.TempBuf) - g_pCB->FunctionParams.pCmdCtrl->RxDescLen);
1730 g_pCB->FunctionParams.pCmdExt->ActualRxPayloadLen = ActDataSize;
1733 if(ActDataSize <= 0)
1735 g_pCB->FunctionParams.pCmdExt->RxPayloadLen = 0;
1740 if (ActDataSize > g_pCB->FunctionParams.pCmdExt->RxPayloadLen)
1742 LengthToCopy = (_u16)(g_pCB->FunctionParams.pCmdExt->RxPayloadLen & (3));
1743 AlignedLengthRecv = (_u16)(g_pCB->FunctionParams.pCmdExt->RxPayloadLen & (~3));
1747 LengthToCopy = (_u16)(ActDataSize & (3));
1748 AlignedLengthRecv = (_u16)(ActDataSize & (~3));
1755 if( AlignedLengthRecv >= 4)
1757 NWP_IF_READ_CHECK(g_pCB->FD,
1758 g_pCB->FunctionParams.pCmdExt->pRxPayload,
1759 AlignedLengthRecv );
1763 if( LengthToCopy > 0)
1765 NWP_IF_READ_CHECK(g_pCB->FD,TailBuffer,4);
1767 sl_Memcpy(g_pCB->FunctionParams.pCmdExt->pRxPayload + AlignedLengthRecv,
1770 ActDataSize = ActDataSize-4;
1773 if (ActDataSize > g_pCB->FunctionParams.pCmdExt->RxPayloadLen)
1776 AlignedLengthRecv = (_u16)( (ActDataSize + 3 - g_pCB->FunctionParams.pCmdExt->RxPayloadLen) & (~3) );
1777 while( AlignedLengthRecv > 0)
1779 NWP_IF_READ_CHECK(g_pCB->FD,TailBuffer, 4 );
1780 AlignedLengthRecv = AlignedLengthRecv - 4;
1792 _SL_DBG_CNT_INC(MsgCnt.Read);
1795 sl_IfUnMaskIntHdlr();
1797 return SL_OS_RET_CODE_OK;
1804 static void _SlDrvAsyncEventGenericHandler(_u8 bInCmdContext)
1806 _u32 SlAsyncEvent = 0;
1807 _u8 OpcodeFound = FALSE;
1810 _u32* pEventLocation = NULL;
1815 if (g_pCB->FunctionParams.AsyncExt.AsyncEvtHandler == NULL)
1822 if ( (( SL_IS_PROVISIONING_ACTIVE || SL_IS_PROVISIONING_INITIATED_BY_USER) && !(SL_IS_PROVISIONING_API_ALLOWED)) &&
1823 (pHdr->GenHeader.Opcode != SL_OPCODE_WLAN_PROVISIONING_STATUS_ASYNC_EVENT) &&
1824 (pHdr->GenHeader.Opcode != SL_OPCODE_DEVICE_RESET_REQUEST_ASYNC_EVENT) &&
1825 (pHdr->GenHeader.Opcode != SL_OPCODE_DEVICE_INITCOMPLETE) &&
1826 (pHdr->GenHeader.Opcode != SL_OPCODE_WLAN_PROVISIONING_PROFILE_ADDED_ASYNC_RESPONSE) &&
1827 (pHdr->GenHeader.Opcode != SL_OPCODE_NETAPP_REQUEST) )
1833 for (i=0; i< (_u8)(
sizeof(OpcodeTranslateTable) /
sizeof(OpcodeKeyVal_t)); i++)
1835 if (OpcodeTranslateTable[i].opcode == pHdr->GenHeader.Opcode)
1837 SlAsyncEvent = OpcodeTranslateTable[i].event;
1844 if (OpcodeFound == FALSE)
1846 if ((pHdr->GenHeader.Opcode & SL_OPCODE_SILO_MASK) == SL_OPCODE_SILO_DEVICE)
1850 deviceEvent.pAsyncMsgBuff = g_pCB->FunctionParams.AsyncExt.pAsyncBuf;
1851 deviceEvent.bInCmdContext = bInCmdContext;
1853 g_pCB->FunctionParams.AsyncExt.AsyncEvtHandler(&deviceEvent);
1859 g_pCB->FunctionParams.AsyncExt.AsyncEvtHandler(g_pCB->FunctionParams.AsyncExt.pAsyncBuf);
1865 pEventLocation = (_u32*)(g_pCB->FunctionParams.AsyncExt.pAsyncBuf + sizeof (
_SlResponseHeader_t) -
sizeof(SlAsyncEvent) );
1868 *pEventLocation = SlAsyncEvent;
1872 g_pCB->FunctionParams.AsyncExt.AsyncEvtHandler(pEventLocation);
1882 static _SlReturnVal_t _SlDrvMsgReadCmdCtx(_u16 cmdOpcode, _u8 IsLockRequired)
1885 _u32 CmdCmpltTimeout;
1890 if ((cmdOpcode == SL_OPCODE_NVMEM_FILEOPEN) || (cmdOpcode == SL_OPCODE_NVMEM_NVMEMFSPROGRAMMINGCOMMAND))
1892 CmdCmpltTimeout = ((_u32)SL_DRIVER_TIMEOUT_LONG * 10);
1897 CmdCmpltTimeout = (SL_OPCODE_SILO_FS & cmdOpcode)? (_u32)(SL_DRIVER_TIMEOUT_LONG) : (_u32)SL_DRIVER_TIMEOUT_SHORT;
1908 while (TRUE == g_pCB->WaitForCmdResp)
1910 if(_SL_PENDING_RX_MSG(g_pCB))
1913 VERIFY_RET_OK(_SlDrvMsgRead());
1915 RetVal = _SlDrvMsgRead();
1917 if (RetVal != SL_OS_RET_CODE_OK)
1919 g_pCB->WaitForCmdResp = FALSE;
1921 if ((IsLockRequired) && (RetVal != SL_API_ABORTED))
1923 SL_DRV_LOCK_GLOBAL_UNLOCK(TRUE);
1926 return SL_API_ABORTED;
1931 if (CMD_RESP_CLASS == g_pCB->FunctionParams.AsyncExt.RxMsgClass)
1933 g_pCB->WaitForCmdResp = FALSE;
1937 SL_DRV_SYNC_OBJ_CLEAR(&g_pCB->CmdSyncObj);
1939 else if (ASYNC_EVT_CLASS == g_pCB->FunctionParams.AsyncExt.RxMsgClass)
1947 _SlDrvAsyncEventGenericHandler(TRUE);
1950 #ifdef SL_MEMORY_MGMT_DYNAMIC
1951 sl_Free(g_pCB->FunctionParams.AsyncExt.pAsyncBuf);
1953 g_pCB->FunctionParams.AsyncExt.pAsyncBuf = NULL;
1961 _SlDrvSyncObjWaitForever(&g_pCB->CmdSyncObj);
1964 RetVal = sl_SyncObjWait(&g_pCB->CmdSyncObj, CmdCmpltTimeout);
1967 g_pCB->WaitForCmdResp = FALSE;
1971 SL_DRV_LOCK_GLOBAL_UNLOCK(TRUE);
1975 if (SL_IS_DEVICE_STARTED)
1977 _SlDrvHandleFatalError(SL_DEVICE_EVENT_FATAL_NO_CMD_ACK, cmdOpcode, (_u32)CmdCmpltTimeout);
1980 return SL_API_ABORTED;
1993 SL_DRV_LOCK_GLOBAL_UNLOCK(TRUE);
1996 if(_SL_PENDING_RX_MSG(g_pCB))
1998 (void)sl_Spawn((_SlSpawnEntryFunc_t)_SlDrvMsgReadSpawnCtx, NULL, 0);
2001 return SL_OS_RET_CODE_OK;
2007 _SlReturnVal_t _SlDrvMsgReadSpawnCtx(
void *pValue)
2009 _SlReturnVal_t RetVal;
2011 #ifdef SL_POLLING_MODE_USED
2012 _i16 retCode = OSI_OK;
2017 if (GlobalLockObj != NULL)
2019 retCode = sl_LockObjLock(&GlobalLockObj, 0);
2021 if ( OSI_OK != retCode )
2023 if (TRUE == g_pCB->WaitForCmdResp)
2025 SL_DRV_SYNC_OBJ_SIGNAL(&g_pCB->CmdSyncObj);
2026 return SL_RET_CODE_OK;
2033 while (OSI_OK != retCode);
2036 SL_DRV_LOCK_GLOBAL_LOCK_FOREVER(GLOBAL_LOCK_FLAGS_NONE);
2044 if(FALSE == (_SL_PENDING_RX_MSG(g_pCB)))
2046 SL_DRV_LOCK_GLOBAL_UNLOCK(FALSE);
2048 return SL_RET_CODE_OK;
2052 VERIFY_RET_OK(_SlDrvMsgRead());
2054 RetVal = _SlDrvMsgRead();
2056 if (RetVal != SL_OS_RET_CODE_OK)
2058 if (RetVal != SL_API_ABORTED)
2060 SL_DRV_LOCK_GLOBAL_UNLOCK(FALSE);
2063 return SL_API_ABORTED;
2069 switch(g_pCB->FunctionParams.AsyncExt.RxMsgClass)
2071 case ASYNC_EVT_CLASS:
2074 VERIFY_PROTOCOL(NULL != g_pCB->FunctionParams.AsyncExt.pAsyncBuf);
2076 _SlDrvAsyncEventGenericHandler(FALSE);
2078 #ifdef SL_MEMORY_MGMT_DYNAMIC
2079 sl_Free(g_pCB->FunctionParams.AsyncExt.pAsyncBuf);
2081 g_pCB->FunctionParams.AsyncExt.pAsyncBuf = NULL;
2084 case DUMMY_MSG_CLASS:
2085 case RECV_RESP_CLASS:
2088 case CMD_RESP_CLASS:
2095 SL_DRV_LOCK_GLOBAL_UNLOCK(FALSE);
2097 return(SL_RET_CODE_OK);
2116 static const _SlSpawnEntryFunc_t RxMsgClassLUT[] = {
2117 (_SlSpawnEntryFunc_t)_SlDeviceEventHandler,
2119 (_SlSpawnEntryFunc_t)_SlDrvHandleWlanEvents,
2124 (_SlSpawnEntryFunc_t)_SlDrvHandleSockEvents,
2129 (_SlSpawnEntryFunc_t)_SlDrvHandleNetAppEvents,
2135 (_SlSpawnEntryFunc_t)_SlNetUtilHandleAsync_Cmd,
2143 static _SlReturnVal_t _SlDrvClassifyRxMsg(
2146 _SlSpawnEntryFunc_t AsyncEvtHandler = NULL;
2147 _SlRxMsgClass_e RxMsgClass = CMD_RESP_CLASS;
2151 if (0 == (SL_OPCODE_SYNC & Opcode))
2154 if (SL_OPCODE_DEVICE_DEVICEASYNCDUMMY == Opcode)
2156 RxMsgClass = DUMMY_MSG_CLASS;
2158 else if ( (SL_OPCODE_SOCKET_RECVASYNCRESPONSE == Opcode) || (SL_OPCODE_SOCKET_RECVFROMASYNCRESPONSE == Opcode)
2160 || (SL_OPCODE_SOCKET_RECVFROMASYNCRESPONSE_V6 == Opcode)
2164 RxMsgClass = RECV_RESP_CLASS;
2169 RxMsgClass = ASYNC_EVT_CLASS;
2173 Silo = (_u8)((Opcode >> SL_OPCODE_SILO_OFFSET) & 0x7);
2175 VERIFY_PROTOCOL(Silo < (_u8)(
sizeof(RxMsgClassLUT)/
sizeof(_SlSpawnEntryFunc_t)));
2180 AsyncEvtHandler = RxMsgClassLUT[Silo];
2182 if ((SL_OPCODE_NETAPP_HTTPGETTOKENVALUE == Opcode) || (SL_OPCODE_NETAPP_HTTPPOSTTOKENVALUE == Opcode) ||
2183 (SL_OPCODE_NETAPP_REQUEST == Opcode) || (SL_OPCODE_NETAPP_RESPONSE == Opcode) || (SL_OPCODE_NETAPP_SEND == Opcode))
2185 AsyncEvtHandler = _SlNetAppEventHandler;
2188 else if (SL_OPCODE_NETAPP_PINGREPORTREQUESTRESPONSE == Opcode)
2190 AsyncEvtHandler = (_SlSpawnEntryFunc_t)_SlNetAppHandleAsync_PingResponse;
2196 g_pCB->FunctionParams.AsyncExt.RxMsgClass = RxMsgClass;
2197 g_pCB->FunctionParams.AsyncExt.AsyncEvtHandler = AsyncEvtHandler;
2199 return SL_RET_CODE_OK;
2206 static _SlReturnVal_t _SlDrvRxHdrRead(_u8 *pBuf)
2209 _u8 TimeoutState = TIMEOUT_STATE_INIT_VAL;
2210 _u8 SearchSync = TRUE;
2212 #if (!defined (SL_TINY)) && (defined(slcb_GetTimestamp))
2216 #ifndef SL_IF_TYPE_UART
2218 NWP_IF_WRITE_CHECK(g_pCB->FD, (_u8 *)&g_H2NCnysPattern.Short, SYNC_PATTERN_LEN);
2221 #if (!defined (SL_TINY)) && (defined(slcb_GetTimestamp))
2222 _SlDrvStartMeasureTimeout(&TimeoutInfo, SYNC_PATTERN_TIMEOUT_IN_MSEC);
2226 NWP_IF_READ_CHECK(g_pCB->FD, &pBuf[0], 8);
2229 while ( *(_u32 *)&pBuf[0] == *(_u32 *)&pBuf[4])
2231 NWP_IF_READ_CHECK(g_pCB->FD, &pBuf[4], 4);
2232 #if (!defined (SL_TINY)) && (defined(slcb_GetTimestamp))
2233 if (_SlDrvIsTimeoutExpired(&TimeoutInfo))
2235 return SL_API_ABORTED;
2241 while (SearchSync && TimeoutState)
2244 for (ShiftIdx =0; ShiftIdx <=4 ; ShiftIdx++)
2247 sl_Memcpy(&SyncPattern[0], &pBuf[ShiftIdx], 4);
2250 if (N2H_SYNC_PATTERN_MATCH(&SyncPattern[0], g_pCB->TxSeqNum))
2253 sl_Memcpy(&pBuf[0], &pBuf[ShiftIdx + SYNC_PATTERN_LEN], 4);
2258 NWP_IF_READ_CHECK(g_pCB->FD, &pBuf[SYNC_PATTERN_LEN - ShiftIdx], ShiftIdx);
2268 if (SearchSync == TRUE)
2271 *(_u32 *)&pBuf[0] = *(_u32 *)&pBuf[4];
2274 NWP_IF_READ_CHECK(g_pCB->FD, &pBuf[4], 4);
2278 #if (defined (slcb_GetTimestamp)) && (!defined (SL_TINY))
2282 if (TIMEOUT_ONE_MORE_SHOT == TimeoutState)
2284 TimeoutState = TIMEOUT_STATE_EXPIRY;
2290 if (_SlDrvIsTimeoutExpired(&TimeoutInfo))
2292 TimeoutState = TIMEOUT_ONE_MORE_SHOT;
2298 #if (defined (slcb_GetTimestamp)) && (!defined (SL_TINY))
2299 if (TIMEOUT_STATE_EXPIRY == TimeoutState)
2301 return SL_API_ABORTED;
2308 while ( N2H_SYNC_PATTERN_MATCH(pBuf, g_pCB->TxSeqNum) )
2310 _SL_DBG_CNT_INC(Work.DoubleSyncPattern);
2311 NWP_IF_READ_CHECK(g_pCB->FD, &pBuf[0], SYNC_PATTERN_LEN);
2317 NWP_IF_READ_CHECK(g_pCB->FD, &pBuf[SYNC_PATTERN_LEN], _SL_RESP_SPEC_HDR_SIZE);
2319 return SL_RET_CODE_OK;
2332 _i16 _SlDrvBasicCmd(_SlOpcode_t Opcode)
2334 _SlBasicCmdMsg_u Msg;
2337 _SlDrvMemZero(&Msg, (_u16)
sizeof(_SlBasicCmdMsg_u));
2338 CmdCtrl.Opcode = Opcode;
2339 CmdCtrl.TxDescLen = 0;
2343 VERIFY_RET_OK(_SlDrvCmdOp((
_SlCmdCtrl_t *)&CmdCtrl, &Msg, NULL));
2345 return (_i16)Msg.Rsp.status;
2355 _SlReturnVal_t _SlDrvCmdSend_noLock(
2357 void *pTxRxDescBuff ,
2360 _SlReturnVal_t RetVal;
2361 _u8 WaitForCmdRespOriginalVal;
2366 WaitForCmdRespOriginalVal = g_pCB->WaitForCmdResp;
2371 g_pCB->WaitForCmdResp = FALSE;
2373 SL_TRACE0(DBG_MSG, MSG_312,
"_SlDrvCmdSend_noLock: call _SlDrvMsgWrite");
2376 RetVal = _SlDrvMsgWrite(pCmdCtrl, pCmdExt, pTxRxDescBuff);
2379 g_pCB->WaitForCmdResp = WaitForCmdRespOriginalVal;
2392 _SlReturnVal_t _SlDrvCmdSend(
2394 void *pTxRxDescBuff ,
2397 _SlReturnVal_t RetVal;
2399 _SlDrvObjLockWaitForever(&GlobalLockObj);
2401 g_pCB->WaitForCmdResp = FALSE;
2403 SL_TRACE0(DBG_MSG, MSG_312,
"_SlDrvCmdSend: call _SlDrvMsgWrite");
2406 RetVal = _SlDrvMsgWrite(pCmdCtrl, pCmdExt, pTxRxDescBuff);
2408 _SlDrvObjUnLock(&GlobalLockObj);
2418 _u8 _SlDrvWaitForPoolObj(_u8 ActionID, _u8 SocketID)
2420 _u8 CurrObjIndex = MAX_CONCURRENT_ACTIONS;
2423 SL_DRV_PROTECTION_OBJ_LOCK_FOREVER();
2425 if (MAX_CONCURRENT_ACTIONS > g_pCB->FreePoolIdx)
2428 CurrObjIndex = g_pCB->FreePoolIdx;
2431 if (MAX_CONCURRENT_ACTIONS > g_pCB->ObjPool[CurrObjIndex].NextIndex)
2433 g_pCB->FreePoolIdx = g_pCB->ObjPool[CurrObjIndex].NextIndex;
2439 g_pCB->FreePoolIdx = MAX_CONCURRENT_ACTIONS;
2444 SL_DRV_PROTECTION_OBJ_UNLOCK();
2445 return CurrObjIndex;
2447 g_pCB->ObjPool[CurrObjIndex].ActionID = (_u8)ActionID;
2448 if (SL_MAX_SOCKETS > SocketID)
2450 g_pCB->ObjPool[CurrObjIndex].AdditionalData = SocketID;
2455 while ( ( (SL_MAX_SOCKETS > SocketID) && (g_pCB->ActiveActionsBitmap & (1<<SocketID)) ) ||
2456 ( (g_pCB->ActiveActionsBitmap & (1<<ActionID)) && (SL_MAX_SOCKETS == SocketID) ) )
2459 g_pCB->ObjPool[CurrObjIndex].NextIndex = g_pCB->PendingPoolIdx;
2460 g_pCB->PendingPoolIdx = CurrObjIndex;
2461 SL_DRV_PROTECTION_OBJ_UNLOCK();
2464 (void)_SlDrvSyncObjWaitForever(&g_pCB->ObjPool[CurrObjIndex].SyncObj);
2467 SL_DRV_PROTECTION_OBJ_LOCK_FOREVER();
2471 if (SL_MAX_SOCKETS > SocketID)
2473 g_pCB->ActiveActionsBitmap |= (1<<SocketID);
2477 g_pCB->ActiveActionsBitmap |= (1<<ActionID);
2480 g_pCB->ObjPool[CurrObjIndex].NextIndex = g_pCB->ActivePoolIdx;
2481 g_pCB->ActivePoolIdx = CurrObjIndex;
2484 SL_DRV_PROTECTION_OBJ_UNLOCK();
2489 _SlDrvUpdateApiInProgress(API_IN_PROGRESS_UPDATE_INCREMENT);
2491 return CurrObjIndex;
2497 void _SlDrvReleasePoolObj(_u8 ObjIdx)
2503 SL_DRV_PROTECTION_OBJ_LOCK_FOREVER();
2508 PendingIndex = g_pCB->PendingPoolIdx;
2510 while(MAX_CONCURRENT_ACTIONS > PendingIndex)
2513 if ( (g_pCB->ObjPool[PendingIndex].ActionID == g_pCB->ObjPool[ObjIdx].ActionID) &&
2514 ( (SL_MAX_SOCKETS == (g_pCB->ObjPool[PendingIndex].AdditionalData & SL_BSD_SOCKET_ID_MASK)) ||
2515 ((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) ))) )
2518 _SlDrvRemoveFromList(&g_pCB->PendingPoolIdx, PendingIndex);
2519 SL_DRV_SYNC_OBJ_SIGNAL(&g_pCB->ObjPool[PendingIndex].SyncObj);
2522 PendingIndex = g_pCB->ObjPool[PendingIndex].NextIndex;
2526 if (SL_MAX_SOCKETS > (g_pCB->ObjPool[ObjIdx].AdditionalData & SL_BSD_SOCKET_ID_MASK))
2529 g_pCB->ActiveActionsBitmap &= ~(1<<(g_pCB->ObjPool[ObjIdx].AdditionalData & SL_BSD_SOCKET_ID_MASK));
2534 g_pCB->ActiveActionsBitmap &= ~(1<<g_pCB->ObjPool[ObjIdx].ActionID);
2538 g_pCB->ObjPool[ObjIdx].pRespArgs = NULL;
2539 g_pCB->ObjPool[ObjIdx].ActionID = 0;
2540 g_pCB->ObjPool[ObjIdx].AdditionalData = SL_MAX_SOCKETS;
2543 _SlDrvRemoveFromList(&g_pCB->ActivePoolIdx, ObjIdx);
2546 g_pCB->ObjPool[ObjIdx].NextIndex = g_pCB->FreePoolIdx;
2547 g_pCB->FreePoolIdx = ObjIdx;
2549 SL_DRV_PROTECTION_OBJ_UNLOCK();
2554 _SlDrvUpdateApiInProgress(API_IN_PROGRESS_UPDATE_DECREMENT);
2562 static void _SlDrvRemoveFromList(_u8 *ListIndex, _u8 ItemIndex)
2568 if (MAX_CONCURRENT_ACTIONS == g_pCB->ObjPool[*ListIndex].NextIndex)
2570 *ListIndex = MAX_CONCURRENT_ACTIONS;
2575 else if (*ListIndex == ItemIndex)
2577 *ListIndex = g_pCB->ObjPool[ItemIndex].NextIndex;
2583 while(MAX_CONCURRENT_ACTIONS > Idx)
2586 if (g_pCB->ObjPool[Idx].NextIndex == ItemIndex)
2588 g_pCB->ObjPool[Idx].NextIndex = g_pCB->ObjPool[ItemIndex].NextIndex;
2592 Idx = g_pCB->ObjPool[Idx].NextIndex;
2602 static _SlReturnVal_t _SlDrvFindAndSetActiveObj(_SlOpcode_t Opcode, _u8 Sd)
2606 ActiveIndex = g_pCB->ActivePoolIdx;
2609 while (MAX_CONCURRENT_ACTIONS > ActiveIndex)
2612 if (MAX_CONCURRENT_ACTIONS > ActiveIndex)
2616 if (g_pCB->ObjPool[ActiveIndex].AdditionalData & SL_NETAPP_FAMILY_MASK)
2618 Opcode &= ~SL_OPCODE_IPV6;
2621 if ((g_pCB->ObjPool[ActiveIndex].ActionID == RECV_ID) && (Sd == g_pCB->ObjPool[ActiveIndex].AdditionalData) &&
2622 ( (SL_OPCODE_SOCKET_RECVASYNCRESPONSE == Opcode) || (SL_OPCODE_SOCKET_RECVFROMASYNCRESPONSE == Opcode)
2624 || (SL_OPCODE_SOCKET_RECVFROMASYNCRESPONSE_V6 == Opcode)
2630 g_pCB->FunctionParams.AsyncExt.ActionIndex = ActiveIndex;
2631 return SL_RET_CODE_OK;
2634 if ( (_SlActionLookupTable[ g_pCB->ObjPool[ActiveIndex].ActionID - MAX_SOCKET_ENUM_IDX].ActionAsyncOpcode == Opcode) &&
2635 ( ((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)) ) )
2638 g_pCB->FunctionParams.AsyncExt.AsyncEvtHandler = _SlActionLookupTable[ g_pCB->ObjPool[ActiveIndex].ActionID - MAX_SOCKET_ENUM_IDX].AsyncEventHandler;
2639 g_pCB->FunctionParams.AsyncExt.ActionIndex = ActiveIndex;
2640 return SL_RET_CODE_OK;
2642 ActiveIndex = g_pCB->ObjPool[ActiveIndex].NextIndex;
2645 return SL_RET_CODE_SELF_ERROR;
2649 #if defined(slcb_NetAppHttpServerHdlr) || defined(EXT_LIB_REGISTERED_HTTP_SERVER_EVENTS)
2652 _SlDrvHandleHttpServerEvents (slHttpServerEvent, slHttpServerResponse);
2656 #if defined(slcb_NetAppRequestHdlr) || defined(EXT_LIB_REGISTERED_NETAPP_REQUEST_EVENTS)
2657 void _SlDrvDispatchNetAppRequestEvents(SlNetAppRequest_t *slNetAppRequestEvent,
SlNetAppResponse_t *slNetAppResponse)
2659 _SlDrvHandleNetAppRequestEvents (slNetAppRequestEvent, slNetAppResponse);
2665 _SlReturnVal_t _SlDrvSyncObjSignal(_SlSyncObj_t *pSyncObj)
2667 OSI_RET_OK_CHECK(sl_SyncObjSignal(pSyncObj));
2668 return SL_OS_RET_CODE_OK;
2671 _SlReturnVal_t _SlDrvObjLockWaitForever(_SlLockObj_t *pLockObj)
2674 OSI_RET_OK_CHECK(sl_LockObjLock(pLockObj, SL_OS_WAIT_FOREVER));
2675 return SL_OS_RET_CODE_OK;
2678 _SlReturnVal_t _SlDrvProtectionObjLockWaitForever(
void)
2680 OSI_RET_OK_CHECK(sl_LockObjLock(&g_pCB->ProtectionLockObj, SL_OS_WAIT_FOREVER));
2682 return SL_OS_RET_CODE_OK;
2685 _SlReturnVal_t _SlDrvObjUnLock(_SlLockObj_t *pLockObj)
2687 OSI_RET_OK_CHECK(sl_LockObjUnlock(pLockObj));
2689 return SL_OS_RET_CODE_OK;
2692 _SlReturnVal_t _SlDrvProtectionObjUnLock(
void)
2694 OSI_RET_OK_CHECK(sl_LockObjUnlock(&g_pCB->ProtectionLockObj));
2695 return SL_OS_RET_CODE_OK;
2698 static _SlReturnVal_t _SlDrvObjGlobalLockWaitForever(_u32 Flags)
2703 _u8 UpdateApiInProgress = (Flags & GLOBAL_LOCK_FLAGS_UPDATE_API_IN_PROGRESS);
2704 _u16 IsProvStopApi = (Flags & GLOBAL_LOCK_FLAGS_PROVISIONING_STOP_API);
2707 if (SL_IS_RESTART_REQUIRED)
2709 return SL_API_ABORTED;
2713 gGlobalLockCntRequested++;
2715 ret = sl_LockObjLock(&GlobalLockObj, SL_OS_WAIT_FOREVER);
2719 if (SL_IS_DEVICE_START_IN_PROGRESS || SL_IS_DEVICE_STOP_IN_PROGRESS || SL_IS_PROVISIONING_IN_PROGRESS)
2728 Opcode = (Flags >> 16);
2729 Silo = Opcode & ((0xF << SL_OPCODE_SILO_OFFSET));
2732 if (Opcode != SL_OPCODE_DEVICE_STOP_COMMAND)
2734 _i16 Status = _SlDrvDriverIsApiAllowed(Silo);
2738 sl_LockObjUnlock(&GlobalLockObj);
2745 if ((0 == ret) && (UpdateApiInProgress))
2747 if (!SL_IS_PROVISIONING_ACTIVE || SL_IS_PROVISIONING_API_ALLOWED)
2750 _SlDrvUpdateApiInProgress(API_IN_PROGRESS_UPDATE_INCREMENT);
2753 else if (FALSE == IsProvStopApi )
2757 SL_DRV_LOCK_GLOBAL_UNLOCK(TRUE);
2758 return SL_RET_CODE_PROVISIONING_IN_PROGRESS;
2764 _SlReturnVal_t _SlDrvGlobalObjUnLock(_u8 bDecrementApiInProgress)
2766 gGlobalLockCntReleased++;
2768 OSI_RET_OK_CHECK(sl_LockObjUnlock(&GlobalLockObj));
2770 if (bDecrementApiInProgress)
2772 _SlDrvUpdateApiInProgress(API_IN_PROGRESS_UPDATE_DECREMENT);
2775 return SL_OS_RET_CODE_OK;
2778 void _SlDrvMemZero(
void* Addr, _u16 size)
2780 sl_Memset(Addr, 0, size);
2786 _SlDrvMemZero(pCmdExt, (_u16)
sizeof (
_SlCmdExt_t));
2792 _SlReturnVal_t _SlDrvSyncObjWaitForever(_SlSyncObj_t *pSyncObj)
2794 return sl_SyncObjWait(pSyncObj, SL_OS_WAIT_FOREVER);
2798 _SlReturnVal_t _SlDrvSyncObjWaitForever(_SlSyncObj_t *pSyncObj)
2800 _SlReturnVal_t RetVal = sl_SyncObjWait(pSyncObj, SL_OS_WAIT_FOREVER);
2805 if (SL_IS_RESTART_REQUIRED)
2807 return SL_API_ABORTED;
2816 #if (!defined (SL_TINY)) && (defined(slcb_GetTimestamp))
2822 pTimeoutInfo->Total10MSecUnits = TimeoutInMsec / 10;
2832 if (pTimeoutInfo->TSCurr >= pTimeoutInfo->TSPrev)
2834 pTimeoutInfo->DeltaTicks = pTimeoutInfo->TSCurr - pTimeoutInfo->TSPrev;
2838 pTimeoutInfo->DeltaTicks = (SL_TIMESTAMP_MAX_VALUE - pTimeoutInfo->TSPrev) + pTimeoutInfo->TSCurr;
2841 TSCount = pTimeoutInfo->DeltaTicksReminder + pTimeoutInfo->DeltaTicks;
2844 if (TSCount > SL_TIMESTAMP_TICKS_IN_10_MILLISECONDS)
2846 pTimeoutInfo->Total10MSecUnits -= (TSCount / SL_TIMESTAMP_TICKS_IN_10_MILLISECONDS);
2847 pTimeoutInfo->DeltaTicksReminder = TSCount % SL_TIMESTAMP_TICKS_IN_10_MILLISECONDS;
2849 if (pTimeoutInfo->Total10MSecUnits > 0)
2851 pTimeoutInfo->TSPrev = pTimeoutInfo->TSCurr;
2864 void _SlDrvHandleFatalError(_u32 errorId, _u32 info1, _u32 info2)
2869 _SlDrvMemZero(&FatalEvent,
sizeof(FatalEvent));
2871 if (SL_IS_RESTART_REQUIRED)
2877 SL_SET_RESTART_REQUIRED;
2881 (void)sl_LockObjDelete(&GlobalLockObj);
2884 GlobalLockObj = NULL;
2887 for (i=0; i< MAX_CONCURRENT_ACTIONS; i++)
2889 SL_DRV_SYNC_OBJ_SIGNAL(&g_pCB->ObjPool[i].SyncObj);
2893 FatalEvent.Id = errorId;
2897 case SL_DEVICE_EVENT_FATAL_DEVICE_ABORT:
2900 FatalEvent.Data.DeviceAssert.Code = info1;
2903 FatalEvent.Data.DeviceAssert.Value = info2;
2907 case SL_DEVICE_EVENT_FATAL_NO_CMD_ACK:
2910 FatalEvent.Data.NoCmdAck.Code = info1;
2914 case SL_DEVICE_EVENT_FATAL_CMD_TIMEOUT:
2917 FatalEvent.Data.CmdTimeout.Code = info1;
2921 case SL_DEVICE_EVENT_FATAL_SYNC_LOSS:
2922 case SL_DEVICE_EVENT_FATAL_DRIVER_ABORT:
2928 #if defined(slcb_DeviceFatalErrorEvtHdlr) || defined (EXT_LIB_REGISTERED_FATAL_ERROR_EVENTS)
2930 _SlDrvHandleFatalErrorEvents(&FatalEvent);
2934 _SlReturnVal_t _SlDrvSyncObjWaitTimeout(_SlSyncObj_t *pSyncObj, _u32 timeoutVal, _u32 asyncEventOpcode)
2936 _SlReturnVal_t ret = sl_SyncObjWait(pSyncObj, timeoutVal);
2941 _SlDrvHandleFatalError(SL_DEVICE_EVENT_FATAL_CMD_TIMEOUT, asyncEventOpcode, timeoutVal);
2942 return SL_API_ABORTED;
2944 else if (SL_IS_RESTART_REQUIRED)
2946 return SL_API_ABORTED;
2949 return SL_RET_CODE_OK;
2953 static void _SlDrvUpdateApiInProgress(_i8 Value)
2955 SL_DRV_PROTECTION_OBJ_LOCK_FOREVER();
2957 g_pCB->ApiInProgressCnt += Value;
2959 SL_DRV_PROTECTION_OBJ_UNLOCK();
2962 _i8 _SlDrvIsApiInProgress(
void)
2966 return (g_pCB->ApiInProgressCnt > 0);
2974 #ifdef slcb_GetTimestamp
2976 void _SlDrvSleep(_u16 DurationInMsec)
2980 _SlDrvStartMeasureTimeout(&TimeoutInfo, DurationInMsec);
2982 while(!_SlDrvIsTimeoutExpired(&TimeoutInfo));
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.