NFCSTATUS phNciNfc_CoreIfTxRx(pphNciNfc_CoreContext_t pCtx,
                               pphNciNfc_CoreTxInfo_t pTxInfo,
                               pphNciNfc_Buff_t  pRxBuffInfo,
                               uint32_t dwTimeOutMs,
                               pphNciNfc_CoreIfNtf_t NciCb,
                               void *pContext)
{
    NFCSTATUS wStatus = NFCSTATUS_SUCCESS;

    PH_LOG_NCI_FUNC_ENTRY();
    if ((NULL != pCtx) &&
        (NULL != pTxInfo) &&
        (NULL != pRxBuffInfo) &&
        (NULL != NciCb))
    {
        if(pCtx->SendStateContext.CurrState == phNciNfc_StateSendIdle)
        {
            /* Either command or data message can be sent */
            if(phNciNfc_e_NciCoreMsgTypeCntrlCmd == pTxInfo->tHeaderInfo.eMsgType)
            {
                pTxInfo->tHeaderInfo.bConn_ID = 0;
            }
            else /* Sending a data message */
            {
                pTxInfo->tHeaderInfo.Group_ID = (phNciNfc_CoreGid_t)0;
                pTxInfo->tHeaderInfo.Opcode_ID.Val = 0;
            }
            /* All calling function which use 'phNciNfc_CoreIfTxRx' to send and receive cmd-Rsp or Data
            shall go for Auto deregistration */
            pTxInfo->tHeaderInfo.bEnabled = PHNCINFC_ENABLE_AUTO_DEREG;
            pCtx->tTemp.pTxInfo = pTxInfo;
            pCtx->tTemp.dwTimeOutMs = dwTimeOutMs;
            pCtx->tTemp.NciCb = NciCb;
            pCtx->tTemp.pContext = pContext;

            pCtx->bCoreTxOnly = 0; /* Notify upper layer after response is received for the command sent or
                                      sending command fails*/
            phOsalNfc_MemCopy(&(pCtx->TxInfo), pTxInfo, sizeof(phNciNfc_CoreTxInfo_t));
            /* Print the NCI packet details */
            phNciNfc_PrintPacketDescription(&pTxInfo->tHeaderInfo, pTxInfo->Buff, pTxInfo->wLen);
            wStatus = phNciNfc_StateHandler(pCtx, phNciNfc_EvtSendPacket);
        }
        else
        {
            wStatus = NFCSTATUS_BUSY;
        }
    }
    else
    {
        wStatus = NFCSTATUS_INVALID_PARAMETER;
    }
    PH_LOG_NCI_FUNC_EXIT();
    return wStatus;
}
NFCSTATUS phNciNfc_CoreIfTxOnly(pphNciNfc_CoreContext_t pCtx,
                               pphNciNfc_CoreTxInfo_t pTxInfo,
                               pphNciNfc_CoreIfNtf_t NciCb,
                               void *pContext)
{
    NFCSTATUS wStatus = NFCSTATUS_SUCCESS;

    PH_LOG_NCI_FUNC_ENTRY();
    if ((NULL != pCtx) &&
        (NULL != pTxInfo) &&
        (NULL != NciCb))
    {
        if(pCtx->SendStateContext.CurrState == phNciNfc_StateSendIdle)
        {
            pCtx->tTemp.pTxInfo = pTxInfo;
            /* No timer is used */
            pCtx->tTemp.dwTimeOutMs = 0;
            pCtx->tTemp.NciCb = NciCb;
            pCtx->tTemp.pContext = pContext;

            pCtx->bCoreTxOnly = 1; /* Send and receive operation is in progress */
            phOsalNfc_MemCopy(&(pCtx->TxInfo), pTxInfo, sizeof(phNciNfc_CoreTxInfo_t));
            /* Print the NCI packet details */
            phNciNfc_PrintPacketDescription(&pTxInfo->tHeaderInfo, pTxInfo->Buff, pTxInfo->wLen);
            wStatus = phNciNfc_StateHandler(pCtx, phNciNfc_EvtSendPacket);
        }
        else
        {
            wStatus = NFCSTATUS_BUSY;
        }
    }
    else
    {
        wStatus = NFCSTATUS_INVALID_PARAMETER;
    }
    PH_LOG_NCI_FUNC_EXIT();
    return wStatus;
}
NFCSTATUS
phNciNfc_CoreRecvManager(void *pCtx,
                         NFCSTATUS wStatus,
                         pphNciNfc_sCoreHeaderInfo_t pHdrInfo,
                         phNciNfc_NciCoreMsgType_t eMsgType)
{
    NFCSTATUS wStat = NFCSTATUS_INVALID_PARAMETER;
    phNciNfc_TransactInfo_t tTransInfo;
    void *pRegList = NULL;
    phNciNfc_CoreRegInfo_t tRegInfo;
    uint16_t wDataLen = 0;
    uint16_t wNumOfNode = 0;
    pphNciNfc_CoreContext_t pCoreCtx = (pphNciNfc_CoreContext_t) pCtx;

    PH_LOG_NCI_FUNC_ENTRY();
    if((NULL != pCoreCtx) && (NULL != pHdrInfo))
    {
        wStat = NFCSTATUS_SUCCESS;
        if((phNciNfc_e_NciCoreMsgTypeCntrlRsp == eMsgType) ||
           (phNciNfc_e_NciCoreMsgTypeCntrlNtf == eMsgType))
        {
            tRegInfo.bGid = (uint8_t)pHdrInfo->Group_ID;
            tRegInfo.bOid = (uint8_t)pHdrInfo->Opcode_ID.Val;

            if((phNciNfc_e_NciCoreMsgTypeCntrlRsp == eMsgType))
            {
                PH_LOG_NCI_INFO_STR("Invoke response call back func if registered");
                pRegList = (void *)pCoreCtx->tRspCtx.aRspRegList;
            }
            else
            {
                PH_LOG_NCI_INFO_STR("Invoke notification call back func if registered");
                pRegList =  (void *)pCoreCtx->tNtfCtx.aNtfRegList;
            }
        }
        else if(phNciNfc_e_NciCoreMsgTypeData == eMsgType)
        {
            PH_LOG_NCI_INFO_STR("Invoke data call back func if registered");
            pRegList =  (void *)pCoreCtx->tDataCtx.aDataRegList;
            tRegInfo.bConnId = pHdrInfo->bConn_ID;
        }
        else
        {
            wStat = NFCSTATUS_INVALID_PARAMETER;
            PH_LOG_NCI_CRIT_STR("Invalid message type!");
        }

        if(NFCSTATUS_SUCCESS == wStat)
        {
            /* NOTE: For time being the following operations are being done at this location
            1. Allocation of buffer for storing the extracted data from linked list
            2. Extraction of received payload from linked list
            3. Copy of extracted data to the allocated buffer
            #These operation shall be performed at the Nci module level call back in later point of time
            */
            if(NFCSTATUS_SUCCESS != wStatus)
            {
                /* Response time out has happened */
                tTransInfo.pbuffer = NULL;
                tTransInfo.wLength = 0;
                wStat = NFCSTATUS_SUCCESS;
            }
            else
            {
                tTransInfo.pbuffer = NULL;
                tTransInfo.wLength = 0;
                /* Get size of payload present in linked list */
                wStat = phNciNfc_CoreGetDataLength(pCoreCtx,&wDataLen, &wNumOfNode);
                if(NFCSTATUS_SUCCESS == wStat)
                {
                    PH_LOG_NCI_INFO_U32MSG("Message size received: ",wDataLen);
                    if(wNumOfNode == 1)
                    {
                        /*May need seperate function for getting the pointer value*/
                      tTransInfo.pbuffer = &(pCoreCtx->tReceiveInfo.ListHead.tMem.aBuffer[PHNCINFC_CORE_PKT_HEADER_LEN]);
                      tTransInfo.wLength = wDataLen;
                    }else
                    {
                        /* Allocate memory for storing the payload */
                        tTransInfo.pbuffer = phOsalNfc_GetMemory(wDataLen);
                    }
                    if(NULL != tTransInfo.pbuffer)
                    {
                        tTransInfo.wLength = wDataLen;
                        /* Extract the data from linked list and copy it to the allocated buffer */
                        wStat = phNciNfc_CoreGetData(pCoreCtx,tTransInfo.pbuffer,wDataLen);
                    }
                }
            }

            if(NFCSTATUS_SUCCESS == wStat)
            {
                phNciNfc_PrintPacketDescription(pHdrInfo, tTransInfo.pbuffer, tTransInfo.wLength, pCoreCtx->bLogDataMessages);
                wStat = phNciNfc_CoreInvokeCb(pRegList,wStatus,&tRegInfo,eMsgType,&tTransInfo);
            }
            /* Free memory that had been allocated */
            if((NULL != tTransInfo.pbuffer) && (wNumOfNode > 1))
            {
                phOsalNfc_FreeMemory(tTransInfo.pbuffer);
                tTransInfo.pbuffer = NULL;
                tTransInfo.wLength = 0;
            }
            /* Delete linked list */
            phNciNfc_CoreDeleteList(pCoreCtx);
        }
    }
    PH_LOG_NCI_FUNC_EXIT();
    return wStat;
}