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      }
1072ee71571ead17d435e9d9e8be300edd5d45333b7Sunil Jogi      ChkLlcpMac_Cb(pContext,status);
1085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   }
1095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
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;
14535a9f321a9cb5db0e65b9579d11bee2ac9bb1c54Sylvain Fonteneau
1462ee71571ead17d435e9d9e8be300edd5d45333b7Sunil Jogi      if (LlcpMac->SendPending)
1472ee71571ead17d435e9d9e8be300edd5d45333b7Sunil Jogi      {
1482ee71571ead17d435e9d9e8be300edd5d45333b7Sunil Jogi         /* Reset Flag */
1492ee71571ead17d435e9d9e8be300edd5d45333b7Sunil Jogi         LlcpMac->SendPending = FALSE;
1502ee71571ead17d435e9d9e8be300edd5d45333b7Sunil Jogi         phFriNfc_LlcpMac_Nfcip_TriggerSendCb(LlcpMac, NFCSTATUS_FAILED);
1512ee71571ead17d435e9d9e8be300edd5d45333b7Sunil Jogi      }
15235a9f321a9cb5db0e65b9579d11bee2ac9bb1c54Sylvain Fonteneau
1532ee71571ead17d435e9d9e8be300edd5d45333b7Sunil Jogi      if (LlcpMac->RecvPending)
1542ee71571ead17d435e9d9e8be300edd5d45333b7Sunil Jogi      {
1552ee71571ead17d435e9d9e8be300edd5d45333b7Sunil Jogi         /* Reset Flag */
1562ee71571ead17d435e9d9e8be300edd5d45333b7Sunil Jogi         LlcpMac->RecvPending = FALSE;
1572ee71571ead17d435e9d9e8be300edd5d45333b7Sunil Jogi         phFriNfc_LlcpMac_Nfcip_TriggerRecvCb(LlcpMac, NFCSTATUS_FAILED);
1582ee71571ead17d435e9d9e8be300edd5d45333b7Sunil Jogi      }
15935a9f321a9cb5db0e65b9579d11bee2ac9bb1c54Sylvain Fonteneau
1602ee71571ead17d435e9d9e8be300edd5d45333b7Sunil Jogi      LlcpMac->LinkStatus_Cb(LlcpMac->LinkStatus_Context,
1612ee71571ead17d435e9d9e8be300edd5d45333b7Sunil Jogi                             LlcpMac->LinkState,
1622ee71571ead17d435e9d9e8be300edd5d45333b7Sunil Jogi                             NULL,
1632ee71571ead17d435e9d9e8be300edd5d45333b7Sunil Jogi                             LlcpMac->PeerRemoteDevType);
16435a9f321a9cb5db0e65b9579d11bee2ac9bb1c54Sylvain Fonteneau   }
16535a9f321a9cb5db0e65b9579d11bee2ac9bb1c54Sylvain Fonteneau
1665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   return status;
1675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
1685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic void phFriNfc_LlcpMac_Nfcip_Send_Cb(void       *pContext,
1705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                           NFCSTATUS   Status)
1715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
1725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   phFriNfc_LlcpMac_t            *LlcpMac = (phFriNfc_LlcpMac_t *)pContext;
1735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1746e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas#ifdef LLCP_CHANGES
1756e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas   if(gpphLibContext->LibNfcState.next_state
1766e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas                               == eLibNfcHalStateShutdown)
1776e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas   {
1786e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas      phLibNfc_Pending_Shutdown();
1796e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas      Status = NFCSTATUS_SHUTDOWN;
1806e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas   }
1816e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas#endif /* #ifdef LLCP_CHANGES */
1826e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas
1835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   /* Reset Send and Receive Flag */
1845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   LlcpMac->SendPending = FALSE;
1855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   LlcpMac->RecvPending = FALSE;
1865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
187c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau   phFriNfc_LlcpMac_Nfcip_TriggerSendCb(LlcpMac, Status);
1885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
1905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic void phFriNfc_LlcpMac_Nfcip_Receive_Cb(void       *pContext,
1925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                              NFCSTATUS   Status)
1935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
1945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   phFriNfc_LlcpMac_t               *LlcpMac = (phFriNfc_LlcpMac_t *)pContext;
1956e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas#ifdef LLCP_CHANGES
1966e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas
1976e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas   phFriNfc_LlcpMac_Send_CB_t       pfSendCB;
1986e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas   void                             *pSendContext;
1996e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas
2006e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas
2016e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas   if(gpphLibContext->LibNfcState.next_state
2026e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas                               == eLibNfcHalStateShutdown)
2036e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas   {
2046e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas      phLibNfc_Pending_Shutdown();
2056e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas      Status = NFCSTATUS_SHUTDOWN;
2066e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas   }
2076e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas
2086e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas   if (NFCSTATUS_SHUTDOWN == Status)
2096e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas   {
2106e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas      /* Save context in local variables */
2116e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas      pfSendCB = LlcpMac->MacSend_Cb;
2126e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas      pSendContext = LlcpMac->MacSend_Context;
2136e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas
2146e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas      /* Reset the pointer to the Send Callback */
2156e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas      LlcpMac->MacSend_Cb = NULL;
2166e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas      LlcpMac->MacSend_Context = NULL;
2176e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas
2186e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas      /* Reset Send and Receive Flag */
2196e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas      LlcpMac->SendPending = FALSE;
2206e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas      LlcpMac->RecvPending = FALSE;
2216e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas   }
2226e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas
2236e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas#endif /* #ifdef LLCP_CHANGES */
2245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
225c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau   phFriNfc_LlcpMac_Nfcip_TriggerRecvCb(LlcpMac, Status);
2265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
2276e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas#ifdef LLCP_CHANGES
2286e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas
2296e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas   if (NFCSTATUS_SHUTDOWN == Status)
2306e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas   {
2316e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas       if ((LlcpMac->SendPending) && (NULL != pfSendCB))
2326e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas       {
2336e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas           pfSendCB(pSendContext, Status);
2346e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas      }
2356e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas   }
2366e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas   else
2376e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas
2386e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas#endif /* #ifdef LLCP_CHANGES */
2396e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas   {
2405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   /* Test if a send is pending */
2415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   if(LlcpMac->SendPending)
2425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   {
243de9450aac004d93771d610c98588ff34a6749d10Sylvain Fonteneau      Status = phFriNfc_LlcpMac_Nfcip_Send(LlcpMac,LlcpMac->psSendBuffer,LlcpMac->MacSend_Cb,LlcpMac->MacSend_Context);
2445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   }
2455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
2466e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas}
2475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
2485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic void phFriNfc_LlcpMac_Nfcip_Transceive_Cb(void       *pContext,
2495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                 NFCSTATUS   Status)
2505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
2515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   phFriNfc_LlcpMac_t               *LlcpMac = (phFriNfc_LlcpMac_t *)pContext;
2525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
2536e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas#ifdef LLCP_CHANGES
2546e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas   if(gpphLibContext->LibNfcState.next_state
2556e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas                               == eLibNfcHalStateShutdown)
2566e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas   {
2576e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas      phLibNfc_Pending_Shutdown();
2586e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas      Status = NFCSTATUS_SHUTDOWN;
2596e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas   }
2606e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas#endif /* #ifdef LLCP_CHANGES */
2615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
2625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   /* Reset Send and Receive Flag */
2635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   LlcpMac->SendPending = FALSE;
2645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   LlcpMac->RecvPending = FALSE;
2655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
2665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   /* Call the callbacks */
267c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau   phFriNfc_LlcpMac_Nfcip_TriggerSendCb(LlcpMac, Status);
268c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau   phFriNfc_LlcpMac_Nfcip_TriggerRecvCb(LlcpMac, Status);
2695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
2705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
2715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_LlcpMac_Nfcip_Send(phFriNfc_LlcpMac_t               *LlcpMac,
2725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                             phNfc_sData_t                    *psData,
2735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                             phFriNfc_LlcpMac_Send_CB_t       LlcpMacSend_Cb,
2745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                             void                             *pContext)
2755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
2765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   NFCSTATUS status = NFCSTATUS_SUCCESS;
2775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
2785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   if(NULL == LlcpMac || NULL == psData || NULL == LlcpMacSend_Cb || NULL == pContext)
2795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   {
2805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      status = PHNFCSTVAL(CID_FRI_NFC_LLCP_MAC, NFCSTATUS_INVALID_PARAMETER);
2815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   }
2825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   else if(LlcpMac->MacSend_Cb != NULL && LlcpMac->PeerRemoteDevType == phFriNfc_LlcpMac_ePeerTypeInitiator)
2835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   {
2845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      /*Previous callback is pending */
2855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      status = NFCSTATUS_REJECTED;
2865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   }
2875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   else
2885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   {
2895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      /* Save the LlcpMacSend_Cb */
2905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      LlcpMac->MacSend_Cb = LlcpMacSend_Cb;
2915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      LlcpMac->MacSend_Context = pContext;
2925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
2935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      switch(LlcpMac->PeerRemoteDevType)
2945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      {
2955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      case phFriNfc_LlcpMac_ePeerTypeInitiator:
2965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly         {
2975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            if(LlcpMac->RecvPending)
2985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
2995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly               /*set the completion routines for the LLCP Transceive function*/
3005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                LlcpMac->MacCompletionInfo.CompletionRoutine = phFriNfc_LlcpMac_Nfcip_Transceive_Cb;
3015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                LlcpMac->MacCompletionInfo.Context = LlcpMac;
3025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
3035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                /* set the command type*/
3045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                LlcpMac->Cmd.NfcIP1Cmd = phHal_eNfcIP1_Raw;
3055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
3065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                /* set the Additional Info*/
3075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                LlcpMac->psDepAdditionalInfo.DepFlags.MetaChaining = 0;
3085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                LlcpMac->psDepAdditionalInfo.DepFlags.NADPresent = 0;
3095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                LlcpMac->SendPending = TRUE;
3105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
3115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                status = phFriNfc_OvrHal_Transceive(LlcpMac->LowerDevice,
3125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                    &LlcpMac->MacCompletionInfo,
3135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                    LlcpMac->psRemoteDevInfo,
3145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                    LlcpMac->Cmd,
3155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                    &LlcpMac->psDepAdditionalInfo,
3165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                    psData->buffer,
3175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                    (uint16_t)psData->length,
3185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                    LlcpMac->psReceiveBuffer->buffer,
3195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                    (uint16_t*)&LlcpMac->psReceiveBuffer->length);
3205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
3215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            else
3225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
3235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly               LlcpMac->SendPending = TRUE;
3245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly               LlcpMac->psSendBuffer = psData;
3255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly               return status = NFCSTATUS_PENDING;
3265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
3275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly         }break;
3285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      case phFriNfc_LlcpMac_ePeerTypeTarget:
3295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly         {
3305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            if(!LlcpMac->RecvPending)
3315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
3325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly               LlcpMac->SendPending = TRUE;
3335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly               LlcpMac->psSendBuffer = psData;
3345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly               return status = NFCSTATUS_PENDING;
3355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
3365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            else
3375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
3385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly               /*set the completion routines for the LLCP Send function*/
3395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly               LlcpMac->MacCompletionInfo.CompletionRoutine = phFriNfc_LlcpMac_Nfcip_Send_Cb;
3405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly               LlcpMac->MacCompletionInfo.Context = LlcpMac;
3415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly               status = phFriNfc_OvrHal_Send(LlcpMac->LowerDevice,
3425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                             &LlcpMac->MacCompletionInfo,
3435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                             LlcpMac->psRemoteDevInfo,
3445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                             psData->buffer,
3455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                             (uint16_t)psData->length);
3465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
3475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly         }break;
3485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      default:
3495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly         {
3505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            status = PHNFCSTVAL(CID_FRI_NFC_LLCP_MAC, NFCSTATUS_INVALID_DEVICE);
3515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly         }break;
3525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      }
3535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   }
3545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   return status;
3555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
3565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
3575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_LlcpMac_Nfcip_Receive(phFriNfc_LlcpMac_t               *LlcpMac,
3585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                phNfc_sData_t                    *psData,
3595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                phFriNfc_LlcpMac_Reveive_CB_t    LlcpMacReceive_Cb,
3605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                void                             *pContext)
3615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
3625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   NFCSTATUS status = NFCSTATUS_SUCCESS;
3635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   if(NULL == LlcpMac || NULL==psData || NULL == LlcpMacReceive_Cb || NULL == pContext)
3645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   {
3655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      status = PHNFCSTVAL(CID_FRI_NFC_LLCP_MAC, NFCSTATUS_INVALID_PARAMETER);
3665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   }
3675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   else if(LlcpMac->MacReceive_Cb != NULL)
3685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   {
3695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      /*Previous callback is pending */
3705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      status = NFCSTATUS_REJECTED;
3715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   }
3725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   else
3735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   {
3745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      /* Save the LlcpMacReceive_Cb */
3755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      LlcpMac->MacReceive_Cb = LlcpMacReceive_Cb;
3765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      LlcpMac->MacReceive_Context = pContext;
3775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
3785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      /* Save the pointer to the receive buffer */
3795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      LlcpMac->psReceiveBuffer= psData;
3805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
3815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      switch(LlcpMac->PeerRemoteDevType)
3825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      {
3835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      case phFriNfc_LlcpMac_ePeerTypeInitiator:
3845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly         {
3855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            if(LlcpMac->SendPending)
3865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
3875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly               /*set the completion routines for the LLCP Transceive function*/
3885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly               LlcpMac->MacCompletionInfo.CompletionRoutine = phFriNfc_LlcpMac_Nfcip_Transceive_Cb;
3895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly               LlcpMac->MacCompletionInfo.Context = LlcpMac;
3905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly               /* set the command type*/
3915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly               LlcpMac->Cmd.NfcIP1Cmd = phHal_eNfcIP1_Raw;
3925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly               /* set the Additional Info*/
3935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly               LlcpMac->psDepAdditionalInfo.DepFlags.MetaChaining = 0;
3945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly               LlcpMac->psDepAdditionalInfo.DepFlags.NADPresent = 0;
3955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly               LlcpMac->RecvPending = TRUE;
3965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
3975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly               status = phFriNfc_OvrHal_Transceive(LlcpMac->LowerDevice,
3985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                   &LlcpMac->MacCompletionInfo,
3995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                   LlcpMac->psRemoteDevInfo,
4005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                   LlcpMac->Cmd,
4015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                   &LlcpMac->psDepAdditionalInfo,
4025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                   LlcpMac->psSendBuffer->buffer,
4035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                   (uint16_t)LlcpMac->psSendBuffer->length,
4045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                   psData->buffer,
4055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                   (uint16_t*)&psData->length);
4065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
4075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            else
4085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
4095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly               LlcpMac->RecvPending = TRUE;
4105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly               return status = NFCSTATUS_PENDING;
4115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
4125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly         }break;
4135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      case phFriNfc_LlcpMac_ePeerTypeTarget:
4145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly         {
4155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly             /*set the completion routines for the LLCP Receive function*/
4165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            LlcpMac->MacCompletionInfo.CompletionRoutine = phFriNfc_LlcpMac_Nfcip_Receive_Cb;
4175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            /* save the context of LlcpMacNfcip */
4185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            LlcpMac->MacCompletionInfo.Context = LlcpMac;
4195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            LlcpMac->RecvPending = TRUE;
4205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
4215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            status = phFriNfc_OvrHal_Receive(LlcpMac->LowerDevice,
4225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                             &LlcpMac->MacCompletionInfo,
4235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                             LlcpMac->psRemoteDevInfo,
4245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                             LlcpMac->psReceiveBuffer->buffer,
4255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                             (uint16_t*)&LlcpMac->psReceiveBuffer->length);
4265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly         }break;
4275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      default:
4285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly         {
4295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            status = PHNFCSTVAL(CID_FRI_NFC_LLCP_MAC, NFCSTATUS_INVALID_DEVICE);
4305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly         }break;
4315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      }
4325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   }
4335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   return status;
4345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
4355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
4365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
4375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS phFriNfc_LlcpMac_Nfcip_Register (phFriNfc_LlcpMac_t *LlcpMac)
4385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
4395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   NFCSTATUS status = NFCSTATUS_SUCCESS;
4405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
4415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   if(NULL != LlcpMac)
4425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   {
4435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      LlcpMac->LlcpMacInterface.chk = phFriNfc_LlcpMac_Nfcip_Chk;
4445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      LlcpMac->LlcpMacInterface.activate   = phFriNfc_LlcpMac_Nfcip_Activate;
4455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      LlcpMac->LlcpMacInterface.deactivate = phFriNfc_LlcpMac_Nfcip_Deactivate;
4465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      LlcpMac->LlcpMacInterface.send = phFriNfc_LlcpMac_Nfcip_Send;
4475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      LlcpMac->LlcpMacInterface.receive = phFriNfc_LlcpMac_Nfcip_Receive;
4485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
4495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      return NFCSTATUS_SUCCESS;
4505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   }
4515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   else
4525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   {
4535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      return status = PHNFCSTVAL(CID_FRI_NFC_LLCP_MAC, NFCSTATUS_FAILED);
4545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   }
4555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
456