1121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao/*
2121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao *
3121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao *  Copyright (C) 2013-2014 NXP Semiconductors
4121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao *
5121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao *  Licensed under the Apache License, Version 2.0 (the "License");
6121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao *  you may not use this file except in compliance with the License.
7121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao *  You may obtain a copy of the License at
8121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao *
9121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao *  http://www.apache.org/licenses/LICENSE-2.0
10121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao *
11121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao *  Unless required by applicable law or agreed to in writing, software
12121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao *  distributed under the License is distributed on an "AS IS" BASIS,
13121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao *  See the License for the specific language governing permissions and
15121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao *  limitations under the License.
16121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao *
17121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao ******************************************************************************/
18121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao#include <errno.h>
19ae2234d1cdd7c35543a795dcb51a6537ffce2007Jizhou Liao#include <pthread.h>
20ae2234d1cdd7c35543a795dcb51a6537ffce2007Jizhou Liao
21121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao#include <phNxpLog.h>
22ae2234d1cdd7c35543a795dcb51a6537ffce2007Jizhou Liao#include <phNxpNciHal.h>
23ae2234d1cdd7c35543a795dcb51a6537ffce2007Jizhou Liao#include <phNxpNciHal_utils.h>
24ae2234d1cdd7c35543a795dcb51a6537ffce2007Jizhou Liao
25ae2234d1cdd7c35543a795dcb51a6537ffce2007Jizhou Liaoextern uint8_t discovery_cmd[50];
26ae2234d1cdd7c35543a795dcb51a6537ffce2007Jizhou Liaoextern uint8_t discovery_cmd_len;
27ae2234d1cdd7c35543a795dcb51a6537ffce2007Jizhou Liaoextern uint8_t nfcdep_detected;
28121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
29121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao/*********************** Link list functions **********************************/
30121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
31121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao/*******************************************************************************
32121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao**
33121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao** Function         listInit
34121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao**
35121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao** Description      List initialization
36121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao**
37121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao** Returns          1, if list initialized, 0 otherwise
38121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao**
39121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao*******************************************************************************/
40121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liaoint listInit(struct listHead* pList)
41121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao{
42121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    pList->pFirst = NULL;
43121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    if (pthread_mutex_init(&pList->mutex, NULL) == -1)
44121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    {
45121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        NXPLOG_NCIHAL_E("Mutex creation failed (errno=0x%08x)", errno);
46121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        return 0;
47121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    }
48121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
49121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    return 1;
50121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao}
51121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
52121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao/*******************************************************************************
53121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao**
54121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao** Function         listDestroy
55121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao**
56121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao** Description      List destruction
57121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao**
58121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao** Returns          1, if list destroyed, 0 if failed
59121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao**
60121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao*******************************************************************************/
61121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liaoint listDestroy(struct listHead* pList)
62121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao{
63121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    int bListNotEmpty = 1;
64121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    while (bListNotEmpty)
65121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    {
66121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        bListNotEmpty = listGetAndRemoveNext(pList, NULL);
67121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    }
68121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
69121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    if (pthread_mutex_destroy(&pList->mutex) == -1)
70121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    {
71121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        NXPLOG_NCIHAL_E("Mutex destruction failed (errno=0x%08x)", errno);
72121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        return 0;
73121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    }
74121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
75121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    return 1;
76121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao}
77121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
78121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao/*******************************************************************************
79121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao**
80121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao** Function         listAdd
81121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao**
82121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao** Description      Add a node to the list
83121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao**
84121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao** Returns          1, if added, 0 if otherwise
85121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao**
86121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao*******************************************************************************/
87121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liaoint listAdd(struct listHead* pList, void* pData)
88121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao{
89121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    struct listNode* pNode;
90121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    struct listNode* pLastNode;
91121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    int result;
92121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
93121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    /* Create node */
94121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    pNode = (struct listNode*) malloc(sizeof(struct listNode));
95121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    if (pNode == NULL)
96121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    {
97121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        result = 0;
98121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        NXPLOG_NCIHAL_E("Failed to malloc");
99121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        goto clean_and_return;
100121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    }
101121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    pNode->pData = pData;
102121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    pNode->pNext = NULL;
103121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
104121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    pthread_mutex_lock(&pList->mutex);
105121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
106121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    /* Add the node to the list */
107121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    if (pList->pFirst == NULL)
108121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    {
109121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        /* Set the node as the head */
110121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        pList->pFirst = pNode;
111121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    }
112121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    else
113121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    {
114121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        /* Seek to the end of the list */
115121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        pLastNode = pList->pFirst;
116121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        while (pLastNode->pNext != NULL)
117121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        {
118121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao            pLastNode = pLastNode->pNext;
119121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        }
120121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
121121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        /* Add the node to the current list */
122121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        pLastNode->pNext = pNode;
123121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    }
124121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
125121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    result = 1;
126121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
127121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liaoclean_and_return:
128121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    pthread_mutex_unlock(&pList->mutex);
129121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    return result;
130121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao}
131121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
132121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao/*******************************************************************************
133121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao**
134121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao** Function         listRemove
135121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao**
136121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao** Description      Remove node from the list
137121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao**
138121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao** Returns          1, if removed, 0 if otherwise
139121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao**
140121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao*******************************************************************************/
141121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liaoint listRemove(struct listHead* pList, void* pData)
142121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao{
143121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    struct listNode* pNode;
144121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    struct listNode* pRemovedNode;
145121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    int result;
146121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
147121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    pthread_mutex_lock(&pList->mutex);
148121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
149121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    if (pList->pFirst == NULL)
150121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    {
151121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        /* Empty list */
152121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        NXPLOG_NCIHAL_E("Failed to deallocate (list empty)");
153121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        result = 0;
154121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        goto clean_and_return;
155121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    }
156121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
157121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    pNode = pList->pFirst;
158121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    if (pList->pFirst->pData == pData)
159121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    {
160121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        /* Get the removed node */
161121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        pRemovedNode = pNode;
162121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
163121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        /* Remove the first node */
164121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        pList->pFirst = pList->pFirst->pNext;
165121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    }
166121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    else
167121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    {
168121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        while (pNode->pNext != NULL)
169121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        {
170121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao            if (pNode->pNext->pData == pData)
171121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao            {
172121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao                /* Node found ! */
173121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao                break;
174121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao            }
175121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao            pNode = pNode->pNext;
176121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        }
177121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
178121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        if (pNode->pNext == NULL)
179121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        {
180121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao            /* Node not found */
181121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao            result = 0;
182121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao            NXPLOG_NCIHAL_E("Failed to deallocate (not found %8p)", pData);
183121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao            goto clean_and_return;
184121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        }
185121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
186121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        /* Get the removed node */
187121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        pRemovedNode = pNode->pNext;
188121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
189121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        /* Remove the node from the list */
190121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        pNode->pNext = pNode->pNext->pNext;
191121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    }
192121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
193121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    /* Deallocate the node */
194121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    free(pRemovedNode);
195121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
196121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    result = 1;
197121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
198121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liaoclean_and_return:
199121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    pthread_mutex_unlock(&pList->mutex);
200121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    return result;
201121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao}
202121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
203121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao/*******************************************************************************
204121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao**
205121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao** Function         listGetAndRemoveNext
206121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao**
207121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao** Description      Get next node on the list and remove it
208121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao**
209121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao** Returns          1, if successful, 0 if otherwise
210121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao**
211121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao*******************************************************************************/
212121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liaoint listGetAndRemoveNext(struct listHead* pList, void** ppData)
213121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao{
214121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    struct listNode* pNode;
215121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    int result;
216121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
217121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    pthread_mutex_lock(&pList->mutex);
218121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
219121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    if (pList->pFirst ==  NULL)
220121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    {
221121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        /* Empty list */
222121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        NXPLOG_NCIHAL_D("Failed to deallocate (list empty)");
223121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        result = 0;
224121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        goto clean_and_return;
225121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    }
226121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
227121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    /* Work on the first node */
228121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    pNode = pList->pFirst;
229121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
230121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    /* Return the data */
231121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    if (ppData != NULL)
232121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    {
233121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        *ppData = pNode->pData;
234121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    }
235121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
236121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    /* Remove and deallocate the node */
237121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    pList->pFirst = pNode->pNext;
238121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    free(pNode);
239121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
240121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    result = 1;
241121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
242121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liaoclean_and_return:
243121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    listDump(pList);
244121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    pthread_mutex_unlock(&pList->mutex);
245121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    return result;
246121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao}
247121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
248121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao/*******************************************************************************
249121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao**
250121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao** Function         listDump
251121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao**
252121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao** Description      Dump list information
253121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao**
254121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao** Returns          None
255121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao**
256121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao*******************************************************************************/
257121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liaovoid listDump(struct listHead* pList)
258121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao{
259121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    struct listNode* pNode = pList->pFirst;
260121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
261121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    NXPLOG_NCIHAL_D("Node dump:");
262121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    while (pNode != NULL)
263121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    {
264121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        NXPLOG_NCIHAL_D("- %8p (%8p)", pNode, pNode->pData);
265121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        pNode = pNode->pNext;
266121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    }
267121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
268121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    return;
269121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao}
270121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
271121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao/* END Linked list source code */
272121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
273121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao/****************** Semaphore and mutex helper functions **********************/
274121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
275121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liaostatic phNxpNciHal_Monitor_t *nxpncihal_monitor = NULL;
276121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
277121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao/*******************************************************************************
278121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao**
279121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao** Function         phNxpNciHal_init_monitor
280121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao**
281121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao** Description      Initialize the semaphore monitor
282121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao**
283121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao** Returns          Pointer to monitor, otherwise NULL if failed
284121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao**
285121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao*******************************************************************************/
286121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou LiaophNxpNciHal_Monitor_t*
287121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou LiaophNxpNciHal_init_monitor(void)
288121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao{
289121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    NXPLOG_NCIHAL_D("Entering phNxpNciHal_init_monitor");
290121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
291121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    if (nxpncihal_monitor == NULL)
292121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    {
293121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        nxpncihal_monitor = (phNxpNciHal_Monitor_t *) malloc(
294121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao                sizeof(phNxpNciHal_Monitor_t));
295121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    }
296121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
297121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    if (nxpncihal_monitor != NULL)
298121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    {
299121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        memset(nxpncihal_monitor, 0x00, sizeof(phNxpNciHal_Monitor_t));
300121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
301121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        if (pthread_mutex_init(&nxpncihal_monitor->reentrance_mutex, NULL)
302121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao                == -1)
303121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        {
304121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao            NXPLOG_NCIHAL_E("reentrance_mutex creation returned 0x%08x", errno);
305121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao            goto clean_and_return;
306121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        }
307121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
308121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        if (pthread_mutex_init(&nxpncihal_monitor->concurrency_mutex, NULL)
309121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao                == -1)
310121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        {
311121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao            NXPLOG_NCIHAL_E("concurrency_mutex creation returned 0x%08x", errno);
312121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao            pthread_mutex_destroy(&nxpncihal_monitor->reentrance_mutex);
313121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao            goto clean_and_return;
314121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        }
315121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
316121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        if (listInit(&nxpncihal_monitor->sem_list) != 1)
317121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        {
318121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao            NXPLOG_NCIHAL_E("Semaphore List creation failed");
319121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao            pthread_mutex_destroy(&nxpncihal_monitor->concurrency_mutex);
320121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao            pthread_mutex_destroy(&nxpncihal_monitor->reentrance_mutex);
321121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao            goto clean_and_return;
322121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        }
323121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    }
324121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    else
325121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    {
326121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        NXPLOG_NCIHAL_E("nxphal_monitor creation failed");
327121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        goto clean_and_return;
328121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    }
329121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
330121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    NXPLOG_NCIHAL_D("Returning with SUCCESS");
331121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
332121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    return nxpncihal_monitor;
333121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
334121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liaoclean_and_return:
335121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    NXPLOG_NCIHAL_D("Returning with FAILURE");
336121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
337121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    if (nxpncihal_monitor != NULL)
338121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    {
339121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        free(nxpncihal_monitor);
340121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        nxpncihal_monitor = NULL;
341121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    }
342121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
343121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    return NULL;
344121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao}
345121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
346121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao/*******************************************************************************
347121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao**
348121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao** Function         phNxpNciHal_cleanup_monitor
349121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao**
350121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao** Description      Clean up semaphore monitor
351121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao**
352121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao** Returns          None
353121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao**
354121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao*******************************************************************************/
355121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liaovoid phNxpNciHal_cleanup_monitor(void)
356121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao{
357121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    if (nxpncihal_monitor != NULL)
358121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    {
359121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        pthread_mutex_destroy(&nxpncihal_monitor->concurrency_mutex);
360121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        REENTRANCE_UNLOCK();
361121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        pthread_mutex_destroy(&nxpncihal_monitor->reentrance_mutex);
362121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        phNxpNciHal_releaseall_cb_data();
363121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        listDestroy(&nxpncihal_monitor->sem_list);
364121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    }
365121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
366121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    free(nxpncihal_monitor);
367121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    nxpncihal_monitor = NULL;
368121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
369121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    return;
370121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao}
371121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
372121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao/*******************************************************************************
373121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao**
374121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao** Function         phNxpNciHal_get_monitor
375121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao**
376121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao** Description      Get monitor
377121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao**
378121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao** Returns          Pointer to monitor
379121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao**
380121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao*******************************************************************************/
381121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou LiaophNxpNciHal_Monitor_t*
382121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou LiaophNxpNciHal_get_monitor(void)
383121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao{
384121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    return nxpncihal_monitor;
385121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao}
386121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
387121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao/* Initialize the callback data */
388121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou LiaoNFCSTATUS phNxpNciHal_init_cb_data(phNxpNciHal_Sem_t *pCallbackData,
389121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        void *pContext)
390121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao{
391121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    /* Create semaphore */
392121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    if (sem_init(&pCallbackData->sem, 0, 0) == -1)
393121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    {
394121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        NXPLOG_NCIHAL_E("Semaphore creation failed (errno=0x%08x)", errno);
395121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        return NFCSTATUS_FAILED;
396121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    }
397121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
398121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    /* Set default status value */
399121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    pCallbackData->status = NFCSTATUS_FAILED;
400121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
401121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    /* Copy the context */
402121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    pCallbackData->pContext = pContext;
403121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
404121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    /* Add to active semaphore list */
405121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    if (listAdd(&phNxpNciHal_get_monitor()->sem_list, pCallbackData) != 1)
406121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    {
407121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        NXPLOG_NCIHAL_E("Failed to add the semaphore to the list");
408121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    }
409121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
410121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    return NFCSTATUS_SUCCESS;
411121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao}
412121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
413121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao/*******************************************************************************
414121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao**
415121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao** Function         phNxpNciHal_cleanup_cb_data
416121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao**
417121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao** Description      Clean up callback data
418121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao**
419121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao** Returns          None
420121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao**
421121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao*******************************************************************************/
422121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liaovoid phNxpNciHal_cleanup_cb_data(phNxpNciHal_Sem_t* pCallbackData)
423121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao{
424121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    /* Destroy semaphore */
425121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    if (sem_destroy(&pCallbackData->sem))
426121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    {
427121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        NXPLOG_NCIHAL_E("phNxpNciHal_cleanup_cb_data: Failed to destroy semaphore (errno=0x%08x)", errno);
428121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    }
429121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
430121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    /* Remove from active semaphore list */
431121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    if (listRemove(&phNxpNciHal_get_monitor()->sem_list, pCallbackData) != 1)
432121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    {
433121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        NXPLOG_NCIHAL_E("phNxpNciHal_cleanup_cb_data: Failed to remove semaphore from the list");
434121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    }
435121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
436121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    return;
437121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao}
438121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
439121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao/*******************************************************************************
440121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao**
441121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao** Function         phNxpNciHal_releaseall_cb_data
442121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao**
443121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao** Description      Release all callback data
444121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao**
445121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao** Returns          None
446121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao**
447121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao*******************************************************************************/
448121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liaovoid phNxpNciHal_releaseall_cb_data(void)
449121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao{
450121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    phNxpNciHal_Sem_t* pCallbackData;
451121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
452121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    while (listGetAndRemoveNext(&phNxpNciHal_get_monitor()->sem_list,
453121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao            (void**) &pCallbackData))
454121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    {
455121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        pCallbackData->status = NFCSTATUS_FAILED;
456121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        sem_post(&pCallbackData->sem);
457121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    }
458121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
459121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    return;
460121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao}
461121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
462121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao/* END Semaphore and mutex helper functions */
463121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
464121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao/**************************** Other functions *********************************/
465121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
466121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao/*******************************************************************************
467121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao**
468121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao** Function         phNxpNciHal_print_packet
469121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao**
470121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao** Description      Print packet
471121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao**
472121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao** Returns          None
473121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao**
474121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao*******************************************************************************/
475121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liaovoid phNxpNciHal_print_packet(const char *pString, const uint8_t *p_data,
476121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        uint16_t len)
477121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao{
478121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    uint32_t i, j;
479121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    char print_buffer[len * 3 + 1];
480121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
481121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    memset (print_buffer, 0, sizeof(print_buffer));
482121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    for (i = 0; i < len; i++) {
483121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        snprintf(&print_buffer[i * 2], 3, "%02X", p_data[i]);
484121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    }
485121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    if( 0 == memcmp(pString,"SEND",0x04))
486121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    {
487121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        NXPLOG_NCIX_D("len = %3d > %s", len, print_buffer);
488121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    }
489121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    else if( 0 == memcmp(pString,"RECV",0x04))
490121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    {
491121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        NXPLOG_NCIR_D("len = %3d > %s", len, print_buffer);
492121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    }
493121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
494121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    return;
495121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao}
496121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
497121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
498121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao/*******************************************************************************
499121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao**
500121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao** Function         phNxpNciHal_emergency_recovery
501121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao**
502121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao** Description      Emergency recovery in case of no other way out
503121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao**
504121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao** Returns          None
505121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao**
506121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao*******************************************************************************/
507121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
508ae2234d1cdd7c35543a795dcb51a6537ffce2007Jizhou Liaovoid phNxpNciHal_emergency_recovery (void)
509121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao{
510ae2234d1cdd7c35543a795dcb51a6537ffce2007Jizhou Liao    if (nfcdep_detected && discovery_cmd_len != 0)
511ae2234d1cdd7c35543a795dcb51a6537ffce2007Jizhou Liao    {
512ae2234d1cdd7c35543a795dcb51a6537ffce2007Jizhou Liao        pthread_t pthread;
513ae2234d1cdd7c35543a795dcb51a6537ffce2007Jizhou Liao        pthread_attr_t attr;
514ae2234d1cdd7c35543a795dcb51a6537ffce2007Jizhou Liao        pthread_attr_init (&attr);
515ae2234d1cdd7c35543a795dcb51a6537ffce2007Jizhou Liao        pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED);
516ae2234d1cdd7c35543a795dcb51a6537ffce2007Jizhou Liao        if (pthread_create (&pthread, &attr, phNxpNciHal_core_reset_recovery, NULL) == 0)
517ae2234d1cdd7c35543a795dcb51a6537ffce2007Jizhou Liao        {
518ae2234d1cdd7c35543a795dcb51a6537ffce2007Jizhou Liao            return;
519ae2234d1cdd7c35543a795dcb51a6537ffce2007Jizhou Liao        }
520ae2234d1cdd7c35543a795dcb51a6537ffce2007Jizhou Liao    }
521ae2234d1cdd7c35543a795dcb51a6537ffce2007Jizhou Liao    NXPLOG_NCIHAL_E ("%s: abort()", __FUNCTION__);
522ae2234d1cdd7c35543a795dcb51a6537ffce2007Jizhou Liao    abort ();
523121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao}
524