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