xref: /aosp_15_r20/system/nfc/src/gki/common/gki_buffer.cc (revision 7eba2f3b06c51ae21384f6a4f14577b668a869b3)
1*7eba2f3bSAndroid Build Coastguard Worker /******************************************************************************
2*7eba2f3bSAndroid Build Coastguard Worker  *
3*7eba2f3bSAndroid Build Coastguard Worker  *  Copyright (C) 1999-2012 Broadcom Corporation
4*7eba2f3bSAndroid Build Coastguard Worker  *
5*7eba2f3bSAndroid Build Coastguard Worker  *  Licensed under the Apache License, Version 2.0 (the "License");
6*7eba2f3bSAndroid Build Coastguard Worker  *  you may not use this file except in compliance with the License.
7*7eba2f3bSAndroid Build Coastguard Worker  *  You may obtain a copy of the License at:
8*7eba2f3bSAndroid Build Coastguard Worker  *
9*7eba2f3bSAndroid Build Coastguard Worker  *  http://www.apache.org/licenses/LICENSE-2.0
10*7eba2f3bSAndroid Build Coastguard Worker  *
11*7eba2f3bSAndroid Build Coastguard Worker  *  Unless required by applicable law or agreed to in writing, software
12*7eba2f3bSAndroid Build Coastguard Worker  *  distributed under the License is distributed on an "AS IS" BASIS,
13*7eba2f3bSAndroid Build Coastguard Worker  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*7eba2f3bSAndroid Build Coastguard Worker  *  See the License for the specific language governing permissions and
15*7eba2f3bSAndroid Build Coastguard Worker  *  limitations under the License.
16*7eba2f3bSAndroid Build Coastguard Worker  *
17*7eba2f3bSAndroid Build Coastguard Worker  ******************************************************************************/
18*7eba2f3bSAndroid Build Coastguard Worker #include <android-base/logging.h>
19*7eba2f3bSAndroid Build Coastguard Worker #include <android-base/stringprintf.h>
20*7eba2f3bSAndroid Build Coastguard Worker #include <log/log.h>
21*7eba2f3bSAndroid Build Coastguard Worker 
22*7eba2f3bSAndroid Build Coastguard Worker #include "gki_int.h"
23*7eba2f3bSAndroid Build Coastguard Worker 
24*7eba2f3bSAndroid Build Coastguard Worker #if (GKI_NUM_TOTAL_BUF_POOLS > 16)
25*7eba2f3bSAndroid Build Coastguard Worker #error Number of pools out of range (16 Max)!
26*7eba2f3bSAndroid Build Coastguard Worker #endif
27*7eba2f3bSAndroid Build Coastguard Worker 
28*7eba2f3bSAndroid Build Coastguard Worker #if (BTU_STACK_LITE_ENABLED == FALSE)
29*7eba2f3bSAndroid Build Coastguard Worker static void gki_add_to_pool_list(uint8_t pool_id);
30*7eba2f3bSAndroid Build Coastguard Worker static void gki_remove_from_pool_list(uint8_t pool_id);
31*7eba2f3bSAndroid Build Coastguard Worker #endif /*  BTU_STACK_LITE_ENABLED == FALSE */
32*7eba2f3bSAndroid Build Coastguard Worker 
33*7eba2f3bSAndroid Build Coastguard Worker using android::base::StringPrintf;
34*7eba2f3bSAndroid Build Coastguard Worker 
35*7eba2f3bSAndroid Build Coastguard Worker /*******************************************************************************
36*7eba2f3bSAndroid Build Coastguard Worker **
37*7eba2f3bSAndroid Build Coastguard Worker ** Function         gki_init_free_queue
38*7eba2f3bSAndroid Build Coastguard Worker **
39*7eba2f3bSAndroid Build Coastguard Worker ** Description      Internal function called at startup to initialize a free
40*7eba2f3bSAndroid Build Coastguard Worker **                  queue. It is called once for each free queue.
41*7eba2f3bSAndroid Build Coastguard Worker **
42*7eba2f3bSAndroid Build Coastguard Worker ** Returns          void
43*7eba2f3bSAndroid Build Coastguard Worker **
44*7eba2f3bSAndroid Build Coastguard Worker *******************************************************************************/
gki_init_free_queue(uint8_t id,uint16_t size,uint16_t total,void * p_mem)45*7eba2f3bSAndroid Build Coastguard Worker static void gki_init_free_queue(uint8_t id, uint16_t size, uint16_t total,
46*7eba2f3bSAndroid Build Coastguard Worker                                 void* p_mem) {
47*7eba2f3bSAndroid Build Coastguard Worker   uint16_t i;
48*7eba2f3bSAndroid Build Coastguard Worker   uint16_t act_size;
49*7eba2f3bSAndroid Build Coastguard Worker   BUFFER_HDR_T* hdr;
50*7eba2f3bSAndroid Build Coastguard Worker   BUFFER_HDR_T* hdr1 = nullptr;
51*7eba2f3bSAndroid Build Coastguard Worker   uint32_t* magic;
52*7eba2f3bSAndroid Build Coastguard Worker   int32_t tempsize = size;
53*7eba2f3bSAndroid Build Coastguard Worker   tGKI_COM_CB* p_cb = &gki_cb.com;
54*7eba2f3bSAndroid Build Coastguard Worker 
55*7eba2f3bSAndroid Build Coastguard Worker   /* Ensure an even number of longwords */
56*7eba2f3bSAndroid Build Coastguard Worker   tempsize = (int32_t)ALIGN_POOL(size);
57*7eba2f3bSAndroid Build Coastguard Worker   act_size = (uint16_t)(tempsize + BUFFER_PADDING_SIZE);
58*7eba2f3bSAndroid Build Coastguard Worker 
59*7eba2f3bSAndroid Build Coastguard Worker   /* Remember pool start and end addresses */
60*7eba2f3bSAndroid Build Coastguard Worker   if (p_mem) {
61*7eba2f3bSAndroid Build Coastguard Worker     p_cb->pool_start[id] = (uint8_t*)p_mem;
62*7eba2f3bSAndroid Build Coastguard Worker     p_cb->pool_end[id] = (uint8_t*)p_mem + (act_size * total);
63*7eba2f3bSAndroid Build Coastguard Worker   }
64*7eba2f3bSAndroid Build Coastguard Worker 
65*7eba2f3bSAndroid Build Coastguard Worker   p_cb->pool_size[id] = act_size;
66*7eba2f3bSAndroid Build Coastguard Worker 
67*7eba2f3bSAndroid Build Coastguard Worker   p_cb->freeq[id].size = (uint16_t)tempsize;
68*7eba2f3bSAndroid Build Coastguard Worker   p_cb->freeq[id].total = total;
69*7eba2f3bSAndroid Build Coastguard Worker   p_cb->freeq[id].cur_cnt = 0;
70*7eba2f3bSAndroid Build Coastguard Worker   p_cb->freeq[id].max_cnt = 0;
71*7eba2f3bSAndroid Build Coastguard Worker 
72*7eba2f3bSAndroid Build Coastguard Worker   /* Initialize  index table */
73*7eba2f3bSAndroid Build Coastguard Worker   if (p_mem) {
74*7eba2f3bSAndroid Build Coastguard Worker     hdr = (BUFFER_HDR_T*)p_mem;
75*7eba2f3bSAndroid Build Coastguard Worker     p_cb->freeq[id].p_first = hdr;
76*7eba2f3bSAndroid Build Coastguard Worker     for (i = 0; i < total; i++) {
77*7eba2f3bSAndroid Build Coastguard Worker       hdr->task_id = GKI_INVALID_TASK;
78*7eba2f3bSAndroid Build Coastguard Worker       hdr->q_id = id;
79*7eba2f3bSAndroid Build Coastguard Worker       hdr->status = BUF_STATUS_FREE;
80*7eba2f3bSAndroid Build Coastguard Worker       magic = (uint32_t*)((uint8_t*)hdr + BUFFER_HDR_SIZE + tempsize);
81*7eba2f3bSAndroid Build Coastguard Worker       *magic = MAGIC_NO;
82*7eba2f3bSAndroid Build Coastguard Worker       hdr1 = hdr;
83*7eba2f3bSAndroid Build Coastguard Worker       hdr = (BUFFER_HDR_T*)((uint8_t*)hdr + act_size);
84*7eba2f3bSAndroid Build Coastguard Worker       hdr1->p_next = hdr;
85*7eba2f3bSAndroid Build Coastguard Worker     }
86*7eba2f3bSAndroid Build Coastguard Worker     if (hdr1 != nullptr) hdr = hdr1;
87*7eba2f3bSAndroid Build Coastguard Worker     hdr->p_next = nullptr;
88*7eba2f3bSAndroid Build Coastguard Worker     p_cb->freeq[id].p_last = hdr;
89*7eba2f3bSAndroid Build Coastguard Worker   }
90*7eba2f3bSAndroid Build Coastguard Worker   return;
91*7eba2f3bSAndroid Build Coastguard Worker }
92*7eba2f3bSAndroid Build Coastguard Worker 
gki_alloc_free_queue(uint8_t id)93*7eba2f3bSAndroid Build Coastguard Worker static bool gki_alloc_free_queue(uint8_t id) {
94*7eba2f3bSAndroid Build Coastguard Worker   FREE_QUEUE_T* Q;
95*7eba2f3bSAndroid Build Coastguard Worker   tGKI_COM_CB* p_cb = &gki_cb.com;
96*7eba2f3bSAndroid Build Coastguard Worker 
97*7eba2f3bSAndroid Build Coastguard Worker   Q = &p_cb->freeq[p_cb->pool_list[id]];
98*7eba2f3bSAndroid Build Coastguard Worker 
99*7eba2f3bSAndroid Build Coastguard Worker   if (Q->p_first == nullptr) {
100*7eba2f3bSAndroid Build Coastguard Worker     void* p_mem = GKI_os_malloc((Q->size + BUFFER_PADDING_SIZE) * Q->total);
101*7eba2f3bSAndroid Build Coastguard Worker     if (p_mem) {
102*7eba2f3bSAndroid Build Coastguard Worker       // re-initialize the queue with allocated memory
103*7eba2f3bSAndroid Build Coastguard Worker       gki_init_free_queue(id, Q->size, Q->total, p_mem);
104*7eba2f3bSAndroid Build Coastguard Worker       return true;
105*7eba2f3bSAndroid Build Coastguard Worker     }
106*7eba2f3bSAndroid Build Coastguard Worker     GKI_exception(GKI_ERROR_BUF_SIZE_TOOBIG,
107*7eba2f3bSAndroid Build Coastguard Worker                   "gki_alloc_free_queue: Not enough memory");
108*7eba2f3bSAndroid Build Coastguard Worker   }
109*7eba2f3bSAndroid Build Coastguard Worker   return false;
110*7eba2f3bSAndroid Build Coastguard Worker }
111*7eba2f3bSAndroid Build Coastguard Worker 
112*7eba2f3bSAndroid Build Coastguard Worker /*******************************************************************************
113*7eba2f3bSAndroid Build Coastguard Worker **
114*7eba2f3bSAndroid Build Coastguard Worker ** Function         gki_buffer_init
115*7eba2f3bSAndroid Build Coastguard Worker **
116*7eba2f3bSAndroid Build Coastguard Worker ** Description      Called once internally by GKI at startup to initialize all
117*7eba2f3bSAndroid Build Coastguard Worker **                  buffers and free buffer pools.
118*7eba2f3bSAndroid Build Coastguard Worker **
119*7eba2f3bSAndroid Build Coastguard Worker ** Returns          void
120*7eba2f3bSAndroid Build Coastguard Worker **
121*7eba2f3bSAndroid Build Coastguard Worker *******************************************************************************/
gki_buffer_init(void)122*7eba2f3bSAndroid Build Coastguard Worker void gki_buffer_init(void) {
123*7eba2f3bSAndroid Build Coastguard Worker   uint8_t i, tt, mb;
124*7eba2f3bSAndroid Build Coastguard Worker   tGKI_COM_CB* p_cb = &gki_cb.com;
125*7eba2f3bSAndroid Build Coastguard Worker 
126*7eba2f3bSAndroid Build Coastguard Worker   /* Initialize mailboxes */
127*7eba2f3bSAndroid Build Coastguard Worker   for (tt = 0; tt < GKI_MAX_TASKS; tt++) {
128*7eba2f3bSAndroid Build Coastguard Worker     for (mb = 0; mb < NUM_TASK_MBOX; mb++) {
129*7eba2f3bSAndroid Build Coastguard Worker       p_cb->OSTaskQFirst[tt][mb] = nullptr;
130*7eba2f3bSAndroid Build Coastguard Worker       p_cb->OSTaskQLast[tt][mb] = nullptr;
131*7eba2f3bSAndroid Build Coastguard Worker     }
132*7eba2f3bSAndroid Build Coastguard Worker   }
133*7eba2f3bSAndroid Build Coastguard Worker 
134*7eba2f3bSAndroid Build Coastguard Worker   for (tt = 0; tt < GKI_NUM_TOTAL_BUF_POOLS; tt++) {
135*7eba2f3bSAndroid Build Coastguard Worker     p_cb->pool_start[tt] = nullptr;
136*7eba2f3bSAndroid Build Coastguard Worker     p_cb->pool_end[tt] = nullptr;
137*7eba2f3bSAndroid Build Coastguard Worker     p_cb->pool_size[tt] = 0;
138*7eba2f3bSAndroid Build Coastguard Worker 
139*7eba2f3bSAndroid Build Coastguard Worker     p_cb->freeq[tt].p_first = nullptr;
140*7eba2f3bSAndroid Build Coastguard Worker     p_cb->freeq[tt].p_last = nullptr;
141*7eba2f3bSAndroid Build Coastguard Worker     p_cb->freeq[tt].size = 0;
142*7eba2f3bSAndroid Build Coastguard Worker     p_cb->freeq[tt].total = 0;
143*7eba2f3bSAndroid Build Coastguard Worker     p_cb->freeq[tt].cur_cnt = 0;
144*7eba2f3bSAndroid Build Coastguard Worker     p_cb->freeq[tt].max_cnt = 0;
145*7eba2f3bSAndroid Build Coastguard Worker   }
146*7eba2f3bSAndroid Build Coastguard Worker 
147*7eba2f3bSAndroid Build Coastguard Worker   /* Use default from target.h */
148*7eba2f3bSAndroid Build Coastguard Worker   p_cb->pool_access_mask = GKI_DEF_BUFPOOL_PERM_MASK;
149*7eba2f3bSAndroid Build Coastguard Worker 
150*7eba2f3bSAndroid Build Coastguard Worker #if (GKI_NUM_FIXED_BUF_POOLS > 0)
151*7eba2f3bSAndroid Build Coastguard Worker   gki_init_free_queue(0, GKI_BUF0_SIZE, GKI_BUF0_MAX, p_cb->bufpool0);
152*7eba2f3bSAndroid Build Coastguard Worker #endif
153*7eba2f3bSAndroid Build Coastguard Worker 
154*7eba2f3bSAndroid Build Coastguard Worker #if (GKI_NUM_FIXED_BUF_POOLS > 1)
155*7eba2f3bSAndroid Build Coastguard Worker   gki_init_free_queue(1, GKI_BUF1_SIZE, GKI_BUF1_MAX, p_cb->bufpool1);
156*7eba2f3bSAndroid Build Coastguard Worker #endif
157*7eba2f3bSAndroid Build Coastguard Worker 
158*7eba2f3bSAndroid Build Coastguard Worker #if (GKI_NUM_FIXED_BUF_POOLS > 2)
159*7eba2f3bSAndroid Build Coastguard Worker   gki_init_free_queue(2, GKI_BUF2_SIZE, GKI_BUF2_MAX, p_cb->bufpool2);
160*7eba2f3bSAndroid Build Coastguard Worker #endif
161*7eba2f3bSAndroid Build Coastguard Worker 
162*7eba2f3bSAndroid Build Coastguard Worker #if (GKI_NUM_FIXED_BUF_POOLS > 3)
163*7eba2f3bSAndroid Build Coastguard Worker   gki_init_free_queue(3, GKI_BUF3_SIZE, GKI_BUF3_MAX, p_cb->bufpool3);
164*7eba2f3bSAndroid Build Coastguard Worker #endif
165*7eba2f3bSAndroid Build Coastguard Worker 
166*7eba2f3bSAndroid Build Coastguard Worker #if (GKI_NUM_FIXED_BUF_POOLS > 4)
167*7eba2f3bSAndroid Build Coastguard Worker   gki_init_free_queue(4, GKI_BUF4_SIZE, GKI_BUF4_MAX, p_cb->bufpool4);
168*7eba2f3bSAndroid Build Coastguard Worker #endif
169*7eba2f3bSAndroid Build Coastguard Worker 
170*7eba2f3bSAndroid Build Coastguard Worker #if (GKI_NUM_FIXED_BUF_POOLS > 5)
171*7eba2f3bSAndroid Build Coastguard Worker   gki_init_free_queue(5, GKI_BUF5_SIZE, GKI_BUF5_MAX, p_cb->bufpool5);
172*7eba2f3bSAndroid Build Coastguard Worker #endif
173*7eba2f3bSAndroid Build Coastguard Worker 
174*7eba2f3bSAndroid Build Coastguard Worker #if (GKI_NUM_FIXED_BUF_POOLS > 6)
175*7eba2f3bSAndroid Build Coastguard Worker   gki_init_free_queue(6, GKI_BUF6_SIZE, GKI_BUF6_MAX, p_cb->bufpool6);
176*7eba2f3bSAndroid Build Coastguard Worker #endif
177*7eba2f3bSAndroid Build Coastguard Worker 
178*7eba2f3bSAndroid Build Coastguard Worker #if (GKI_NUM_FIXED_BUF_POOLS > 7)
179*7eba2f3bSAndroid Build Coastguard Worker   gki_init_free_queue(7, GKI_BUF7_SIZE, GKI_BUF7_MAX, p_cb->bufpool7);
180*7eba2f3bSAndroid Build Coastguard Worker #endif
181*7eba2f3bSAndroid Build Coastguard Worker 
182*7eba2f3bSAndroid Build Coastguard Worker #if (GKI_NUM_FIXED_BUF_POOLS > 8)
183*7eba2f3bSAndroid Build Coastguard Worker   gki_init_free_queue(8, GKI_BUF8_SIZE, GKI_BUF8_MAX, p_cb->bufpool8);
184*7eba2f3bSAndroid Build Coastguard Worker #endif
185*7eba2f3bSAndroid Build Coastguard Worker 
186*7eba2f3bSAndroid Build Coastguard Worker #if (GKI_NUM_FIXED_BUF_POOLS > 9)
187*7eba2f3bSAndroid Build Coastguard Worker   gki_init_free_queue(9, GKI_BUF9_SIZE, GKI_BUF9_MAX, p_cb->bufpool9);
188*7eba2f3bSAndroid Build Coastguard Worker #endif
189*7eba2f3bSAndroid Build Coastguard Worker 
190*7eba2f3bSAndroid Build Coastguard Worker #if (GKI_NUM_FIXED_BUF_POOLS > 10)
191*7eba2f3bSAndroid Build Coastguard Worker   gki_init_free_queue(10, GKI_BUF10_SIZE, GKI_BUF10_MAX, p_cb->bufpool10);
192*7eba2f3bSAndroid Build Coastguard Worker #endif
193*7eba2f3bSAndroid Build Coastguard Worker 
194*7eba2f3bSAndroid Build Coastguard Worker #if (GKI_NUM_FIXED_BUF_POOLS > 11)
195*7eba2f3bSAndroid Build Coastguard Worker   gki_init_free_queue(11, GKI_BUF11_SIZE, GKI_BUF11_MAX, p_cb->bufpool11);
196*7eba2f3bSAndroid Build Coastguard Worker #endif
197*7eba2f3bSAndroid Build Coastguard Worker 
198*7eba2f3bSAndroid Build Coastguard Worker #if (GKI_NUM_FIXED_BUF_POOLS > 12)
199*7eba2f3bSAndroid Build Coastguard Worker   gki_init_free_queue(12, GKI_BUF12_SIZE, GKI_BUF12_MAX, p_cb->bufpool12);
200*7eba2f3bSAndroid Build Coastguard Worker #endif
201*7eba2f3bSAndroid Build Coastguard Worker 
202*7eba2f3bSAndroid Build Coastguard Worker #if (GKI_NUM_FIXED_BUF_POOLS > 13)
203*7eba2f3bSAndroid Build Coastguard Worker   gki_init_free_queue(13, GKI_BUF13_SIZE, GKI_BUF13_MAX, p_cb->bufpool13);
204*7eba2f3bSAndroid Build Coastguard Worker #endif
205*7eba2f3bSAndroid Build Coastguard Worker 
206*7eba2f3bSAndroid Build Coastguard Worker #if (GKI_NUM_FIXED_BUF_POOLS > 14)
207*7eba2f3bSAndroid Build Coastguard Worker   gki_init_free_queue(14, GKI_BUF14_SIZE, GKI_BUF14_MAX, p_cb->bufpool14);
208*7eba2f3bSAndroid Build Coastguard Worker #endif
209*7eba2f3bSAndroid Build Coastguard Worker 
210*7eba2f3bSAndroid Build Coastguard Worker #if (GKI_NUM_FIXED_BUF_POOLS > 15)
211*7eba2f3bSAndroid Build Coastguard Worker   gki_init_free_queue(15, GKI_BUF15_SIZE, GKI_BUF15_MAX, p_cb->bufpool15);
212*7eba2f3bSAndroid Build Coastguard Worker #endif
213*7eba2f3bSAndroid Build Coastguard Worker 
214*7eba2f3bSAndroid Build Coastguard Worker   /* add pools to the pool_list which is arranged in the order of size */
215*7eba2f3bSAndroid Build Coastguard Worker   for (i = 0; i < GKI_NUM_FIXED_BUF_POOLS; i++) {
216*7eba2f3bSAndroid Build Coastguard Worker     p_cb->pool_list[i] = i;
217*7eba2f3bSAndroid Build Coastguard Worker   }
218*7eba2f3bSAndroid Build Coastguard Worker 
219*7eba2f3bSAndroid Build Coastguard Worker   p_cb->curr_total_no_of_pools = GKI_NUM_FIXED_BUF_POOLS;
220*7eba2f3bSAndroid Build Coastguard Worker 
221*7eba2f3bSAndroid Build Coastguard Worker   return;
222*7eba2f3bSAndroid Build Coastguard Worker }
223*7eba2f3bSAndroid Build Coastguard Worker 
224*7eba2f3bSAndroid Build Coastguard Worker /*******************************************************************************
225*7eba2f3bSAndroid Build Coastguard Worker **
226*7eba2f3bSAndroid Build Coastguard Worker ** Function         GKI_init_q
227*7eba2f3bSAndroid Build Coastguard Worker **
228*7eba2f3bSAndroid Build Coastguard Worker ** Description      Called by an application to initialize a buffer queue.
229*7eba2f3bSAndroid Build Coastguard Worker **
230*7eba2f3bSAndroid Build Coastguard Worker ** Returns          void
231*7eba2f3bSAndroid Build Coastguard Worker **
232*7eba2f3bSAndroid Build Coastguard Worker *******************************************************************************/
GKI_init_q(BUFFER_Q * p_q)233*7eba2f3bSAndroid Build Coastguard Worker void GKI_init_q(BUFFER_Q* p_q) {
234*7eba2f3bSAndroid Build Coastguard Worker   p_q->p_first = p_q->p_last = nullptr;
235*7eba2f3bSAndroid Build Coastguard Worker   p_q->count = 0;
236*7eba2f3bSAndroid Build Coastguard Worker 
237*7eba2f3bSAndroid Build Coastguard Worker   return;
238*7eba2f3bSAndroid Build Coastguard Worker }
239*7eba2f3bSAndroid Build Coastguard Worker 
240*7eba2f3bSAndroid Build Coastguard Worker /*******************************************************************************
241*7eba2f3bSAndroid Build Coastguard Worker **
242*7eba2f3bSAndroid Build Coastguard Worker ** Function         GKI_getbuf
243*7eba2f3bSAndroid Build Coastguard Worker **
244*7eba2f3bSAndroid Build Coastguard Worker ** Description      Called by an application to get a free buffer which
245*7eba2f3bSAndroid Build Coastguard Worker **                  is of size greater or equal to the requested size.
246*7eba2f3bSAndroid Build Coastguard Worker **
247*7eba2f3bSAndroid Build Coastguard Worker **                  Note: This routine only takes buffers from public pools.
248*7eba2f3bSAndroid Build Coastguard Worker **                        It will not use any buffers from pools
249*7eba2f3bSAndroid Build Coastguard Worker **                        marked GKI_RESTRICTED_POOL.
250*7eba2f3bSAndroid Build Coastguard Worker **
251*7eba2f3bSAndroid Build Coastguard Worker ** Parameters       size - (input) number of bytes needed.
252*7eba2f3bSAndroid Build Coastguard Worker **
253*7eba2f3bSAndroid Build Coastguard Worker ** Returns          A pointer to the buffer, or NULL if none available
254*7eba2f3bSAndroid Build Coastguard Worker **
255*7eba2f3bSAndroid Build Coastguard Worker *******************************************************************************/
GKI_getbuf(uint16_t size)256*7eba2f3bSAndroid Build Coastguard Worker void* GKI_getbuf(uint16_t size) {
257*7eba2f3bSAndroid Build Coastguard Worker   BUFFER_HDR_T* p_hdr;
258*7eba2f3bSAndroid Build Coastguard Worker   FREE_QUEUE_T* Q;
259*7eba2f3bSAndroid Build Coastguard Worker 
260*7eba2f3bSAndroid Build Coastguard Worker #if defined(DYN_ALLOC) || defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION)
261*7eba2f3bSAndroid Build Coastguard Worker   if (size == 0 || size > (USHRT_MAX - 3)) {
262*7eba2f3bSAndroid Build Coastguard Worker     LOG(ERROR) << StringPrintf("getbuf: Requested size(%d) is invalid", size);
263*7eba2f3bSAndroid Build Coastguard Worker     android_errorWriteLog(0x534e4554, "205729183");
264*7eba2f3bSAndroid Build Coastguard Worker #ifndef DYN_ALLOC
265*7eba2f3bSAndroid Build Coastguard Worker     abort();
266*7eba2f3bSAndroid Build Coastguard Worker #else
267*7eba2f3bSAndroid Build Coastguard Worker     return (nullptr);
268*7eba2f3bSAndroid Build Coastguard Worker #endif
269*7eba2f3bSAndroid Build Coastguard Worker   }
270*7eba2f3bSAndroid Build Coastguard Worker 
271*7eba2f3bSAndroid Build Coastguard Worker   size = ALIGN_POOL(size);
272*7eba2f3bSAndroid Build Coastguard Worker   size_t total_sz = size + sizeof(BUFFER_HDR_T)
273*7eba2f3bSAndroid Build Coastguard Worker #if (GKI_ENABLE_BUF_CORRUPTION_CHECK == TRUE)
274*7eba2f3bSAndroid Build Coastguard Worker                     + sizeof(uint32_t);
275*7eba2f3bSAndroid Build Coastguard Worker #else
276*7eba2f3bSAndroid Build Coastguard Worker       ;
277*7eba2f3bSAndroid Build Coastguard Worker #endif
278*7eba2f3bSAndroid Build Coastguard Worker   p_hdr = (BUFFER_HDR_T*)GKI_os_malloc(total_sz);
279*7eba2f3bSAndroid Build Coastguard Worker   if (!p_hdr) {
280*7eba2f3bSAndroid Build Coastguard Worker     LOG(ERROR) << StringPrintf("unable to allocate buffer!!!!!");
281*7eba2f3bSAndroid Build Coastguard Worker     LOG(ERROR) << StringPrintf("total_sz:%zu size:%d", total_sz, size);
282*7eba2f3bSAndroid Build Coastguard Worker     abort();
283*7eba2f3bSAndroid Build Coastguard Worker   }
284*7eba2f3bSAndroid Build Coastguard Worker 
285*7eba2f3bSAndroid Build Coastguard Worker   memset(p_hdr, 0, total_sz);
286*7eba2f3bSAndroid Build Coastguard Worker 
287*7eba2f3bSAndroid Build Coastguard Worker #if (GKI_ENABLE_BUF_CORRUPTION_CHECK == TRUE)
288*7eba2f3bSAndroid Build Coastguard Worker   *(uint32_t*)((uint8_t*)p_hdr + BUFFER_HDR_SIZE + size) = MAGIC_NO;
289*7eba2f3bSAndroid Build Coastguard Worker #endif
290*7eba2f3bSAndroid Build Coastguard Worker   p_hdr->task_id = GKI_get_taskid();
291*7eba2f3bSAndroid Build Coastguard Worker   p_hdr->status = BUF_STATUS_UNLINKED;
292*7eba2f3bSAndroid Build Coastguard Worker   p_hdr->p_next = nullptr;
293*7eba2f3bSAndroid Build Coastguard Worker   p_hdr->Type = 0;
294*7eba2f3bSAndroid Build Coastguard Worker 
295*7eba2f3bSAndroid Build Coastguard Worker   p_hdr->q_id = 0;
296*7eba2f3bSAndroid Build Coastguard Worker   p_hdr->size = size;
297*7eba2f3bSAndroid Build Coastguard Worker 
298*7eba2f3bSAndroid Build Coastguard Worker   GKI_disable();
299*7eba2f3bSAndroid Build Coastguard Worker   Q = &gki_cb.com.freeq[p_hdr->q_id];
300*7eba2f3bSAndroid Build Coastguard Worker   if (++Q->cur_cnt > Q->max_cnt) Q->max_cnt = Q->cur_cnt;
301*7eba2f3bSAndroid Build Coastguard Worker   GKI_enable();
302*7eba2f3bSAndroid Build Coastguard Worker 
303*7eba2f3bSAndroid Build Coastguard Worker   LOG(VERBOSE) << StringPrintf("%s %p %d:%d", __func__,
304*7eba2f3bSAndroid Build Coastguard Worker                              ((uint8_t*)p_hdr + BUFFER_HDR_SIZE), Q->cur_cnt,
305*7eba2f3bSAndroid Build Coastguard Worker                              Q->max_cnt);
306*7eba2f3bSAndroid Build Coastguard Worker   UNUSED(gki_alloc_free_queue);
307*7eba2f3bSAndroid Build Coastguard Worker   return (void*)((uint8_t*)p_hdr + BUFFER_HDR_SIZE);
308*7eba2f3bSAndroid Build Coastguard Worker #else
309*7eba2f3bSAndroid Build Coastguard Worker   uint8_t i;
310*7eba2f3bSAndroid Build Coastguard Worker   tGKI_COM_CB* p_cb = &gki_cb.com;
311*7eba2f3bSAndroid Build Coastguard Worker 
312*7eba2f3bSAndroid Build Coastguard Worker   if (size == 0) {
313*7eba2f3bSAndroid Build Coastguard Worker     GKI_exception(GKI_ERROR_BUF_SIZE_ZERO, "getbuf: Size is zero");
314*7eba2f3bSAndroid Build Coastguard Worker     return (nullptr);
315*7eba2f3bSAndroid Build Coastguard Worker   }
316*7eba2f3bSAndroid Build Coastguard Worker 
317*7eba2f3bSAndroid Build Coastguard Worker   /* Find the first buffer pool that is public that can hold the desired size */
318*7eba2f3bSAndroid Build Coastguard Worker   for (i = 0; i < p_cb->curr_total_no_of_pools; i++) {
319*7eba2f3bSAndroid Build Coastguard Worker     if (size <= p_cb->freeq[p_cb->pool_list[i]].size) break;
320*7eba2f3bSAndroid Build Coastguard Worker   }
321*7eba2f3bSAndroid Build Coastguard Worker 
322*7eba2f3bSAndroid Build Coastguard Worker   if (i == p_cb->curr_total_no_of_pools) {
323*7eba2f3bSAndroid Build Coastguard Worker     GKI_exception(GKI_ERROR_BUF_SIZE_TOOBIG, "getbuf: Size is too big");
324*7eba2f3bSAndroid Build Coastguard Worker     return (nullptr);
325*7eba2f3bSAndroid Build Coastguard Worker   }
326*7eba2f3bSAndroid Build Coastguard Worker 
327*7eba2f3bSAndroid Build Coastguard Worker   /* Make sure the buffers aren't disturbed til finished with allocation */
328*7eba2f3bSAndroid Build Coastguard Worker   GKI_disable();
329*7eba2f3bSAndroid Build Coastguard Worker 
330*7eba2f3bSAndroid Build Coastguard Worker   /* search the public buffer pools that are big enough to hold the size
331*7eba2f3bSAndroid Build Coastguard Worker    * until a free buffer is found */
332*7eba2f3bSAndroid Build Coastguard Worker   for (; i < p_cb->curr_total_no_of_pools; i++) {
333*7eba2f3bSAndroid Build Coastguard Worker     /* Only look at PUBLIC buffer pools (bypass RESTRICTED pools) */
334*7eba2f3bSAndroid Build Coastguard Worker     if (((uint16_t)1 << p_cb->pool_list[i]) & p_cb->pool_access_mask) continue;
335*7eba2f3bSAndroid Build Coastguard Worker 
336*7eba2f3bSAndroid Build Coastguard Worker     Q = &p_cb->freeq[p_cb->pool_list[i]];
337*7eba2f3bSAndroid Build Coastguard Worker     if (Q->cur_cnt < Q->total) {
338*7eba2f3bSAndroid Build Coastguard Worker       if (Q->p_first == nullptr && gki_alloc_free_queue(i) != true) {
339*7eba2f3bSAndroid Build Coastguard Worker         LOG(ERROR) << StringPrintf("out of buffer");
340*7eba2f3bSAndroid Build Coastguard Worker         GKI_enable();
341*7eba2f3bSAndroid Build Coastguard Worker         return nullptr;
342*7eba2f3bSAndroid Build Coastguard Worker       }
343*7eba2f3bSAndroid Build Coastguard Worker 
344*7eba2f3bSAndroid Build Coastguard Worker       if (Q->p_first == nullptr) {
345*7eba2f3bSAndroid Build Coastguard Worker         /* gki_alloc_free_queue() failed to alloc memory */
346*7eba2f3bSAndroid Build Coastguard Worker         LOG(ERROR) << StringPrintf("fail alloc free queue");
347*7eba2f3bSAndroid Build Coastguard Worker         GKI_enable();
348*7eba2f3bSAndroid Build Coastguard Worker         return nullptr;
349*7eba2f3bSAndroid Build Coastguard Worker       }
350*7eba2f3bSAndroid Build Coastguard Worker 
351*7eba2f3bSAndroid Build Coastguard Worker       p_hdr = Q->p_first;
352*7eba2f3bSAndroid Build Coastguard Worker       Q->p_first = p_hdr->p_next;
353*7eba2f3bSAndroid Build Coastguard Worker 
354*7eba2f3bSAndroid Build Coastguard Worker       if (!Q->p_first) Q->p_last = nullptr;
355*7eba2f3bSAndroid Build Coastguard Worker 
356*7eba2f3bSAndroid Build Coastguard Worker       if (++Q->cur_cnt > Q->max_cnt) Q->max_cnt = Q->cur_cnt;
357*7eba2f3bSAndroid Build Coastguard Worker 
358*7eba2f3bSAndroid Build Coastguard Worker       GKI_enable();
359*7eba2f3bSAndroid Build Coastguard Worker 
360*7eba2f3bSAndroid Build Coastguard Worker       p_hdr->task_id = GKI_get_taskid();
361*7eba2f3bSAndroid Build Coastguard Worker 
362*7eba2f3bSAndroid Build Coastguard Worker       p_hdr->status = BUF_STATUS_UNLINKED;
363*7eba2f3bSAndroid Build Coastguard Worker       p_hdr->p_next = nullptr;
364*7eba2f3bSAndroid Build Coastguard Worker       p_hdr->Type = 0;
365*7eba2f3bSAndroid Build Coastguard Worker       return ((void*)((uint8_t*)p_hdr + BUFFER_HDR_SIZE));
366*7eba2f3bSAndroid Build Coastguard Worker     }
367*7eba2f3bSAndroid Build Coastguard Worker   }
368*7eba2f3bSAndroid Build Coastguard Worker 
369*7eba2f3bSAndroid Build Coastguard Worker   LOG(ERROR) << StringPrintf("unable to allocate buffer!!!!!");
370*7eba2f3bSAndroid Build Coastguard Worker 
371*7eba2f3bSAndroid Build Coastguard Worker   GKI_enable();
372*7eba2f3bSAndroid Build Coastguard Worker 
373*7eba2f3bSAndroid Build Coastguard Worker   return (nullptr);
374*7eba2f3bSAndroid Build Coastguard Worker #endif
375*7eba2f3bSAndroid Build Coastguard Worker }
376*7eba2f3bSAndroid Build Coastguard Worker 
377*7eba2f3bSAndroid Build Coastguard Worker /*******************************************************************************
378*7eba2f3bSAndroid Build Coastguard Worker **
379*7eba2f3bSAndroid Build Coastguard Worker ** Function         GKI_getpoolbuf
380*7eba2f3bSAndroid Build Coastguard Worker **
381*7eba2f3bSAndroid Build Coastguard Worker ** Description      Called by an application to get a free buffer from
382*7eba2f3bSAndroid Build Coastguard Worker **                  a specific buffer pool.
383*7eba2f3bSAndroid Build Coastguard Worker **
384*7eba2f3bSAndroid Build Coastguard Worker **                  Note: If there are no more buffers available from the pool,
385*7eba2f3bSAndroid Build Coastguard Worker **                        the public buffers are searched for an available
386*7eba2f3bSAndroid Build Coastguard Worker **                        buffer.
387*7eba2f3bSAndroid Build Coastguard Worker **
388*7eba2f3bSAndroid Build Coastguard Worker ** Parameters       pool_id - (input) pool ID to get a buffer out of.
389*7eba2f3bSAndroid Build Coastguard Worker **
390*7eba2f3bSAndroid Build Coastguard Worker ** Returns          A pointer to the buffer, or NULL if none available
391*7eba2f3bSAndroid Build Coastguard Worker **
392*7eba2f3bSAndroid Build Coastguard Worker *******************************************************************************/
GKI_getpoolbuf(uint8_t pool_id)393*7eba2f3bSAndroid Build Coastguard Worker void* GKI_getpoolbuf(uint8_t pool_id) {
394*7eba2f3bSAndroid Build Coastguard Worker #if defined(DYN_ALLOC) || defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION)
395*7eba2f3bSAndroid Build Coastguard Worker   uint16_t size = 0;
396*7eba2f3bSAndroid Build Coastguard Worker   switch (pool_id) {
397*7eba2f3bSAndroid Build Coastguard Worker     // NFC_NCI_POOL_ID, NFC_RW_POOL_ID and NFC_CE_POOL_ID are all redefined to
398*7eba2f3bSAndroid Build Coastguard Worker     // GKI_POOL_ID_2.
399*7eba2f3bSAndroid Build Coastguard Worker     case GKI_POOL_ID_2:
400*7eba2f3bSAndroid Build Coastguard Worker       size = GKI_BUF2_SIZE;
401*7eba2f3bSAndroid Build Coastguard Worker       break;
402*7eba2f3bSAndroid Build Coastguard Worker 
403*7eba2f3bSAndroid Build Coastguard Worker     // LLCP_POOL_ID, GKI_MAX_BUF_SIZE_POOL_ID are redefined to GKI_POOL_ID_3.
404*7eba2f3bSAndroid Build Coastguard Worker     case GKI_POOL_ID_3:
405*7eba2f3bSAndroid Build Coastguard Worker       size = GKI_BUF3_SIZE;
406*7eba2f3bSAndroid Build Coastguard Worker       break;
407*7eba2f3bSAndroid Build Coastguard Worker 
408*7eba2f3bSAndroid Build Coastguard Worker     default:
409*7eba2f3bSAndroid Build Coastguard Worker       LOG(ERROR) << StringPrintf("Unknown pool ID: %d", pool_id);
410*7eba2f3bSAndroid Build Coastguard Worker #ifndef DYN_ALLOC
411*7eba2f3bSAndroid Build Coastguard Worker       abort();
412*7eba2f3bSAndroid Build Coastguard Worker #else
413*7eba2f3bSAndroid Build Coastguard Worker       return (nullptr);
414*7eba2f3bSAndroid Build Coastguard Worker #endif
415*7eba2f3bSAndroid Build Coastguard Worker       break;
416*7eba2f3bSAndroid Build Coastguard Worker   }
417*7eba2f3bSAndroid Build Coastguard Worker 
418*7eba2f3bSAndroid Build Coastguard Worker   return GKI_getbuf(size);
419*7eba2f3bSAndroid Build Coastguard Worker #else
420*7eba2f3bSAndroid Build Coastguard Worker   FREE_QUEUE_T* Q;
421*7eba2f3bSAndroid Build Coastguard Worker   BUFFER_HDR_T* p_hdr;
422*7eba2f3bSAndroid Build Coastguard Worker   tGKI_COM_CB* p_cb = &gki_cb.com;
423*7eba2f3bSAndroid Build Coastguard Worker 
424*7eba2f3bSAndroid Build Coastguard Worker   if (pool_id >= GKI_NUM_TOTAL_BUF_POOLS) return (nullptr);
425*7eba2f3bSAndroid Build Coastguard Worker 
426*7eba2f3bSAndroid Build Coastguard Worker   /* Make sure the buffers aren't disturbed til finished with allocation */
427*7eba2f3bSAndroid Build Coastguard Worker   GKI_disable();
428*7eba2f3bSAndroid Build Coastguard Worker 
429*7eba2f3bSAndroid Build Coastguard Worker   Q = &p_cb->freeq[pool_id];
430*7eba2f3bSAndroid Build Coastguard Worker   if (Q->cur_cnt < Q->total) {
431*7eba2f3bSAndroid Build Coastguard Worker     if (Q->p_first == nullptr && gki_alloc_free_queue(pool_id) != true)
432*7eba2f3bSAndroid Build Coastguard Worker       return nullptr;
433*7eba2f3bSAndroid Build Coastguard Worker 
434*7eba2f3bSAndroid Build Coastguard Worker     if (Q->p_first == nullptr) {
435*7eba2f3bSAndroid Build Coastguard Worker       /* gki_alloc_free_queue() failed to alloc memory */
436*7eba2f3bSAndroid Build Coastguard Worker       LOG(ERROR) << StringPrintf("fail alloc free queue");
437*7eba2f3bSAndroid Build Coastguard Worker       return nullptr;
438*7eba2f3bSAndroid Build Coastguard Worker     }
439*7eba2f3bSAndroid Build Coastguard Worker 
440*7eba2f3bSAndroid Build Coastguard Worker     p_hdr = Q->p_first;
441*7eba2f3bSAndroid Build Coastguard Worker     Q->p_first = p_hdr->p_next;
442*7eba2f3bSAndroid Build Coastguard Worker 
443*7eba2f3bSAndroid Build Coastguard Worker     if (!Q->p_first) Q->p_last = nullptr;
444*7eba2f3bSAndroid Build Coastguard Worker 
445*7eba2f3bSAndroid Build Coastguard Worker     if (++Q->cur_cnt > Q->max_cnt) Q->max_cnt = Q->cur_cnt;
446*7eba2f3bSAndroid Build Coastguard Worker 
447*7eba2f3bSAndroid Build Coastguard Worker     GKI_enable();
448*7eba2f3bSAndroid Build Coastguard Worker 
449*7eba2f3bSAndroid Build Coastguard Worker     p_hdr->task_id = GKI_get_taskid();
450*7eba2f3bSAndroid Build Coastguard Worker 
451*7eba2f3bSAndroid Build Coastguard Worker     p_hdr->status = BUF_STATUS_UNLINKED;
452*7eba2f3bSAndroid Build Coastguard Worker     p_hdr->p_next = nullptr;
453*7eba2f3bSAndroid Build Coastguard Worker     p_hdr->Type = 0;
454*7eba2f3bSAndroid Build Coastguard Worker 
455*7eba2f3bSAndroid Build Coastguard Worker     return ((void*)((uint8_t*)p_hdr + BUFFER_HDR_SIZE));
456*7eba2f3bSAndroid Build Coastguard Worker   }
457*7eba2f3bSAndroid Build Coastguard Worker 
458*7eba2f3bSAndroid Build Coastguard Worker   /* If here, no buffers in the specified pool */
459*7eba2f3bSAndroid Build Coastguard Worker   GKI_enable();
460*7eba2f3bSAndroid Build Coastguard Worker 
461*7eba2f3bSAndroid Build Coastguard Worker   /* try for free buffers in public pools */
462*7eba2f3bSAndroid Build Coastguard Worker   return (GKI_getbuf(p_cb->freeq[pool_id].size));
463*7eba2f3bSAndroid Build Coastguard Worker #endif
464*7eba2f3bSAndroid Build Coastguard Worker }
465*7eba2f3bSAndroid Build Coastguard Worker 
466*7eba2f3bSAndroid Build Coastguard Worker /*******************************************************************************
467*7eba2f3bSAndroid Build Coastguard Worker **
468*7eba2f3bSAndroid Build Coastguard Worker ** Function         GKI_freebuf
469*7eba2f3bSAndroid Build Coastguard Worker **
470*7eba2f3bSAndroid Build Coastguard Worker ** Description      Called by an application to return a buffer to the free
471*7eba2f3bSAndroid Build Coastguard Worker **                  pool.
472*7eba2f3bSAndroid Build Coastguard Worker **
473*7eba2f3bSAndroid Build Coastguard Worker ** Parameters       p_buf - (input) address of the beginning of a buffer.
474*7eba2f3bSAndroid Build Coastguard Worker **
475*7eba2f3bSAndroid Build Coastguard Worker ** Returns          void
476*7eba2f3bSAndroid Build Coastguard Worker **
477*7eba2f3bSAndroid Build Coastguard Worker *******************************************************************************/
GKI_freebuf(void * p_buf)478*7eba2f3bSAndroid Build Coastguard Worker void GKI_freebuf(void* p_buf) {
479*7eba2f3bSAndroid Build Coastguard Worker   BUFFER_HDR_T* p_hdr;
480*7eba2f3bSAndroid Build Coastguard Worker   FREE_QUEUE_T* Q;
481*7eba2f3bSAndroid Build Coastguard Worker 
482*7eba2f3bSAndroid Build Coastguard Worker #if (GKI_ENABLE_BUF_CORRUPTION_CHECK == TRUE)
483*7eba2f3bSAndroid Build Coastguard Worker   if (!p_buf || gki_chk_buf_damage(p_buf)) {
484*7eba2f3bSAndroid Build Coastguard Worker     GKI_exception(GKI_ERROR_BUF_CORRUPTED, "Free - Buf Corrupted");
485*7eba2f3bSAndroid Build Coastguard Worker     return;
486*7eba2f3bSAndroid Build Coastguard Worker   }
487*7eba2f3bSAndroid Build Coastguard Worker #endif
488*7eba2f3bSAndroid Build Coastguard Worker 
489*7eba2f3bSAndroid Build Coastguard Worker   p_hdr = (BUFFER_HDR_T*)((uint8_t*)p_buf - BUFFER_HDR_SIZE);
490*7eba2f3bSAndroid Build Coastguard Worker 
491*7eba2f3bSAndroid Build Coastguard Worker   if (p_hdr->status != BUF_STATUS_UNLINKED) {
492*7eba2f3bSAndroid Build Coastguard Worker     GKI_exception(GKI_ERROR_FREEBUF_BUF_LINKED, "Freeing Linked Buf");
493*7eba2f3bSAndroid Build Coastguard Worker     return;
494*7eba2f3bSAndroid Build Coastguard Worker   }
495*7eba2f3bSAndroid Build Coastguard Worker 
496*7eba2f3bSAndroid Build Coastguard Worker   if (p_hdr->q_id >= GKI_NUM_TOTAL_BUF_POOLS) {
497*7eba2f3bSAndroid Build Coastguard Worker     GKI_exception(GKI_ERROR_FREEBUF_BAD_QID, "Bad Buf QId");
498*7eba2f3bSAndroid Build Coastguard Worker     return;
499*7eba2f3bSAndroid Build Coastguard Worker   }
500*7eba2f3bSAndroid Build Coastguard Worker 
501*7eba2f3bSAndroid Build Coastguard Worker #if defined(DYN_ALLOC) || defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION)
502*7eba2f3bSAndroid Build Coastguard Worker   GKI_disable();
503*7eba2f3bSAndroid Build Coastguard Worker   Q = &gki_cb.com.freeq[p_hdr->q_id];
504*7eba2f3bSAndroid Build Coastguard Worker   if (Q->cur_cnt > 0) Q->cur_cnt--;
505*7eba2f3bSAndroid Build Coastguard Worker   GKI_enable();
506*7eba2f3bSAndroid Build Coastguard Worker 
507*7eba2f3bSAndroid Build Coastguard Worker   GKI_os_free(p_hdr);
508*7eba2f3bSAndroid Build Coastguard Worker #else
509*7eba2f3bSAndroid Build Coastguard Worker   GKI_disable();
510*7eba2f3bSAndroid Build Coastguard Worker 
511*7eba2f3bSAndroid Build Coastguard Worker   /*
512*7eba2f3bSAndroid Build Coastguard Worker   ** Release the buffer
513*7eba2f3bSAndroid Build Coastguard Worker   */
514*7eba2f3bSAndroid Build Coastguard Worker   Q = &gki_cb.com.freeq[p_hdr->q_id];
515*7eba2f3bSAndroid Build Coastguard Worker   if (Q->p_last)
516*7eba2f3bSAndroid Build Coastguard Worker     Q->p_last->p_next = p_hdr;
517*7eba2f3bSAndroid Build Coastguard Worker   else
518*7eba2f3bSAndroid Build Coastguard Worker     Q->p_first = p_hdr;
519*7eba2f3bSAndroid Build Coastguard Worker 
520*7eba2f3bSAndroid Build Coastguard Worker   Q->p_last = p_hdr;
521*7eba2f3bSAndroid Build Coastguard Worker   p_hdr->p_next = nullptr;
522*7eba2f3bSAndroid Build Coastguard Worker   p_hdr->status = BUF_STATUS_FREE;
523*7eba2f3bSAndroid Build Coastguard Worker   p_hdr->task_id = GKI_INVALID_TASK;
524*7eba2f3bSAndroid Build Coastguard Worker   if (Q->cur_cnt > 0) Q->cur_cnt--;
525*7eba2f3bSAndroid Build Coastguard Worker 
526*7eba2f3bSAndroid Build Coastguard Worker   GKI_enable();
527*7eba2f3bSAndroid Build Coastguard Worker #endif
528*7eba2f3bSAndroid Build Coastguard Worker }
529*7eba2f3bSAndroid Build Coastguard Worker 
530*7eba2f3bSAndroid Build Coastguard Worker /*******************************************************************************
531*7eba2f3bSAndroid Build Coastguard Worker **
532*7eba2f3bSAndroid Build Coastguard Worker ** Function         GKI_get_buf_size
533*7eba2f3bSAndroid Build Coastguard Worker **
534*7eba2f3bSAndroid Build Coastguard Worker ** Description      Called by an application to get the size of a buffer.
535*7eba2f3bSAndroid Build Coastguard Worker **
536*7eba2f3bSAndroid Build Coastguard Worker ** Parameters       p_buf - (input) address of the beginning of a buffer.
537*7eba2f3bSAndroid Build Coastguard Worker **
538*7eba2f3bSAndroid Build Coastguard Worker ** Returns          the size of the buffer
539*7eba2f3bSAndroid Build Coastguard Worker **
540*7eba2f3bSAndroid Build Coastguard Worker *******************************************************************************/
GKI_get_buf_size(void * p_buf)541*7eba2f3bSAndroid Build Coastguard Worker uint16_t GKI_get_buf_size(void* p_buf) {
542*7eba2f3bSAndroid Build Coastguard Worker   BUFFER_HDR_T* p_hdr;
543*7eba2f3bSAndroid Build Coastguard Worker 
544*7eba2f3bSAndroid Build Coastguard Worker   p_hdr = (BUFFER_HDR_T*)((uint8_t*)p_buf - BUFFER_HDR_SIZE);
545*7eba2f3bSAndroid Build Coastguard Worker 
546*7eba2f3bSAndroid Build Coastguard Worker #if defined(DYN_ALLOC) || defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION)
547*7eba2f3bSAndroid Build Coastguard Worker   return p_hdr->size;
548*7eba2f3bSAndroid Build Coastguard Worker #else
549*7eba2f3bSAndroid Build Coastguard Worker   if ((uintptr_t)p_hdr & 1) return (0);
550*7eba2f3bSAndroid Build Coastguard Worker 
551*7eba2f3bSAndroid Build Coastguard Worker   if (p_hdr->q_id < GKI_NUM_TOTAL_BUF_POOLS) {
552*7eba2f3bSAndroid Build Coastguard Worker     return (gki_cb.com.freeq[p_hdr->q_id].size);
553*7eba2f3bSAndroid Build Coastguard Worker   }
554*7eba2f3bSAndroid Build Coastguard Worker 
555*7eba2f3bSAndroid Build Coastguard Worker   return (0);
556*7eba2f3bSAndroid Build Coastguard Worker #endif
557*7eba2f3bSAndroid Build Coastguard Worker }
558*7eba2f3bSAndroid Build Coastguard Worker 
559*7eba2f3bSAndroid Build Coastguard Worker /*******************************************************************************
560*7eba2f3bSAndroid Build Coastguard Worker **
561*7eba2f3bSAndroid Build Coastguard Worker ** Function         gki_chk_buf_damage
562*7eba2f3bSAndroid Build Coastguard Worker **
563*7eba2f3bSAndroid Build Coastguard Worker ** Description      Called internally by OSS to check for buffer corruption.
564*7eba2f3bSAndroid Build Coastguard Worker **
565*7eba2f3bSAndroid Build Coastguard Worker ** Returns          TRUE if there is a problem, else FALSE
566*7eba2f3bSAndroid Build Coastguard Worker **
567*7eba2f3bSAndroid Build Coastguard Worker *******************************************************************************/
gki_chk_buf_damage(void * p_buf)568*7eba2f3bSAndroid Build Coastguard Worker bool gki_chk_buf_damage(void* p_buf) {
569*7eba2f3bSAndroid Build Coastguard Worker #if (GKI_ENABLE_BUF_CORRUPTION_CHECK == TRUE)
570*7eba2f3bSAndroid Build Coastguard Worker 
571*7eba2f3bSAndroid Build Coastguard Worker   uint32_t* magic;
572*7eba2f3bSAndroid Build Coastguard Worker   magic = (uint32_t*)((uint8_t*)p_buf + GKI_get_buf_size(p_buf));
573*7eba2f3bSAndroid Build Coastguard Worker 
574*7eba2f3bSAndroid Build Coastguard Worker   if ((uintptr_t)magic & 1) return true;
575*7eba2f3bSAndroid Build Coastguard Worker 
576*7eba2f3bSAndroid Build Coastguard Worker   if (*magic == MAGIC_NO) return false;
577*7eba2f3bSAndroid Build Coastguard Worker 
578*7eba2f3bSAndroid Build Coastguard Worker   LOG(ERROR) << StringPrintf("%s 0x%x %p", __func__, *magic, p_buf);
579*7eba2f3bSAndroid Build Coastguard Worker   return true;
580*7eba2f3bSAndroid Build Coastguard Worker 
581*7eba2f3bSAndroid Build Coastguard Worker #else
582*7eba2f3bSAndroid Build Coastguard Worker   UNUSED(p_buf);
583*7eba2f3bSAndroid Build Coastguard Worker   return false;
584*7eba2f3bSAndroid Build Coastguard Worker 
585*7eba2f3bSAndroid Build Coastguard Worker #endif
586*7eba2f3bSAndroid Build Coastguard Worker }
587*7eba2f3bSAndroid Build Coastguard Worker 
588*7eba2f3bSAndroid Build Coastguard Worker /*******************************************************************************
589*7eba2f3bSAndroid Build Coastguard Worker **
590*7eba2f3bSAndroid Build Coastguard Worker ** Function         GKI_send_msg
591*7eba2f3bSAndroid Build Coastguard Worker **
592*7eba2f3bSAndroid Build Coastguard Worker ** Description      Called by applications to send a buffer to a task
593*7eba2f3bSAndroid Build Coastguard Worker **
594*7eba2f3bSAndroid Build Coastguard Worker ** Returns          Nothing
595*7eba2f3bSAndroid Build Coastguard Worker **
596*7eba2f3bSAndroid Build Coastguard Worker *******************************************************************************/
GKI_send_msg(uint8_t task_id,uint8_t mbox,void * msg)597*7eba2f3bSAndroid Build Coastguard Worker void GKI_send_msg(uint8_t task_id, uint8_t mbox, void* msg) {
598*7eba2f3bSAndroid Build Coastguard Worker   BUFFER_HDR_T* p_hdr;
599*7eba2f3bSAndroid Build Coastguard Worker   tGKI_COM_CB* p_cb = &gki_cb.com;
600*7eba2f3bSAndroid Build Coastguard Worker 
601*7eba2f3bSAndroid Build Coastguard Worker   /* If task non-existant or not started, drop buffer */
602*7eba2f3bSAndroid Build Coastguard Worker   if ((task_id >= GKI_MAX_TASKS) || (mbox >= NUM_TASK_MBOX) ||
603*7eba2f3bSAndroid Build Coastguard Worker       (p_cb->OSRdyTbl[task_id] == TASK_DEAD)) {
604*7eba2f3bSAndroid Build Coastguard Worker     GKI_exception(GKI_ERROR_SEND_MSG_BAD_DEST, "Sending to unknown dest");
605*7eba2f3bSAndroid Build Coastguard Worker     GKI_freebuf(msg);
606*7eba2f3bSAndroid Build Coastguard Worker     return;
607*7eba2f3bSAndroid Build Coastguard Worker   }
608*7eba2f3bSAndroid Build Coastguard Worker 
609*7eba2f3bSAndroid Build Coastguard Worker #if (GKI_ENABLE_BUF_CORRUPTION_CHECK == TRUE)
610*7eba2f3bSAndroid Build Coastguard Worker   if (gki_chk_buf_damage(msg)) {
611*7eba2f3bSAndroid Build Coastguard Worker     GKI_exception(GKI_ERROR_BUF_CORRUPTED, "Send - Buffer corrupted");
612*7eba2f3bSAndroid Build Coastguard Worker     return;
613*7eba2f3bSAndroid Build Coastguard Worker   }
614*7eba2f3bSAndroid Build Coastguard Worker #endif
615*7eba2f3bSAndroid Build Coastguard Worker 
616*7eba2f3bSAndroid Build Coastguard Worker   p_hdr = (BUFFER_HDR_T*)((uint8_t*)msg - BUFFER_HDR_SIZE);
617*7eba2f3bSAndroid Build Coastguard Worker 
618*7eba2f3bSAndroid Build Coastguard Worker   if (p_hdr->status != BUF_STATUS_UNLINKED) {
619*7eba2f3bSAndroid Build Coastguard Worker     GKI_exception(GKI_ERROR_SEND_MSG_BUF_LINKED, "Send - buffer linked");
620*7eba2f3bSAndroid Build Coastguard Worker     return;
621*7eba2f3bSAndroid Build Coastguard Worker   }
622*7eba2f3bSAndroid Build Coastguard Worker 
623*7eba2f3bSAndroid Build Coastguard Worker   GKI_disable();
624*7eba2f3bSAndroid Build Coastguard Worker 
625*7eba2f3bSAndroid Build Coastguard Worker   if (p_cb->OSTaskQFirst[task_id][mbox])
626*7eba2f3bSAndroid Build Coastguard Worker     p_cb->OSTaskQLast[task_id][mbox]->p_next = p_hdr;
627*7eba2f3bSAndroid Build Coastguard Worker   else
628*7eba2f3bSAndroid Build Coastguard Worker     p_cb->OSTaskQFirst[task_id][mbox] = p_hdr;
629*7eba2f3bSAndroid Build Coastguard Worker 
630*7eba2f3bSAndroid Build Coastguard Worker   p_cb->OSTaskQLast[task_id][mbox] = p_hdr;
631*7eba2f3bSAndroid Build Coastguard Worker 
632*7eba2f3bSAndroid Build Coastguard Worker   p_hdr->p_next = nullptr;
633*7eba2f3bSAndroid Build Coastguard Worker   p_hdr->status = BUF_STATUS_QUEUED;
634*7eba2f3bSAndroid Build Coastguard Worker   p_hdr->task_id = task_id;
635*7eba2f3bSAndroid Build Coastguard Worker 
636*7eba2f3bSAndroid Build Coastguard Worker   GKI_enable();
637*7eba2f3bSAndroid Build Coastguard Worker 
638*7eba2f3bSAndroid Build Coastguard Worker   GKI_send_event(task_id, (uint16_t)EVENT_MASK(mbox));
639*7eba2f3bSAndroid Build Coastguard Worker 
640*7eba2f3bSAndroid Build Coastguard Worker   return;
641*7eba2f3bSAndroid Build Coastguard Worker }
642*7eba2f3bSAndroid Build Coastguard Worker 
643*7eba2f3bSAndroid Build Coastguard Worker /*******************************************************************************
644*7eba2f3bSAndroid Build Coastguard Worker **
645*7eba2f3bSAndroid Build Coastguard Worker ** Function         GKI_read_mbox
646*7eba2f3bSAndroid Build Coastguard Worker **
647*7eba2f3bSAndroid Build Coastguard Worker ** Description      Called by applications to read a buffer from one of
648*7eba2f3bSAndroid Build Coastguard Worker **                  the task mailboxes.  A task can only read its own mailbox.
649*7eba2f3bSAndroid Build Coastguard Worker **
650*7eba2f3bSAndroid Build Coastguard Worker ** Parameters:      mbox  - (input) mailbox ID to read (0, 1, 2, or 3)
651*7eba2f3bSAndroid Build Coastguard Worker **
652*7eba2f3bSAndroid Build Coastguard Worker ** Returns          NULL if the mailbox was empty, else the address of a buffer
653*7eba2f3bSAndroid Build Coastguard Worker **
654*7eba2f3bSAndroid Build Coastguard Worker *******************************************************************************/
GKI_read_mbox(uint8_t mbox)655*7eba2f3bSAndroid Build Coastguard Worker void* GKI_read_mbox(uint8_t mbox) {
656*7eba2f3bSAndroid Build Coastguard Worker   uint8_t task_id = GKI_get_taskid();
657*7eba2f3bSAndroid Build Coastguard Worker   void* p_buf = nullptr;
658*7eba2f3bSAndroid Build Coastguard Worker   BUFFER_HDR_T* p_hdr;
659*7eba2f3bSAndroid Build Coastguard Worker 
660*7eba2f3bSAndroid Build Coastguard Worker   if ((task_id >= GKI_MAX_TASKS) || (mbox >= NUM_TASK_MBOX)) return (nullptr);
661*7eba2f3bSAndroid Build Coastguard Worker 
662*7eba2f3bSAndroid Build Coastguard Worker   GKI_disable();
663*7eba2f3bSAndroid Build Coastguard Worker 
664*7eba2f3bSAndroid Build Coastguard Worker   if (gki_cb.com.OSTaskQFirst[task_id][mbox]) {
665*7eba2f3bSAndroid Build Coastguard Worker     p_hdr = gki_cb.com.OSTaskQFirst[task_id][mbox];
666*7eba2f3bSAndroid Build Coastguard Worker     gki_cb.com.OSTaskQFirst[task_id][mbox] = p_hdr->p_next;
667*7eba2f3bSAndroid Build Coastguard Worker 
668*7eba2f3bSAndroid Build Coastguard Worker     p_hdr->p_next = nullptr;
669*7eba2f3bSAndroid Build Coastguard Worker     p_hdr->status = BUF_STATUS_UNLINKED;
670*7eba2f3bSAndroid Build Coastguard Worker 
671*7eba2f3bSAndroid Build Coastguard Worker     p_buf = (uint8_t*)p_hdr + BUFFER_HDR_SIZE;
672*7eba2f3bSAndroid Build Coastguard Worker   }
673*7eba2f3bSAndroid Build Coastguard Worker 
674*7eba2f3bSAndroid Build Coastguard Worker   GKI_enable();
675*7eba2f3bSAndroid Build Coastguard Worker 
676*7eba2f3bSAndroid Build Coastguard Worker   return (p_buf);
677*7eba2f3bSAndroid Build Coastguard Worker }
678*7eba2f3bSAndroid Build Coastguard Worker 
679*7eba2f3bSAndroid Build Coastguard Worker /*******************************************************************************
680*7eba2f3bSAndroid Build Coastguard Worker **
681*7eba2f3bSAndroid Build Coastguard Worker ** Function         GKI_enqueue
682*7eba2f3bSAndroid Build Coastguard Worker **
683*7eba2f3bSAndroid Build Coastguard Worker ** Description      Enqueue a buffer at the tail of the queue
684*7eba2f3bSAndroid Build Coastguard Worker **
685*7eba2f3bSAndroid Build Coastguard Worker ** Parameters:      p_q  -  (input) pointer to a queue.
686*7eba2f3bSAndroid Build Coastguard Worker **                  p_buf - (input) address of the buffer to enqueue
687*7eba2f3bSAndroid Build Coastguard Worker **
688*7eba2f3bSAndroid Build Coastguard Worker ** Returns          void
689*7eba2f3bSAndroid Build Coastguard Worker **
690*7eba2f3bSAndroid Build Coastguard Worker *******************************************************************************/
GKI_enqueue(BUFFER_Q * p_q,void * p_buf)691*7eba2f3bSAndroid Build Coastguard Worker void GKI_enqueue(BUFFER_Q* p_q, void* p_buf) {
692*7eba2f3bSAndroid Build Coastguard Worker   BUFFER_HDR_T* p_hdr;
693*7eba2f3bSAndroid Build Coastguard Worker 
694*7eba2f3bSAndroid Build Coastguard Worker #if (GKI_ENABLE_BUF_CORRUPTION_CHECK == TRUE)
695*7eba2f3bSAndroid Build Coastguard Worker   if (gki_chk_buf_damage(p_buf)) {
696*7eba2f3bSAndroid Build Coastguard Worker     GKI_exception(GKI_ERROR_BUF_CORRUPTED, "Enqueue - Buffer corrupted");
697*7eba2f3bSAndroid Build Coastguard Worker     return;
698*7eba2f3bSAndroid Build Coastguard Worker   }
699*7eba2f3bSAndroid Build Coastguard Worker #endif
700*7eba2f3bSAndroid Build Coastguard Worker 
701*7eba2f3bSAndroid Build Coastguard Worker   p_hdr = (BUFFER_HDR_T*)((uint8_t*)p_buf - BUFFER_HDR_SIZE);
702*7eba2f3bSAndroid Build Coastguard Worker 
703*7eba2f3bSAndroid Build Coastguard Worker   if (p_hdr->status != BUF_STATUS_UNLINKED) {
704*7eba2f3bSAndroid Build Coastguard Worker     GKI_exception(GKI_ERROR_ENQUEUE_BUF_LINKED, "Eneueue - buf already linked");
705*7eba2f3bSAndroid Build Coastguard Worker     return;
706*7eba2f3bSAndroid Build Coastguard Worker   }
707*7eba2f3bSAndroid Build Coastguard Worker 
708*7eba2f3bSAndroid Build Coastguard Worker   GKI_disable();
709*7eba2f3bSAndroid Build Coastguard Worker 
710*7eba2f3bSAndroid Build Coastguard Worker   /* Since the queue is exposed (C vs C++), keep the pointers in exposed format
711*7eba2f3bSAndroid Build Coastguard Worker    */
712*7eba2f3bSAndroid Build Coastguard Worker   if (p_q->p_first) {
713*7eba2f3bSAndroid Build Coastguard Worker     BUFFER_HDR_T* p_last_hdr =
714*7eba2f3bSAndroid Build Coastguard Worker         (BUFFER_HDR_T*)((uint8_t*)p_q->p_last - BUFFER_HDR_SIZE);
715*7eba2f3bSAndroid Build Coastguard Worker     p_last_hdr->p_next = p_hdr;
716*7eba2f3bSAndroid Build Coastguard Worker   } else
717*7eba2f3bSAndroid Build Coastguard Worker     p_q->p_first = p_buf;
718*7eba2f3bSAndroid Build Coastguard Worker 
719*7eba2f3bSAndroid Build Coastguard Worker   p_q->p_last = p_buf;
720*7eba2f3bSAndroid Build Coastguard Worker   p_q->count++;
721*7eba2f3bSAndroid Build Coastguard Worker 
722*7eba2f3bSAndroid Build Coastguard Worker   p_hdr->p_next = nullptr;
723*7eba2f3bSAndroid Build Coastguard Worker   p_hdr->status = BUF_STATUS_QUEUED;
724*7eba2f3bSAndroid Build Coastguard Worker 
725*7eba2f3bSAndroid Build Coastguard Worker   GKI_enable();
726*7eba2f3bSAndroid Build Coastguard Worker 
727*7eba2f3bSAndroid Build Coastguard Worker   return;
728*7eba2f3bSAndroid Build Coastguard Worker }
729*7eba2f3bSAndroid Build Coastguard Worker 
730*7eba2f3bSAndroid Build Coastguard Worker /*******************************************************************************
731*7eba2f3bSAndroid Build Coastguard Worker **
732*7eba2f3bSAndroid Build Coastguard Worker ** Function         GKI_enqueue_head
733*7eba2f3bSAndroid Build Coastguard Worker **
734*7eba2f3bSAndroid Build Coastguard Worker ** Description      Enqueue a buffer at the head of the queue
735*7eba2f3bSAndroid Build Coastguard Worker **
736*7eba2f3bSAndroid Build Coastguard Worker ** Parameters:      p_q  -  (input) pointer to a queue.
737*7eba2f3bSAndroid Build Coastguard Worker **                  p_buf - (input) address of the buffer to enqueue
738*7eba2f3bSAndroid Build Coastguard Worker **
739*7eba2f3bSAndroid Build Coastguard Worker ** Returns          void
740*7eba2f3bSAndroid Build Coastguard Worker **
741*7eba2f3bSAndroid Build Coastguard Worker *******************************************************************************/
GKI_enqueue_head(BUFFER_Q * p_q,void * p_buf)742*7eba2f3bSAndroid Build Coastguard Worker void GKI_enqueue_head(BUFFER_Q* p_q, void* p_buf) {
743*7eba2f3bSAndroid Build Coastguard Worker   BUFFER_HDR_T* p_hdr;
744*7eba2f3bSAndroid Build Coastguard Worker 
745*7eba2f3bSAndroid Build Coastguard Worker #if (GKI_ENABLE_BUF_CORRUPTION_CHECK == TRUE)
746*7eba2f3bSAndroid Build Coastguard Worker   if (gki_chk_buf_damage(p_buf)) {
747*7eba2f3bSAndroid Build Coastguard Worker     GKI_exception(GKI_ERROR_BUF_CORRUPTED, "Enqueue - Buffer corrupted");
748*7eba2f3bSAndroid Build Coastguard Worker     return;
749*7eba2f3bSAndroid Build Coastguard Worker   }
750*7eba2f3bSAndroid Build Coastguard Worker #endif
751*7eba2f3bSAndroid Build Coastguard Worker 
752*7eba2f3bSAndroid Build Coastguard Worker   p_hdr = (BUFFER_HDR_T*)((uint8_t*)p_buf - BUFFER_HDR_SIZE);
753*7eba2f3bSAndroid Build Coastguard Worker 
754*7eba2f3bSAndroid Build Coastguard Worker   if (p_hdr->status != BUF_STATUS_UNLINKED) {
755*7eba2f3bSAndroid Build Coastguard Worker     GKI_exception(GKI_ERROR_ENQUEUE_BUF_LINKED,
756*7eba2f3bSAndroid Build Coastguard Worker                   "Eneueue head - buf already linked");
757*7eba2f3bSAndroid Build Coastguard Worker     return;
758*7eba2f3bSAndroid Build Coastguard Worker   }
759*7eba2f3bSAndroid Build Coastguard Worker 
760*7eba2f3bSAndroid Build Coastguard Worker   GKI_disable();
761*7eba2f3bSAndroid Build Coastguard Worker 
762*7eba2f3bSAndroid Build Coastguard Worker   if (p_q->p_first) {
763*7eba2f3bSAndroid Build Coastguard Worker     p_hdr->p_next = (BUFFER_HDR_T*)((uint8_t*)p_q->p_first - BUFFER_HDR_SIZE);
764*7eba2f3bSAndroid Build Coastguard Worker     p_q->p_first = p_buf;
765*7eba2f3bSAndroid Build Coastguard Worker   } else {
766*7eba2f3bSAndroid Build Coastguard Worker     p_q->p_first = p_buf;
767*7eba2f3bSAndroid Build Coastguard Worker     p_q->p_last = p_buf;
768*7eba2f3bSAndroid Build Coastguard Worker     p_hdr->p_next = nullptr;
769*7eba2f3bSAndroid Build Coastguard Worker   }
770*7eba2f3bSAndroid Build Coastguard Worker   p_q->count++;
771*7eba2f3bSAndroid Build Coastguard Worker 
772*7eba2f3bSAndroid Build Coastguard Worker   p_hdr->status = BUF_STATUS_QUEUED;
773*7eba2f3bSAndroid Build Coastguard Worker 
774*7eba2f3bSAndroid Build Coastguard Worker   GKI_enable();
775*7eba2f3bSAndroid Build Coastguard Worker 
776*7eba2f3bSAndroid Build Coastguard Worker   return;
777*7eba2f3bSAndroid Build Coastguard Worker }
778*7eba2f3bSAndroid Build Coastguard Worker 
779*7eba2f3bSAndroid Build Coastguard Worker /*******************************************************************************
780*7eba2f3bSAndroid Build Coastguard Worker **
781*7eba2f3bSAndroid Build Coastguard Worker ** Function         GKI_dequeue
782*7eba2f3bSAndroid Build Coastguard Worker **
783*7eba2f3bSAndroid Build Coastguard Worker ** Description      Dequeues a buffer from the head of a queue
784*7eba2f3bSAndroid Build Coastguard Worker **
785*7eba2f3bSAndroid Build Coastguard Worker ** Parameters:      p_q  - (input) pointer to a queue.
786*7eba2f3bSAndroid Build Coastguard Worker **
787*7eba2f3bSAndroid Build Coastguard Worker ** Returns          NULL if queue is empty, else buffer
788*7eba2f3bSAndroid Build Coastguard Worker **
789*7eba2f3bSAndroid Build Coastguard Worker *******************************************************************************/
GKI_dequeue(BUFFER_Q * p_q)790*7eba2f3bSAndroid Build Coastguard Worker void* GKI_dequeue(BUFFER_Q* p_q) {
791*7eba2f3bSAndroid Build Coastguard Worker   BUFFER_HDR_T* p_hdr;
792*7eba2f3bSAndroid Build Coastguard Worker 
793*7eba2f3bSAndroid Build Coastguard Worker   GKI_disable();
794*7eba2f3bSAndroid Build Coastguard Worker 
795*7eba2f3bSAndroid Build Coastguard Worker   if (!p_q || !p_q->count) {
796*7eba2f3bSAndroid Build Coastguard Worker     GKI_enable();
797*7eba2f3bSAndroid Build Coastguard Worker     return (nullptr);
798*7eba2f3bSAndroid Build Coastguard Worker   }
799*7eba2f3bSAndroid Build Coastguard Worker 
800*7eba2f3bSAndroid Build Coastguard Worker   p_hdr = (BUFFER_HDR_T*)((uint8_t*)p_q->p_first - BUFFER_HDR_SIZE);
801*7eba2f3bSAndroid Build Coastguard Worker 
802*7eba2f3bSAndroid Build Coastguard Worker   /* Keep buffers such that GKI header is invisible */
803*7eba2f3bSAndroid Build Coastguard Worker   if (p_hdr->p_next)
804*7eba2f3bSAndroid Build Coastguard Worker     p_q->p_first = ((uint8_t*)p_hdr->p_next + BUFFER_HDR_SIZE);
805*7eba2f3bSAndroid Build Coastguard Worker   else {
806*7eba2f3bSAndroid Build Coastguard Worker     p_q->p_first = nullptr;
807*7eba2f3bSAndroid Build Coastguard Worker     p_q->p_last = nullptr;
808*7eba2f3bSAndroid Build Coastguard Worker   }
809*7eba2f3bSAndroid Build Coastguard Worker 
810*7eba2f3bSAndroid Build Coastguard Worker   p_q->count--;
811*7eba2f3bSAndroid Build Coastguard Worker 
812*7eba2f3bSAndroid Build Coastguard Worker   p_hdr->p_next = nullptr;
813*7eba2f3bSAndroid Build Coastguard Worker   p_hdr->status = BUF_STATUS_UNLINKED;
814*7eba2f3bSAndroid Build Coastguard Worker 
815*7eba2f3bSAndroid Build Coastguard Worker   GKI_enable();
816*7eba2f3bSAndroid Build Coastguard Worker 
817*7eba2f3bSAndroid Build Coastguard Worker   return ((uint8_t*)p_hdr + BUFFER_HDR_SIZE);
818*7eba2f3bSAndroid Build Coastguard Worker }
819*7eba2f3bSAndroid Build Coastguard Worker 
820*7eba2f3bSAndroid Build Coastguard Worker /*******************************************************************************
821*7eba2f3bSAndroid Build Coastguard Worker **
822*7eba2f3bSAndroid Build Coastguard Worker ** Function         GKI_remove_from_queue
823*7eba2f3bSAndroid Build Coastguard Worker **
824*7eba2f3bSAndroid Build Coastguard Worker ** Description      Dequeue a buffer from the middle of the queue
825*7eba2f3bSAndroid Build Coastguard Worker **
826*7eba2f3bSAndroid Build Coastguard Worker ** Parameters:      p_q  - (input) pointer to a queue.
827*7eba2f3bSAndroid Build Coastguard Worker **                  p_buf - (input) address of the buffer to enqueue
828*7eba2f3bSAndroid Build Coastguard Worker **
829*7eba2f3bSAndroid Build Coastguard Worker ** Returns          NULL if queue is empty, else buffer
830*7eba2f3bSAndroid Build Coastguard Worker **
831*7eba2f3bSAndroid Build Coastguard Worker *******************************************************************************/
GKI_remove_from_queue(BUFFER_Q * p_q,void * p_buf)832*7eba2f3bSAndroid Build Coastguard Worker void* GKI_remove_from_queue(BUFFER_Q* p_q, void* p_buf) {
833*7eba2f3bSAndroid Build Coastguard Worker   BUFFER_HDR_T* p_prev;
834*7eba2f3bSAndroid Build Coastguard Worker   BUFFER_HDR_T* p_buf_hdr;
835*7eba2f3bSAndroid Build Coastguard Worker 
836*7eba2f3bSAndroid Build Coastguard Worker   GKI_disable();
837*7eba2f3bSAndroid Build Coastguard Worker 
838*7eba2f3bSAndroid Build Coastguard Worker   if (p_buf == p_q->p_first) {
839*7eba2f3bSAndroid Build Coastguard Worker     GKI_enable();
840*7eba2f3bSAndroid Build Coastguard Worker     return (GKI_dequeue(p_q));
841*7eba2f3bSAndroid Build Coastguard Worker   }
842*7eba2f3bSAndroid Build Coastguard Worker 
843*7eba2f3bSAndroid Build Coastguard Worker   p_buf_hdr = (BUFFER_HDR_T*)((uint8_t*)p_buf - BUFFER_HDR_SIZE);
844*7eba2f3bSAndroid Build Coastguard Worker   p_prev = (BUFFER_HDR_T*)((uint8_t*)p_q->p_first - BUFFER_HDR_SIZE);
845*7eba2f3bSAndroid Build Coastguard Worker 
846*7eba2f3bSAndroid Build Coastguard Worker   for (; p_prev; p_prev = p_prev->p_next) {
847*7eba2f3bSAndroid Build Coastguard Worker     /* If the previous points to this one, move the pointers around */
848*7eba2f3bSAndroid Build Coastguard Worker     if (p_prev->p_next == p_buf_hdr) {
849*7eba2f3bSAndroid Build Coastguard Worker       p_prev->p_next = p_buf_hdr->p_next;
850*7eba2f3bSAndroid Build Coastguard Worker 
851*7eba2f3bSAndroid Build Coastguard Worker       /* If we are removing the last guy in the queue, update p_last */
852*7eba2f3bSAndroid Build Coastguard Worker       if (p_buf == p_q->p_last) p_q->p_last = p_prev + 1;
853*7eba2f3bSAndroid Build Coastguard Worker 
854*7eba2f3bSAndroid Build Coastguard Worker       /* One less in the queue */
855*7eba2f3bSAndroid Build Coastguard Worker       p_q->count--;
856*7eba2f3bSAndroid Build Coastguard Worker 
857*7eba2f3bSAndroid Build Coastguard Worker       /* The buffer is now unlinked */
858*7eba2f3bSAndroid Build Coastguard Worker       p_buf_hdr->p_next = nullptr;
859*7eba2f3bSAndroid Build Coastguard Worker       p_buf_hdr->status = BUF_STATUS_UNLINKED;
860*7eba2f3bSAndroid Build Coastguard Worker 
861*7eba2f3bSAndroid Build Coastguard Worker       GKI_enable();
862*7eba2f3bSAndroid Build Coastguard Worker       return (p_buf);
863*7eba2f3bSAndroid Build Coastguard Worker     }
864*7eba2f3bSAndroid Build Coastguard Worker   }
865*7eba2f3bSAndroid Build Coastguard Worker 
866*7eba2f3bSAndroid Build Coastguard Worker   GKI_enable();
867*7eba2f3bSAndroid Build Coastguard Worker   return (nullptr);
868*7eba2f3bSAndroid Build Coastguard Worker }
869*7eba2f3bSAndroid Build Coastguard Worker 
870*7eba2f3bSAndroid Build Coastguard Worker /*******************************************************************************
871*7eba2f3bSAndroid Build Coastguard Worker **
872*7eba2f3bSAndroid Build Coastguard Worker ** Function         GKI_getfirst
873*7eba2f3bSAndroid Build Coastguard Worker **
874*7eba2f3bSAndroid Build Coastguard Worker ** Description      Return a pointer to the first buffer in a queue
875*7eba2f3bSAndroid Build Coastguard Worker **
876*7eba2f3bSAndroid Build Coastguard Worker ** Parameters:      p_q  - (input) pointer to a queue.
877*7eba2f3bSAndroid Build Coastguard Worker **
878*7eba2f3bSAndroid Build Coastguard Worker ** Returns          NULL if queue is empty, else buffer address
879*7eba2f3bSAndroid Build Coastguard Worker **
880*7eba2f3bSAndroid Build Coastguard Worker *******************************************************************************/
GKI_getfirst(BUFFER_Q * p_q)881*7eba2f3bSAndroid Build Coastguard Worker void* GKI_getfirst(BUFFER_Q* p_q) { return (p_q->p_first); }
882*7eba2f3bSAndroid Build Coastguard Worker 
883*7eba2f3bSAndroid Build Coastguard Worker /*******************************************************************************
884*7eba2f3bSAndroid Build Coastguard Worker **
885*7eba2f3bSAndroid Build Coastguard Worker ** Function         GKI_getlast
886*7eba2f3bSAndroid Build Coastguard Worker **
887*7eba2f3bSAndroid Build Coastguard Worker ** Description      Return a pointer to the last buffer in a queue
888*7eba2f3bSAndroid Build Coastguard Worker **
889*7eba2f3bSAndroid Build Coastguard Worker ** Parameters:      p_q  - (input) pointer to a queue.
890*7eba2f3bSAndroid Build Coastguard Worker **
891*7eba2f3bSAndroid Build Coastguard Worker ** Returns          NULL if queue is empty, else buffer address
892*7eba2f3bSAndroid Build Coastguard Worker **
893*7eba2f3bSAndroid Build Coastguard Worker *******************************************************************************/
GKI_getlast(BUFFER_Q * p_q)894*7eba2f3bSAndroid Build Coastguard Worker void* GKI_getlast(BUFFER_Q* p_q) { return (p_q->p_last); }
895*7eba2f3bSAndroid Build Coastguard Worker 
896*7eba2f3bSAndroid Build Coastguard Worker /*******************************************************************************
897*7eba2f3bSAndroid Build Coastguard Worker **
898*7eba2f3bSAndroid Build Coastguard Worker ** Function         GKI_getnext
899*7eba2f3bSAndroid Build Coastguard Worker **
900*7eba2f3bSAndroid Build Coastguard Worker ** Description      Return a pointer to the next buffer in a queue
901*7eba2f3bSAndroid Build Coastguard Worker **
902*7eba2f3bSAndroid Build Coastguard Worker ** Parameters:      p_buf - (input) pointer to the buffer to find the next one
903*7eba2f3bSAndroid Build Coastguard Worker **                                  from.
904*7eba2f3bSAndroid Build Coastguard Worker **
905*7eba2f3bSAndroid Build Coastguard Worker ** Returns          NULL if no more buffers in the queue, else next buffer
906*7eba2f3bSAndroid Build Coastguard Worker **                  address
907*7eba2f3bSAndroid Build Coastguard Worker **
908*7eba2f3bSAndroid Build Coastguard Worker *******************************************************************************/
GKI_getnext(void * p_buf)909*7eba2f3bSAndroid Build Coastguard Worker void* GKI_getnext(void* p_buf) {
910*7eba2f3bSAndroid Build Coastguard Worker   BUFFER_HDR_T* p_hdr;
911*7eba2f3bSAndroid Build Coastguard Worker 
912*7eba2f3bSAndroid Build Coastguard Worker   p_hdr = (BUFFER_HDR_T*)((uint8_t*)p_buf - BUFFER_HDR_SIZE);
913*7eba2f3bSAndroid Build Coastguard Worker 
914*7eba2f3bSAndroid Build Coastguard Worker   if (p_hdr->p_next)
915*7eba2f3bSAndroid Build Coastguard Worker     return ((uint8_t*)p_hdr->p_next + BUFFER_HDR_SIZE);
916*7eba2f3bSAndroid Build Coastguard Worker   else
917*7eba2f3bSAndroid Build Coastguard Worker     return (nullptr);
918*7eba2f3bSAndroid Build Coastguard Worker }
919*7eba2f3bSAndroid Build Coastguard Worker 
920*7eba2f3bSAndroid Build Coastguard Worker /*******************************************************************************
921*7eba2f3bSAndroid Build Coastguard Worker **
922*7eba2f3bSAndroid Build Coastguard Worker ** Function         GKI_queue_is_empty
923*7eba2f3bSAndroid Build Coastguard Worker **
924*7eba2f3bSAndroid Build Coastguard Worker ** Description      Check the status of a queue.
925*7eba2f3bSAndroid Build Coastguard Worker **
926*7eba2f3bSAndroid Build Coastguard Worker ** Parameters:      p_q  - (input) pointer to a queue.
927*7eba2f3bSAndroid Build Coastguard Worker **
928*7eba2f3bSAndroid Build Coastguard Worker ** Returns          TRUE if queue is empty, else FALSE
929*7eba2f3bSAndroid Build Coastguard Worker **
930*7eba2f3bSAndroid Build Coastguard Worker *******************************************************************************/
GKI_queue_is_empty(BUFFER_Q * p_q)931*7eba2f3bSAndroid Build Coastguard Worker bool GKI_queue_is_empty(BUFFER_Q* p_q) { return ((bool)(p_q->count == 0)); }
932*7eba2f3bSAndroid Build Coastguard Worker 
933*7eba2f3bSAndroid Build Coastguard Worker /*******************************************************************************
934*7eba2f3bSAndroid Build Coastguard Worker **
935*7eba2f3bSAndroid Build Coastguard Worker ** Function         GKI_find_buf_start
936*7eba2f3bSAndroid Build Coastguard Worker **
937*7eba2f3bSAndroid Build Coastguard Worker ** Description      This function is called with an address inside a buffer,
938*7eba2f3bSAndroid Build Coastguard Worker **                  and returns the start address ofthe buffer.
939*7eba2f3bSAndroid Build Coastguard Worker **
940*7eba2f3bSAndroid Build Coastguard Worker **                  The buffer should be one allocated from one of GKI's pools.
941*7eba2f3bSAndroid Build Coastguard Worker **
942*7eba2f3bSAndroid Build Coastguard Worker ** Parameters:      p_user_area - (input) address of anywhere in a GKI buffer.
943*7eba2f3bSAndroid Build Coastguard Worker **
944*7eba2f3bSAndroid Build Coastguard Worker ** Returns          void * - Address of the beginning of the specified buffer if
945*7eba2f3bSAndroid Build Coastguard Worker **                           successful, otherwise NULL if unsuccessful
946*7eba2f3bSAndroid Build Coastguard Worker **
947*7eba2f3bSAndroid Build Coastguard Worker *******************************************************************************/
GKI_find_buf_start(void * p_user_area)948*7eba2f3bSAndroid Build Coastguard Worker void* GKI_find_buf_start(void* p_user_area) {
949*7eba2f3bSAndroid Build Coastguard Worker   uint16_t xx, size;
950*7eba2f3bSAndroid Build Coastguard Worker   uint32_t yy;
951*7eba2f3bSAndroid Build Coastguard Worker   tGKI_COM_CB* p_cb = &gki_cb.com;
952*7eba2f3bSAndroid Build Coastguard Worker   uint8_t* p_ua = (uint8_t*)p_user_area;
953*7eba2f3bSAndroid Build Coastguard Worker 
954*7eba2f3bSAndroid Build Coastguard Worker   for (xx = 0; xx < GKI_NUM_TOTAL_BUF_POOLS; xx++) {
955*7eba2f3bSAndroid Build Coastguard Worker     if ((p_ua > p_cb->pool_start[xx]) && (p_ua < p_cb->pool_end[xx])) {
956*7eba2f3bSAndroid Build Coastguard Worker       yy = (uint32_t)(p_ua - p_cb->pool_start[xx]);
957*7eba2f3bSAndroid Build Coastguard Worker 
958*7eba2f3bSAndroid Build Coastguard Worker       size = p_cb->pool_size[xx];
959*7eba2f3bSAndroid Build Coastguard Worker 
960*7eba2f3bSAndroid Build Coastguard Worker       yy = (yy / size) * size;
961*7eba2f3bSAndroid Build Coastguard Worker 
962*7eba2f3bSAndroid Build Coastguard Worker       return ((void*)(p_cb->pool_start[xx] + yy + sizeof(BUFFER_HDR_T)));
963*7eba2f3bSAndroid Build Coastguard Worker     }
964*7eba2f3bSAndroid Build Coastguard Worker   }
965*7eba2f3bSAndroid Build Coastguard Worker 
966*7eba2f3bSAndroid Build Coastguard Worker   /* If here, invalid address - not in one of our buffers */
967*7eba2f3bSAndroid Build Coastguard Worker   GKI_exception(GKI_ERROR_BUF_SIZE_ZERO, "GKI_get_buf_start:: bad addr");
968*7eba2f3bSAndroid Build Coastguard Worker 
969*7eba2f3bSAndroid Build Coastguard Worker   return (nullptr);
970*7eba2f3bSAndroid Build Coastguard Worker }
971*7eba2f3bSAndroid Build Coastguard Worker 
972*7eba2f3bSAndroid Build Coastguard Worker /********************************************************
973*7eba2f3bSAndroid Build Coastguard Worker  * The following functions are not needed for light stack
974*7eba2f3bSAndroid Build Coastguard Worker  *********************************************************/
975*7eba2f3bSAndroid Build Coastguard Worker #ifndef BTU_STACK_LITE_ENABLED
976*7eba2f3bSAndroid Build Coastguard Worker #define BTU_STACK_LITE_ENABLED FALSE
977*7eba2f3bSAndroid Build Coastguard Worker #endif
978*7eba2f3bSAndroid Build Coastguard Worker 
979*7eba2f3bSAndroid Build Coastguard Worker #if (BTU_STACK_LITE_ENABLED == FALSE)
980*7eba2f3bSAndroid Build Coastguard Worker 
981*7eba2f3bSAndroid Build Coastguard Worker /*******************************************************************************
982*7eba2f3bSAndroid Build Coastguard Worker **
983*7eba2f3bSAndroid Build Coastguard Worker ** Function         GKI_set_pool_permission
984*7eba2f3bSAndroid Build Coastguard Worker **
985*7eba2f3bSAndroid Build Coastguard Worker ** Description      This function is called to set or change the permissions for
986*7eba2f3bSAndroid Build Coastguard Worker **                  the specified pool ID.
987*7eba2f3bSAndroid Build Coastguard Worker **
988*7eba2f3bSAndroid Build Coastguard Worker ** Parameters       pool_id - (input) pool ID to be set or changed
989*7eba2f3bSAndroid Build Coastguard Worker **                  permission - (input) GKI_PUBLIC_POOL or GKI_RESTRICTED_POOL
990*7eba2f3bSAndroid Build Coastguard Worker **
991*7eba2f3bSAndroid Build Coastguard Worker ** Returns          GKI_SUCCESS if successful
992*7eba2f3bSAndroid Build Coastguard Worker **                  GKI_INVALID_POOL if unsuccessful
993*7eba2f3bSAndroid Build Coastguard Worker **
994*7eba2f3bSAndroid Build Coastguard Worker *******************************************************************************/
GKI_set_pool_permission(uint8_t pool_id,uint8_t permission)995*7eba2f3bSAndroid Build Coastguard Worker uint8_t GKI_set_pool_permission(uint8_t pool_id, uint8_t permission) {
996*7eba2f3bSAndroid Build Coastguard Worker   tGKI_COM_CB* p_cb = &gki_cb.com;
997*7eba2f3bSAndroid Build Coastguard Worker 
998*7eba2f3bSAndroid Build Coastguard Worker   if (pool_id < GKI_NUM_TOTAL_BUF_POOLS) {
999*7eba2f3bSAndroid Build Coastguard Worker     if (permission == GKI_RESTRICTED_POOL)
1000*7eba2f3bSAndroid Build Coastguard Worker       p_cb->pool_access_mask =
1001*7eba2f3bSAndroid Build Coastguard Worker           (uint16_t)(p_cb->pool_access_mask | (1 << pool_id));
1002*7eba2f3bSAndroid Build Coastguard Worker 
1003*7eba2f3bSAndroid Build Coastguard Worker     else /* mark the pool as public */
1004*7eba2f3bSAndroid Build Coastguard Worker       p_cb->pool_access_mask =
1005*7eba2f3bSAndroid Build Coastguard Worker           (uint16_t)(p_cb->pool_access_mask & ~(1 << pool_id));
1006*7eba2f3bSAndroid Build Coastguard Worker 
1007*7eba2f3bSAndroid Build Coastguard Worker     return (GKI_SUCCESS);
1008*7eba2f3bSAndroid Build Coastguard Worker   } else
1009*7eba2f3bSAndroid Build Coastguard Worker     return (GKI_INVALID_POOL);
1010*7eba2f3bSAndroid Build Coastguard Worker }
1011*7eba2f3bSAndroid Build Coastguard Worker 
1012*7eba2f3bSAndroid Build Coastguard Worker /*******************************************************************************
1013*7eba2f3bSAndroid Build Coastguard Worker **
1014*7eba2f3bSAndroid Build Coastguard Worker ** Function         gki_add_to_pool_list
1015*7eba2f3bSAndroid Build Coastguard Worker **
1016*7eba2f3bSAndroid Build Coastguard Worker ** Description      Adds pool to the pool list which is arranged in the
1017*7eba2f3bSAndroid Build Coastguard Worker **                  order of size
1018*7eba2f3bSAndroid Build Coastguard Worker **
1019*7eba2f3bSAndroid Build Coastguard Worker ** Returns          void
1020*7eba2f3bSAndroid Build Coastguard Worker **
1021*7eba2f3bSAndroid Build Coastguard Worker *******************************************************************************/
gki_add_to_pool_list(uint8_t pool_id)1022*7eba2f3bSAndroid Build Coastguard Worker static void gki_add_to_pool_list(uint8_t pool_id) {
1023*7eba2f3bSAndroid Build Coastguard Worker   int32_t i, j;
1024*7eba2f3bSAndroid Build Coastguard Worker   tGKI_COM_CB* p_cb = &gki_cb.com;
1025*7eba2f3bSAndroid Build Coastguard Worker 
1026*7eba2f3bSAndroid Build Coastguard Worker   /* Find the position where the specified pool should be inserted into the list
1027*7eba2f3bSAndroid Build Coastguard Worker    */
1028*7eba2f3bSAndroid Build Coastguard Worker   for (i = 0; i < p_cb->curr_total_no_of_pools; i++) {
1029*7eba2f3bSAndroid Build Coastguard Worker     if (p_cb->freeq[pool_id].size <= p_cb->freeq[p_cb->pool_list[i]].size)
1030*7eba2f3bSAndroid Build Coastguard Worker       break;
1031*7eba2f3bSAndroid Build Coastguard Worker   }
1032*7eba2f3bSAndroid Build Coastguard Worker 
1033*7eba2f3bSAndroid Build Coastguard Worker   /* Insert the new buffer pool ID into the list of pools */
1034*7eba2f3bSAndroid Build Coastguard Worker   for (j = p_cb->curr_total_no_of_pools; j > i; j--) {
1035*7eba2f3bSAndroid Build Coastguard Worker     p_cb->pool_list[j] = p_cb->pool_list[j - 1];
1036*7eba2f3bSAndroid Build Coastguard Worker   }
1037*7eba2f3bSAndroid Build Coastguard Worker 
1038*7eba2f3bSAndroid Build Coastguard Worker   p_cb->pool_list[i] = pool_id;
1039*7eba2f3bSAndroid Build Coastguard Worker 
1040*7eba2f3bSAndroid Build Coastguard Worker   return;
1041*7eba2f3bSAndroid Build Coastguard Worker }
1042*7eba2f3bSAndroid Build Coastguard Worker 
1043*7eba2f3bSAndroid Build Coastguard Worker /*******************************************************************************
1044*7eba2f3bSAndroid Build Coastguard Worker **
1045*7eba2f3bSAndroid Build Coastguard Worker ** Function         gki_remove_from_pool_list
1046*7eba2f3bSAndroid Build Coastguard Worker **
1047*7eba2f3bSAndroid Build Coastguard Worker ** Description      Removes pool from the pool list. Called when a pool is
1048*7eba2f3bSAndroid Build Coastguard Worker **                  deleted
1049*7eba2f3bSAndroid Build Coastguard Worker **
1050*7eba2f3bSAndroid Build Coastguard Worker ** Returns          void
1051*7eba2f3bSAndroid Build Coastguard Worker **
1052*7eba2f3bSAndroid Build Coastguard Worker *******************************************************************************/
gki_remove_from_pool_list(uint8_t pool_id)1053*7eba2f3bSAndroid Build Coastguard Worker static void gki_remove_from_pool_list(uint8_t pool_id) {
1054*7eba2f3bSAndroid Build Coastguard Worker   tGKI_COM_CB* p_cb = &gki_cb.com;
1055*7eba2f3bSAndroid Build Coastguard Worker   uint8_t i;
1056*7eba2f3bSAndroid Build Coastguard Worker 
1057*7eba2f3bSAndroid Build Coastguard Worker   for (i = 0; i < p_cb->curr_total_no_of_pools; i++) {
1058*7eba2f3bSAndroid Build Coastguard Worker     if (pool_id == p_cb->pool_list[i]) break;
1059*7eba2f3bSAndroid Build Coastguard Worker   }
1060*7eba2f3bSAndroid Build Coastguard Worker 
1061*7eba2f3bSAndroid Build Coastguard Worker   while (i < (p_cb->curr_total_no_of_pools - 1)) {
1062*7eba2f3bSAndroid Build Coastguard Worker     p_cb->pool_list[i] = p_cb->pool_list[i + 1];
1063*7eba2f3bSAndroid Build Coastguard Worker     i++;
1064*7eba2f3bSAndroid Build Coastguard Worker   }
1065*7eba2f3bSAndroid Build Coastguard Worker 
1066*7eba2f3bSAndroid Build Coastguard Worker   return;
1067*7eba2f3bSAndroid Build Coastguard Worker }
1068*7eba2f3bSAndroid Build Coastguard Worker 
1069*7eba2f3bSAndroid Build Coastguard Worker /*******************************************************************************
1070*7eba2f3bSAndroid Build Coastguard Worker **
1071*7eba2f3bSAndroid Build Coastguard Worker ** Function         GKI_poolcount
1072*7eba2f3bSAndroid Build Coastguard Worker **
1073*7eba2f3bSAndroid Build Coastguard Worker ** Description      Called by an application to get the total number of buffers
1074*7eba2f3bSAndroid Build Coastguard Worker **                  in the specified buffer pool.
1075*7eba2f3bSAndroid Build Coastguard Worker **
1076*7eba2f3bSAndroid Build Coastguard Worker ** Parameters       pool_id - (input) pool ID to get the free count of.
1077*7eba2f3bSAndroid Build Coastguard Worker **
1078*7eba2f3bSAndroid Build Coastguard Worker ** Returns          the total number of buffers in the pool
1079*7eba2f3bSAndroid Build Coastguard Worker **
1080*7eba2f3bSAndroid Build Coastguard Worker *******************************************************************************/
GKI_poolcount(uint8_t pool_id)1081*7eba2f3bSAndroid Build Coastguard Worker uint16_t GKI_poolcount(uint8_t pool_id) {
1082*7eba2f3bSAndroid Build Coastguard Worker   if (pool_id >= GKI_NUM_TOTAL_BUF_POOLS) return (0);
1083*7eba2f3bSAndroid Build Coastguard Worker 
1084*7eba2f3bSAndroid Build Coastguard Worker   return (gki_cb.com.freeq[pool_id].total);
1085*7eba2f3bSAndroid Build Coastguard Worker }
1086*7eba2f3bSAndroid Build Coastguard Worker 
1087*7eba2f3bSAndroid Build Coastguard Worker /*******************************************************************************
1088*7eba2f3bSAndroid Build Coastguard Worker **
1089*7eba2f3bSAndroid Build Coastguard Worker ** Function         GKI_poolfreecount
1090*7eba2f3bSAndroid Build Coastguard Worker **
1091*7eba2f3bSAndroid Build Coastguard Worker ** Description      Called by an application to get the number of free buffers
1092*7eba2f3bSAndroid Build Coastguard Worker **                  in the specified buffer pool.
1093*7eba2f3bSAndroid Build Coastguard Worker **
1094*7eba2f3bSAndroid Build Coastguard Worker ** Parameters       pool_id - (input) pool ID to get the free count of.
1095*7eba2f3bSAndroid Build Coastguard Worker **
1096*7eba2f3bSAndroid Build Coastguard Worker ** Returns          the number of free buffers in the pool
1097*7eba2f3bSAndroid Build Coastguard Worker **
1098*7eba2f3bSAndroid Build Coastguard Worker *******************************************************************************/
GKI_poolfreecount(uint8_t pool_id)1099*7eba2f3bSAndroid Build Coastguard Worker uint16_t GKI_poolfreecount(uint8_t pool_id) {
1100*7eba2f3bSAndroid Build Coastguard Worker   FREE_QUEUE_T* Q;
1101*7eba2f3bSAndroid Build Coastguard Worker 
1102*7eba2f3bSAndroid Build Coastguard Worker   if (pool_id >= GKI_NUM_TOTAL_BUF_POOLS) return (0);
1103*7eba2f3bSAndroid Build Coastguard Worker 
1104*7eba2f3bSAndroid Build Coastguard Worker   Q = &gki_cb.com.freeq[pool_id];
1105*7eba2f3bSAndroid Build Coastguard Worker 
1106*7eba2f3bSAndroid Build Coastguard Worker   return ((uint16_t)(Q->total - Q->cur_cnt));
1107*7eba2f3bSAndroid Build Coastguard Worker }
1108*7eba2f3bSAndroid Build Coastguard Worker 
1109*7eba2f3bSAndroid Build Coastguard Worker /*******************************************************************************
1110*7eba2f3bSAndroid Build Coastguard Worker **
1111*7eba2f3bSAndroid Build Coastguard Worker ** Function         GKI_change_buf_owner
1112*7eba2f3bSAndroid Build Coastguard Worker **
1113*7eba2f3bSAndroid Build Coastguard Worker ** Description      Called to change the task ownership of a buffer.
1114*7eba2f3bSAndroid Build Coastguard Worker **
1115*7eba2f3bSAndroid Build Coastguard Worker ** Parameters:      p_buf   - (input) pointer to the buffer
1116*7eba2f3bSAndroid Build Coastguard Worker **                  task_id - (input) task id to change ownership to
1117*7eba2f3bSAndroid Build Coastguard Worker **
1118*7eba2f3bSAndroid Build Coastguard Worker ** Returns          void
1119*7eba2f3bSAndroid Build Coastguard Worker **
1120*7eba2f3bSAndroid Build Coastguard Worker *******************************************************************************/
GKI_change_buf_owner(void * p_buf,uint8_t task_id)1121*7eba2f3bSAndroid Build Coastguard Worker void GKI_change_buf_owner(void* p_buf, uint8_t task_id) {
1122*7eba2f3bSAndroid Build Coastguard Worker   BUFFER_HDR_T* p_hdr = (BUFFER_HDR_T*)((uint8_t*)p_buf - BUFFER_HDR_SIZE);
1123*7eba2f3bSAndroid Build Coastguard Worker 
1124*7eba2f3bSAndroid Build Coastguard Worker   p_hdr->task_id = task_id;
1125*7eba2f3bSAndroid Build Coastguard Worker 
1126*7eba2f3bSAndroid Build Coastguard Worker   return;
1127*7eba2f3bSAndroid Build Coastguard Worker }
1128*7eba2f3bSAndroid Build Coastguard Worker 
1129*7eba2f3bSAndroid Build Coastguard Worker #if (GKI_SEND_MSG_FROM_ISR == TRUE)
1130*7eba2f3bSAndroid Build Coastguard Worker /*******************************************************************************
1131*7eba2f3bSAndroid Build Coastguard Worker **
1132*7eba2f3bSAndroid Build Coastguard Worker ** Function         GKI_isend_msg
1133*7eba2f3bSAndroid Build Coastguard Worker **
1134*7eba2f3bSAndroid Build Coastguard Worker ** Description      Called from interrupt context to send a buffer to a task
1135*7eba2f3bSAndroid Build Coastguard Worker **
1136*7eba2f3bSAndroid Build Coastguard Worker ** Returns          Nothing
1137*7eba2f3bSAndroid Build Coastguard Worker **
1138*7eba2f3bSAndroid Build Coastguard Worker *******************************************************************************/
GKI_isend_msg(uint8_t task_id,uint8_t mbox,void * msg)1139*7eba2f3bSAndroid Build Coastguard Worker void GKI_isend_msg(uint8_t task_id, uint8_t mbox, void* msg) {
1140*7eba2f3bSAndroid Build Coastguard Worker   BUFFER_HDR_T* p_hdr;
1141*7eba2f3bSAndroid Build Coastguard Worker   tGKI_COM_CB* p_cb = &gki_cb.com;
1142*7eba2f3bSAndroid Build Coastguard Worker 
1143*7eba2f3bSAndroid Build Coastguard Worker   /* If task non-existant or not started, drop buffer */
1144*7eba2f3bSAndroid Build Coastguard Worker   if ((task_id >= GKI_MAX_TASKS) || (mbox >= NUM_TASK_MBOX) ||
1145*7eba2f3bSAndroid Build Coastguard Worker       (p_cb->OSRdyTbl[task_id] == TASK_DEAD)) {
1146*7eba2f3bSAndroid Build Coastguard Worker     GKI_exception(GKI_ERROR_SEND_MSG_BAD_DEST, "Sending to unknown dest");
1147*7eba2f3bSAndroid Build Coastguard Worker     GKI_freebuf(msg);
1148*7eba2f3bSAndroid Build Coastguard Worker     return;
1149*7eba2f3bSAndroid Build Coastguard Worker   }
1150*7eba2f3bSAndroid Build Coastguard Worker 
1151*7eba2f3bSAndroid Build Coastguard Worker #if (GKI_ENABLE_BUF_CORRUPTION_CHECK == TRUE)
1152*7eba2f3bSAndroid Build Coastguard Worker   if (gki_chk_buf_damage(msg)) {
1153*7eba2f3bSAndroid Build Coastguard Worker     GKI_exception(GKI_ERROR_BUF_CORRUPTED, "Send - Buffer corrupted");
1154*7eba2f3bSAndroid Build Coastguard Worker     return;
1155*7eba2f3bSAndroid Build Coastguard Worker   }
1156*7eba2f3bSAndroid Build Coastguard Worker #endif
1157*7eba2f3bSAndroid Build Coastguard Worker 
1158*7eba2f3bSAndroid Build Coastguard Worker #if (GKI_ENABLE_OWNER_CHECK == TRUE)
1159*7eba2f3bSAndroid Build Coastguard Worker   if (gki_chk_buf_owner(msg)) {
1160*7eba2f3bSAndroid Build Coastguard Worker     GKI_exception(GKI_ERROR_NOT_BUF_OWNER, "Send by non-owner");
1161*7eba2f3bSAndroid Build Coastguard Worker     return;
1162*7eba2f3bSAndroid Build Coastguard Worker   }
1163*7eba2f3bSAndroid Build Coastguard Worker #endif
1164*7eba2f3bSAndroid Build Coastguard Worker 
1165*7eba2f3bSAndroid Build Coastguard Worker   p_hdr = (BUFFER_HDR_T*)((uint8_t*)msg - BUFFER_HDR_SIZE);
1166*7eba2f3bSAndroid Build Coastguard Worker 
1167*7eba2f3bSAndroid Build Coastguard Worker   if (p_hdr->status != BUF_STATUS_UNLINKED) {
1168*7eba2f3bSAndroid Build Coastguard Worker     GKI_exception(GKI_ERROR_SEND_MSG_BUF_LINKED, "Send - buffer linked");
1169*7eba2f3bSAndroid Build Coastguard Worker     return;
1170*7eba2f3bSAndroid Build Coastguard Worker   }
1171*7eba2f3bSAndroid Build Coastguard Worker 
1172*7eba2f3bSAndroid Build Coastguard Worker   if (p_cb->OSTaskQFirst[task_id][mbox])
1173*7eba2f3bSAndroid Build Coastguard Worker     p_cb->OSTaskQLast[task_id][mbox]->p_next = p_hdr;
1174*7eba2f3bSAndroid Build Coastguard Worker   else
1175*7eba2f3bSAndroid Build Coastguard Worker     p_cb->OSTaskQFirst[task_id][mbox] = p_hdr;
1176*7eba2f3bSAndroid Build Coastguard Worker 
1177*7eba2f3bSAndroid Build Coastguard Worker   p_cb->OSTaskQLast[task_id][mbox] = p_hdr;
1178*7eba2f3bSAndroid Build Coastguard Worker 
1179*7eba2f3bSAndroid Build Coastguard Worker   p_hdr->p_next = NULL;
1180*7eba2f3bSAndroid Build Coastguard Worker   p_hdr->status = BUF_STATUS_QUEUED;
1181*7eba2f3bSAndroid Build Coastguard Worker   p_hdr->task_id = task_id;
1182*7eba2f3bSAndroid Build Coastguard Worker 
1183*7eba2f3bSAndroid Build Coastguard Worker   GKI_isend_event(task_id, (uint16_t)EVENT_MASK(mbox));
1184*7eba2f3bSAndroid Build Coastguard Worker 
1185*7eba2f3bSAndroid Build Coastguard Worker   return;
1186*7eba2f3bSAndroid Build Coastguard Worker }
1187*7eba2f3bSAndroid Build Coastguard Worker #endif
1188*7eba2f3bSAndroid Build Coastguard Worker 
1189*7eba2f3bSAndroid Build Coastguard Worker /*******************************************************************************
1190*7eba2f3bSAndroid Build Coastguard Worker **
1191*7eba2f3bSAndroid Build Coastguard Worker ** Function         GKI_create_pool
1192*7eba2f3bSAndroid Build Coastguard Worker **
1193*7eba2f3bSAndroid Build Coastguard Worker ** Description      Called by applications to create a buffer pool.
1194*7eba2f3bSAndroid Build Coastguard Worker **
1195*7eba2f3bSAndroid Build Coastguard Worker ** Parameters:      size - (input) length (in bytes) of each buffer in the pool
1196*7eba2f3bSAndroid Build Coastguard Worker **                  count - (input) number of buffers to allocate for the pool
1197*7eba2f3bSAndroid Build Coastguard Worker **                  permission - (input) restricted or public access?
1198*7eba2f3bSAndroid Build Coastguard Worker **                                      (GKI_PUBLIC_POOL or GKI_RESTRICTED_POOL)
1199*7eba2f3bSAndroid Build Coastguard Worker **                  p_mem_pool - (input) pointer to an OS memory pool, NULL if
1200*7eba2f3bSAndroid Build Coastguard Worker **                                       not provided
1201*7eba2f3bSAndroid Build Coastguard Worker **
1202*7eba2f3bSAndroid Build Coastguard Worker ** Returns          the buffer pool ID, which should be used in calls to
1203*7eba2f3bSAndroid Build Coastguard Worker **                  GKI_getpoolbuf(). If a pool could not be created, this
1204*7eba2f3bSAndroid Build Coastguard Worker **                  function returns 0xff.
1205*7eba2f3bSAndroid Build Coastguard Worker **
1206*7eba2f3bSAndroid Build Coastguard Worker *******************************************************************************/
GKI_create_pool(uint16_t size,uint16_t count,uint8_t permission,void * p_mem_pool)1207*7eba2f3bSAndroid Build Coastguard Worker uint8_t GKI_create_pool(uint16_t size, uint16_t count, uint8_t permission,
1208*7eba2f3bSAndroid Build Coastguard Worker                         void* p_mem_pool) {
1209*7eba2f3bSAndroid Build Coastguard Worker   uint8_t xx;
1210*7eba2f3bSAndroid Build Coastguard Worker   uint32_t mem_needed;
1211*7eba2f3bSAndroid Build Coastguard Worker   int32_t tempsize = size;
1212*7eba2f3bSAndroid Build Coastguard Worker   tGKI_COM_CB* p_cb = &gki_cb.com;
1213*7eba2f3bSAndroid Build Coastguard Worker 
1214*7eba2f3bSAndroid Build Coastguard Worker   /* First make sure the size of each pool has a valid size with room for the
1215*7eba2f3bSAndroid Build Coastguard Worker    * header info */
1216*7eba2f3bSAndroid Build Coastguard Worker   if (size > MAX_USER_BUF_SIZE) return (GKI_INVALID_POOL);
1217*7eba2f3bSAndroid Build Coastguard Worker 
1218*7eba2f3bSAndroid Build Coastguard Worker   /* First, look for an unused pool */
1219*7eba2f3bSAndroid Build Coastguard Worker   for (xx = 0; xx < GKI_NUM_TOTAL_BUF_POOLS; xx++) {
1220*7eba2f3bSAndroid Build Coastguard Worker     if (!p_cb->pool_start[xx]) break;
1221*7eba2f3bSAndroid Build Coastguard Worker   }
1222*7eba2f3bSAndroid Build Coastguard Worker 
1223*7eba2f3bSAndroid Build Coastguard Worker   if (xx == GKI_NUM_TOTAL_BUF_POOLS) return (GKI_INVALID_POOL);
1224*7eba2f3bSAndroid Build Coastguard Worker 
1225*7eba2f3bSAndroid Build Coastguard Worker   /* Ensure an even number of longwords */
1226*7eba2f3bSAndroid Build Coastguard Worker   tempsize = (int32_t)ALIGN_POOL(size);
1227*7eba2f3bSAndroid Build Coastguard Worker 
1228*7eba2f3bSAndroid Build Coastguard Worker   mem_needed = (tempsize + BUFFER_PADDING_SIZE) * count;
1229*7eba2f3bSAndroid Build Coastguard Worker 
1230*7eba2f3bSAndroid Build Coastguard Worker   if (!p_mem_pool) p_mem_pool = GKI_os_malloc(mem_needed);
1231*7eba2f3bSAndroid Build Coastguard Worker 
1232*7eba2f3bSAndroid Build Coastguard Worker   if (p_mem_pool) {
1233*7eba2f3bSAndroid Build Coastguard Worker     /* Initialize the new pool */
1234*7eba2f3bSAndroid Build Coastguard Worker     gki_init_free_queue(xx, size, count, p_mem_pool);
1235*7eba2f3bSAndroid Build Coastguard Worker     gki_add_to_pool_list(xx);
1236*7eba2f3bSAndroid Build Coastguard Worker     (void)GKI_set_pool_permission(xx, permission);
1237*7eba2f3bSAndroid Build Coastguard Worker     p_cb->curr_total_no_of_pools++;
1238*7eba2f3bSAndroid Build Coastguard Worker 
1239*7eba2f3bSAndroid Build Coastguard Worker     return (xx);
1240*7eba2f3bSAndroid Build Coastguard Worker   } else
1241*7eba2f3bSAndroid Build Coastguard Worker     return (GKI_INVALID_POOL);
1242*7eba2f3bSAndroid Build Coastguard Worker }
1243*7eba2f3bSAndroid Build Coastguard Worker 
1244*7eba2f3bSAndroid Build Coastguard Worker /*******************************************************************************
1245*7eba2f3bSAndroid Build Coastguard Worker **
1246*7eba2f3bSAndroid Build Coastguard Worker ** Function         GKI_delete_pool
1247*7eba2f3bSAndroid Build Coastguard Worker **
1248*7eba2f3bSAndroid Build Coastguard Worker ** Description      Called by applications to delete a buffer pool.  The
1249*7eba2f3bSAndroid Build Coastguard Worker **                  function calls the operating specific function to free the
1250*7eba2f3bSAndroid Build Coastguard Worker **                  actual memory. An exception is generated if an error is
1251*7eba2f3bSAndroid Build Coastguard Worker **                  detected.
1252*7eba2f3bSAndroid Build Coastguard Worker **
1253*7eba2f3bSAndroid Build Coastguard Worker ** Parameters:      pool_id - (input) Id of the poll being deleted.
1254*7eba2f3bSAndroid Build Coastguard Worker **
1255*7eba2f3bSAndroid Build Coastguard Worker ** Returns          void
1256*7eba2f3bSAndroid Build Coastguard Worker **
1257*7eba2f3bSAndroid Build Coastguard Worker *******************************************************************************/
GKI_delete_pool(uint8_t pool_id)1258*7eba2f3bSAndroid Build Coastguard Worker void GKI_delete_pool(uint8_t pool_id) {
1259*7eba2f3bSAndroid Build Coastguard Worker   FREE_QUEUE_T* Q;
1260*7eba2f3bSAndroid Build Coastguard Worker   tGKI_COM_CB* p_cb = &gki_cb.com;
1261*7eba2f3bSAndroid Build Coastguard Worker 
1262*7eba2f3bSAndroid Build Coastguard Worker   if ((pool_id >= GKI_NUM_TOTAL_BUF_POOLS) || (!p_cb->pool_start[pool_id]))
1263*7eba2f3bSAndroid Build Coastguard Worker     return;
1264*7eba2f3bSAndroid Build Coastguard Worker 
1265*7eba2f3bSAndroid Build Coastguard Worker   GKI_disable();
1266*7eba2f3bSAndroid Build Coastguard Worker   Q = &p_cb->freeq[pool_id];
1267*7eba2f3bSAndroid Build Coastguard Worker 
1268*7eba2f3bSAndroid Build Coastguard Worker   if (!Q->cur_cnt) {
1269*7eba2f3bSAndroid Build Coastguard Worker     Q->size = 0;
1270*7eba2f3bSAndroid Build Coastguard Worker     Q->total = 0;
1271*7eba2f3bSAndroid Build Coastguard Worker     Q->cur_cnt = 0;
1272*7eba2f3bSAndroid Build Coastguard Worker     Q->max_cnt = 0;
1273*7eba2f3bSAndroid Build Coastguard Worker     Q->p_first = nullptr;
1274*7eba2f3bSAndroid Build Coastguard Worker     Q->p_last = nullptr;
1275*7eba2f3bSAndroid Build Coastguard Worker 
1276*7eba2f3bSAndroid Build Coastguard Worker     GKI_os_free(p_cb->pool_start[pool_id]);
1277*7eba2f3bSAndroid Build Coastguard Worker 
1278*7eba2f3bSAndroid Build Coastguard Worker     p_cb->pool_start[pool_id] = nullptr;
1279*7eba2f3bSAndroid Build Coastguard Worker     p_cb->pool_end[pool_id] = nullptr;
1280*7eba2f3bSAndroid Build Coastguard Worker     p_cb->pool_size[pool_id] = 0;
1281*7eba2f3bSAndroid Build Coastguard Worker 
1282*7eba2f3bSAndroid Build Coastguard Worker     gki_remove_from_pool_list(pool_id);
1283*7eba2f3bSAndroid Build Coastguard Worker     p_cb->curr_total_no_of_pools--;
1284*7eba2f3bSAndroid Build Coastguard Worker   } else
1285*7eba2f3bSAndroid Build Coastguard Worker     GKI_exception(GKI_ERROR_DELETE_POOL_BAD_QID, "Deleting bad pool");
1286*7eba2f3bSAndroid Build Coastguard Worker 
1287*7eba2f3bSAndroid Build Coastguard Worker   GKI_enable();
1288*7eba2f3bSAndroid Build Coastguard Worker 
1289*7eba2f3bSAndroid Build Coastguard Worker   return;
1290*7eba2f3bSAndroid Build Coastguard Worker }
1291*7eba2f3bSAndroid Build Coastguard Worker 
1292*7eba2f3bSAndroid Build Coastguard Worker #endif /*  BTU_STACK_LITE_ENABLED == FALSE */
1293*7eba2f3bSAndroid Build Coastguard Worker 
1294*7eba2f3bSAndroid Build Coastguard Worker /*******************************************************************************
1295*7eba2f3bSAndroid Build Coastguard Worker **
1296*7eba2f3bSAndroid Build Coastguard Worker ** Function         GKI_get_pool_bufsize
1297*7eba2f3bSAndroid Build Coastguard Worker **
1298*7eba2f3bSAndroid Build Coastguard Worker ** Description      Called by an application to get the size of buffers in a
1299*7eba2f3bSAndroid Build Coastguard Worker **                  pool
1300*7eba2f3bSAndroid Build Coastguard Worker **
1301*7eba2f3bSAndroid Build Coastguard Worker ** Parameters       Pool ID.
1302*7eba2f3bSAndroid Build Coastguard Worker **
1303*7eba2f3bSAndroid Build Coastguard Worker ** Returns          the size of buffers in the pool
1304*7eba2f3bSAndroid Build Coastguard Worker **
1305*7eba2f3bSAndroid Build Coastguard Worker *******************************************************************************/
GKI_get_pool_bufsize(uint8_t pool_id)1306*7eba2f3bSAndroid Build Coastguard Worker uint16_t GKI_get_pool_bufsize(uint8_t pool_id) {
1307*7eba2f3bSAndroid Build Coastguard Worker #if defined(DYN_ALLOC) || defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION)
1308*7eba2f3bSAndroid Build Coastguard Worker   uint16_t size = 0;
1309*7eba2f3bSAndroid Build Coastguard Worker   switch (pool_id) {
1310*7eba2f3bSAndroid Build Coastguard Worker     case GKI_POOL_ID_0:
1311*7eba2f3bSAndroid Build Coastguard Worker       size = GKI_BUF0_SIZE;
1312*7eba2f3bSAndroid Build Coastguard Worker       break;
1313*7eba2f3bSAndroid Build Coastguard Worker     case GKI_POOL_ID_1:
1314*7eba2f3bSAndroid Build Coastguard Worker       size = GKI_BUF1_SIZE;
1315*7eba2f3bSAndroid Build Coastguard Worker       break;
1316*7eba2f3bSAndroid Build Coastguard Worker     case GKI_POOL_ID_2:
1317*7eba2f3bSAndroid Build Coastguard Worker       size = GKI_BUF2_SIZE;
1318*7eba2f3bSAndroid Build Coastguard Worker       break;
1319*7eba2f3bSAndroid Build Coastguard Worker     case GKI_POOL_ID_3:
1320*7eba2f3bSAndroid Build Coastguard Worker       size = GKI_BUF3_SIZE;
1321*7eba2f3bSAndroid Build Coastguard Worker       break;
1322*7eba2f3bSAndroid Build Coastguard Worker       /* Here could be more pool ids, but they are not used in the current
1323*7eba2f3bSAndroid Build Coastguard Worker        * implementation */
1324*7eba2f3bSAndroid Build Coastguard Worker     default:
1325*7eba2f3bSAndroid Build Coastguard Worker       LOG(ERROR) << StringPrintf("Unknown pool ID: %d", pool_id);
1326*7eba2f3bSAndroid Build Coastguard Worker       return (0);
1327*7eba2f3bSAndroid Build Coastguard Worker       break;
1328*7eba2f3bSAndroid Build Coastguard Worker   }
1329*7eba2f3bSAndroid Build Coastguard Worker   return (size);
1330*7eba2f3bSAndroid Build Coastguard Worker #else
1331*7eba2f3bSAndroid Build Coastguard Worker   if (pool_id < GKI_NUM_TOTAL_BUF_POOLS)
1332*7eba2f3bSAndroid Build Coastguard Worker     return (gki_cb.com.freeq[pool_id].size);
1333*7eba2f3bSAndroid Build Coastguard Worker 
1334*7eba2f3bSAndroid Build Coastguard Worker   return (0);
1335*7eba2f3bSAndroid Build Coastguard Worker #endif
1336*7eba2f3bSAndroid Build Coastguard Worker }
1337*7eba2f3bSAndroid Build Coastguard Worker 
1338*7eba2f3bSAndroid Build Coastguard Worker /*******************************************************************************
1339*7eba2f3bSAndroid Build Coastguard Worker **
1340*7eba2f3bSAndroid Build Coastguard Worker ** Function         GKI_poolutilization
1341*7eba2f3bSAndroid Build Coastguard Worker **
1342*7eba2f3bSAndroid Build Coastguard Worker ** Description      Called by an application to get the buffer utilization
1343*7eba2f3bSAndroid Build Coastguard Worker **                  in the specified buffer pool.
1344*7eba2f3bSAndroid Build Coastguard Worker **
1345*7eba2f3bSAndroid Build Coastguard Worker ** Parameters       pool_id - (input) pool ID to get the free count of.
1346*7eba2f3bSAndroid Build Coastguard Worker **
1347*7eba2f3bSAndroid Build Coastguard Worker ** Returns          % of buffers used from 0 to 100
1348*7eba2f3bSAndroid Build Coastguard Worker **
1349*7eba2f3bSAndroid Build Coastguard Worker *******************************************************************************/
GKI_poolutilization(uint8_t pool_id)1350*7eba2f3bSAndroid Build Coastguard Worker uint16_t GKI_poolutilization(uint8_t pool_id) {
1351*7eba2f3bSAndroid Build Coastguard Worker   FREE_QUEUE_T* Q;
1352*7eba2f3bSAndroid Build Coastguard Worker 
1353*7eba2f3bSAndroid Build Coastguard Worker   if (pool_id >= GKI_NUM_TOTAL_BUF_POOLS) return (100);
1354*7eba2f3bSAndroid Build Coastguard Worker 
1355*7eba2f3bSAndroid Build Coastguard Worker   Q = &gki_cb.com.freeq[pool_id];
1356*7eba2f3bSAndroid Build Coastguard Worker 
1357*7eba2f3bSAndroid Build Coastguard Worker   if (Q->total == 0) return (100);
1358*7eba2f3bSAndroid Build Coastguard Worker 
1359*7eba2f3bSAndroid Build Coastguard Worker   return ((Q->cur_cnt * 100) / Q->total);
1360*7eba2f3bSAndroid Build Coastguard Worker }
1361