void phLibNfc_P2pConfigParamsCb(void* pContext,NFCSTATUS status,void* pInfo)
{
    pphNciNfc_RfDiscConfigParams_t pRfDiscConfParam = (pphNciNfc_RfDiscConfigParams_t) pContext;
    NFCSTATUS wStatus = status;
    pphLibNfc_LibContext_t pLibContext = gpphLibNfc_Context;
    phLibNfc_Event_t TrigEvent = phLibNfc_EventReqCompleted;

    PH_LOG_LIBNFC_FUNC_ENTRY();
    if(NULL != pLibContext)
    {
        if(NULL != pRfDiscConfParam)
        {
            phOsalNfc_FreeMemory(pRfDiscConfParam);
        }

        (void)phLibNfc_StateHandler(pLibContext, TrigEvent, pInfo, NULL, NULL);
        if(NULL != pLibContext->CBInfo.pClientNfcIpCfgCb)
        {
            if(NFCSTATUS_SUCCESS != wStatus)
            {
                wStatus = NFCSTATUS_FAILED;
            }

            pLibContext->CBInfo.pClientNfcIpCfgCb(pLibContext->CBInfo.pClientNfcIpCfgCntx,
                                        wStatus);
         }
        pLibContext->CBInfo.pClientNfcIpCfgCb = NULL;
        pLibContext->CBInfo.pClientNfcIpCfgCntx = NULL;
    }
    PH_LOG_LIBNFC_FUNC_EXIT();
}
static void phLibNfc_DeferredReceiveCb(void *pContext)
{
    phNfc_sData_t tRecvBufferInfo;
    pphLibNfc_Receive_RspCb_t pUpperLayerCb = NULL;
    phLibNfc_LibContext_t *pLibContext = (phLibNfc_LibContext_t *)pContext;
    void *pUpperLayerCtx = NULL;
    phLibNfc_Event_t TrigEvent = phLibNfc_EventReqCompleted;
    PH_LOG_LIBNFC_FUNC_ENTRY();
    if(NULL != pLibContext)
    {
        pUpperLayerCb = pLibContext->CBInfo.pClientNfcIpRxCb;
        pUpperLayerCtx = pLibContext->CBInfo.pClientNfcIpRxCntx;
        pLibContext->CBInfo.pClientNfcIpRxCb = NULL;
        pLibContext->CBInfo.pClientNfcIpRxCntx = NULL;
        (void)phLibNfc_StateHandler(pLibContext, TrigEvent, NULL, NULL, NULL);
        if(NULL != pUpperLayerCb)
        {
            tRecvBufferInfo.buffer = pLibContext->HCE_FirstBuffer.buffer;
            tRecvBufferInfo.length = pLibContext->HCE_FirstBuffer.length;
            pUpperLayerCb(pUpperLayerCtx,&tRecvBufferInfo,NFCSTATUS_SUCCESS);
        }
        if(pLibContext->HCE_FirstBuffer.buffer )
        {
            phOsalNfc_FreeMemory(pLibContext->HCE_FirstBuffer.buffer);
            pLibContext->HCE_FirstBuffer.buffer = NULL;
            pLibContext->HCE_FirstBuffer.length = 0;
        }
    }
    PH_LOG_LIBNFC_FUNC_EXIT();
    return;
}
static void phLibNfc_P2pRemoteDev_ReceiveCb(void* pContext,NFCSTATUS status,void* pInfo)
{
    NFCSTATUS wStatus = status;
    phNfc_sData_t tRecvBufferInfo;
    pphNciNfc_TransactInfo_t pTransInfo = pInfo;
    pphLibNfc_LibContext_t pLibContext = (pphLibNfc_LibContext_t) pContext;
    phLibNfc_Event_t TrigEvent = phLibNfc_EventReqCompleted;
    pphLibNfc_Receive_RspCb_t pUpperLayerCb = NULL;
    void *pUpperLayerCtx = NULL;
    UNUSED(pContext);
    PH_LOG_LIBNFC_FUNC_ENTRY();
    if((NULL != pLibContext) && (gpphLibNfc_Context == pLibContext)&& (NULL != pTransInfo))
    {
        pUpperLayerCb = pLibContext->CBInfo.pClientNfcIpRxCb;
        pUpperLayerCtx = pLibContext->CBInfo.pClientNfcIpRxCntx;
        (void)phLibNfc_StateHandler(pLibContext, TrigEvent, NULL, NULL, NULL);
        if(NULL != pUpperLayerCb)
        {
            tRecvBufferInfo.buffer = pTransInfo->pbuffer;
            tRecvBufferInfo.length = (uint32_t)pTransInfo->wLength;
            pUpperLayerCb(pUpperLayerCtx,&tRecvBufferInfo,wStatus);
        }
    }
    PH_LOG_LIBNFC_FUNC_EXIT();
}
NFCSTATUS
phLibNfc_RemoteDev_Receive( phLibNfc_Handle            hRemoteDevice,
                            pphLibNfc_Receive_RspCb_t   pReceiveRspCb,
                            void*                       pContext)
{
    NFCSTATUS wStatus = NFCSTATUS_FAILED;
    pphLibNfc_LibContext_t pLibContext = gpphLibNfc_Context;
    phLibNfc_Event_t TrigEvent = phLibNfc_EventRecv;
    pphNciNfc_RemoteDevInformation_t pNciRemDevHandle = NULL;
    phLibNfc_sRemoteDevInformation_t *pLibRemDevHandle = (phLibNfc_sRemoteDevInformation_t *)hRemoteDevice;
    PH_LOG_LIBNFC_FUNC_ENTRY();

    wStatus = phLibNfc_IsInitialised(pLibContext);
    if(NFCSTATUS_SUCCESS != wStatus)
    {
        wStatus=NFCSTATUS_NOT_INITIALISED;
    }
    /* Check for valid state,If De initialize is called then return NFCSTATUS_SHUTDOWN */
    else if(gpphLibNfc_Context->StateContext.TrgtState == phLibNfc_StateReset)
    {
        wStatus = NFCSTATUS_SHUTDOWN;
    }
    else if((NULL == pReceiveRspCb) || (NULL == pLibRemDevHandle))
    {
        wStatus = NFCSTATUS_INVALID_PARAMETER;
    }
    else
    {
        wStatus = phLibNfc_MapRemoteDevHandle(&pLibRemDevHandle,&pNciRemDevHandle,PH_LIBNFC_INTERNAL_LIBTONCI_MAP);
        if((NFCSTATUS_SUCCESS == wStatus) && (NULL != pNciRemDevHandle))
        {
            pLibContext->CBInfo.pClientNfcIpRxCb = pReceiveRspCb;
            pLibContext->CBInfo.pClientNfcIpRxCntx = pContext;

            wStatus = phLibNfc_StateHandler(pLibContext,TrigEvent,
                                        NULL,NULL,NULL);
            if(NFCSTATUS_PENDING == wStatus)
            {
                /* Do nothing */
            }
            else if(NFCSTATUS_INVALID_STATE == wStatus)
            {
                PH_LOG_LIBNFC_WARN_STR("phLibNfc_RemoteDev_Receive: StateHandler returned NFCSTATUS_INVALID_STATE");
                wStatus = NFCSTATUS_DESELECTED;
            }
            else
            {
                PH_LOG_LIBNFC_CRIT_U32MSG("phLibNfc_RemoteDev_Receive: StateHandler returned status:",wStatus);
                wStatus = NFCSTATUS_FAILED;
            }
        }
        else
        {
            wStatus = NFCSTATUS_INVALID_HANDLE;
        }
    }
    PH_LOG_LIBNFC_FUNC_EXIT();
    return wStatus;
}
static NFCSTATUS phLibNfc_InitializeComplete(void* pContext, NFCSTATUS status, void* pInfo)
{
    NFCSTATUS wStatus = status;
    pphLibNfc_LibContext_t pLibContext  = (pphLibNfc_LibContext_t)pContext;
    phLibNfc_Event_t TrigEvent = phLibNfc_EventReqCompleted;
    pphLibNfc_InitCallback_t pClientCb;
    void * pUpperLayerContext;
    UNUSED(pInfo);
    PH_LOG_LIBNFC_FUNC_ENTRY();

    if(NFCSTATUS_SUCCESS == wStatus)
    {
        /* Initializing the Flags during init*/
        gpphLibNfc_Context->HCE_FirstBuf = 0;
        pLibContext->bPcdConnected = FALSE;
        pLibContext->dev_cnt = 0;

        wStatus = phLibNfc_StateHandler(pContext, TrigEvent, pInfo, NULL, NULL);
    }
    if(NFCSTATUS_SUCCESS == wStatus)
    {
        pClientCb = pLibContext->CBInfo.pClientInitCb;
        pUpperLayerContext = pLibContext->CBInfo.pClientInitCntx;
        pLibContext->CBInfo.pClientInitCb = NULL;
        pLibContext->CBInfo.pClientInitCntx = NULL;
        
        if(NULL != pClientCb)
        {
            (*pClientCb)(pUpperLayerContext,pLibContext->eConfigStatus,wStatus);
        }        
    }
    else
    {
        phLibNfc_ReleaseLibNfcContext(pContext,NFCSTATUS_FAILED);
    }
    PH_LOG_LIBNFC_FUNC_EXIT();
    return wStatus;
}
static void phLibNfc_P2pRemoteDev_SendCb(void* pContext,NFCSTATUS status,void* pInfo)
{
    NFCSTATUS wStatus = status;
    pphLibNfc_LibContext_t pLibContext = (pphLibNfc_LibContext_t)pContext;
    phLibNfc_Event_t TrigEvent = phLibNfc_EventReqCompleted;
    pphLibNfc_RspCb_t pUpperLayerCb = NULL;
    void *UpperLayerCtx = NULL;
    UNUSED(pInfo);
    PH_LOG_LIBNFC_FUNC_ENTRY();
    if((NULL != pLibContext) && (gpphLibNfc_Context == pLibContext))
    {
        pUpperLayerCb = pLibContext->CBInfo.pClientNfcIpTxCb;
        UpperLayerCtx = pLibContext->CBInfo.pClientNfcIpTxCntx;
        pLibContext->CBInfo.pClientNfcIpTxCb = NULL;
        pLibContext->CBInfo.pClientNfcIpTxCntx = NULL;
        (void)phLibNfc_StateHandler(pLibContext, TrigEvent, NULL, NULL, NULL);
        if(NULL != pUpperLayerCb)
        {
            pUpperLayerCb(UpperLayerCtx,wStatus);
        }
    }
    PH_LOG_LIBNFC_FUNC_EXIT();
}
NFCSTATUS
phLibNfc_Mgt_SetP2P_ConfigParams(phLibNfc_sNfcIPCfg_t *pConfigInfo,
                                 pphLibNfc_RspCb_t pConfigRspCb,
                                 void *  pContext)
{
    NFCSTATUS wStatus = NFCSTATUS_FAILED;
    pphLibNfc_LibContext_t pLibContext = gpphLibNfc_Context;
    pphNciNfc_RfDiscConfigParams_t pRfDiscConfParam = NULL;
    uint8_t bGeneralBytesLength = 0;
    phLibNfc_DummyInfo_t Info;
    phLibNfc_Event_t TrigEvent = phLibNfc_EventDummy;
    PH_LOG_LIBNFC_FUNC_ENTRY();
    Info.Evt = phLibNfc_DummyEventInvalid;
    if(NULL == pLibContext)
    {
        wStatus = NFCSTATUS_NOT_INITIALISED;
    }
    else if((NULL == pConfigInfo) ||(NULL == pConfigRspCb))
    {
        wStatus = NFCSTATUS_INVALID_PARAMETER;
    }
    else
    {
        bGeneralBytesLength = pConfigInfo->generalBytesLength;
        if((pLibContext->bDtaFlag || (0 != bGeneralBytesLength)) &&
           (PH_LIBNFC_INTERNAL_MAX_ATR_LENGTH >= bGeneralBytesLength))
        {
            /* Allocate memory for the input parameter that needs to be sent to
               'phNciNfc_SetConfigRfParameters' API */
            pRfDiscConfParam = (pphNciNfc_RfDiscConfigParams_t)phOsalNfc_GetMemory(
                                                sizeof(phNciNfc_RfDiscConfigParams_t));
            if(NULL != pRfDiscConfParam)
            {
                phOsalNfc_SetMemory(pRfDiscConfParam,0,sizeof(phNciNfc_RfDiscConfigParams_t));

                pLibContext->CBInfo.pClientNfcIpCfgCb = pConfigRspCb;
                pLibContext->CBInfo.pClientNfcIpCfgCntx = pContext;

                /* Set general bytes for Poll  Nfc-Dep parameters */
                switch(pConfigInfo->p2pMode)
                {
                    case NFC_DEP_POLL:
                        pRfDiscConfParam->tConfigInfo.PollNfcDepConfig = 1;
                        /* Configuring general bytes for ATR_REQ */
                        pRfDiscConfParam->tPollNfcDepDiscParams.PollNfcDepConfig.EnableConfig = 0;
                        pRfDiscConfParam->tPollNfcDepDiscParams.PollNfcDepConfig.Config.bSetGenBytes = 1;
                        pRfDiscConfParam->tPollNfcDepDiscParams.bAtrReqGeneBytesSize = bGeneralBytesLength;
                        phOsalNfc_MemCopy(pRfDiscConfParam->tPollNfcDepDiscParams.aAtrReqGenBytes,
                        pConfigInfo->generalBytes,bGeneralBytesLength);
                        /*Enable General Bytes to default values*/
                        /*Configure to default value = 0x30*/
                        pRfDiscConfParam->tPollNfcDepDiscParams.PollNfcDepConfig.Config.bSetAtrConfig = 1;
                        pRfDiscConfParam->tPollNfcDepDiscParams.AtrReqConfig.bDid = 0; /*0 For LLCP*/
                        pRfDiscConfParam->tPollNfcDepDiscParams.AtrReqConfig.bLr = 0x03;/*0x03 for LLCP*/
                    break;
                    case  NFC_DEP_LISTEN:
                        /* Set general bytes for Listen  Nfc-Dep parameters */
                        pRfDiscConfParam->tConfigInfo.LstnNfcDepConfig = 1;
                        /* Configuring general bytes for ATR_RES */
                        pRfDiscConfParam->tLstnNfcDepDiscParams.LstnNfcDepConfig.EnableConfig = 0;
                        pRfDiscConfParam->tLstnNfcDepDiscParams.LstnNfcDepConfig.Config.bSetGenBytes = 1;
                        pRfDiscConfParam->tLstnNfcDepDiscParams.bAtrResGenBytesSize = bGeneralBytesLength;
                        phOsalNfc_MemCopy(pRfDiscConfParam->tLstnNfcDepDiscParams.aAtrResGenBytes,
                        pConfigInfo->generalBytes,bGeneralBytesLength);
                        /*Enable General Bytes in response*/
                        /*Configure to defaule value*/
                        pRfDiscConfParam->tLstnNfcDepDiscParams.LstnNfcDepConfig.Config.bSetAtrRespConfig = 1;
                        pRfDiscConfParam->tLstnNfcDepDiscParams.AtrRespConfig.bLengthReduction = 0x03; /*For LLCP*/
                    break;
                    case NFC_DEP_DEFAULT:
                    default:
                        pRfDiscConfParam->tConfigInfo.PollNfcDepConfig = 1;
                        /* Configuring general bytes for ATR_REQ */
                        pRfDiscConfParam->tPollNfcDepDiscParams.PollNfcDepConfig.EnableConfig = 0;
                        pRfDiscConfParam->tPollNfcDepDiscParams.PollNfcDepConfig.Config.bSetGenBytes = 1;
                        pRfDiscConfParam->tPollNfcDepDiscParams.bAtrReqGeneBytesSize = bGeneralBytesLength;
                        phOsalNfc_MemCopy(pRfDiscConfParam->tPollNfcDepDiscParams.aAtrReqGenBytes,
                                          pConfigInfo->generalBytes,bGeneralBytesLength);
                        /*Enable General Bytes to default values*/
                        /*Configure to default value = 0x30*/
                        pRfDiscConfParam->tPollNfcDepDiscParams.PollNfcDepConfig.Config.bSetAtrConfig = 1;
                        pRfDiscConfParam->tPollNfcDepDiscParams.AtrReqConfig.bDid = 0; /*0 For LLCP*/
                        pRfDiscConfParam->tPollNfcDepDiscParams.AtrReqConfig.bLr = 0x03;/*0x03 for LLCP*/     
                        pRfDiscConfParam->tConfigInfo.LstnNfcDepConfig = 1;
                        /* Configuring general bytes for ATR_RES */
                        pRfDiscConfParam->tLstnNfcDepDiscParams.LstnNfcDepConfig.EnableConfig = 0;
                        pRfDiscConfParam->tLstnNfcDepDiscParams.LstnNfcDepConfig.Config.bSetGenBytes = 1;
                        pRfDiscConfParam->tLstnNfcDepDiscParams.bAtrResGenBytesSize = bGeneralBytesLength;
                        phOsalNfc_MemCopy(pRfDiscConfParam->tLstnNfcDepDiscParams.aAtrResGenBytes,
                                          pConfigInfo->generalBytes,bGeneralBytesLength);
                        /*Enable General Bytes in response*/
                        /*Configure to defaule value*/
                        pRfDiscConfParam->tLstnNfcDepDiscParams.LstnNfcDepConfig.Config.bSetAtrRespConfig = 1;
                        pRfDiscConfParam->tLstnNfcDepDiscParams.AtrRespConfig.bLengthReduction = 0x03; /*For LLCP*/		
                    break;
                }

                Info.Evt = phLibNfc_DummyEventSetP2PConfigs;
                Info.Params = (void *)pRfDiscConfParam;

                wStatus = phLibNfc_StateHandler(pLibContext,
                                                TrigEvent,
                                                NULL,
                                                &Info,
                                                NULL);
                if(NFCSTATUS_PENDING != wStatus)
                {
                    phOsalNfc_FreeMemory(pRfDiscConfParam);
                    pLibContext->CBInfo.pClientNfcIpCfgCb = NULL;
                    pLibContext->CBInfo.pClientNfcIpCfgCntx = NULL;
                }
            }
            else
            {
                wStatus = NFCSTATUS_INSUFFICIENT_RESOURCES;
            }
        }
        else
        {
            wStatus = NFCSTATUS_INVALID_PARAMETER;
        }
    }
    PH_LOG_LIBNFC_FUNC_EXIT();
    return wStatus;
}
NFCSTATUS
phLibNfc_RemoteDev_Send(phLibNfc_Handle             hRemoteDevice,
                        phNfc_sData_t*              pTransferData,
                        pphLibNfc_RspCb_t           pSendRspCb,
                        void*                       pContext)
{
    NFCSTATUS wStatus = NFCSTATUS_FAILED;
    pphLibNfc_LibContext_t pLibContext = gpphLibNfc_Context;
    phLibNfc_Event_t TrigEvent = phLibNfc_EventSend;
    pphNciNfc_RemoteDevInformation_t pNciRemDevHandle = NULL;
    phLibNfc_sRemoteDevInformation_t *pLibRemDevHandle = (phLibNfc_sRemoteDevInformation_t *)hRemoteDevice;
    PH_LOG_LIBNFC_FUNC_ENTRY();

    wStatus = phLibNfc_IsInitialised(pLibContext);
    if(NFCSTATUS_SUCCESS != wStatus)
    {
        wStatus=NFCSTATUS_NOT_INITIALISED;
    }
    /* Check for valid state,If De initialize is called then return NFCSTATUS_SHUTDOWN */
    else if(gpphLibNfc_Context->StateContext.TrgtState == phLibNfc_StateReset)
    {
        wStatus = NFCSTATUS_SHUTDOWN;
    }
    else if((NULL == pSendRspCb) || (NULL == pTransferData) || (NULL == pLibRemDevHandle))
    {
        wStatus = NFCSTATUS_INVALID_PARAMETER;
    }
    else
    {
        if((NULL != pTransferData->buffer) || (0 == pTransferData->length))
        {
            wStatus = phLibNfc_MapRemoteDevHandle(&pLibRemDevHandle,&pNciRemDevHandle,PH_LIBNFC_INTERNAL_LIBTONCI_MAP);
            if((NFCSTATUS_SUCCESS == wStatus) && (NULL != pNciRemDevHandle))
            {
                pLibContext->CBInfo.pClientNfcIpTxCb = pSendRspCb;
                pLibContext->CBInfo.pClientNfcIpTxCntx = pContext;

                wStatus = phLibNfc_StateHandler(pLibContext,TrigEvent,
                                    (void *)pTransferData,NULL,NULL);
                if(NFCSTATUS_PENDING == wStatus)
                {
                    /* Do nothing */
                }
                else if(NFCSTATUS_INVALID_STATE == wStatus)
                {
                    wStatus = NFCSTATUS_DESELECTED;
                    pLibContext->CBInfo.pClientNfcIpTxCb = NULL;
                    pLibContext->CBInfo.pClientNfcIpTxCntx = NULL;
                }
                else
                {
                    wStatus = NFCSTATUS_FAILED;
                    pLibContext->CBInfo.pClientNfcIpTxCb = NULL;
                    pLibContext->CBInfo.pClientNfcIpTxCntx = NULL;
                }
            }
            else
            {
                wStatus = NFCSTATUS_INVALID_HANDLE;
            }
        }
        else
        {
            wStatus = NFCSTATUS_INVALID_PARAMETER;
        }
    }
    PH_LOG_LIBNFC_FUNC_EXIT();
    return wStatus;
}