20 #include <ti/drivers/net/wifi/simplelink.h>
21 #include <ti/drivers/net/wifi/source/protocol.h>
22 #include <ti/drivers/net/wifi/source/driver.h>
24 #if (defined (SL_PLATFORM_MULTI_THREADED)) && (!defined (SL_PLATFORM_EXTERNAL_SPAWN))
26 #define _SL_MAX_INTERNAL_SPAWN_ENTRIES 10
28 typedef struct _SlInternalSpawnEntry_t
30 _SlSpawnEntryFunc_t pEntry;
32 struct _SlInternalSpawnEntry_t* pNext;
33 }_SlInternalSpawnEntry_t;
37 _SlInternalSpawnEntry_t SpawnEntries[_SL_MAX_INTERNAL_SPAWN_ENTRIES];
38 _SlInternalSpawnEntry_t* pFree;
39 _SlInternalSpawnEntry_t* pWaitForExe;
40 _SlInternalSpawnEntry_t* pLastInWaitList;
46 }_SlInternalSpawnCB_t;
48 _SlInternalSpawnCB_t g_SlInternalSpawnCB;
52 void* _SlInternalSpawnTaskEntry()
55 _SlInternalSpawnEntry_t* pEntry;
60 sl_LockObjCreate(&g_SlInternalSpawnCB.LockObj,
"SlSpawnProtect");
61 sl_LockObjLock(&g_SlInternalSpawnCB.LockObj,SL_OS_NO_WAIT);
64 sl_SyncObjCreate(&g_SlInternalSpawnCB.SyncObj,
"SlSpawnSync");
65 sl_SyncObjWait(&g_SlInternalSpawnCB.SyncObj,SL_OS_NO_WAIT);
67 g_SlInternalSpawnCB.pFree = &g_SlInternalSpawnCB.SpawnEntries[0];
68 g_SlInternalSpawnCB.pWaitForExe = NULL;
69 g_SlInternalSpawnCB.pLastInWaitList = NULL;
72 for (i=0 ; i<_SL_MAX_INTERNAL_SPAWN_ENTRIES - 1 ; i++)
74 g_SlInternalSpawnCB.SpawnEntries[i].pNext = &g_SlInternalSpawnCB.SpawnEntries[i+1];
75 g_SlInternalSpawnCB.SpawnEntries[i].pEntry = NULL;
77 g_SlInternalSpawnCB.SpawnEntries[i].pNext = NULL;
79 g_SlInternalSpawnCB.IrqWriteCnt =0;
80 g_SlInternalSpawnCB.IrqReadCnt = 0;
81 g_SlInternalSpawnCB.pIrqFuncValue = NULL;
83 SL_DRV_OBJ_UNLOCK(&g_SlInternalSpawnCB.LockObj);
89 sl_SyncObjWait(&g_SlInternalSpawnCB.SyncObj,SL_OS_WAIT_FOREVER);
92 while (g_SlInternalSpawnCB.IrqWriteCnt != g_SlInternalSpawnCB.IrqReadCnt)
95 _SlDrvMsgReadSpawnCtx(g_SlInternalSpawnCB.pIrqFuncValue);
96 g_SlInternalSpawnCB.IrqReadCnt++;
105 SL_DRV_OBJ_LOCK_FOREVER(&g_SlInternalSpawnCB.LockObj);
107 pEntry = g_SlInternalSpawnCB.pWaitForExe;
108 if ( NULL == pEntry )
110 SL_DRV_OBJ_UNLOCK(&g_SlInternalSpawnCB.LockObj);
115 g_SlInternalSpawnCB.pWaitForExe = pEntry->pNext;
116 if (pEntry == g_SlInternalSpawnCB.pLastInWaitList)
118 g_SlInternalSpawnCB.pLastInWaitList = NULL;
122 SL_DRV_OBJ_UNLOCK(&g_SlInternalSpawnCB.LockObj);
128 pEntry->pEntry(pEntry->pValue);
131 SL_DRV_OBJ_LOCK_FOREVER(&g_SlInternalSpawnCB.LockObj);
133 pEntry->pNext = g_SlInternalSpawnCB.pFree;
134 g_SlInternalSpawnCB.pFree = pEntry;
137 if (NULL != g_SlInternalSpawnCB.pWaitForExe)
143 SL_DRV_OBJ_UNLOCK(&g_SlInternalSpawnCB.LockObj);
152 _i16 _SlInternalSpawn(_SlSpawnEntryFunc_t pEntry ,
void* pValue , _u32 flags)
155 _SlInternalSpawnEntry_t* pSpawnEntry;
160 if (flags & SL_SPAWN_FLAG_FROM_SL_IRQ_HANDLER)
162 g_SlInternalSpawnCB.IrqWriteCnt++;
163 g_SlInternalSpawnCB.pIrqFuncValue = pValue;
164 SL_DRV_SYNC_OBJ_SIGNAL(&g_SlInternalSpawnCB.SyncObj);
169 if (NULL == pEntry || (g_SlInternalSpawnCB.pFree == NULL))
175 SL_DRV_OBJ_LOCK_FOREVER(&g_SlInternalSpawnCB.LockObj);
177 pSpawnEntry = g_SlInternalSpawnCB.pFree;
178 g_SlInternalSpawnCB.pFree = pSpawnEntry->pNext;
180 pSpawnEntry->pEntry = pEntry;
181 pSpawnEntry->pValue = pValue;
182 pSpawnEntry->pNext = NULL;
184 if (NULL == g_SlInternalSpawnCB.pWaitForExe)
186 g_SlInternalSpawnCB.pWaitForExe = pSpawnEntry;
187 g_SlInternalSpawnCB.pLastInWaitList = pSpawnEntry;
191 g_SlInternalSpawnCB.pLastInWaitList->pNext = pSpawnEntry;
192 g_SlInternalSpawnCB.pLastInWaitList = pSpawnEntry;
195 SL_DRV_OBJ_UNLOCK(&g_SlInternalSpawnCB.LockObj);
198 SL_DRV_SYNC_OBJ_SIGNAL(&g_SlInternalSpawnCB.SyncObj);