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