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 * \file phLibNfc_Ioctl.c
195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * Project: NFC FRI 1.1
215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *
225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * $Date: Mon Mar  1 19:07:05 2010 $
235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * $Author: ing07385 $
245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * $Revision: 1.35 $
255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * $Aliases: NFC_FRI1.1_WK1008_SDK,NFC_FRI1.1_WK1007_R33_4,NFC_FRI1.1_WK1007_SDK,NFC_FRI1.1_WK1014_SDK,NFC_FRI1.1_WK1017_PREP1,NFC_FRI1.1_WK1017_R34_1,NFC_FRI1.1_WK1017_R34_2,NFC_FRI1.1_WK1019_SDK,NFC_FRI1.1_WK1024_SDK $
265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *
275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */
285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*
305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly************************* Header Files ****************************************
315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/
325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phLibNfcStatus.h>
345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phLibNfc.h>
355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phHal4Nfc.h>
365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phOsalNfc.h>
375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phLibNfc_Internal.h>
385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phLibNfc_ndef_raw.h>
395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phLibNfc_initiator.h>
405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phLibNfc_discovery.h>
415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phLibNfc_ioctl.h>
425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phNfcStatus.h>
435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*
455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*************************** Macro's  ****************************************
465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/
475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifndef STATIC_DISABLE
495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#define STATIC static
505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else
515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#define STATIC
525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif
535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*
555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*************************** Global Variables **********************************
565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/
575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellySTATIC phLibNfc_Ioctl_Cntx_t phLibNfc_Ioctl_Cntx;
595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*
615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*************************** Static Function Declaration ***********************
625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/
635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/* Response callback for Ioctl management */
665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellySTATIC  void phLibNfc_Ioctl_Mgmt_CB(void            *context,
675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                              phNfc_sData_t         *pOutData,
685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                              NFCSTATUS             status );
695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/** Response callback for UICC switch mode*/
725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellySTATIC void phLibNfc_Switch_Swp_Mode_CB(
735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                void  *context,
745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                NFCSTATUS status
755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                );
765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*
785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*************************** Function Definitions ******************************
795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/
805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/**
825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* The I/O Control function allows the caller to configure specific
835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* functionality provided by the lower layer.Each feature is accessible
845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* via a specific IOCTL Code.
855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/
865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS phLibNfc_Mgt_IoCtl    (void*                      pDalHandle,
875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                 uint16_t                   IoctlCode,
885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                 phNfc_sData_t*             pInParam,
895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                 phNfc_sData_t*             pOutParam,
905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                 pphLibNfc_IoctlCallback_t  pIoCtl_Rsp_cb,
915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                 void*                      pContext
925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                 )
935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NFCSTATUS StatusCode=NFCSTATUS_INVALID_PARAMETER;
955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    if((IoctlCode==0)||(NULL==pIoCtl_Rsp_cb) ||
985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly		(NULL==pContext) ||(NULL==pInParam)  ||
995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly		(NULL==pDalHandle))
1005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
1015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        StatusCode=NFCSTATUS_INVALID_PARAMETER;
1025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        return StatusCode;
1035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
1045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    if(IoctlCode!= NFC_FW_DOWNLOAD)
1055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
1065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        if(pOutParam == NULL)
1075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
1085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            StatusCode = NFCSTATUS_INVALID_PARAMETER;
1095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            return StatusCode;
1105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
1115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        if(( gpphLibContext == NULL) ||
1125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly			(gpphLibContext->LibNfcState.cur_state == eLibNfcHalStateShutdown))
1135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
1145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            StatusCode = NFCSTATUS_NOT_INITIALISED;
1155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            return StatusCode;
1165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
1175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        else
1185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
1195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            if(gpphLibContext->LibNfcState.next_state == eLibNfcHalStateShutdown)
1205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
1215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                StatusCode = NFCSTATUS_SHUTDOWN;
1225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                return StatusCode;
1235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
1245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
1255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
1265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    phLibNfc_Ioctl_Cntx.CliRspCb =pIoCtl_Rsp_cb;
1275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    phLibNfc_Ioctl_Cntx.pCliCntx = pContext;
1285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    phLibNfc_Ioctl_Cntx.pOutParam = pOutParam;
1295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    phLibNfc_Ioctl_Cntx.IoctlCode = IoctlCode;
1305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /* Process the IOCTL requests */
1315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    switch(IoctlCode)
1325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
1335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        case NFC_FW_DOWNLOAD:
1345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {/* Set power status */
1355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            phLibNfc_Ioctl_Cntx.psHwReference = phOsalNfc_GetMemory((uint32_t)sizeof(phHal_sHwReference_t));
1365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            if(phLibNfc_Ioctl_Cntx.psHwReference == NULL)
1375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                return NFCSTATUS_FAILED;
1385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            (void)memset(phLibNfc_Ioctl_Cntx.psHwReference,0,sizeof(phHal_sHwReference_t));
1395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            phLibNfc_Ioctl_Cntx.psHwReference->p_board_driver = pDalHandle;
1405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            StatusCode = phHal4Nfc_Ioctl( phLibNfc_Ioctl_Cntx.psHwReference,
1425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                          NFC_FW_DOWNLOAD,
1435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                          pInParam,
1445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                          pOutParam,
1455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                          phLibNfc_Ioctl_Mgmt_CB,
1465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                          &phLibNfc_Ioctl_Cntx );
1475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }break;
1485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        case NFC_MEM_READ:
1495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
1505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly           StatusCode = phHal4Nfc_Ioctl(gpphLibContext->psHwReference,
1515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                         NFC_MEM_READ,
1525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                         pInParam,
1535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                         pOutParam,
1545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                         phLibNfc_Ioctl_Mgmt_CB,
1555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                         &phLibNfc_Ioctl_Cntx );
1565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }break;
1585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        case NFC_MEM_WRITE:
1595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
1605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly           StatusCode = phHal4Nfc_Ioctl( gpphLibContext->psHwReference,
1625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly				                          NFC_MEM_WRITE,
1635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                          pInParam,
1645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                          pOutParam,
1655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                          phLibNfc_Ioctl_Mgmt_CB,
1665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                          &phLibNfc_Ioctl_Cntx );
1675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }break;
1695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly		case PHLIBNFC_ANTENNA_TEST:
1705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly		{
1715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                StatusCode = phHal4Nfc_Ioctl( gpphLibContext->psHwReference,
1735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                          PHLIBNFC_ANTENNA_TEST,
1745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                          pInParam,
1755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                          pOutParam,
1765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                          phLibNfc_Ioctl_Mgmt_CB,
1775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                          &phLibNfc_Ioctl_Cntx );
1785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly		}break;
1805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly		case PHLIBNFC_SWP_TEST:
1815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly		{
1825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                StatusCode = phHal4Nfc_Ioctl( gpphLibContext->psHwReference,
1845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                          PHLIBNFC_SWP_TEST,
1855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                          pInParam,
1865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                          pOutParam,
1875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                          phLibNfc_Ioctl_Mgmt_CB,
1885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                          &phLibNfc_Ioctl_Cntx );
1895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly		}break;
1915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly		case PHLIBNFC_PRBS_TEST:
1935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly		{
1945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly		        StatusCode = phHal4Nfc_Ioctl( gpphLibContext->psHwReference,
1955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                          PHLIBNFC_PRBS_TEST,
1965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                          pInParam,
1975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                          pOutParam,
1985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                          phLibNfc_Ioctl_Mgmt_CB,
1995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                          &phLibNfc_Ioctl_Cntx );
2005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
2015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
2025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly		}break;
2035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        case PHLIBNFC_SWITCH_SWP_MODE:
2045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly		{
2055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            StatusCode = phHal4Nfc_Switch_Swp_Mode( gpphLibContext->psHwReference,
2065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                          (phHal_eSWP_Mode_t)pInParam->buffer[0],
2075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                          phLibNfc_Switch_Swp_Mode_CB,
2085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                          &phLibNfc_Ioctl_Cntx
2095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                          );
2105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
2115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
2125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly		}break;
2135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        default :
2145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
2155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly          /* don't do any thing*/
2165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }break;
2175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
2185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    } /* End of IOCTL  switch */
2195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly	if(StatusCode!=NFCSTATUS_PENDING)
2205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
2215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly		StatusCode = NFCSTATUS_FAILED;
2225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
2235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly	else
2245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly	{
2255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly		if(IoctlCode!= NFC_FW_DOWNLOAD)
2265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly		{
2275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly			gpphLibContext->status.GenCb_pending_status=TRUE;
2285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly		}
2295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly	}
2305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    return StatusCode;
2315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
2325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}   /* End of IOCTL handler function */
2335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
2345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
2355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
2365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellySTATIC  void phLibNfc_Ioctl_Mgmt_CB(void          *context,
2375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                              phNfc_sData_t *pOutData,
2385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                              NFCSTATUS      status )
2395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
2405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    phLibNfc_Ioctl_Cntx_t *pIoctlCntx=NULL;
2416dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren    if(PHNFCSTATUS(status) == NFCSTATUS_FEATURE_NOT_SUPPORTED)
2426dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren    {
2436dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren        status = NFCSTATUS_FEATURE_NOT_SUPPORTED;
2446dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren    }
2456dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren    else if(PHNFCSTATUS(status)!=NFCSTATUS_SUCCESS)
2465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
2475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        status = NFCSTATUS_FAILED;
2485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
2495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly	if(gpphLibContext!= NULL)
2505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly	{
2515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly		if(eLibNfcHalStateShutdown == gpphLibContext->LibNfcState.next_state)
2525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly		{
2535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly		    /*If shutdown called in between allow shutdown to happen*/
2545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly			phLibNfc_Pending_Shutdown();
2555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly			status = NFCSTATUS_SHUTDOWN;
2565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly		}
2575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly	}
2585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    pIoctlCntx= (phLibNfc_Ioctl_Cntx_t*)context;
2595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    if( pIoctlCntx !=NULL)
2605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
2615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        switch(pIoctlCntx->IoctlCode)
2625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
2635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            case NFC_FW_DOWNLOAD:
2645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
2655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                /*Release the hardware reference memory*/
2665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                phOsalNfc_FreeMemory(pIoctlCntx->psHwReference);
2675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }break;
2685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            case NFC_MEM_READ:
2695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
2705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
2715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }break;
2725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            case NFC_MEM_WRITE:
2735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
2745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
2755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }break;
2765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
2775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly			case PHLIBNFC_ANTENNA_TEST:
2785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
2795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
2805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }break;
2815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly			case PHLIBNFC_SWP_TEST:
2825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
2835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
2845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }break;
2855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly			case PHLIBNFC_PRBS_TEST:
2865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
2875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
2885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }break;
2895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            default:
2905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
2915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
2925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
2935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        pIoctlCntx->CliRspCb(pIoctlCntx->pCliCntx,pOutData,status);
2945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly		if(gpphLibContext!= NULL)
2955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly		{
2965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly			gpphLibContext->status.GenCb_pending_status=FALSE;
2975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly		}
2985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
2995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
3005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
3015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellySTATIC void phLibNfc_Switch_Swp_Mode_CB(
3025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                void  *context,
3035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                NFCSTATUS status
3045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                )
3055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
3065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    if(PHNFCSTATUS(status)!=NFCSTATUS_SUCCESS)
3075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
3085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        status = NFCSTATUS_FAILED;
3095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
3105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    if(gpphLibContext!= NULL)
3115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly	{
3125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly		if(eLibNfcHalStateShutdown == gpphLibContext->LibNfcState.next_state)
3135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly		{
3145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly		    /*If shutdown called in between allow shutdown to happen*/
3155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly			phLibNfc_Pending_Shutdown();
3165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly			status = NFCSTATUS_SHUTDOWN;
3175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly		}
3185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly	}
3195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    if((NULL != context)&&(context == (void *)&phLibNfc_Ioctl_Cntx))
3205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
3215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        if(NULL != phLibNfc_Ioctl_Cntx.CliRspCb)
3225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
3235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            (*phLibNfc_Ioctl_Cntx.CliRspCb)(
3245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                phLibNfc_Ioctl_Cntx.pCliCntx,
3255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                phLibNfc_Ioctl_Cntx.pOutParam,
3265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                status
3275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                );
3285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
3295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
3305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    return;
3315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
3325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
333