phFriNfc_LlcpMacNfcip.c revision c2c730a21faacadbb607bfa182795262d00a8ec7
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
185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/**
195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * \file  phFriNfc_LlcpMacNfcip.c
205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * \brief NFC LLCP MAC Mappings For Different RF Technologies.
215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *
225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * Project: NFC-FRI
235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *
245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */
255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*include files*/
285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phFriNfc_LlcpMac.h>
295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phLibNfcStatus.h>
305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phLibNfc.h>
315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phLibNfc_Internal.h>
325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <stdio.h>
335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <string.h>
345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_LlcpMac_Nfcip_Send(phFriNfc_LlcpMac_t               *LlcpMac,
365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                             phNfc_sData_t                    *psData,
375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                             phFriNfc_LlcpMac_Send_CB_t       LlcpMacSend_Cb,
385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                             void                             *pContext);
395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
41c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneaustatic void phFriNfc_LlcpMac_Nfcip_TriggerRecvCb(phFriNfc_LlcpMac_t  *LlcpMac,
42c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau                                                 NFCSTATUS           status)
43c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau{
44c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau   phFriNfc_LlcpMac_Reveive_CB_t pfReceiveCB;
45c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau   void                          *pReceiveContext;
46c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau
47c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau   if (LlcpMac->MacReceive_Cb != NULL)
48c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau   {
49c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau      /* Save callback params */
50c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau      pfReceiveCB = LlcpMac->MacReceive_Cb;
51c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau      pReceiveContext = LlcpMac->MacReceive_Context;
52c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau
53c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau      /* Reset the pointer to the Receive Callback and Context*/
54c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau      LlcpMac->MacReceive_Cb = NULL;
55c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau      LlcpMac->MacReceive_Context = NULL;
56c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau
57c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau      /* Call the receive callback */
58c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau      pfReceiveCB(pReceiveContext, status, LlcpMac->psReceiveBuffer);
59c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau   }
60c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau}
61c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau
62c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneaustatic void phFriNfc_LlcpMac_Nfcip_TriggerSendCb(phFriNfc_LlcpMac_t  *LlcpMac,
63c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau                                                 NFCSTATUS           status)
64c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau{
65c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau   phFriNfc_LlcpMac_Send_CB_t pfSendCB;
66c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau   void                       *pSendContext;
67c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau
68c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau   if (LlcpMac->MacSend_Cb != NULL)
69c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau   {
70c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau      /* Save context in local variables */
71c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau      pfSendCB     = LlcpMac->MacSend_Cb;
72c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau      pSendContext = LlcpMac->MacSend_Context;
73c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau
74c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau      /* Reset the pointer to the Send Callback */
75c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau      LlcpMac->MacSend_Cb = NULL;
76c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau      LlcpMac->MacSend_Context = NULL;
77c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau
78c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau      /* Call Send callback */
79c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau      pfSendCB(pSendContext, status);
80c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau   }
81c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau}
82c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau
835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_LlcpMac_Nfcip_Chk(phFriNfc_LlcpMac_t                   *LlcpMac,
845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                            phFriNfc_LlcpMac_Chk_CB_t            ChkLlcpMac_Cb,
855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                            void                                 *pContext)
865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   NFCSTATUS status = NFCSTATUS_SUCCESS;
885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   uint8_t Llcp_Magic_Number[] = {0x46,0x66,0x6D};
895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   if(NULL == LlcpMac || NULL == ChkLlcpMac_Cb || NULL == pContext)
915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   {
925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      status = PHNFCSTVAL(CID_FRI_NFC_LLCP_MAC, NFCSTATUS_INVALID_PARAMETER);
935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   }
945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   else
955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   {
965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      status = (NFCSTATUS)memcmp(Llcp_Magic_Number,LlcpMac->psRemoteDevInfo->RemoteDevInfo.NfcIP_Info.ATRInfo,3);
975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      if(!status)
985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      {
995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly         LlcpMac->sConfigParam.buffer = &LlcpMac->psRemoteDevInfo->RemoteDevInfo.NfcIP_Info.ATRInfo[3] ;
1005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly         LlcpMac->sConfigParam.length = (LlcpMac->psRemoteDevInfo->RemoteDevInfo.NfcIP_Info.ATRInfo_Length - 3);
1015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly         status = NFCSTATUS_SUCCESS;
1025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      }
1035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      else
1045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      {
1055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly         status = PHNFCSTVAL(CID_FRI_NFC_LLCP_MAC, NFCSTATUS_FAILED);
1065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      }
1075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   }
1085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   ChkLlcpMac_Cb(pContext,status);
1105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   return status;
1115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
1125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_LlcpMac_Nfcip_Activate (phFriNfc_LlcpMac_t   *LlcpMac)
1145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
1155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   NFCSTATUS status  = NFCSTATUS_SUCCESS;
1165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   if(LlcpMac == NULL)
1185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   {
1195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      status = PHNFCSTVAL(CID_FRI_NFC_LLCP_MAC, NFCSTATUS_INVALID_PARAMETER);
1205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   }
1215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   else
1225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   {
1235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      LlcpMac->LinkState = phFriNfc_LlcpMac_eLinkActivated;
1245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      LlcpMac->LinkStatus_Cb(LlcpMac->LinkStatus_Context,
1255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                             LlcpMac->LinkState,
1265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                             &LlcpMac->sConfigParam,
1275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                             LlcpMac->PeerRemoteDevType);
1285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   }
1295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   return status;
1315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
1325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_LlcpMac_Nfcip_Deactivate (phFriNfc_LlcpMac_t   *LlcpMac)
1345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
1355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   NFCSTATUS status  = NFCSTATUS_SUCCESS;
1365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   if(NULL == LlcpMac)
1385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   {
1395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      status = PHNFCSTVAL(CID_FRI_NFC_LLCP_MAC, NFCSTATUS_INVALID_PARAMETER);
1405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   }
1415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   else
1425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   {
1435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      /* Set the flag of LinkStatus to deactivate */
1445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      LlcpMac->LinkState = phFriNfc_LlcpMac_eLinkDeactivated;
1455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   }
1465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
14735a9f321a9cb5db0e65b9579d11bee2ac9bb1c54Sylvain Fonteneau   if (LlcpMac->SendPending)
14835a9f321a9cb5db0e65b9579d11bee2ac9bb1c54Sylvain Fonteneau   {
14935a9f321a9cb5db0e65b9579d11bee2ac9bb1c54Sylvain Fonteneau      /* Reset Flag */
15035a9f321a9cb5db0e65b9579d11bee2ac9bb1c54Sylvain Fonteneau      LlcpMac->SendPending = FALSE;
15135a9f321a9cb5db0e65b9579d11bee2ac9bb1c54Sylvain Fonteneau
152c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau      phFriNfc_LlcpMac_Nfcip_TriggerSendCb(LlcpMac, NFCSTATUS_FAILED);
15335a9f321a9cb5db0e65b9579d11bee2ac9bb1c54Sylvain Fonteneau   }
15435a9f321a9cb5db0e65b9579d11bee2ac9bb1c54Sylvain Fonteneau
15535a9f321a9cb5db0e65b9579d11bee2ac9bb1c54Sylvain Fonteneau   if (LlcpMac->RecvPending)
15635a9f321a9cb5db0e65b9579d11bee2ac9bb1c54Sylvain Fonteneau   {
15735a9f321a9cb5db0e65b9579d11bee2ac9bb1c54Sylvain Fonteneau      /* Reset Flag */
15835a9f321a9cb5db0e65b9579d11bee2ac9bb1c54Sylvain Fonteneau      LlcpMac->RecvPending = FALSE;
15935a9f321a9cb5db0e65b9579d11bee2ac9bb1c54Sylvain Fonteneau
160c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau      phFriNfc_LlcpMac_Nfcip_TriggerRecvCb(LlcpMac, NFCSTATUS_FAILED);
16135a9f321a9cb5db0e65b9579d11bee2ac9bb1c54Sylvain Fonteneau   }
16235a9f321a9cb5db0e65b9579d11bee2ac9bb1c54Sylvain Fonteneau
1635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   LlcpMac->LinkStatus_Cb(LlcpMac->LinkStatus_Context,
1645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                          LlcpMac->LinkState,
1655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                          NULL,
1665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                          LlcpMac->PeerRemoteDevType);
1675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   return status;
1695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
1705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic void phFriNfc_LlcpMac_Nfcip_Send_Cb(void       *pContext,
1725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                           NFCSTATUS   Status)
1735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
1745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   phFriNfc_LlcpMac_t            *LlcpMac = (phFriNfc_LlcpMac_t *)pContext;
1755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1766e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas#ifdef LLCP_CHANGES
1776e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas   if(gpphLibContext->LibNfcState.next_state
1786e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas                               == eLibNfcHalStateShutdown)
1796e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas   {
1806e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas      phLibNfc_Pending_Shutdown();
1816e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas      Status = NFCSTATUS_SHUTDOWN;
1826e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas   }
1836e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas#endif /* #ifdef LLCP_CHANGES */
1846e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas
1855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   /* Reset Send and Receive Flag */
1865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   LlcpMac->SendPending = FALSE;
1875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   LlcpMac->RecvPending = FALSE;
1885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
189c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau   phFriNfc_LlcpMac_Nfcip_TriggerSendCb(LlcpMac, Status);
1905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
1925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic void phFriNfc_LlcpMac_Nfcip_Receive_Cb(void       *pContext,
1945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                              NFCSTATUS   Status)
1955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
1965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   phFriNfc_LlcpMac_t               *LlcpMac = (phFriNfc_LlcpMac_t *)pContext;
1976e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas#ifdef LLCP_CHANGES
1986e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas
1996e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas   phFriNfc_LlcpMac_Send_CB_t       pfSendCB;
2006e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas   void                             *pSendContext;
2016e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas
2026e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas
2036e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas   if(gpphLibContext->LibNfcState.next_state
2046e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas                               == eLibNfcHalStateShutdown)
2056e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas   {
2066e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas      phLibNfc_Pending_Shutdown();
2076e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas      Status = NFCSTATUS_SHUTDOWN;
2086e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas   }
2096e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas
2106e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas   if (NFCSTATUS_SHUTDOWN == Status)
2116e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas   {
2126e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas      /* Save context in local variables */
2136e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas      pfSendCB = LlcpMac->MacSend_Cb;
2146e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas      pSendContext = LlcpMac->MacSend_Context;
2156e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas
2166e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas      /* Reset the pointer to the Send Callback */
2176e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas      LlcpMac->MacSend_Cb = NULL;
2186e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas      LlcpMac->MacSend_Context = NULL;
2196e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas
2206e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas      /* Reset Send and Receive Flag */
2216e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas      LlcpMac->SendPending = FALSE;
2226e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas      LlcpMac->RecvPending = FALSE;
2236e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas   }
2246e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas
2256e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas#endif /* #ifdef LLCP_CHANGES */
2265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
227c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau   phFriNfc_LlcpMac_Nfcip_TriggerRecvCb(LlcpMac, Status);
2285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
2296e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas#ifdef LLCP_CHANGES
2306e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas
2316e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas   if (NFCSTATUS_SHUTDOWN == Status)
2326e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas   {
2336e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas       if ((LlcpMac->SendPending) && (NULL != pfSendCB))
2346e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas       {
2356e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas           pfSendCB(pSendContext, Status);
2366e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas      }
2376e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas   }
2386e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas   else
2396e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas
2406e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas#endif /* #ifdef LLCP_CHANGES */
2416e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas   {
2425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   /* Test if a send is pending */
2435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   if(LlcpMac->SendPending)
2445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   {
2455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      Status = phFriNfc_LlcpMac_Nfcip_Send(LlcpMac,LlcpMac->psSendBuffer,LlcpMac->MacSend_Cb,LlcpMac->MacReceive_Context);
2465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   }
2475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
2486e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas}
2495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
2505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic void phFriNfc_LlcpMac_Nfcip_Transceive_Cb(void       *pContext,
2515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                 NFCSTATUS   Status)
2525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
2535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   phFriNfc_LlcpMac_t               *LlcpMac = (phFriNfc_LlcpMac_t *)pContext;
2545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
2556e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas#ifdef LLCP_CHANGES
2566e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas   if(gpphLibContext->LibNfcState.next_state
2576e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas                               == eLibNfcHalStateShutdown)
2586e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas   {
2596e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas      phLibNfc_Pending_Shutdown();
2606e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas      Status = NFCSTATUS_SHUTDOWN;
2616e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas   }
2626e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas#endif /* #ifdef LLCP_CHANGES */
2635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
2645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   /* Reset Send and Receive Flag */
2655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   LlcpMac->SendPending = FALSE;
2665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   LlcpMac->RecvPending = FALSE;
2675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
2685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   /* Call the callbacks */
269c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau   phFriNfc_LlcpMac_Nfcip_TriggerSendCb(LlcpMac, Status);
270c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau   phFriNfc_LlcpMac_Nfcip_TriggerRecvCb(LlcpMac, Status);
2715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
2725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
2735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_LlcpMac_Nfcip_Send(phFriNfc_LlcpMac_t               *LlcpMac,
2745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                             phNfc_sData_t                    *psData,
2755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                             phFriNfc_LlcpMac_Send_CB_t       LlcpMacSend_Cb,
2765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                             void                             *pContext)
2775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
2785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   NFCSTATUS status = NFCSTATUS_SUCCESS;
2795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
2805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   if(NULL == LlcpMac || NULL == psData || NULL == LlcpMacSend_Cb || NULL == pContext)
2815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   {
2825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      status = PHNFCSTVAL(CID_FRI_NFC_LLCP_MAC, NFCSTATUS_INVALID_PARAMETER);
2835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   }
2845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   else if(LlcpMac->MacSend_Cb != NULL && LlcpMac->PeerRemoteDevType == phFriNfc_LlcpMac_ePeerTypeInitiator)
2855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   {
2865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      /*Previous callback is pending */
2875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      status = NFCSTATUS_REJECTED;
2885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   }
2895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   else
2905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   {
2915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      /* Save the LlcpMacSend_Cb */
2925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      LlcpMac->MacSend_Cb = LlcpMacSend_Cb;
2935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      LlcpMac->MacSend_Context = pContext;
2945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
2955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      switch(LlcpMac->PeerRemoteDevType)
2965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      {
2975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      case phFriNfc_LlcpMac_ePeerTypeInitiator:
2985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly         {
2995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            if(LlcpMac->RecvPending)
3005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
3015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly               /*set the completion routines for the LLCP Transceive function*/
3025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                LlcpMac->MacCompletionInfo.CompletionRoutine = phFriNfc_LlcpMac_Nfcip_Transceive_Cb;
3035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                LlcpMac->MacCompletionInfo.Context = LlcpMac;
3045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
3055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                /* set the command type*/
3065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                LlcpMac->Cmd.NfcIP1Cmd = phHal_eNfcIP1_Raw;
3075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
3085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                /* set the Additional Info*/
3095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                LlcpMac->psDepAdditionalInfo.DepFlags.MetaChaining = 0;
3105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                LlcpMac->psDepAdditionalInfo.DepFlags.NADPresent = 0;
3115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                LlcpMac->SendPending = TRUE;
3125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
3135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                status = phFriNfc_OvrHal_Transceive(LlcpMac->LowerDevice,
3145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                    &LlcpMac->MacCompletionInfo,
3155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                    LlcpMac->psRemoteDevInfo,
3165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                    LlcpMac->Cmd,
3175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                    &LlcpMac->psDepAdditionalInfo,
3185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                    psData->buffer,
3195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                    (uint16_t)psData->length,
3205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                    LlcpMac->psReceiveBuffer->buffer,
3215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                    (uint16_t*)&LlcpMac->psReceiveBuffer->length);
3225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
3235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            else
3245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
3255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly               LlcpMac->SendPending = TRUE;
3265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly               LlcpMac->psSendBuffer = psData;
3275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly               return status = NFCSTATUS_PENDING;
3285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
3295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly         }break;
3305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      case phFriNfc_LlcpMac_ePeerTypeTarget:
3315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly         {
3325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            if(!LlcpMac->RecvPending)
3335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
3345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly               LlcpMac->SendPending = TRUE;
3355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly               LlcpMac->psSendBuffer = psData;
3365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly               return status = NFCSTATUS_PENDING;
3375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
3385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            else
3395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
3405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly               /*set the completion routines for the LLCP Send function*/
3415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly               LlcpMac->MacCompletionInfo.CompletionRoutine = phFriNfc_LlcpMac_Nfcip_Send_Cb;
3425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly               LlcpMac->MacCompletionInfo.Context = LlcpMac;
3435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly               status = phFriNfc_OvrHal_Send(LlcpMac->LowerDevice,
3445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                             &LlcpMac->MacCompletionInfo,
3455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                             LlcpMac->psRemoteDevInfo,
3465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                             psData->buffer,
3475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                             (uint16_t)psData->length);
3485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
3495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly         }break;
3505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      default:
3515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly         {
3525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            status = PHNFCSTVAL(CID_FRI_NFC_LLCP_MAC, NFCSTATUS_INVALID_DEVICE);
3535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly         }break;
3545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      }
3555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   }
3565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   return status;
3575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
3585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
3595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_LlcpMac_Nfcip_Receive(phFriNfc_LlcpMac_t               *LlcpMac,
3605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                phNfc_sData_t                    *psData,
3615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                phFriNfc_LlcpMac_Reveive_CB_t    LlcpMacReceive_Cb,
3625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                void                             *pContext)
3635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
3645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   NFCSTATUS status = NFCSTATUS_SUCCESS;
3655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   if(NULL == LlcpMac || NULL==psData || NULL == LlcpMacReceive_Cb || NULL == pContext)
3665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   {
3675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      status = PHNFCSTVAL(CID_FRI_NFC_LLCP_MAC, NFCSTATUS_INVALID_PARAMETER);
3685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   }
3695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   else if(LlcpMac->MacReceive_Cb != NULL)
3705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   {
3715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      /*Previous callback is pending */
3725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      status = NFCSTATUS_REJECTED;
3735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   }
3745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   else
3755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   {
3765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      /* Save the LlcpMacReceive_Cb */
3775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      LlcpMac->MacReceive_Cb = LlcpMacReceive_Cb;
3785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      LlcpMac->MacReceive_Context = pContext;
3795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
3805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      /* Save the pointer to the receive buffer */
3815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      LlcpMac->psReceiveBuffer= psData;
3825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
3835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      switch(LlcpMac->PeerRemoteDevType)
3845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      {
3855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      case phFriNfc_LlcpMac_ePeerTypeInitiator:
3865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly         {
3875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            if(LlcpMac->SendPending)
3885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
3895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly               /*set the completion routines for the LLCP Transceive function*/
3905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly               LlcpMac->MacCompletionInfo.CompletionRoutine = phFriNfc_LlcpMac_Nfcip_Transceive_Cb;
3915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly               LlcpMac->MacCompletionInfo.Context = LlcpMac;
3925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly               /* set the command type*/
3935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly               LlcpMac->Cmd.NfcIP1Cmd = phHal_eNfcIP1_Raw;
3945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly               /* set the Additional Info*/
3955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly               LlcpMac->psDepAdditionalInfo.DepFlags.MetaChaining = 0;
3965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly               LlcpMac->psDepAdditionalInfo.DepFlags.NADPresent = 0;
3975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly               LlcpMac->RecvPending = TRUE;
3985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
3995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly               status = phFriNfc_OvrHal_Transceive(LlcpMac->LowerDevice,
4005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                   &LlcpMac->MacCompletionInfo,
4015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                   LlcpMac->psRemoteDevInfo,
4025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                   LlcpMac->Cmd,
4035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                   &LlcpMac->psDepAdditionalInfo,
4045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                   LlcpMac->psSendBuffer->buffer,
4055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                   (uint16_t)LlcpMac->psSendBuffer->length,
4065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                   psData->buffer,
4075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                   (uint16_t*)&psData->length);
4085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
4095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            else
4105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
4115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly               LlcpMac->RecvPending = TRUE;
4125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly               return status = NFCSTATUS_PENDING;
4135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
4145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly         }break;
4155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      case phFriNfc_LlcpMac_ePeerTypeTarget:
4165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly         {
4175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly             /*set the completion routines for the LLCP Receive function*/
4185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            LlcpMac->MacCompletionInfo.CompletionRoutine = phFriNfc_LlcpMac_Nfcip_Receive_Cb;
4195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            /* save the context of LlcpMacNfcip */
4205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            LlcpMac->MacCompletionInfo.Context = LlcpMac;
4215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            LlcpMac->RecvPending = TRUE;
4225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
4235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            status = phFriNfc_OvrHal_Receive(LlcpMac->LowerDevice,
4245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                             &LlcpMac->MacCompletionInfo,
4255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                             LlcpMac->psRemoteDevInfo,
4265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                             LlcpMac->psReceiveBuffer->buffer,
4275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                             (uint16_t*)&LlcpMac->psReceiveBuffer->length);
4285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly         }break;
4295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      default:
4305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly         {
4315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            status = PHNFCSTVAL(CID_FRI_NFC_LLCP_MAC, NFCSTATUS_INVALID_DEVICE);
4325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly         }break;
4335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      }
4345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   }
4355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   return status;
4365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
4375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
4385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
4395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS phFriNfc_LlcpMac_Nfcip_Register (phFriNfc_LlcpMac_t *LlcpMac)
4405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
4415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   NFCSTATUS status = NFCSTATUS_SUCCESS;
4425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
4435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   if(NULL != LlcpMac)
4445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   {
4455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      LlcpMac->LlcpMacInterface.chk = phFriNfc_LlcpMac_Nfcip_Chk;
4465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      LlcpMac->LlcpMacInterface.activate   = phFriNfc_LlcpMac_Nfcip_Activate;
4475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      LlcpMac->LlcpMacInterface.deactivate = phFriNfc_LlcpMac_Nfcip_Deactivate;
4485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      LlcpMac->LlcpMacInterface.send = phFriNfc_LlcpMac_Nfcip_Send;
4495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      LlcpMac->LlcpMacInterface.receive = phFriNfc_LlcpMac_Nfcip_Receive;
4505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
4515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      return NFCSTATUS_SUCCESS;
4525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   }
4535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   else
4545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   {
4555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      return status = PHNFCSTVAL(CID_FRI_NFC_LLCP_MAC, NFCSTATUS_FAILED);
4565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   }
4575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
458