1/******************************************************************************
2 *
3 *  Copyright (C) 2009-2012 Broadcom Corporation
4 *
5 *  Licensed under the Apache License, Version 2.0 (the "License");
6 *  you may not use this file except in compliance with the License.
7 *  You may obtain a copy of the License at:
8 *
9 *  http://www.apache.org/licenses/LICENSE-2.0
10 *
11 *  Unless required by applicable law or agreed to in writing, software
12 *  distributed under the License is distributed on an "AS IS" BASIS,
13 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 *  See the License for the specific language governing permissions and
15 *  limitations under the License.
16 *
17 ******************************************************************************/
18
19/******************************************************************************
20 *
21 *  Filename:      utils.h
22 *
23 *  Description:   Utility functions declaration
24 *
25 ******************************************************************************/
26
27#ifndef UTILS_H
28#define UTILS_H
29
30/******************************************************************************
31**  Constants & Macros
32******************************************************************************/
33
34#define STREAM_TO_UINT16(u16, p) {u16 = ((uint16_t)(*(p)) + (((uint16_t)(*((p) + 1))) << 8)); (p) += 2;}
35#define UINT16_TO_STREAM(p, u16) {*(p)++ = (uint8_t)(u16); *(p)++ = (uint8_t)((u16) >> 8);}
36#define UINT32_TO_STREAM(p, u32) {*(p)++ = (uint8_t)(u32); *(p)++ = (uint8_t)((u32) >> 8); *(p)++ = (uint8_t)((u32) >> 16); *(p)++ = (uint8_t)((u32) >> 24);}
37
38/******************************************************************************
39**  Type definitions
40******************************************************************************/
41
42typedef struct
43{
44    void        *p_first;
45    void        *p_last;
46    uint16_t    count;
47} BUFFER_Q;
48
49/******************************************************************************
50**  Extern variables and functions
51******************************************************************************/
52
53/******************************************************************************
54**  Functions
55******************************************************************************/
56
57/*******************************************************************************
58**
59** Function        utils_init
60**
61** Description     Utils initialization
62**
63** Returns         None
64**
65*******************************************************************************/
66void utils_init ();
67
68/*******************************************************************************
69**
70** Function        utils_cleanup
71**
72** Description     Utils cleanup
73**
74** Returns         None
75**
76*******************************************************************************/
77void utils_cleanup ();
78
79/*******************************************************************************
80**
81** Function        utils_queue_init
82**
83** Description     Initialize the given buffer queue
84**
85** Returns         None
86**
87*******************************************************************************/
88void utils_queue_init (BUFFER_Q *p_q);
89
90/*******************************************************************************
91**
92** Function        utils_enqueue
93**
94** Description     Enqueue a buffer at the tail of the given queue
95**
96** Returns         None
97**
98*******************************************************************************/
99void utils_enqueue (BUFFER_Q *p_q, void *p_buf);
100
101/*******************************************************************************
102**
103** Function        utils_dequeue
104**
105** Description     Dequeues a buffer from the head of the given queue
106**
107** Returns         NULL if queue is empty, else buffer
108**
109*******************************************************************************/
110void *utils_dequeue (BUFFER_Q *p_q);
111
112/*******************************************************************************
113**
114** Function        utils_dequeue_unlocked
115**
116** Description     Dequeues a buffer from the head of the given queue without lock
117**
118** Returns         NULL if queue is empty, else buffer
119**
120*******************************************************************************/
121void *utils_dequeue_unlocked (BUFFER_Q *p_q);
122
123/*******************************************************************************
124**
125** Function        utils_getnext
126**
127** Description     Return a pointer to the next buffer linked to the given buffer
128**
129** Returns         NULL if the given buffer does not point to any next buffer,
130**                 else next buffer address
131**
132*******************************************************************************/
133void *utils_getnext (void *p_buf);
134
135/*******************************************************************************
136**
137** Function        utils_remove_from_queue
138**
139** Description     Dequeue the given buffer from the middle of the given queue
140**
141** Returns         NULL if the given queue is empty, else the given buffer
142**
143*******************************************************************************/
144void *utils_remove_from_queue (BUFFER_Q *p_q, void *p_buf);
145
146/*******************************************************************************
147**
148** Function        utils_remove_from_queue_unlocked
149**
150** Description     Dequeue the given buffer from the middle of the given queue without lock
151**
152** Returns         NULL if the given queue is empty, else the given buffer
153**
154*******************************************************************************/
155void *utils_remove_from_queue_unlocked (BUFFER_Q *p_q, void *p_buf);
156
157
158/*******************************************************************************
159**
160** Function        utils_delay
161**
162** Description     sleep unconditionally for timeout milliseconds
163**
164** Returns         None
165**
166*******************************************************************************/
167void utils_delay (uint32_t timeout);
168
169/*******************************************************************************
170**
171** Function        utils_lock
172**
173** Description     application calls this function before entering critical
174**                 section
175**
176** Returns         None
177**
178*******************************************************************************/
179void utils_lock (void);
180
181/*******************************************************************************
182**
183** Function        utils_unlock
184**
185** Description     application calls this function when leaving critical
186**                 section
187**
188** Returns         None
189**
190*******************************************************************************/
191void utils_unlock (void);
192
193#endif /* UTILS_H */
194
195