15d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*
25d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * Copyright (C) 2010 NXP Semiconductors
35d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *
45d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * Licensed under the Apache License, Version 2.0 (the "License");
55d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * you may not use this file except in compliance with the License.
65d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * You may obtain a copy of the License at
75d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *
85d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *      http://www.apache.org/licenses/LICENSE-2.0
95d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *
105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * Unless required by applicable law or agreed to in writing, software
115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * distributed under the License is distributed on an "AS IS" BASIS,
125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * See the License for the specific language governing permissions and
145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * limitations under the License.
155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */
165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*!
175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * \file  phHal4Nfc_P2P.c
185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * \brief Hal4Nfc_P2P source.
195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *
205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * Project: NFC-FRI 1.1
215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *
225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * $Date: Mon May 31 11:43:43 2010 $
235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * $Author: ing07385 $
245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * $Revision: 1.56 $
255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * $Aliases: NFC_FRI1.1_WK1023_R35_1 $
265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *
275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */
285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/* ---------------------------Include files ------------------------------------*/
305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phHal4Nfc.h>
315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phHal4Nfc_Internal.h>
325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phOsalNfc.h>
335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phOsalNfc_Timer.h>
345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phHciNfc.h>
355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phNfcConfig.h>
3632060a1ad89a5791039bf4a7e89db6cbc3e669d0Sunil Jogi
375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/* ------------------------------- Macros ------------------------------------*/
385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef _WIN32
405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*Timeout value for recv data timer for P2P.This timer is used for creating
415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly  Asynchronous behavior in the scenario where the data is received even before
425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly  the upper layer calls the phHal4Nfc_receive().*/
435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#define     PH_HAL4NFC_RECV_CB_TIMEOUT       100U
445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else
455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#define     PH_HAL4NFC_RECV_CB_TIMEOUT      0x00U
465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif/*#ifdef _WIN32*/
475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/* --------------------Structures and enumerations --------------------------*/
505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*timer callback to send already buffered receive data to upper layer*/
525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic void phHal4Nfc_P2PRecvTimerCb(uint32_t P2PRecvTimerId, void *pContext);
535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/* ---------------------- Function definitions ------------------------------*/
555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*  Transfer the user data to another NfcIP device from the host.
575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *  pTransferCallback is called, when all steps in the transfer sequence are
585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *  completed.*/
595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS
605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyphHal4Nfc_Send(
615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                phHal_sHwReference_t                    *psHwReference,
625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                phHal4Nfc_TransactInfo_t                *psTransferInfo,
635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                phNfc_sData_t                            sTransferData,
645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                pphHal4Nfc_SendCallback_t                pSendCallback,
655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                void                                    *pContext
665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                )
675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NFCSTATUS RetStatus = NFCSTATUS_PENDING;
695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    phHal4Nfc_Hal4Ctxt_t *Hal4Ctxt = NULL;
7032060a1ad89a5791039bf4a7e89db6cbc3e669d0Sunil Jogi
715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /*NULL checks*/
725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    if((NULL == psHwReference)
735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        ||( NULL == pSendCallback )
745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        || (NULL == psTransferInfo)
755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        )
765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        phOsalNfc_RaiseException(phOsalNfc_e_PrecondFailed,1);
785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        RetStatus = PHNFCSTVAL(CID_NFC_HAL ,NFCSTATUS_INVALID_PARAMETER);
795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /*Check initialised state*/
815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    else if((NULL == psHwReference->hal_context)
825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        || (((phHal4Nfc_Hal4Ctxt_t *)
835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                psHwReference->hal_context)->Hal4CurrentState
845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                               < eHal4StateOpenAndReady)
855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        || (((phHal4Nfc_Hal4Ctxt_t *)
865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                psHwReference->hal_context)->Hal4NextState
875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                               == eHal4StateClosed))
885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        RetStatus = PHNFCSTVAL(CID_NFC_HAL ,NFCSTATUS_NOT_INITIALISED);
905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /*Only NfcIp1 Target can call this API*/
925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    else if(phHal_eNfcIP1_Initiator != psTransferInfo->remotePCDType)
935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        RetStatus = PHNFCSTVAL(CID_NFC_HAL ,NFCSTATUS_INVALID_DEVICE);
955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    else
975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        Hal4Ctxt = (phHal4Nfc_Hal4Ctxt_t *)psHwReference->hal_context;
995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        if(NULL == Hal4Ctxt->psTrcvCtxtInfo)
1005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
1015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            RetStatus= PHNFCSTVAL(CID_NFC_HAL ,NFCSTATUS_FAILED);
1025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
1035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        /*Check Activated*/
1045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        else if(NFC_EVT_ACTIVATED == Hal4Ctxt->sTgtConnectInfo.EmulationState)
1055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
1065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            Hal4Ctxt->sUpperLayerInfo.psUpperLayerCtxt = pContext;
1075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            /*Register upper layer callback*/
1085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            Hal4Ctxt->psTrcvCtxtInfo->pP2PSendCb  = pSendCallback;
1095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            PHDBG_INFO("NfcIP1 Send");
1105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            /*allocate buffer to store senddata received from upper layer*/
1115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            if (NULL == Hal4Ctxt->psTrcvCtxtInfo->psUpperSendData)
1125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
1135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                Hal4Ctxt->psTrcvCtxtInfo->psUpperSendData = (phNfc_sData_t *)
1145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        phOsalNfc_GetMemory(sizeof(phNfc_sData_t));
1155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                if(NULL != Hal4Ctxt->psTrcvCtxtInfo->psUpperSendData)
1165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
1175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    (void)memset(Hal4Ctxt->psTrcvCtxtInfo->psUpperSendData, 0,
1185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                    sizeof(phNfc_sData_t));
1195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    Hal4Ctxt->psTrcvCtxtInfo->TransactionTimerId
1205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                            = PH_OSALNFC_INVALID_TIMER_ID;
1215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
1225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
1235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            Hal4Ctxt->psTrcvCtxtInfo->psUpperSendData->buffer
1255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                = sTransferData.buffer;
1265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            Hal4Ctxt->psTrcvCtxtInfo->psUpperSendData->length
1275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                = sTransferData.length;
12832060a1ad89a5791039bf4a7e89db6cbc3e669d0Sunil Jogi
12932060a1ad89a5791039bf4a7e89db6cbc3e669d0Sunil Jogi            /* If data size is less than Peer's Max frame length, then no chaining is required */
13032060a1ad89a5791039bf4a7e89db6cbc3e669d0Sunil Jogi            if(Hal4Ctxt->rem_dev_list[0]->RemoteDevInfo.NfcIP_Info.MaxFrameLength >= sTransferData.length)
1315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
1325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                Hal4Ctxt->psTrcvCtxtInfo->
1335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    XchangeInfo.params.nfc_info.more_info = FALSE;
1345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                Hal4Ctxt->psTrcvCtxtInfo->XchangeInfo.tx_length
1355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    = (uint8_t)sTransferData.length;
1365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                Hal4Ctxt->psTrcvCtxtInfo->XchangeInfo.tx_buffer
1375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    = sTransferData.buffer;
1385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
1395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            else/*set more_info to true,to indicate more data pending to be sent*/
1405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
1415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                Hal4Ctxt->psTrcvCtxtInfo->
1425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    XchangeInfo.params.nfc_info.more_info = TRUE;
1435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                Hal4Ctxt->psTrcvCtxtInfo->XchangeInfo.tx_length
14432060a1ad89a5791039bf4a7e89db6cbc3e669d0Sunil Jogi                    = Hal4Ctxt->rem_dev_list[0]->RemoteDevInfo.NfcIP_Info.MaxFrameLength;
1455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                Hal4Ctxt->psTrcvCtxtInfo->XchangeInfo.tx_buffer
1465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    = sTransferData.buffer;
1475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                Hal4Ctxt->psTrcvCtxtInfo->NumberOfBytesSent
14832060a1ad89a5791039bf4a7e89db6cbc3e669d0Sunil Jogi                    += Hal4Ctxt->rem_dev_list[0]->RemoteDevInfo.NfcIP_Info.MaxFrameLength;
1495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
1505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            PHDBG_INFO("HAL4:Calling Hci_Send_data()");
1515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            RetStatus = phHciNfc_Send_Data (
1525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                Hal4Ctxt->psHciHandle,
1535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                psHwReference,
1545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                NULL,
1555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                &(Hal4Ctxt->psTrcvCtxtInfo->XchangeInfo)
1565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                );
1575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            /*check return status*/
1585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            if (NFCSTATUS_PENDING == RetStatus)
1595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
1605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                /*Set P2P_Send_In_Progress to defer any disconnect call until
1615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                 Send complete occurs*/
1625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                Hal4Ctxt->psTrcvCtxtInfo->P2P_Send_In_Progress = TRUE;
1635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                Hal4Ctxt->Hal4NextState = eHal4StateTransaction;
1645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                /*No of bytes remaining for next send*/
1655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                Hal4Ctxt->psTrcvCtxtInfo->psUpperSendData->length
1665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    -= Hal4Ctxt->psTrcvCtxtInfo->XchangeInfo.tx_length;
1675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
1685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
1695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        else/*Deactivated*/
1705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
1715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            RetStatus = PHNFCSTVAL(CID_NFC_HAL ,NFCSTATUS_DESELECTED);
1725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
1735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
1745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    return RetStatus;
1755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
1765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*  Transfer the user data to the another NfcIP device from the host.
1795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *  pTransferCallback is called, when all steps in the transfer sequence are
1805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *  completed.*/
1815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS
1835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyphHal4Nfc_Receive(
1845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                  phHal_sHwReference_t                  *psHwReference,
1855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                  phHal4Nfc_TransactInfo_t              *psRecvInfo,
1865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                  pphHal4Nfc_ReceiveCallback_t          pReceiveCallback,
1875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                  void                                  *pContext
1885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                 )
1895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
1905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NFCSTATUS RetStatus = NFCSTATUS_PENDING;
1915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    phHal4Nfc_Hal4Ctxt_t *Hal4Ctxt = NULL;
1925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly     /*NULL checks*/
1935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    if((NULL == psHwReference)
1945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        ||( NULL == pReceiveCallback)
1955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        ||( NULL == psRecvInfo))
1965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
1975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        phOsalNfc_RaiseException(phOsalNfc_e_PrecondFailed,1);
1985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        RetStatus = PHNFCSTVAL(CID_NFC_HAL ,NFCSTATUS_INVALID_PARAMETER);
1995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
2005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /*Check initialised state*/
2015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    else if((NULL == psHwReference->hal_context)
2025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        || (((phHal4Nfc_Hal4Ctxt_t *)
2035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                psHwReference->hal_context)->Hal4CurrentState
2045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                               < eHal4StateOpenAndReady)
2055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        || (((phHal4Nfc_Hal4Ctxt_t *)
2065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                psHwReference->hal_context)->Hal4NextState
2075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                               == eHal4StateClosed))
2085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
2095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        RetStatus = PHNFCSTVAL(CID_NFC_HAL ,NFCSTATUS_NOT_INITIALISED);
2105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
2115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    else
2125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
2135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        Hal4Ctxt = (phHal4Nfc_Hal4Ctxt_t *)psHwReference->hal_context;
2145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        if(NFC_EVT_ACTIVATED == Hal4Ctxt->sTgtConnectInfo.EmulationState)
2155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
2165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            /*Following condition gets satisfied only on target side,if receive
2175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly              is not already called*/
2185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            if(NULL == Hal4Ctxt->psTrcvCtxtInfo)
2195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
2205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                Hal4Ctxt->psTrcvCtxtInfo= (pphHal4Nfc_TrcvCtxtInfo_t)
2215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    phOsalNfc_GetMemory((uint32_t)
2225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    (sizeof(phHal4Nfc_TrcvCtxtInfo_t)));
2235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                if(NULL != Hal4Ctxt->psTrcvCtxtInfo)
2245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
2255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    (void)memset(Hal4Ctxt->psTrcvCtxtInfo,0,
2265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        sizeof(phHal4Nfc_TrcvCtxtInfo_t));
2275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    Hal4Ctxt->psTrcvCtxtInfo->TransactionTimerId
2285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        = PH_OSALNFC_INVALID_TIMER_ID;
2295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    Hal4Ctxt->psTrcvCtxtInfo->RecvDataBufferStatus = NFCSTATUS_PENDING;
2305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
2315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
2325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            if(NULL == Hal4Ctxt->psTrcvCtxtInfo)
2335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
2345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                phOsalNfc_RaiseException(phOsalNfc_e_NoMemory,0);
2355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                RetStatus= PHNFCSTVAL(CID_NFC_HAL ,
2365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    NFCSTATUS_INSUFFICIENT_RESOURCES);
2375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
2385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            else /*Store callback & Return status pending*/
2395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
2405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                Hal4Ctxt->sUpperLayerInfo.psUpperLayerCtxt = pContext;
2415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                /*Register upper layer callback*/
2425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                Hal4Ctxt->psTrcvCtxtInfo->pUpperTranceiveCb = NULL;
2435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                Hal4Ctxt->psTrcvCtxtInfo->pP2PRecvCb = pReceiveCallback;
2445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                if(NFCSTATUS_PENDING !=
2455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    Hal4Ctxt->psTrcvCtxtInfo->RecvDataBufferStatus)
2465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
2475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    /**Create a timer to send received data in the callback*/
2485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    if(Hal4Ctxt->psTrcvCtxtInfo->TransactionTimerId
2495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        == PH_OSALNFC_INVALID_TIMER_ID)
2505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
2515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        PHDBG_INFO("HAL4: Transaction Timer Create for Receive");
2525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        Hal4Ctxt->psTrcvCtxtInfo->TransactionTimerId
2535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            = phOsalNfc_Timer_Create();
2545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }
2555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    if(Hal4Ctxt->psTrcvCtxtInfo->TransactionTimerId
2565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        == PH_OSALNFC_INVALID_TIMER_ID)
2575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
2585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        RetStatus = PHNFCSTVAL(CID_NFC_HAL ,
2595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            NFCSTATUS_INSUFFICIENT_RESOURCES);
2605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }
2615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    else/*start the timer*/
2625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
2635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        phOsalNfc_Timer_Start(
2645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            Hal4Ctxt->psTrcvCtxtInfo->TransactionTimerId,
2655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            PH_HAL4NFC_RECV_CB_TIMEOUT,
2665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly							 phHal4Nfc_P2PRecvTimerCb,
2675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly							 NULL
2685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            );
2695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }
2705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
2715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
2725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
2735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        else/*deactivated*/
2745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
2755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            RetStatus= PHNFCSTVAL(CID_NFC_HAL ,NFCSTATUS_DESELECTED);
2765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
2775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
2785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    return RetStatus;
2795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
2805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
2815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*Timer callback for recv data timer for P2P.This timer is used for creating
2825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly  Asynchronous behavior in the scenario where the data is received even before
2835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly  the upper layer calls the phHal4Nfc_receive().*/
2845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic void phHal4Nfc_P2PRecvTimerCb(uint32_t P2PRecvTimerId, void *pContext)
2855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
2865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    phHal4Nfc_Hal4Ctxt_t *Hal4Ctxt = (phHal4Nfc_Hal4Ctxt_t *)(
2875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                            gpphHal4Nfc_Hwref->hal_context);
2885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    pphHal4Nfc_ReceiveCallback_t pUpperRecvCb = NULL;
2895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NFCSTATUS RecvDataBufferStatus = NFCSTATUS_PENDING;
2905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly	PHNFC_UNUSED_VARIABLE(pContext);
2915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
2925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    phOsalNfc_Timer_Stop(P2PRecvTimerId);
2935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    phOsalNfc_Timer_Delete(P2PRecvTimerId);
2945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    if(NULL != Hal4Ctxt->psTrcvCtxtInfo)
2955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
2965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        RecvDataBufferStatus = Hal4Ctxt->psTrcvCtxtInfo->RecvDataBufferStatus;
2975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        Hal4Ctxt->psTrcvCtxtInfo->RecvDataBufferStatus = NFCSTATUS_PENDING;
2985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
2995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        Hal4Ctxt->psTrcvCtxtInfo->TransactionTimerId
3005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            = PH_OSALNFC_INVALID_TIMER_ID;
3015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        /*Update state*/
3025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        Hal4Ctxt->Hal4NextState = (eHal4StateTransaction
3035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly             == Hal4Ctxt->Hal4NextState?eHal4StateInvalid:Hal4Ctxt->Hal4NextState);
3045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        /*Provide address of received data to upper layer data pointer*/
3055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        Hal4Ctxt->psTrcvCtxtInfo->psUpperRecvData
3065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            = &(Hal4Ctxt->psTrcvCtxtInfo->sLowerRecvData);
3075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        /*Chk NULL and call recv callback*/
3085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        if(Hal4Ctxt->psTrcvCtxtInfo->pP2PRecvCb != NULL)
3095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
3105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            pUpperRecvCb = Hal4Ctxt->psTrcvCtxtInfo->pP2PRecvCb;
3115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            Hal4Ctxt->psTrcvCtxtInfo->pP2PRecvCb = NULL;
3125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            (*pUpperRecvCb)(
3135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                Hal4Ctxt->sUpperLayerInfo.psUpperLayerCtxt,
3145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                Hal4Ctxt->psTrcvCtxtInfo->psUpperRecvData,
3155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                RecvDataBufferStatus
3165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                );
3175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
3185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
3195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    return;
3205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
3215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
3225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/**Send complete handler*/
3235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellyvoid phHal4Nfc_SendCompleteHandler(phHal4Nfc_Hal4Ctxt_t  *Hal4Ctxt,void *pInfo)
3245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
3255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    pphHal4Nfc_SendCallback_t pUpperSendCb = NULL;
3265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    pphHal4Nfc_TransceiveCallback_t pUpperTrcvCb = NULL;
3275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NFCSTATUS SendStatus = ((phNfc_sCompletionInfo_t *)pInfo)->status;
3285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    pphHal4Nfc_DiscntCallback_t pUpperDisconnectCb = NULL;
3295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    Hal4Ctxt->psTrcvCtxtInfo->P2P_Send_In_Progress = FALSE;
3305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /*Send status Success or Pending disconnect in HAl4*/
3315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    if((SendStatus != NFCSTATUS_SUCCESS)
3325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        ||(NFC_INVALID_RELEASE_TYPE != Hal4Ctxt->sTgtConnectInfo.ReleaseType))
3335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
3345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        Hal4Ctxt->Hal4NextState = eHal4StateInvalid;
3355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        /*Update Status*/
3365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        SendStatus = (NFCSTATUS)(NFC_INVALID_RELEASE_TYPE !=
3375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly          Hal4Ctxt->sTgtConnectInfo.ReleaseType?NFCSTATUS_RELEASED:SendStatus);
3385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        /*Callback For Target Send*/
3395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        if(NULL != Hal4Ctxt->psTrcvCtxtInfo->pP2PSendCb)
3405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
3415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            pUpperSendCb = Hal4Ctxt->psTrcvCtxtInfo->pP2PSendCb;
3425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            Hal4Ctxt->psTrcvCtxtInfo->pP2PSendCb = NULL;
3435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            (*pUpperSendCb)(
3445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                Hal4Ctxt->sUpperLayerInfo.psUpperLayerCtxt,
3455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                SendStatus
3465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                );
3475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
3485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        else/*Callback For Initiator Send*/
3495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
3505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            if(NULL !=  Hal4Ctxt->psTrcvCtxtInfo->pUpperTranceiveCb)
3515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
3525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                Hal4Ctxt->psTrcvCtxtInfo->psUpperRecvData->length = 0;
3535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                pUpperTrcvCb = Hal4Ctxt->psTrcvCtxtInfo->pUpperTranceiveCb;
3545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                Hal4Ctxt->psTrcvCtxtInfo->pUpperTranceiveCb = NULL;
3555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                (*pUpperTrcvCb)(
3565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    Hal4Ctxt->sUpperLayerInfo.psUpperLayerCtxt,
3575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    Hal4Ctxt->sTgtConnectInfo.psConnectedDevice,
3585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    Hal4Ctxt->psTrcvCtxtInfo->psUpperRecvData,
3595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    SendStatus
3605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    );
3615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
3625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
3635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        /*Issue Pending disconnect from HAl4*/
3645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        if(NFC_INVALID_RELEASE_TYPE != Hal4Ctxt->sTgtConnectInfo.ReleaseType)
3655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
3665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            SendStatus = phHal4Nfc_Disconnect_Execute(gpphHal4Nfc_Hwref);
3675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            if((NFCSTATUS_PENDING != SendStatus) &&
3685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly               (NULL != Hal4Ctxt->sTgtConnectInfo.pUpperDisconnectCb))
3695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
3705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                pUpperDisconnectCb =
3715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    Hal4Ctxt->sTgtConnectInfo.pUpperDisconnectCb;
3725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                Hal4Ctxt->sTgtConnectInfo.pUpperDisconnectCb = NULL;
3735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                (*pUpperDisconnectCb)(
374b5419c7dd2b703f796dc10480a5a73c907f41e14Sylvain Fonteneau                    Hal4Ctxt->sUpperLayerInfo.psUpperLayerDisconnectCtxt,
3755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    Hal4Ctxt->sTgtConnectInfo.psConnectedDevice,
3765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    SendStatus
3775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    );/*Notify disconnect failed to upper layer*/
3785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
3795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
3805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
3815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    else
3825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
3835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        /*More info remaining in send buffer.continue with sending remaining
3845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly          bytes*/
3855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        if(Hal4Ctxt->psTrcvCtxtInfo->psUpperSendData->length
38632060a1ad89a5791039bf4a7e89db6cbc3e669d0Sunil Jogi                                            > Hal4Ctxt->rem_dev_list[0]->RemoteDevInfo.NfcIP_Info.MaxFrameLength)
3875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
3885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            /*Set more info*/
3895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            Hal4Ctxt->psTrcvCtxtInfo->
3905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                XchangeInfo.params.nfc_info.more_info = TRUE;
3915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            /*copy to tx_buffer ,remaining bytes.NumberOfBytesSent is the
3925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly              number of bytes already sent from current send buffer.*/
3935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            Hal4Ctxt->psTrcvCtxtInfo->XchangeInfo.tx_buffer
3945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                = (Hal4Ctxt->psTrcvCtxtInfo->psUpperSendData->buffer
3955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                   + Hal4Ctxt->psTrcvCtxtInfo->NumberOfBytesSent);
3965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            Hal4Ctxt->psTrcvCtxtInfo->XchangeInfo.tx_length
39732060a1ad89a5791039bf4a7e89db6cbc3e669d0Sunil Jogi                = Hal4Ctxt->rem_dev_list[0]->RemoteDevInfo.NfcIP_Info.MaxFrameLength;
3985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            Hal4Ctxt->psTrcvCtxtInfo->NumberOfBytesSent
39932060a1ad89a5791039bf4a7e89db6cbc3e669d0Sunil Jogi                += Hal4Ctxt->rem_dev_list[0]->RemoteDevInfo.NfcIP_Info.MaxFrameLength;
4005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            Hal4Ctxt->psTrcvCtxtInfo->psUpperSendData->length
40132060a1ad89a5791039bf4a7e89db6cbc3e669d0Sunil Jogi                -= Hal4Ctxt->rem_dev_list[0]->RemoteDevInfo.NfcIP_Info.MaxFrameLength;
4025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            PHDBG_INFO("Hal4:Calling Hci_senddata() from sendcompletehandler1");
4035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            SendStatus = phHciNfc_Send_Data (
4045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                Hal4Ctxt->psHciHandle,
4055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                gpphHal4Nfc_Hwref,
4065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                Hal4Ctxt->sTgtConnectInfo.psConnectedDevice,
4075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                &(Hal4Ctxt->psTrcvCtxtInfo->XchangeInfo)
4085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                );
4095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            if(NFCSTATUS_PENDING == SendStatus)
4105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
4115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                Hal4Ctxt->psTrcvCtxtInfo->P2P_Send_In_Progress = TRUE;
4125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
4135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
4145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        /*Remaining bytes is less than PH_HAL4NFC_MAX_SEND_LEN*/
4155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        else if(Hal4Ctxt->psTrcvCtxtInfo->psUpperSendData->length > 0)
4165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
4175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            Hal4Ctxt->psTrcvCtxtInfo->
4185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                XchangeInfo.params.nfc_info.more_info = FALSE;
4195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            Hal4Ctxt->psTrcvCtxtInfo->XchangeInfo.tx_length
4205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                = (uint8_t)Hal4Ctxt->psTrcvCtxtInfo->psUpperSendData->length;
4215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            Hal4Ctxt->psTrcvCtxtInfo->XchangeInfo.tx_buffer
4225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                = (Hal4Ctxt->psTrcvCtxtInfo->psUpperSendData->buffer
4235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                + Hal4Ctxt->psTrcvCtxtInfo->NumberOfBytesSent);
4245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            Hal4Ctxt->psTrcvCtxtInfo->NumberOfBytesSent = 0;
4255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            /*No of bytes remaining for next send*/
4265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            Hal4Ctxt->psTrcvCtxtInfo->psUpperSendData->length = 0;
4275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            PHDBG_INFO("Hal4:Calling Hci_senddata() from sendcompletehandler2");
4285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            SendStatus = phHciNfc_Send_Data (
4295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                Hal4Ctxt->psHciHandle,
4305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                gpphHal4Nfc_Hwref,
4315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                Hal4Ctxt->sTgtConnectInfo.psConnectedDevice,
4325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                &(Hal4Ctxt->psTrcvCtxtInfo->XchangeInfo)
4335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                );
4345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
4355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        else/*No more Bytes left.Send complete*/
4365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
4375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            Hal4Ctxt->psTrcvCtxtInfo->NumberOfBytesSent = 0;
4385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            /*Callback For Target Send*/
4395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            if(NULL != Hal4Ctxt->psTrcvCtxtInfo->pP2PSendCb)
4405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
4415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                pUpperSendCb = Hal4Ctxt->psTrcvCtxtInfo->pP2PSendCb;
4425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                Hal4Ctxt->psTrcvCtxtInfo->pP2PSendCb = NULL;
4435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                (*pUpperSendCb)(
4445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    Hal4Ctxt->sUpperLayerInfo.psUpperLayerCtxt,
4455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                     SendStatus
4465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    );
4475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
4485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            else
4495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
4505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                /**Start timer to keep track of transceive timeout*/
4515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef TRANSACTION_TIMER
4525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                phOsalNfc_Timer_Start(
4535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    Hal4Ctxt->psTrcvCtxtInfo->TransactionTimerId,
4545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    PH_HAL4NFC_TRANSCEIVE_TIMEOUT,
4555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    phHal4Nfc_TrcvTimeoutHandler
4565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    );
4575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /*TRANSACTION_TIMER*/
4585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
4595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
4605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
4615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    return;
4625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
4635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
4645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/**Receive complete handler*/
4655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellyvoid phHal4Nfc_RecvCompleteHandler(phHal4Nfc_Hal4Ctxt_t  *Hal4Ctxt,void *pInfo)
4665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
4675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    pphHal4Nfc_ReceiveCallback_t pUpperRecvCb = NULL;
4685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    pphHal4Nfc_TransceiveCallback_t pUpperTrcvCb = NULL;
4695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NFCSTATUS RecvStatus = ((phNfc_sTransactionInfo_t *)pInfo)->status;
4705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /*allocate TrcvContext if not already allocated.Required since
4715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly     Receive complete can occur before any other send /receive calls.*/
4725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    if(NULL == Hal4Ctxt->psTrcvCtxtInfo)
4735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
4745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        Hal4Ctxt->psTrcvCtxtInfo= (pphHal4Nfc_TrcvCtxtInfo_t)
4755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            phOsalNfc_GetMemory((uint32_t)
4765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            (sizeof(phHal4Nfc_TrcvCtxtInfo_t)));
4775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        if(NULL != Hal4Ctxt->psTrcvCtxtInfo)
4785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
4795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            (void)memset(Hal4Ctxt->psTrcvCtxtInfo,0,
4805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                sizeof(phHal4Nfc_TrcvCtxtInfo_t));
4815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            Hal4Ctxt->psTrcvCtxtInfo->TransactionTimerId
4825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                = PH_OSALNFC_INVALID_TIMER_ID;
4835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            Hal4Ctxt->psTrcvCtxtInfo->RecvDataBufferStatus
4847b40e6d4b45110797cdea7d451d313af891bf6e3Sylvain Fonteneau                = NFCSTATUS_PENDING;
4855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
4865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
4875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    if(NULL == Hal4Ctxt->psTrcvCtxtInfo)
4885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
4895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        phOsalNfc_RaiseException(phOsalNfc_e_NoMemory,0);
4905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        RecvStatus = PHNFCSTVAL(CID_NFC_HAL ,
4915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            NFCSTATUS_INSUFFICIENT_RESOURCES);
4925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
4935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    else
4945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
4955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        /*Allocate 4K buffer to copy the received data into*/
4965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        if(NULL == Hal4Ctxt->psTrcvCtxtInfo->sLowerRecvData.buffer)
4975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
4985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            Hal4Ctxt->psTrcvCtxtInfo->sLowerRecvData.buffer
4995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                = (uint8_t *)phOsalNfc_GetMemory(
5005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        PH_HAL4NFC_MAX_RECEIVE_BUFFER
5015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        );
5025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            if(NULL == Hal4Ctxt->psTrcvCtxtInfo->sLowerRecvData.buffer)
5035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
5045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                phOsalNfc_RaiseException(phOsalNfc_e_NoMemory,
5055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    0);
5065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                RecvStatus = NFCSTATUS_INSUFFICIENT_RESOURCES;
5075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
5085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            else/*memset*/
5095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
5105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                (void)memset(
5115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    Hal4Ctxt->psTrcvCtxtInfo->sLowerRecvData.buffer,
5125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    0,
5135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    PH_HAL4NFC_MAX_RECEIVE_BUFFER
5145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    );
5155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
5165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
5175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
5185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        if(RecvStatus != NFCSTATUS_INSUFFICIENT_RESOURCES)
5195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
5205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            /*Copy the data*/
5215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            (void)memcpy(
5225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                (Hal4Ctxt->psTrcvCtxtInfo->sLowerRecvData.buffer
5235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                + Hal4Ctxt->psTrcvCtxtInfo->P2PRecvLength),
5245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                ((phNfc_sTransactionInfo_t *)pInfo)->buffer,
5255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                ((phNfc_sTransactionInfo_t *)pInfo)->length
5265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                );
5275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            /*Update P2PRecvLength,this also acts as the offset to append more
5285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly              received bytes*/
5295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            Hal4Ctxt->psTrcvCtxtInfo->P2PRecvLength
5305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                += ((phNfc_sTransactionInfo_t *)pInfo)->length;
5315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            Hal4Ctxt->psTrcvCtxtInfo->sLowerRecvData.length
5325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                = Hal4Ctxt->psTrcvCtxtInfo->P2PRecvLength;
5335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
5345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
5355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        if(RecvStatus != NFCSTATUS_MORE_INFORMATION)
5365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
5375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            Hal4Ctxt->psTrcvCtxtInfo->P2PRecvLength = 0;
5385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            Hal4Ctxt->Hal4NextState = (eHal4StateTransaction
5395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly             == Hal4Ctxt->Hal4NextState?eHal4StateInvalid:Hal4Ctxt->Hal4NextState);
5405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            if(NFCSTATUS_PENDING == Hal4Ctxt->psTrcvCtxtInfo->RecvDataBufferStatus)
5415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
5425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                /*Initiator case*/
5435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                if(NULL != Hal4Ctxt->psTrcvCtxtInfo->pUpperTranceiveCb)
5445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
5455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    RecvStatus =(NFCSTATUS_RF_TIMEOUT == RecvStatus?
5465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                NFCSTATUS_DESELECTED:RecvStatus);
5475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    pUpperTrcvCb = Hal4Ctxt->psTrcvCtxtInfo->pUpperTranceiveCb;
5485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    Hal4Ctxt->psTrcvCtxtInfo->pUpperTranceiveCb = NULL;
5495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    Hal4Ctxt->psTrcvCtxtInfo->psUpperRecvData
5505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        = &(Hal4Ctxt->psTrcvCtxtInfo->sLowerRecvData);
5515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    (*pUpperTrcvCb)(
5525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        Hal4Ctxt->sUpperLayerInfo.psUpperLayerCtxt,
5535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        Hal4Ctxt->sTgtConnectInfo.psConnectedDevice,
5545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        Hal4Ctxt->psTrcvCtxtInfo->psUpperRecvData,
5555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        RecvStatus
5565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        );
5575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
5585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                /*P2P target*/
5595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                else if(NULL != Hal4Ctxt->psTrcvCtxtInfo->pP2PRecvCb)
5605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
5615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    pUpperRecvCb = Hal4Ctxt->psTrcvCtxtInfo->pP2PRecvCb;
5625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    Hal4Ctxt->psTrcvCtxtInfo->pP2PRecvCb = NULL;
5635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    Hal4Ctxt->psTrcvCtxtInfo->psUpperRecvData
5645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        = &(Hal4Ctxt->psTrcvCtxtInfo->sLowerRecvData);
5655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    (*pUpperRecvCb)(
5665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        Hal4Ctxt->sUpperLayerInfo.psUpperLayerCtxt,
5675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        Hal4Ctxt->psTrcvCtxtInfo->psUpperRecvData,
5685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        RecvStatus
5695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        );
5705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
5715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                else
5725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
5735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    /*Receive data buffer is complete with data & P2P receive has
5745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                      not yet been called*/
5755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    Hal4Ctxt->psTrcvCtxtInfo->RecvDataBufferStatus
5765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        = NFCSTATUS_SUCCESS;
5775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
5785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
5795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
5805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
5815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    return;
5825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
5835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
5845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*Activation complete handler*/
5855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellyvoid phHal4Nfc_P2PActivateComplete(
5865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                             phHal4Nfc_Hal4Ctxt_t  *Hal4Ctxt,
5875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                             void *pInfo
5885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                            )
5895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
5905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    phHal_sEventInfo_t *psEventInfo = (phHal_sEventInfo_t *)pInfo;
5915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NFCSTATUS Status = NFCSTATUS_SUCCESS;
5925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    static phHal4Nfc_DiscoveryInfo_t sDiscoveryInfo;
5935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /*Copy notification info to provide to upper layer*/
5945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    phHal4Nfc_NotificationInfo_t uNotificationInfo = {&sDiscoveryInfo};
5955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    Hal4Ctxt->sTgtConnectInfo.EmulationState = NFC_EVT_ACTIVATED;
5965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /*if P2p notification is registered*/
5975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    if( NULL != Hal4Ctxt->sUpperLayerInfo.pP2PNotification)
5985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
5995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        /*Allocate remote device Info for P2P target*/
6005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        uNotificationInfo.psDiscoveryInfo->NumberOfDevices = 1;
6015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        if(NULL == Hal4Ctxt->rem_dev_list[0])
6025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
6035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            Hal4Ctxt->rem_dev_list[0]
6045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                = (phHal_sRemoteDevInformation_t *)
6055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    phOsalNfc_GetMemory(
6065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    sizeof(phHal_sRemoteDevInformation_t)
6075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    );
6085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
6095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        if(NULL == Hal4Ctxt->rem_dev_list[0])
6105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
6115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            phOsalNfc_RaiseException(phOsalNfc_e_NoMemory,0);
6125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            Status = PHNFCSTVAL(CID_NFC_HAL ,
6135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                NFCSTATUS_INSUFFICIENT_RESOURCES);
6145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
6155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        else
6165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
6175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            (void)memset((void *)Hal4Ctxt->rem_dev_list[0],
6185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                0,sizeof(phHal_sRemoteDevInformation_t));
6195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            /*Copy device info*/
6205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            (void)memcpy(Hal4Ctxt->rem_dev_list[0],
6215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                psEventInfo->eventInfo.pRemoteDevInfo,
6225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                sizeof(phHal_sRemoteDevInformation_t)
6235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                );
6245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            /*Allocate Trcv context info*/
6255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            if(NULL == Hal4Ctxt->psTrcvCtxtInfo)
6265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
6275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                Hal4Ctxt->psTrcvCtxtInfo= (pphHal4Nfc_TrcvCtxtInfo_t)
6285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    phOsalNfc_GetMemory((uint32_t)
6295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    (sizeof(phHal4Nfc_TrcvCtxtInfo_t)));
6305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                if(NULL != Hal4Ctxt->psTrcvCtxtInfo)
6315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
6325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    (void)memset(Hal4Ctxt->psTrcvCtxtInfo,0,
6335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        sizeof(phHal4Nfc_TrcvCtxtInfo_t));
6345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    Hal4Ctxt->psTrcvCtxtInfo->RecvDataBufferStatus
6355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        = NFCSTATUS_PENDING;
6365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    Hal4Ctxt->psTrcvCtxtInfo->TransactionTimerId
6375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                        = PH_OSALNFC_INVALID_TIMER_ID;
6385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
6395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
6405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            if(NULL == Hal4Ctxt->psTrcvCtxtInfo)
6415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
6425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                phOsalNfc_RaiseException(phOsalNfc_e_NoMemory,0);
6435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                Status= PHNFCSTVAL(CID_NFC_HAL ,
6445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    NFCSTATUS_INSUFFICIENT_RESOURCES);
6455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
6465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            else
6475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
6485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                /*Update state*/
6495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                Hal4Ctxt->Hal4CurrentState = eHal4StateEmulation;
6505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                Hal4Ctxt->Hal4NextState = eHal4StateInvalid;
6515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                uNotificationInfo.psDiscoveryInfo->ppRemoteDevInfo
6525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    = Hal4Ctxt->rem_dev_list;
6535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                /*set session Opened ,this will keep track of whether the session
6545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                 is alive.will be reset if a Event DEACTIVATED is received*/
6555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                Hal4Ctxt->rem_dev_list[0]->SessionOpened = TRUE;
6565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                (*Hal4Ctxt->sUpperLayerInfo.pP2PNotification)(
6575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    Hal4Ctxt->sUpperLayerInfo.P2PDiscoveryCtxt,
6585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    NFC_DISCOVERY_NOTIFICATION,
6595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    uNotificationInfo,
6605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    Status
6615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    );
6625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
6635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
6645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
6655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    return;
6665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
6675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
6685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*Deactivation complete handler*/
6695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellyvoid phHal4Nfc_HandleP2PDeActivate(
6705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                               phHal4Nfc_Hal4Ctxt_t  *Hal4Ctxt,
6715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                               void *pInfo
6725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                               )
6735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
6745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    pphHal4Nfc_ReceiveCallback_t pUpperRecvCb = NULL;
6755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    pphHal4Nfc_SendCallback_t pUpperSendCb = NULL;
6765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    phHal4Nfc_NotificationInfo_t uNotificationInfo;
6775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    uNotificationInfo.psEventInfo = (phHal_sEventInfo_t *)pInfo;
6785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /*session is closed*/
6795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    if(NULL != Hal4Ctxt->rem_dev_list[0])
6805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
6815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        Hal4Ctxt->rem_dev_list[0]->SessionOpened = FALSE;
6825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        Hal4Ctxt->psADDCtxtInfo->nbr_of_devices = 0;
6835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
6845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    Hal4Ctxt->sTgtConnectInfo.psConnectedDevice = NULL;
6855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /*Update state*/
6865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    Hal4Ctxt->Hal4CurrentState = eHal4StateOpenAndReady;
6875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    Hal4Ctxt->Hal4NextState  = eHal4StateInvalid;
6885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    Hal4Ctxt->sTgtConnectInfo.EmulationState = NFC_EVT_DEACTIVATED;
6895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /*If Trcv ctxt info is allocated ,free it here*/
6905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    if(NULL != Hal4Ctxt->psTrcvCtxtInfo)
6915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
6925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        if(PH_OSALNFC_INVALID_TIMER_ID !=
6935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            Hal4Ctxt->psTrcvCtxtInfo->TransactionTimerId)
6945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
6955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            phOsalNfc_Timer_Stop(Hal4Ctxt->psTrcvCtxtInfo->TransactionTimerId);
6965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            phOsalNfc_Timer_Delete(Hal4Ctxt->psTrcvCtxtInfo->TransactionTimerId);
6975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
6985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        pUpperRecvCb = Hal4Ctxt->psTrcvCtxtInfo->pP2PRecvCb;
6995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        pUpperSendCb = Hal4Ctxt->psTrcvCtxtInfo->pP2PSendCb;
7005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        /*Free Hal4 resources used by Target*/
7015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        if (NULL != Hal4Ctxt->psTrcvCtxtInfo->sLowerRecvData.buffer)
7025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
7035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            phOsalNfc_FreeMemory(Hal4Ctxt->psTrcvCtxtInfo->
7045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                sLowerRecvData.buffer);
7055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
7065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        if((NULL == Hal4Ctxt->sTgtConnectInfo.psConnectedDevice)
7075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            && (NULL != Hal4Ctxt->psTrcvCtxtInfo->psUpperSendData))
7085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
7095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            phOsalNfc_FreeMemory(Hal4Ctxt->psTrcvCtxtInfo->psUpperSendData);
7105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
7115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        phOsalNfc_FreeMemory(Hal4Ctxt->psTrcvCtxtInfo);
7125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        Hal4Ctxt->psTrcvCtxtInfo = NULL;
7135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
7145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /*if recv callback is pending*/
7155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    if(NULL != pUpperRecvCb)
7165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
7175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        (*pUpperRecvCb)(
7185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        Hal4Ctxt->sUpperLayerInfo.psUpperLayerCtxt,
7195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        NULL,
7205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        NFCSTATUS_DESELECTED
7215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        );
7225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
7235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /*if send callback is pending*/
7245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    else if(NULL != pUpperSendCb)
7255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
7265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        (*pUpperSendCb)(
7275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        Hal4Ctxt->sUpperLayerInfo.psUpperLayerCtxt,
7285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        NFCSTATUS_DESELECTED
7295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        );
7305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
7315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /*if pP2PNotification is registered*/
7325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    else if(NULL != Hal4Ctxt->sUpperLayerInfo.pP2PNotification)
7335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
7345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        (*Hal4Ctxt->sUpperLayerInfo.pP2PNotification)(
7355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                Hal4Ctxt->sUpperLayerInfo.P2PDiscoveryCtxt,
7365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                NFC_EVENT_NOTIFICATION,
7375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                uNotificationInfo,
7385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                NFCSTATUS_DESELECTED
7395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                );
7405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
7415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    else/*Call Default event handler*/
7425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
7435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        if(NULL != Hal4Ctxt->sUpperLayerInfo.pDefaultEventHandler)
7445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
7455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            Hal4Ctxt->sUpperLayerInfo.pDefaultEventHandler(
7465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                Hal4Ctxt->sUpperLayerInfo.DefaultListenerCtxt,
7475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                NFC_EVENT_NOTIFICATION,
7485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                uNotificationInfo,
7495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                NFCSTATUS_DESELECTED
7505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                );
7515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
7525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
7535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
754