1a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/* 2a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * queue.c 3a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * 43bb9a92880f8cda8c242707ad02077f13b009632Dmitry Shmidt * Copyright(c) 1998 - 2010 Texas Instruments. All rights reserved. 5a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * All rights reserved. 6a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * 7a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * Redistribution and use in source and binary forms, with or without 8a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * modification, are permitted provided that the following conditions 9a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * are met: 10a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * 11a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * * Redistributions of source code must retain the above copyright 12a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * notice, this list of conditions and the following disclaimer. 13a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * * Redistributions in binary form must reproduce the above copyright 14a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * notice, this list of conditions and the following disclaimer in 15a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * the documentation and/or other materials provided with the 16a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * distribution. 17a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * * Neither the name Texas Instruments nor the names of its 18a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * contributors may be used to endorse or promote products derived 19a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * from this software without specific prior written permission. 20a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * 21a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 22a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 23a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 24a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 25a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 26a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 27a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 28a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 29a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 30a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 31a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */ 33a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 34a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 35a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 36a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/** \file queue.c 37a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \brief This module provides generic queueing services, including enqueue, dequeue 38a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * and requeue of any object that contains TQueNodeHdr in its structure. 39a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * 40a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \see queue.h 41a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */ 42a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 43a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 44a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 45a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt#define __FILE_ID__ FILE_ID_130 46a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt#include "report.h" 47a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt#include "queue.h" 48a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 49a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 50a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/* Queue structure */ 51a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidttypedef struct 52a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{ 53a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TQueNodeHdr tHead; /* The queue first node */ 54a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TI_UINT32 uCount; /* Current number of nodes in queue */ 55a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TI_UINT32 uLimit; /* Upper limit of nodes in queue */ 56a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TI_UINT32 uMaxCount; /* Maximum uCount value (for debug) */ 57a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TI_UINT32 uOverflow; /* Number of overflow occurences - couldn't insert node (for debug) */ 58a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TI_UINT32 uNodeHeaderOffset; /* Offset of NodeHeader field from the entry of the queued item */ 59a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TI_HANDLE hOs; 60a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TI_HANDLE hReport; 61a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt} TQueue; 62a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 63a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 64a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 65a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/* 66a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * INTERNAL FUNCTIONS 67a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * =============================== 68a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */ 69a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 70a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 71a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/* 72a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * InsertNode(): Insert new node between pPrev and pNext 73a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */ 74a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtstatic INLINE void InsertNode( TQueNodeHdr *pNode, TQueNodeHdr *pPrev, TQueNodeHdr *pNext) 75a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{ 76a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pNext->pPrev = pNode; 77a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pNode->pNext = pNext; 78a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pNode->pPrev = pPrev; 79a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pPrev->pNext = pNode; 80a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt} 81a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 82a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/* 83a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * RemoveNode(): Remove node from between pPrev and pNext 84a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */ 85a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtstatic INLINE void RemoveNode( TQueNodeHdr *pPrev, TQueNodeHdr *pNext) 86a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{ 87a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pNext->pPrev = pPrev; 88a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pPrev->pNext = pNext; 89a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt} 90a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 91a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/* 92a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * AddToHead(): Add node to queue head (last in queue) 93a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */ 94a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtstatic INLINE void AddToHead( TQueNodeHdr *pNode, TQueNodeHdr *pListHead) 95a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{ 96a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt InsertNode (pNode, pListHead, pListHead->pNext); 97a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt} 98a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 99a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/* 100a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * AddToTail(): Add node to queue tail (first in queue) 101a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */ 102a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtstatic INLINE void AddToTail( TQueNodeHdr *pNode, TQueNodeHdr *pListHead) 103a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{ 104a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt InsertNode( pNode, pListHead->pPrev, pListHead ); 105a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt} 106a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 107a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/* 108a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * DelFromTail(): Delete node from queue tail (first in queue) 109a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */ 110a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtstatic INLINE void DelFromTail (TQueNodeHdr *pNode) 111a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{ 112a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt RemoveNode (pNode->pPrev, pNode->pNext); 113a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt} 114a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 115a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 116a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 117a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/* 118a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * EXTERNAL FUNCTIONS 119a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * =============================== 120a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */ 121a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 122a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 123a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/** 124a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \fn que_Create 125a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \brief Create a queue. 126a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * 127a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * Allocate and init a queue object. 128a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * 129a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \note 130a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param hOs - Handle to Os Abstraction Layer 131a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param hReport - Handle to report module 132a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param uLimit - Maximum items to store in queue 133a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param uNodeHeaderOffset - Offset of NodeHeader field from the entry of the queued item. 134a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \return Handle to the allocated queue 135a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \sa que_Destroy 136a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */ 137a615fb1650af6e111053506f1b764b28a5b4631dDmitry ShmidtTI_HANDLE que_Create (TI_HANDLE hOs, TI_HANDLE hReport, TI_UINT32 uLimit, TI_UINT32 uNodeHeaderOffset) 138a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{ 139a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TQueue *pQue; 140a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 141a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* allocate queue module */ 142a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pQue = os_memoryAlloc (hOs, sizeof(TQueue)); 143a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 144a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt if (!pQue) 145a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 146a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt WLAN_OS_REPORT (("Error allocating the Queue Module\n")); 147a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt return NULL; 148a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 149a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 150a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt os_memoryZero (hOs, pQue, sizeof(TQueue)); 151a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 152a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* Intialize the queue header */ 153a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pQue->tHead.pNext = pQue->tHead.pPrev = &pQue->tHead; 154a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 155a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* Set the Queue parameters */ 156a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pQue->hOs = hOs; 157a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pQue->hReport = hReport; 158a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pQue->uLimit = uLimit; 159a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pQue->uNodeHeaderOffset = uNodeHeaderOffset; 160a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 161a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt return (TI_HANDLE)pQue; 162a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt} 163a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 164a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 165a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/** 166a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \fn que_Destroy 167a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \brief Destroy the queue. 168a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * 169a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * Free the queue memory. 170a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * 171a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \note The queue's owner should first free the queued items! 172a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param hQue - The queue object 173a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \return TI_OK on success or TI_NOK on failure 174a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \sa que_Create 175a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */ 176a615fb1650af6e111053506f1b764b28a5b4631dDmitry ShmidtTI_STATUS que_Destroy (TI_HANDLE hQue) 177a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{ 178a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TQueue *pQue = (TQueue *)hQue; 179a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 180005bbf20350954d05c8a111d3f487d6fddb049bbDmitry Shmidt if (pQue) 181005bbf20350954d05c8a111d3f487d6fddb049bbDmitry Shmidt { 182005bbf20350954d05c8a111d3f487d6fddb049bbDmitry Shmidt /* Alert if the queue is unloaded before it was cleared from items */ 183005bbf20350954d05c8a111d3f487d6fddb049bbDmitry Shmidt if (pQue->uCount) 184005bbf20350954d05c8a111d3f487d6fddb049bbDmitry Shmidt { 185005bbf20350954d05c8a111d3f487d6fddb049bbDmitry Shmidt TRACE0(pQue->hReport, REPORT_SEVERITY_WARNING, "que_Destroy() Queue Not Empty!!"); 186005bbf20350954d05c8a111d3f487d6fddb049bbDmitry Shmidt } 187005bbf20350954d05c8a111d3f487d6fddb049bbDmitry Shmidt /* free Queue object */ 188005bbf20350954d05c8a111d3f487d6fddb049bbDmitry Shmidt os_memoryFree (pQue->hOs, pQue, sizeof(TQueue)); 189a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 190a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 191a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt return TI_OK; 192a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt} 193a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 194a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 195a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/** 196a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \fn que_Init 197a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \brief Init required handles 198a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * 199a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * Init required handles. 200a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * 201a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \note 202a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param hQue - The queue object 203a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param hOs - Handle to Os Abstraction Layer 204a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param hReport - Handle to report module 205a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \return TI_OK on success or TI_NOK on failure 206a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \sa 207a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */ 208a615fb1650af6e111053506f1b764b28a5b4631dDmitry ShmidtTI_STATUS que_Init (TI_HANDLE hQue, TI_HANDLE hOs, TI_HANDLE hReport) 209a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{ 210a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TQueue *pQue = (TQueue *)hQue; 211a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 212a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pQue->hOs = hOs; 213a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pQue->hReport = hReport; 214a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 215a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt return TI_OK; 216a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt} 217a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 218a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 219a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/** 220a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \fn que_Enqueue 221a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \brief Enqueue an item 222a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * 223a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * Enqueue an item at the queue's head (last in queue). 224a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * 225a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \note 226a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param hQue - The queue object 227a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param hItem - Handle to queued item 228a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \return TI_OK if item was queued, or TI_NOK if not queued due to overflow 229a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \sa que_Dequeue, que_Requeue 230a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */ 231a615fb1650af6e111053506f1b764b28a5b4631dDmitry ShmidtTI_STATUS que_Enqueue (TI_HANDLE hQue, TI_HANDLE hItem) 232a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{ 233a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TQueue *pQue = (TQueue *)hQue; 234a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TQueNodeHdr *pQueNodeHdr; /* the Node-Header in the given item */ 235a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 236005bbf20350954d05c8a111d3f487d6fddb049bbDmitry Shmidt if (pQue) 237a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 238005bbf20350954d05c8a111d3f487d6fddb049bbDmitry Shmidt /* Check queue limit */ 239005bbf20350954d05c8a111d3f487d6fddb049bbDmitry Shmidt if(pQue->uCount < pQue->uLimit) 240ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt { 241005bbf20350954d05c8a111d3f487d6fddb049bbDmitry Shmidt /* Find NodeHeader in the given item */ 242005bbf20350954d05c8a111d3f487d6fddb049bbDmitry Shmidt pQueNodeHdr = (TQueNodeHdr *)((TI_UINT8*)hItem + pQue->uNodeHeaderOffset); 243005bbf20350954d05c8a111d3f487d6fddb049bbDmitry Shmidt 244005bbf20350954d05c8a111d3f487d6fddb049bbDmitry Shmidt /* Verify that pNext is NULL --> Sanity check that this item is not already linked to a queue */ 245005bbf20350954d05c8a111d3f487d6fddb049bbDmitry Shmidt if (pQueNodeHdr->pNext) 246005bbf20350954d05c8a111d3f487d6fddb049bbDmitry Shmidt { 247005bbf20350954d05c8a111d3f487d6fddb049bbDmitry Shmidt /* Not an error since we have a case where a timer may expire twice in a row (in TxDataQueue) */ 248005bbf20350954d05c8a111d3f487d6fddb049bbDmitry Shmidt TRACE0(pQue->hReport, REPORT_SEVERITY_WARNING, "que_Enqueue(): Trying to enqueue an item that is already enqueued!!"); 249005bbf20350954d05c8a111d3f487d6fddb049bbDmitry Shmidt return TI_NOK; 250005bbf20350954d05c8a111d3f487d6fddb049bbDmitry Shmidt } 251005bbf20350954d05c8a111d3f487d6fddb049bbDmitry Shmidt 252005bbf20350954d05c8a111d3f487d6fddb049bbDmitry Shmidt /* Enqueue item and increment items counter */ 253005bbf20350954d05c8a111d3f487d6fddb049bbDmitry Shmidt AddToHead (pQueNodeHdr, &pQue->tHead); 254005bbf20350954d05c8a111d3f487d6fddb049bbDmitry Shmidt pQue->uCount++; 255005bbf20350954d05c8a111d3f487d6fddb049bbDmitry Shmidt 256005bbf20350954d05c8a111d3f487d6fddb049bbDmitry Shmidt#ifdef TI_DBG 257005bbf20350954d05c8a111d3f487d6fddb049bbDmitry Shmidt if (pQue->uCount > pQue->uMaxCount) 258005bbf20350954d05c8a111d3f487d6fddb049bbDmitry Shmidt { 259005bbf20350954d05c8a111d3f487d6fddb049bbDmitry Shmidt pQue->uMaxCount = pQue->uCount; 260005bbf20350954d05c8a111d3f487d6fddb049bbDmitry Shmidt } 261005bbf20350954d05c8a111d3f487d6fddb049bbDmitry Shmidt TRACE0(pQue->hReport, REPORT_SEVERITY_INFORMATION , "que_Enqueue(): Enqueued Successfully\n"); 262005bbf20350954d05c8a111d3f487d6fddb049bbDmitry Shmidt#endif 263005bbf20350954d05c8a111d3f487d6fddb049bbDmitry Shmidt 264005bbf20350954d05c8a111d3f487d6fddb049bbDmitry Shmidt return TI_OK; 265ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt } 266a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 267005bbf20350954d05c8a111d3f487d6fddb049bbDmitry Shmidt /* 268005bbf20350954d05c8a111d3f487d6fddb049bbDmitry Shmidt * Queue is overflowed, return TI_NOK. 269005bbf20350954d05c8a111d3f487d6fddb049bbDmitry Shmidt */ 270a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt#ifdef TI_DBG 271005bbf20350954d05c8a111d3f487d6fddb049bbDmitry Shmidt pQue->uOverflow++; 272005bbf20350954d05c8a111d3f487d6fddb049bbDmitry Shmidt TRACE0(pQue->hReport, REPORT_SEVERITY_WARNING , "que_Enqueue(): Queue Overflow\n"); 273a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt#endif 274005bbf20350954d05c8a111d3f487d6fddb049bbDmitry Shmidt } 275a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt return TI_NOK; 276a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt} 277a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 278a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 279a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/** 280a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \fn que_Dequeue 281a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \brief Dequeue an item 282a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * 283a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * Dequeue an item from the queue's tail (first in queue). 284a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * 285a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \note 286a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param hQue - The queue object 287a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \return pointer to dequeued item or NULL if queue is empty 288a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \sa que_Enqueue, que_Requeue 289a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */ 290a615fb1650af6e111053506f1b764b28a5b4631dDmitry ShmidtTI_HANDLE que_Dequeue (TI_HANDLE hQue) 291a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{ 292a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TQueue *pQue = (TQueue *)hQue; 293a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TI_HANDLE hItem; 294005bbf20350954d05c8a111d3f487d6fddb049bbDmitry Shmidt 295005bbf20350954d05c8a111d3f487d6fddb049bbDmitry Shmidt if (pQue) 296a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 297005bbf20350954d05c8a111d3f487d6fddb049bbDmitry Shmidt if (pQue->uCount) 298005bbf20350954d05c8a111d3f487d6fddb049bbDmitry Shmidt { 299005bbf20350954d05c8a111d3f487d6fddb049bbDmitry Shmidt /* Queue is not empty, take packet from the queue tail */ 300005bbf20350954d05c8a111d3f487d6fddb049bbDmitry Shmidt 301005bbf20350954d05c8a111d3f487d6fddb049bbDmitry Shmidt /* find pointer to the node entry */ 302005bbf20350954d05c8a111d3f487d6fddb049bbDmitry Shmidt hItem = (TI_HANDLE)((TI_UINT8*)pQue->tHead.pPrev - pQue->uNodeHeaderOffset); 303a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 304005bbf20350954d05c8a111d3f487d6fddb049bbDmitry Shmidt DelFromTail (pQue->tHead.pPrev); /* remove node from the queue */ 305005bbf20350954d05c8a111d3f487d6fddb049bbDmitry Shmidt pQue->uCount--; 306a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 307005bbf20350954d05c8a111d3f487d6fddb049bbDmitry Shmidt#ifdef TI_DBG 308ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt /* Clear the pNext so we can do a sanity check when enqueuing this structre in the future */ 309ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt ((TQueNodeHdr *)((TI_UINT8*)hItem + pQue->uNodeHeaderOffset))->pNext = NULL; 310005bbf20350954d05c8a111d3f487d6fddb049bbDmitry Shmidt#endif 311a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 312005bbf20350954d05c8a111d3f487d6fddb049bbDmitry Shmidt return (hItem); 313005bbf20350954d05c8a111d3f487d6fddb049bbDmitry Shmidt } 314a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 315a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 316a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* Queue is empty */ 317a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TRACE0(pQue->hReport, REPORT_SEVERITY_INFORMATION , "que_Dequeue(): Queue is empty\n"); 318a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt return NULL; 319a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt} 320a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 321a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 322a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/** 323a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \fn que_Requeue 324a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \brief Requeue an item 325a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * 326a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * Requeue an item at the queue's tail (first in queue). 327a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * 328a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \note 329a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param hQue - The queue object 330a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param hItem - Handle to queued item 331a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \return TI_OK if item was queued, or TI_NOK if not queued due to overflow 332a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \sa que_Enqueue, que_Dequeue 333a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */ 334a615fb1650af6e111053506f1b764b28a5b4631dDmitry ShmidtTI_STATUS que_Requeue (TI_HANDLE hQue, TI_HANDLE hItem) 335a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{ 336a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TQueue *pQue = (TQueue *)hQue; 337a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TQueNodeHdr *pQueNodeHdr; /* the NodeHeader in the given item */ 338a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 339a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* 340a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * If queue's limits not exceeded add the packet to queue's tail and return TI_OK 341a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */ 342a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt if (pQue->uCount < pQue->uLimit) 343a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 344a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* Find NodeHeader in the given item */ 345a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pQueNodeHdr = (TQueNodeHdr *)((TI_UINT8*)hItem + pQue->uNodeHeaderOffset); 346a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 347a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* Verify that pNext is NULL --> Sanity check that this item is not already linked to a queue */ 348a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt if (pQueNodeHdr->pNext) 349a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt { 350a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TRACE0(pQue->hReport, REPORT_SEVERITY_ERROR, "que_Requeue(): Trying to Requeue an item that is already enqueued!!"); 351a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt return TI_NOK; 352a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 353a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 354a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* Enqueue item and increment items counter */ 355a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt AddToTail (pQueNodeHdr, &pQue->tHead); 356a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pQue->uCount++; 357a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 358a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt#ifdef TI_DBG 359a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt if (pQue->uCount > pQue->uMaxCount) 360a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pQue->uMaxCount = pQue->uCount; 361a615fb1650af6e111053506f1b764b28a5b4631dDmitry ShmidtTRACE0(pQue->hReport, REPORT_SEVERITY_INFORMATION , "que_Requeue(): Requeued successfully\n"); 362a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt#endif 363a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 364a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt return TI_OK; 365a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt } 366a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 367ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt 368a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt /* 369a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * Queue is overflowed, return TI_NOK. 370a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * Note: This is not expected in the current design, since Tx packet may be requeued 371a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * only right after it was dequeued in the same context so the queue can't be full. 372a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */ 373a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt#ifdef TI_DBG 374a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pQue->uOverflow++; 375ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry ShmidtTRACE0(pQue->hReport, REPORT_SEVERITY_ERROR , "que_Requeue(): Queue Overflow\n"); 376a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt#endif 377a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 378a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt return TI_NOK; 379a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt} 380a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 381a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 382a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/** 383a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \fn que_Size 384a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \brief Return queue size 385a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * 386a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * Return number of items in queue. 387a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * 388a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \note 389a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param hQue - The queue object 390a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \return TI_UINT32 - the items count 391a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \sa 392a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */ 393a615fb1650af6e111053506f1b764b28a5b4631dDmitry ShmidtTI_UINT32 que_Size (TI_HANDLE hQue) 394a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{ 395a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt TQueue *pQue = (TQueue *)hQue; 396a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 397a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt return (pQue->uCount); 398a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt} 399a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 400a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 401a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt/** 402a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \fn que_Print 403a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \brief Print queue status 404a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * 405a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * Print the queue's parameters (not the content). 406a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * 407a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \note 408a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \param hQue - The queue object 409a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \return void 410a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt * \sa 411a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt */ 412a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 413a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt#ifdef TI_DBG 414a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 415a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidtvoid que_Print(TI_HANDLE hQue) 416a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt{ 417ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt#ifdef REPORT_LOG 418ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt TQueue *pQue = (TQueue *)hQue; 419a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 420a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt WLAN_OS_REPORT(("que_Print: Count=%u MaxCount=%u Limit=%u Overflow=%u NodeHeaderOffset=%u Next=0x%x Prev=0x%x\n", 421a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pQue->uCount, pQue->uMaxCount, pQue->uLimit, pQue->uOverflow, 422a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt pQue->uNodeHeaderOffset, pQue->tHead.pNext, pQue->tHead.pPrev)); 423ddac9c138c5b4b16b99fb8bc5f0f10418efa1029Dmitry Shmidt#endif 424a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt} 425a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt 426a615fb1650af6e111053506f1b764b28a5b4631dDmitry Shmidt#endif /* TI_DBG */ 427