| /****************************************************************************** |
| * |
| * Copyright 2018 NXP |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| * |
| ******************************************************************************/ |
| #define LOG_TAG "NxpEseHal" |
| #include <log/log.h> |
| #include <phNxpEseDataMgr.h> |
| #include <phNxpEsePal.h> |
| |
| extern bool ese_debug_enabled; |
| |
| static phNxpEse_sCoreRecvBuff_List_t *head = NULL, *current = NULL; |
| static uint32_t total_len = 0; |
| |
| static ESESTATUS phNxpEse_DeletList(phNxpEse_sCoreRecvBuff_List_t* head); |
| static ESESTATUS phNxpEse_GetDataFromList(uint32_t* data_len, uint8_t* pbuff); |
| /****************************************************************************** |
| * Function phNxpEse_GetData |
| * |
| * Description This function update the len and provided buffer |
| * |
| * Returns On Success ESESTATUS_SUCCESS else proper error code |
| * |
| ******************************************************************************/ |
| ESESTATUS phNxpEse_GetData(uint32_t* data_len, uint8_t** pbuffer) { |
| uint32_t total_data_len = 0; |
| uint8_t* pbuff = NULL; |
| |
| if (total_len == 0) { |
| ALOGE("%s total_len = %d", __FUNCTION__, total_len); |
| return ESESTATUS_FAILED; |
| } |
| pbuff = (uint8_t*)phNxpEse_memalloc(total_len); |
| if (NULL == pbuff) { |
| ALOGE("%s Error in malloc ", __FUNCTION__); |
| return ESESTATUS_NOT_ENOUGH_MEMORY; |
| } |
| |
| if (ESESTATUS_SUCCESS != phNxpEse_GetDataFromList(&total_data_len, pbuff)) { |
| ALOGE("%s phNxpEse_GetDataFromList", __FUNCTION__); |
| phNxpEse_free(pbuff); |
| return ESESTATUS_FAILED; |
| } |
| if (total_data_len != total_len) { |
| ALOGE("%s Mismatch of len total_data_len %d total_len %d", __FUNCTION__, |
| total_data_len, total_len); |
| phNxpEse_free(pbuff); |
| return ESESTATUS_FAILED; |
| } |
| |
| *pbuffer = pbuff; |
| *data_len = total_data_len; |
| phNxpEse_DeletList(head); |
| total_len = 0; |
| head = NULL; |
| current = NULL; |
| |
| return ESESTATUS_SUCCESS; |
| } |
| /****************************************************************************** |
| * Function phNxpEse_StoreDatainList |
| * |
| * Description This function stores the received data in linked list |
| * |
| * Returns On Success ESESTATUS_SUCCESS else proper error code |
| * |
| ******************************************************************************/ |
| ESESTATUS phNxpEse_StoreDatainList(uint32_t data_len, uint8_t* pbuff) { |
| phNxpEse_sCoreRecvBuff_List_t* newNode = NULL; |
| |
| newNode = (phNxpEse_sCoreRecvBuff_List_t*)phNxpEse_memalloc( |
| sizeof(phNxpEse_sCoreRecvBuff_List_t)); |
| if (newNode == NULL) { |
| return ESESTATUS_NOT_ENOUGH_MEMORY; |
| } |
| newNode->pNext = NULL; |
| newNode->tData.wLen = data_len; |
| phNxpEse_memcpy(newNode->tData.sbuffer, pbuff, data_len); |
| total_len += data_len; |
| if (head == NULL) { |
| head = newNode; |
| current = newNode; |
| } else { |
| current->pNext = newNode; |
| current = newNode; |
| } |
| return ESESTATUS_SUCCESS; |
| } |
| |
| /****************************************************************************** |
| * Function phNxpEse_GetDataFromList |
| * |
| * Description This function copies all linked list data in provided buffer |
| * |
| * Returns On Success ESESTATUS_SUCCESS else proper error code |
| * |
| ******************************************************************************/ |
| static ESESTATUS phNxpEse_GetDataFromList(uint32_t* data_len, uint8_t* pbuff) { |
| phNxpEse_sCoreRecvBuff_List_t* new_node; |
| uint32_t offset = 0; |
| ALOGD_IF(ese_debug_enabled, "%s Enter ", __FUNCTION__); |
| if (head == NULL || pbuff == NULL) { |
| return ESESTATUS_FAILED; |
| } |
| |
| new_node = head; |
| while (new_node != NULL) { |
| phNxpEse_memcpy((pbuff + offset), new_node->tData.sbuffer, |
| new_node->tData.wLen); |
| offset += new_node->tData.wLen; |
| new_node = new_node->pNext; |
| } |
| *data_len = offset; |
| ALOGD_IF(ese_debug_enabled, "%s Exit ", __FUNCTION__); |
| return ESESTATUS_SUCCESS; |
| } |
| |
| /****************************************************************************** |
| * Function phNxpEse_DeletList |
| * |
| * Description This function deletes all nodes from linked list |
| * |
| * Returns On Success ESESTATUS_SUCCESS else proper error code |
| * |
| ******************************************************************************/ |
| static ESESTATUS phNxpEse_DeletList(phNxpEse_sCoreRecvBuff_List_t* head) { |
| ESESTATUS status = ESESTATUS_SUCCESS; |
| phNxpEse_sCoreRecvBuff_List_t *current, *next; |
| current = head; |
| |
| if (head == NULL) { |
| return ESESTATUS_FAILED; |
| } |
| |
| while (current != NULL) { |
| next = current->pNext; |
| phNxpEse_free(current); |
| current = NULL; |
| current = next; |
| } |
| head = NULL; |
| return status; |
| } |