diff options
| author | Daiqian Hu <[email protected]> | 2016-11-21 08:54:24 +0800 |
|---|---|---|
| committer | Daiqian Hu <[email protected]> | 2016-11-21 08:54:24 +0800 |
| commit | a95eaad088f61aa55da9d73015cf1ed86e64a67e (patch) | |
| tree | 15b498a08a4aee4b7f8b1627d39c965b3aa3ba98 /network/wlan/WDI/COMMON/pool.c | |
| parent | 1aa0338ec5418345ea0c383e92b4fa19f7c98425 (diff) | |
Re-submit for WDI sample driver to GitHub
Submit WDI sample driver to GitHub for RS1.
Diffstat (limited to 'network/wlan/WDI/COMMON/pool.c')
| -rw-r--r-- | network/wlan/WDI/COMMON/pool.c | 191 |
1 files changed, 191 insertions, 0 deletions
diff --git a/network/wlan/WDI/COMMON/pool.c b/network/wlan/WDI/COMMON/pool.c new file mode 100644 index 00000000..3eab9574 --- /dev/null +++ b/network/wlan/WDI/COMMON/pool.c @@ -0,0 +1,191 @@ +#include "Mp_Precomp.h" + +#include "pool.h" + +//----------------------------------------------------------------------------- +// Local +//----------------------------------------------------------------------------- + +// Signature +static const char *pool_sig = "RT_POOL"; + +static +BOOLEAN +pool_OnBoundary( + IN const POOL *pool, + IN const VOID *entry + ) +{ + BOOLEAN bOnBoundary = FALSE; + + do + { + if(pool->end <= (u1Byte *)entry) + break; + + if((u1Byte *)entry < pool->start) + break; + + if(((u1Byte *)entry - pool->start) % pool->entrySize) + break; + + bOnBoundary = TRUE; + + }while(FALSE); + + if(!bOnBoundary) + { + RT_TRACE_F(pool->dbgComp, DBG_WARNING, ("invalid entry: 0x%p\n", entry)); + } + + return bOnBoundary; +} + +static +VOID +pool_DumpListEntry( + IN const POOL *pool, + IN const RT_LIST_ENTRY *pEntry + ) +{ + RT_TRACE_F(pool->dbgComp, pool->dbgLevel, ("---\n")); + RT_TRACE_F(pool->dbgComp, pool->dbgLevel, ("entry: %p\n", pEntry)); + RT_TRACE_F(pool->dbgComp, pool->dbgLevel, (" flink: %p\n", pEntry->Flink)); + RT_TRACE_F(pool->dbgComp, pool->dbgLevel, (" blink: %p\n", pEntry->Blink)); +} + +static +VOID +pool_DumpFreeList( + IN const POOL *pool + ) +{ + RT_LIST_ENTRY *pEntry = NULL; + + RT_TRACE_F(pool->dbgComp, pool->dbgLevel, ("Head:\n")); + pool_DumpListEntry(pool, &pool->freeList); + + for(pEntry = RTGetHeadList(&pool->freeList); + pEntry != &pool->freeList; + pEntry = RTNextEntryList(pEntry) + ) + { + pool_DumpListEntry(pool, pEntry); + } +} + +//----------------------------------------------------------------------------- +// Exported +//----------------------------------------------------------------------------- + +VOID +Pool_Init( + IN POOL *pool, + IN char *name, + IN u4Byte buflen, + IN VOID *buf, + IN u4Byte entrySize, + IN u8Byte dbgComp, + IN u4Byte dbgLevel + ) +{ + const u1Byte *pos = (u1Byte *)buf, *end = (u1Byte *)buf + buflen; + + RT_ASSERT(sizeof(RT_LIST_ENTRY) < entrySize, ("Invalid size: %u\n", entrySize)); + + pool->sig = pool_sig; + pool->name = name; + pool->start = pos; + pool->end = end; + pool->entrySize = entrySize; + + RTInitializeListHead(&pool->freeList); + pool->freeCount = 0; + + while(pos + entrySize <= end) + { + RTInsertTailListWithCnt(&pool->freeList, (RT_LIST_ENTRY *)pos, &pool->freeCount); + pos += entrySize; + pool->cap++; + } + + pool->cap = pool->freeCount; + pool->lowMark = pool->freeCount; + + pool->dbgComp = dbgComp; + pool->dbgLevel = dbgLevel; + + RT_TRACE_F(pool->dbgComp, pool->dbgLevel, ("name: %s, cap: %u\n", pool->name, pool->cap)); + + return; +} + +VOID * +Pool_Acquire( + IN POOL *pool + ) +{ + VOID *entry = NULL; + + RT_ASSERT(pool, ("%s(): pool is NULL!!!\n", __FUNCTION__)); + RT_ASSERT(pool_sig == pool->sig, ("%s(): invalid pool\n", __FUNCTION__)); + + if(RTIsListEmpty(&pool->freeList)) return NULL; + + entry = (VOID *)RTRemoveHeadListWithCnt(&pool->freeList, &pool->freeCount); + + if(pool->freeCount < pool->lowMark) + { + pool->lowMark = pool->freeCount; + RT_TRACE_F(pool->dbgComp, pool->dbgLevel, ("%s: lowMark: %u, cap: %u\n", pool->name, pool->freeCount, pool->cap)); + } + + return entry; +} + +VOID +Pool_Release( + IN POOL *pool, + IN VOID *entry + ) +{ + RT_ASSERT(pool, ("%s(): pool is NULL!!!\n", __FUNCTION__)); + RT_ASSERT(pool_sig == pool->sig, ("%s(): invalid pool\n", __FUNCTION__)); + + RT_ASSERT(entry < (VOID *)pool->end, ("%s(): entry (%p) beyond end (%p)\n", __FUNCTION__, entry, pool->end)); + RT_ASSERT((VOID *)pool->start <= entry, ("%s(): entry (%p) below start (%p)\n", __FUNCTION__, entry, pool->start)); + + if(pool_OnBoundary(pool, entry)) + { + RTInsertTailListWithCnt(&pool->freeList, (RT_LIST_ENTRY *)entry, &pool->freeCount); + } + else + { + Pool_Dump(pool); + } + + return; +} + +VOID +Pool_Dump( + IN const POOL *pool + ) +{ + RT_ASSERT(pool, ("%s(): pool is NULL!!!\n", __FUNCTION__)); + RT_ASSERT(pool_sig == pool->sig, ("%s(): invalid pool\n", __FUNCTION__)); + + RT_TRACE_F(pool->dbgComp, pool->dbgLevel, ("---\n")); + RT_TRACE_F(pool->dbgComp, pool->dbgLevel, ("name: %s\n", pool->name)); + RT_TRACE_F(pool->dbgComp, pool->dbgLevel, ("start addr: %p\n", pool->start)); + RT_TRACE_F(pool->dbgComp, pool->dbgLevel, ("end addr: %p\n", pool->end)); + RT_TRACE_F(pool->dbgComp, pool->dbgLevel, ("free count: %u\n", pool->freeCount)); + RT_TRACE_F(pool->dbgComp, pool->dbgLevel, ("capacity: %u\n", pool->cap)); + RT_TRACE_F(pool->dbgComp, pool->dbgLevel, ("low mark: %u\n", pool->lowMark)); + + RT_TRACE_F(pool->dbgComp, pool->dbgLevel, ("Free list:\n")); + //pool_DumpFreeList(pool); + + return; +} + |
