15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************
25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Copyright (C) 2009-2012 Broadcom Corporation
45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Licensed under the Apache License, Version 2.0 (the "License");
65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  you may not use this file except in compliance with the License.
75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  You may obtain a copy of the License at:
85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  http://www.apache.org/licenses/LICENSE-2.0
105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  See the License for the specific language governing permissions and
155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  limitations under the License.
165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/
185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************
205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Filename:      utils.c
225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Description:   Contains helper functions
245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/
265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <errno.h>
285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <pthread.h>
295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <time.h>
305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_hci_bdroid.h"
315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "utils.h"
325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************
345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Static variables
355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project******************************************************************************/
365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic pthread_mutex_t utils_mutex;
385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**   UTILS INTERFACE FUNCTIONS
415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*****************************************************************************/
425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function        utils_init
465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description     Utils initialization
485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns         None
505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid utils_init (void)
535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pthread_mutex_init(&utils_mutex, NULL);
555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function        utils_cleanup
605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description     Utils cleanup
625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns         None
645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid utils_cleanup (void)
675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function        utils_queue_init
735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description     Initialize the given buffer queue
755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns         None
775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid utils_queue_init (BUFFER_Q *p_q)
805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_q->p_first = p_q->p_last = NULL;
825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_q->count = 0;
835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function        utils_enqueue
885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description     Enqueue a buffer at the tail of the given queue
905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns         None
925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid utils_enqueue (BUFFER_Q *p_q, void *p_buf)
955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    HC_BUFFER_HDR_T    *p_hdr;
975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_hdr = (HC_BUFFER_HDR_T *) ((uint8_t *) p_buf - BT_HC_BUFFER_HDR_SIZE);
995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pthread_mutex_lock(&utils_mutex);
1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_q->p_last)
1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        HC_BUFFER_HDR_T *p_last_hdr = \
1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project          (HC_BUFFER_HDR_T *)((uint8_t *)p_q->p_last - BT_HC_BUFFER_HDR_SIZE);
1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_last_hdr->p_next = p_hdr;
1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_q->p_first = p_buf;
1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_q->p_last = p_buf;
1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_q->count++;
1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_hdr->p_next = NULL;
1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pthread_mutex_unlock(&utils_mutex);
1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function        utils_dequeue
1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description     Dequeues a buffer from the head of the given queue
1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns         NULL if queue is empty, else buffer
1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid *utils_dequeue (BUFFER_Q *p_q)
1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pthread_mutex_lock(&utils_mutex);
1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    void* p_buf =  utils_dequeue_unlocked(p_q);
1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pthread_mutex_unlock(&utils_mutex);
1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return p_buf;
1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function        utils_dequeue_unlocked
1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description     Dequeues a buffer from the head of the given queue without lock
1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns         NULL if queue is empty, else buffer
1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid *utils_dequeue_unlocked (BUFFER_Q *p_q)
1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    HC_BUFFER_HDR_T    *p_hdr;
1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_q || !p_q->count)
1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (NULL);
1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_hdr=(HC_BUFFER_HDR_T *)((uint8_t *)p_q->p_first-BT_HC_BUFFER_HDR_SIZE);
1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_hdr->p_next)
1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_q->p_first = ((uint8_t *)p_hdr->p_next + BT_HC_BUFFER_HDR_SIZE);
1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_q->p_first = NULL;
1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_q->p_last  = NULL;
1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_q->count--;
1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_hdr->p_next = NULL;
1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return ((uint8_t *)p_hdr + BT_HC_BUFFER_HDR_SIZE);
1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function        utils_getnext
1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description     Return a pointer to the next buffer linked to the given
1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                 buffer
1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns         NULL if the given buffer does not point to any next buffer,
1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                 else next buffer address
1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid *utils_getnext (void *p_buf)
1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    HC_BUFFER_HDR_T    *p_hdr;
1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_hdr = (HC_BUFFER_HDR_T *) ((uint8_t *) p_buf - BT_HC_BUFFER_HDR_SIZE);
1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_hdr->p_next)
1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return ((uint8_t *)p_hdr->p_next + BT_HC_BUFFER_HDR_SIZE);
1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (NULL);
1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function        utils_remove_from_queue
1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description     Dequeue the given buffer from the middle of the given queue
1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns         NULL if the given queue is empty, else the given buffer
2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid *utils_remove_from_queue (BUFFER_Q *p_q, void *p_buf)
2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pthread_mutex_lock(&utils_mutex);
2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_buf = utils_remove_from_queue_unlocked(p_q, p_buf);
2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pthread_mutex_unlock(&utils_mutex);
2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return p_buf;
2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function        utils_remove_from_queue_unlocked
2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description     Dequeue the given buffer from the middle of the given queue
2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns         NULL if the given queue is empty, else the given buffer
2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid *utils_remove_from_queue_unlocked (BUFFER_Q *p_q, void *p_buf)
2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    HC_BUFFER_HDR_T    *p_prev;
2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    HC_BUFFER_HDR_T    *p_buf_hdr;
2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_buf == p_q->p_first)
2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (utils_dequeue_unlocked (p_q));
2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_buf_hdr = (HC_BUFFER_HDR_T *)((uint8_t *)p_buf - BT_HC_BUFFER_HDR_SIZE);
2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_prev=(HC_BUFFER_HDR_T *)((uint8_t *)p_q->p_first-BT_HC_BUFFER_HDR_SIZE);
2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for ( ; p_prev; p_prev = p_prev->p_next)
2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If the previous points to this one, move the pointers around */
2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_prev->p_next == p_buf_hdr)
2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_prev->p_next = p_buf_hdr->p_next;
2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* If we are removing the last guy in the queue, update p_last */
2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_buf == p_q->p_last)
2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_q->p_last = p_prev + 1;
2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* One less in the queue */
2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_q->count--;
2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* The buffer is now unlinked */
2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_buf_hdr->p_next = NULL;
2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return (p_buf);
2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (NULL);
2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function        utils_delay
2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description     sleep unconditionally for timeout milliseconds
2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns         None
2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid utils_delay (uint32_t timeout)
2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    struct timespec delay;
2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int err;
2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    delay.tv_sec = timeout / 1000;
2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    delay.tv_nsec = 1000 * 1000 * (timeout%1000);
2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* [u]sleep can't be used because it uses SIGALRM */
2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    do {
2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        err = nanosleep(&delay, &delay);
2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    } while (err < 0 && errno ==EINTR);
2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function        utils_lock
2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description     application calls this function before entering critical
2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                 section
2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns         None
2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid utils_lock (void)
2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pthread_mutex_lock(&utils_mutex);
2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function        utils_unlock
2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description     application calls this function when leaving critical
2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                 section
3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns         None
3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid utils_unlock (void)
3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pthread_mutex_unlock(&utils_mutex);
3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
309