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