1 /****************************************************************************** 2 * 3 * Copyright 2018 NXP 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 * 17 ******************************************************************************/ 18 #define LOG_TAG "NxpEseHal" 19 #include <log/log.h> 20 #include <phNxpEseDataMgr.h> 21 #include <phNxpEsePal.h> 22 23 extern bool ese_debug_enabled; 24 25 static phNxpEse_sCoreRecvBuff_List_t *head = NULL, *current = NULL; 26 static uint32_t total_len = 0; 27 28 static ESESTATUS phNxpEse_DeletList(phNxpEse_sCoreRecvBuff_List_t* head); 29 static ESESTATUS phNxpEse_GetDataFromList(uint32_t* data_len, uint8_t* pbuff); 30 /****************************************************************************** 31 * Function phNxpEse_GetData 32 * 33 * Description This function update the len and provided buffer 34 * 35 * Returns On Success ESESTATUS_SUCCESS else proper error code 36 * 37 ******************************************************************************/ 38 ESESTATUS phNxpEse_GetData(uint32_t* data_len, uint8_t** pbuffer) { 39 uint32_t total_data_len = 0; 40 uint8_t* pbuff = NULL; 41 42 if (total_len == 0) { 43 ALOGE("%s total_len = %d", __FUNCTION__, total_len); 44 return ESESTATUS_FAILED; 45 } 46 pbuff = (uint8_t*)phNxpEse_memalloc(total_len); 47 if (NULL == pbuff) { 48 ALOGE("%s Error in malloc ", __FUNCTION__); 49 return ESESTATUS_NOT_ENOUGH_MEMORY; 50 } 51 52 if (ESESTATUS_SUCCESS != phNxpEse_GetDataFromList(&total_data_len, pbuff)) { 53 ALOGE("%s phNxpEse_GetDataFromList", __FUNCTION__); 54 phNxpEse_free(pbuff); 55 return ESESTATUS_FAILED; 56 } 57 if (total_data_len != total_len) { 58 ALOGE("%s Mismatch of len total_data_len %d total_len %d", __FUNCTION__, 59 total_data_len, total_len); 60 phNxpEse_free(pbuff); 61 return ESESTATUS_FAILED; 62 } 63 64 *pbuffer = pbuff; 65 *data_len = total_data_len; 66 phNxpEse_DeletList(head); 67 total_len = 0; 68 head = NULL; 69 current = NULL; 70 71 return ESESTATUS_SUCCESS; 72 } 73 /****************************************************************************** 74 * Function phNxpEse_StoreDatainList 75 * 76 * Description This function stores the received data in linked list 77 * 78 * Returns On Success ESESTATUS_SUCCESS else proper error code 79 * 80 ******************************************************************************/ 81 ESESTATUS phNxpEse_StoreDatainList(uint32_t data_len, uint8_t* pbuff) { 82 phNxpEse_sCoreRecvBuff_List_t* newNode = NULL; 83 84 newNode = (phNxpEse_sCoreRecvBuff_List_t*)phNxpEse_memalloc( 85 sizeof(phNxpEse_sCoreRecvBuff_List_t)); 86 if (newNode == NULL) { 87 return ESESTATUS_NOT_ENOUGH_MEMORY; 88 } 89 newNode->pNext = NULL; 90 newNode->tData.wLen = data_len; 91 phNxpEse_memcpy(newNode->tData.sbuffer, pbuff, data_len); 92 total_len += data_len; 93 if (head == NULL) { 94 head = newNode; 95 current = newNode; 96 } else { 97 current->pNext = newNode; 98 current = newNode; 99 } 100 return ESESTATUS_SUCCESS; 101 } 102 103 /****************************************************************************** 104 * Function phNxpEse_GetDataFromList 105 * 106 * Description This function copies all linked list data in provided buffer 107 * 108 * Returns On Success ESESTATUS_SUCCESS else proper error code 109 * 110 ******************************************************************************/ 111 static ESESTATUS phNxpEse_GetDataFromList(uint32_t* data_len, uint8_t* pbuff) { 112 phNxpEse_sCoreRecvBuff_List_t* new_node; 113 uint32_t offset = 0; 114 ALOGD_IF(ese_debug_enabled, "%s Enter ", __FUNCTION__); 115 if (head == NULL || pbuff == NULL) { 116 return ESESTATUS_FAILED; 117 } 118 119 new_node = head; 120 while (new_node != NULL) { 121 phNxpEse_memcpy((pbuff + offset), new_node->tData.sbuffer, 122 new_node->tData.wLen); 123 offset += new_node->tData.wLen; 124 new_node = new_node->pNext; 125 } 126 *data_len = offset; 127 ALOGD_IF(ese_debug_enabled, "%s Exit ", __FUNCTION__); 128 return ESESTATUS_SUCCESS; 129 } 130 131 /****************************************************************************** 132 * Function phNxpEse_DeletList 133 * 134 * Description This function deletes all nodes from linked list 135 * 136 * Returns On Success ESESTATUS_SUCCESS else proper error code 137 * 138 ******************************************************************************/ 139 static ESESTATUS phNxpEse_DeletList(phNxpEse_sCoreRecvBuff_List_t* head) { 140 ESESTATUS status = ESESTATUS_SUCCESS; 141 phNxpEse_sCoreRecvBuff_List_t *current, *next; 142 current = head; 143 144 if (head == NULL) { 145 return ESESTATUS_FAILED; 146 } 147 148 while (current != NULL) { 149 next = current->pNext; 150 phNxpEse_free(current); 151 current = NULL; 152 current = next; 153 } 154 head = NULL; 155 return status; 156 } 157