Home | History | Annotate | Download | only in mifare
      1 /*
      2  * Copyright (C) 2015 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 #define LOG_TAG "pn54x"
     17 
     18 #include <log/log.h>
     19 
     20 #include <nfc_api.h>
     21 #include <rw_api.h>
     22 #include <phNfcCompId.h>
     23 #include <phNxpLog.h>
     24 #include <phNxpExtns_MifareStd.h>
     25 
     26 phNxpExtns_Context_t       gphNxpExtns_Context;
     27 phNciNfc_TransceiveInfo_t  tNciTranscvInfo;
     28 phFriNfc_sNdefSmtCrdFmt_t  *NdefSmtCrdFmt = NULL;
     29 phFriNfc_NdefMap_t         *NdefMap = NULL;
     30 phLibNfc_NdefInfo_t        NdefInfo;
     31 #if(NFC_NXP_NOT_OPEN_INCLUDED == TRUE)
     32 pthread_mutex_t SharedDataMutex = PTHREAD_MUTEX_INITIALIZER;
     33 #endif
     34 uint8_t current_key[6]={0};
     35 phNci_mfc_auth_cmd_t       gAuthCmdBuf;
     36 STATIC NFCSTATUS phNciNfc_SendMfReq(phNciNfc_TransceiveInfo_t tTranscvInfo,
     37                                     uint8_t *buff, uint16_t *buffSz);
     38 STATIC NFCSTATUS phLibNfc_SendRawCmd(phNfc_sTransceiveInfo_t*    pTransceiveInfo,
     39                                     pphNciNfc_TransceiveInfo_t   pMappedTranscvIf);
     40 STATIC NFCSTATUS phLibNfc_SendWrt16Cmd(phNfc_sTransceiveInfo_t*    pTransceiveInfo,
     41                                     pphNciNfc_TransceiveInfo_t   pMappedTranscvIf);
     42 STATIC NFCSTATUS phLibNfc_SendAuthCmd(phNfc_sTransceiveInfo_t *pTransceiveInfo,
     43                                       phNciNfc_TransceiveInfo_t  *tNciTranscvInfo) __attribute__((unused));
     44 STATIC NFCSTATUS phLibNfc_MapCmds(phNciNfc_RFDevType_t         RemDevType,
     45                                     phNfc_sTransceiveInfo_t*  pTransceiveInfo,
     46                                     pphNciNfc_TransceiveInfo_t   pMappedTranscvIf);
     47 STATIC NFCSTATUS phLibNfc_MifareMap(phNfc_sTransceiveInfo_t*    pTransceiveInfo,
     48                                     pphNciNfc_TransceiveInfo_t   pMappedTranscvIf);
     49 STATIC NFCSTATUS phLibNfc_ChkAuthCmdMFC(phNfc_sTransceiveInfo_t* pTransceiveInfo,
     50                                     uint8_t *bKey);
     51 STATIC NFCSTATUS phLibNfc_GetKeyNumberMFC(uint8_t *buffer,uint8_t *bKey);
     52 STATIC void phLibNfc_CalSectorAddress(uint8_t *Sector_Address);
     53 STATIC NFCSTATUS  phNciNfc_MfCreateAuthCmdHdr(phNciNfc_TransceiveInfo_t tTranscvInfo,
     54                                     uint8_t    bBlockAddr,
     55                                     uint8_t    *buff,
     56                                     uint16_t    *buffSz);
     57 STATIC NFCSTATUS phNciNfc_MfCreateXchgDataHdr(phNciNfc_TransceiveInfo_t tTranscvInfo,
     58                                     uint8_t *buff, uint16_t *buffSz);
     59 STATIC NFCSTATUS phLibNfc_SendWrt16CmdPayload(phNfc_sTransceiveInfo_t*    pTransceiveInfo,
     60                                     pphNciNfc_TransceiveInfo_t   pMappedTranscvIf);
     61 STATIC NFCSTATUS phNciNfc_RecvMfResp(phNciNfc_Buff_t* RspBuffInfo, NFCSTATUS wStatus);
     62 STATIC NFCSTATUS nativeNfcExtns_doTransceive(uint8_t *buff, uint16_t buffSz);
     63 STATIC NFCSTATUS phFriNfc_NdefSmtCrd_Reset__(phFriNfc_sNdefSmtCrdFmt_t    *NdefSmtCrdFmt,
     64                                     uint8_t    *SendRecvBuffer,
     65                                     uint16_t   *SendRecvBuffLen);
     66 STATIC NFCSTATUS phFriNfc_ValidateParams(uint8_t  *PacketData,
     67                                     uint32_t   *PacketDataLength,
     68                                     uint8_t     Offset,
     69                                     phFriNfc_NdefMap_t  *pNdefMap,
     70                                     uint8_t     bNdefReq);
     71 STATIC void Mfc_FormatNdef_Completion_Routine(void *NdefCtxt, NFCSTATUS status);
     72 STATIC void Mfc_WriteNdef_Completion_Routine(void *NdefCtxt, NFCSTATUS status);
     73 STATIC void Mfc_ReadNdef_Completion_Routine(void *NdefCtxt, NFCSTATUS status);
     74 STATIC void Mfc_CheckNdef_Completion_Routine(void *NdefCtxt, NFCSTATUS status);
     75 
     76 /*******************************************************************************
     77 **
     78 ** Function         phNxpExtns_MfcModuleDeInit
     79 **
     80 ** Description      It Deinitializes the Mifare module.
     81 **
     82 **                  Frees all the memory occupied by Mifare module
     83 **
     84 ** Returns:
     85 **                  NFCSTATUS_SUCCESS - if successfully deinitialize
     86 **                  NFCSTATUS_FAILED  - otherwise
     87 **
     88 *******************************************************************************/
     89 NFCSTATUS phNxpExtns_MfcModuleDeInit(void)
     90 {
     91     NFCSTATUS status = NFCSTATUS_FAILED;
     92 
     93     if(NdefMap != NULL)
     94     {
     95         if( NdefMap->psRemoteDevInfo != NULL )
     96         {
     97             free(NdefMap->psRemoteDevInfo);
     98             NdefMap->psRemoteDevInfo = NULL;
     99         }
    100         if( NdefMap->SendRecvBuf != NULL )
    101         {
    102             free(NdefMap->SendRecvBuf);
    103             NdefMap->SendRecvBuf = NULL;
    104         }
    105         if( NdefMap->SendRecvLength != NULL )
    106         {
    107             free(NdefMap->SendRecvLength);
    108             NdefMap->SendRecvLength = NULL;
    109         }
    110         if( NdefMap->DataCount != NULL )
    111         {
    112             free(NdefMap->DataCount);
    113             NdefMap->DataCount = NULL;
    114         }
    115         if( NdefMap->pTransceiveInfo != NULL )
    116         {
    117             if( NdefMap->pTransceiveInfo->sSendData.buffer != NULL )
    118             {
    119                 free(NdefMap->pTransceiveInfo->sSendData.buffer);
    120                 NdefMap->pTransceiveInfo->sSendData.buffer = NULL;
    121             }
    122             if( NdefMap->pTransceiveInfo->sRecvData.buffer != NULL )
    123             {
    124                 free(NdefMap->pTransceiveInfo->sRecvData.buffer);
    125                 NdefMap->pTransceiveInfo->sRecvData.buffer = NULL;
    126             }
    127             free(NdefMap->pTransceiveInfo);
    128             NdefMap->pTransceiveInfo = NULL;
    129         }
    130 
    131         free(NdefMap);
    132         NdefMap = NULL;
    133     }
    134 
    135     if( tNciTranscvInfo.tSendData.pBuff != NULL )
    136     {
    137         free(tNciTranscvInfo.tSendData.pBuff);
    138         tNciTranscvInfo.tSendData.pBuff = NULL;
    139     }
    140 
    141     if( NdefSmtCrdFmt != NULL )
    142     {
    143         free(NdefSmtCrdFmt);
    144         NdefSmtCrdFmt = NULL;
    145     }
    146 #if(NFC_NXP_NOT_OPEN_INCLUDED == TRUE)
    147     pthread_mutex_lock(&SharedDataMutex);
    148 #endif
    149     if ( NULL != NdefInfo.psUpperNdefMsg )
    150     {
    151         if ( NdefInfo.psUpperNdefMsg->buffer != NULL )
    152         {
    153             free(NdefInfo.psUpperNdefMsg->buffer);
    154             NdefInfo.psUpperNdefMsg->buffer = NULL;
    155         }
    156         free(NdefInfo.psUpperNdefMsg);
    157         NdefInfo.psUpperNdefMsg = NULL;
    158     }
    159 #if(NFC_NXP_NOT_OPEN_INCLUDED == TRUE)
    160     pthread_mutex_unlock(&SharedDataMutex);
    161 #endif
    162     if (NULL != gAuthCmdBuf.pauth_cmd)
    163     {
    164         if (NULL != gAuthCmdBuf.pauth_cmd->buffer)
    165         {
    166             free(gAuthCmdBuf.pauth_cmd->buffer);
    167             gAuthCmdBuf.pauth_cmd->buffer = NULL;
    168         }
    169         free(gAuthCmdBuf.pauth_cmd);
    170         gAuthCmdBuf.pauth_cmd = NULL;
    171     }
    172     status = NFCSTATUS_SUCCESS;
    173     return status;
    174 }
    175 
    176 /*******************************************************************************
    177 **
    178 ** Function         phNxpExtns_MfcModuleInit
    179 **
    180 ** Description      It Initializes the memroy and global variables related
    181 **                  to Mifare module.
    182 **
    183 **                  Reset all the global variables and allocate memory for Mifare module
    184 **
    185 ** Returns:
    186 **                  NFCSTATUS_SUCCESS - if successfully deinitialize
    187 **                  NFCSTATUS_FAILED  - otherwise
    188 **
    189 *******************************************************************************/
    190 NFCSTATUS phNxpExtns_MfcModuleInit(void)
    191 {
    192     NFCSTATUS status = NFCSTATUS_FAILED;
    193     gphNxpExtns_Context.writecmdFlag = false;
    194     gphNxpExtns_Context.RawWriteCallBack = false;
    195     gphNxpExtns_Context.CallBackCtxt   = NULL;
    196     gphNxpExtns_Context.CallBackMifare = NULL;
    197     gphNxpExtns_Context.ExtnsConnect = false;
    198     gphNxpExtns_Context.ExtnsDeactivate = false;
    199     gphNxpExtns_Context.ExtnsCallBack = false;
    200 
    201     NdefMap = malloc(sizeof(phFriNfc_NdefMap_t));
    202     if( NULL == NdefMap )
    203     {
    204         goto clean_and_return;
    205     }
    206     memset(NdefMap,0,sizeof(phFriNfc_NdefMap_t));
    207 
    208     NdefMap->psRemoteDevInfo = malloc(sizeof(phLibNfc_sRemoteDevInformation_t));
    209     if( NULL == NdefMap->psRemoteDevInfo )
    210     {
    211         goto clean_and_return;
    212     }
    213     memset(NdefMap->psRemoteDevInfo, 0, sizeof(phLibNfc_sRemoteDevInformation_t));
    214 
    215     NdefMap->SendRecvBuf = malloc((uint32_t)(MAX_BUFF_SIZE * 2));
    216     if( NULL == NdefMap->SendRecvBuf )
    217     {
    218         goto clean_and_return;
    219     }
    220     memset(NdefMap->SendRecvBuf, 0, (MAX_BUFF_SIZE * 2));
    221 
    222     NdefMap->SendRecvLength  = malloc(sizeof(uint16_t));
    223     if( NULL ==  NdefMap->SendRecvLength )
    224     {
    225         goto clean_and_return;
    226     }
    227     memset(NdefMap->SendRecvLength, 0, sizeof(uint16_t));
    228 
    229     NdefMap->DataCount = malloc(sizeof(uint16_t));
    230     if( NULL == NdefMap->DataCount )
    231     {
    232         goto clean_and_return;
    233     }
    234     memset(NdefMap->DataCount, 0, sizeof(uint16_t));
    235 
    236     NdefMap->pTransceiveInfo = malloc(sizeof(phNfc_sTransceiveInfo_t));
    237     if(NULL == NdefMap->pTransceiveInfo)
    238     {
    239         goto clean_and_return;
    240     }
    241     memset(NdefMap->pTransceiveInfo, 0, sizeof(phNfc_sTransceiveInfo_t));
    242 
    243     tNciTranscvInfo.tSendData.pBuff = (uint8_t *)malloc((uint32_t)MAX_BUFF_SIZE);
    244     if(NULL == tNciTranscvInfo.tSendData.pBuff)
    245     {
    246         goto clean_and_return;
    247     }
    248     memset(tNciTranscvInfo.tSendData.pBuff, 0, MAX_BUFF_SIZE);
    249 
    250     NdefMap->pTransceiveInfo->sSendData.buffer = (uint8_t *)malloc((uint32_t)MAX_BUFF_SIZE);
    251     if( NdefMap->pTransceiveInfo->sSendData.buffer == NULL )
    252     {
    253         goto clean_and_return;
    254     }
    255     memset( NdefMap->pTransceiveInfo->sSendData.buffer, 0, MAX_BUFF_SIZE );
    256     NdefMap->pTransceiveInfo->sSendData.length = MAX_BUFF_SIZE;
    257 
    258     NdefMap->pTransceiveInfo->sRecvData.buffer = (uint8_t *)malloc((uint32_t)MAX_BUFF_SIZE); /* size should be same as sRecvData */
    259     if( NdefMap->pTransceiveInfo->sRecvData.buffer == NULL )
    260     {
    261         goto clean_and_return;
    262     }
    263     memset( NdefMap->pTransceiveInfo->sRecvData.buffer, 0, MAX_BUFF_SIZE );
    264     NdefMap->pTransceiveInfo->sRecvData.length = MAX_BUFF_SIZE;
    265 
    266     NdefSmtCrdFmt = malloc( sizeof(phFriNfc_sNdefSmtCrdFmt_t) );
    267     if( NdefSmtCrdFmt == NULL )
    268     {
    269         goto clean_and_return;
    270     }
    271     memset( NdefSmtCrdFmt , 0, sizeof(phFriNfc_sNdefSmtCrdFmt_t) );
    272 #if(NFC_NXP_NOT_OPEN_INCLUDED == TRUE)
    273     pthread_mutex_lock(&SharedDataMutex);
    274 #endif
    275     NdefInfo.psUpperNdefMsg = malloc(sizeof(phNfc_sData_t));
    276     if ( NULL == NdefInfo.psUpperNdefMsg )
    277     {
    278         goto clean_and_return;
    279     }
    280     memset( NdefInfo.psUpperNdefMsg, 0, sizeof(phNfc_sData_t) );
    281     memset (&gAuthCmdBuf, 0, sizeof(phNci_mfc_auth_cmd_t));
    282     gAuthCmdBuf.pauth_cmd = malloc(sizeof(phNfc_sData_t));
    283     if (NULL == gAuthCmdBuf.pauth_cmd)
    284     {
    285         goto clean_and_return;
    286     }
    287     gAuthCmdBuf.pauth_cmd->buffer = malloc((uint32_t)NCI_MAX_DATA_LEN);
    288     if (NULL == gAuthCmdBuf.pauth_cmd->buffer)
    289     {
    290         goto clean_and_return;
    291     }
    292     status = NFCSTATUS_SUCCESS;
    293 
    294 clean_and_return:
    295 #if(NFC_NXP_NOT_OPEN_INCLUDED == TRUE)
    296     pthread_mutex_unlock(&SharedDataMutex);
    297 #endif
    298     if(status != NFCSTATUS_SUCCESS)
    299     {
    300         NXPLOG_EXTNS_E("CRIT: Memory Allocation failed for MFC!");
    301         phNxpExtns_MfcModuleDeInit();
    302     }
    303     return status;
    304 }
    305 
    306 /*******************************************************************************
    307 **
    308 ** Function         Mfc_CheckNdef
    309 **
    310 ** Description      It triggers NDEF detection for Mifare Classic Tag.
    311 **
    312 **
    313 ** Returns          NFCSTATUS_SUCCESS - if successfully initiated
    314 **                  NFCSTATUS_FAILED  - otherwise
    315 **
    316 *******************************************************************************/
    317 NFCSTATUS Mfc_CheckNdef(void)
    318 {
    319     NFCSTATUS status = NFCSTATUS_FAILED;
    320 
    321     EXTNS_SetCallBackFlag(false);
    322     /* Set Completion Routine for CheckNdef */
    323     NdefMap->CompletionRoutine[0].CompletionRoutine = Mfc_CheckNdef_Completion_Routine;
    324 
    325     gphNxpExtns_Context.CallBackMifare = phFriNfc_MifareStdMap_Process;
    326     gphNxpExtns_Context.CallBackCtxt   = NdefMap;
    327     status = phFriNfc_MifareStdMap_H_Reset(NdefMap);
    328     if ( NFCSTATUS_SUCCESS == status)
    329     {
    330         status = phFriNfc_MifareStdMap_ChkNdef(NdefMap);
    331         if ( status == NFCSTATUS_PENDING )
    332         {
    333             status = NFCSTATUS_SUCCESS;
    334         }
    335     }
    336     if( status != NFCSTATUS_SUCCESS )
    337     {
    338         status = NFCSTATUS_FAILED;
    339     }
    340 
    341     return status;
    342 }
    343 
    344 /*******************************************************************************
    345 **
    346 ** Function         Mfc_CheckNdef_Completion_Routine
    347 **
    348 ** Description      Notify NDEF detection for Mifare Classic Tag to JNI
    349 **
    350 **                  Upon completion of NDEF detection, a
    351 **                  NFA_NDEF_DETECT_EVT will be sent, to notify the application
    352 **                  of the NDEF attributes (NDEF total memory size, current
    353 **                  size, etc.).
    354 **
    355 ** Returns:         void
    356 **
    357 *******************************************************************************/
    358 STATIC void Mfc_CheckNdef_Completion_Routine(void *NdefCtxt, NFCSTATUS status)
    359 {
    360     (void)NdefCtxt;
    361     tNFA_CONN_EVT_DATA conn_evt_data;
    362 
    363     conn_evt_data.ndef_detect.status = status;
    364     if(NFCSTATUS_SUCCESS == status)
    365     {
    366         /* NDef Tag Detected */
    367         conn_evt_data.ndef_detect.protocol   = NFA_PROTOCOL_MIFARE;
    368         phFrinfc_MifareClassic_GetContainerSize(NdefMap,
    369                                                 (uint32_t *)&(conn_evt_data.ndef_detect.max_size),
    370                                                 (uint32_t *)&(conn_evt_data.ndef_detect.cur_size));
    371         NdefInfo.NdefLength  = conn_evt_data.ndef_detect.max_size;
    372         /* update local flags */
    373         NdefInfo.is_ndef = 1;
    374         NdefInfo.NdefActualSize = conn_evt_data.ndef_detect.cur_size;
    375         if ( PH_NDEFMAP_CARD_STATE_READ_ONLY == NdefMap->CardState )
    376         {
    377             NXPLOG_EXTNS_D("Mfc_CheckNdef_Completion_Routine : READ_ONLY_CARD");
    378             conn_evt_data.ndef_detect.flags = RW_NDEF_FL_READ_ONLY;
    379         }
    380         else
    381         {
    382             conn_evt_data.ndef_detect.flags = RW_NDEF_FL_SUPPORTED | RW_NDEF_FL_FORMATED;
    383         }
    384     }
    385     else
    386     {
    387         /* NDEF Detection failed for other reasons */
    388         conn_evt_data.ndef_detect.cur_size = 0;
    389         conn_evt_data.ndef_detect.max_size = 0;
    390         conn_evt_data.ndef_detect.flags    = RW_NDEF_FL_UNKNOWN;
    391 
    392         /* update local flags */
    393         NdefInfo.is_ndef = 0;
    394         NdefInfo.NdefActualSize = conn_evt_data.ndef_detect.cur_size;
    395     }
    396     (*gphNxpExtns_Context.p_conn_cback) (NFA_NDEF_DETECT_EVT, &conn_evt_data);
    397 
    398     return;
    399 }
    400 /*******************************************************************************
    401 **
    402 ** Function         Mfc_ReadNdef_Completion_Routine
    403 **
    404 ** Description      Notify NDEF read completion for Mifare Classic Tag to JNI
    405 **
    406 **                  Upon completion of NDEF read, a
    407 **                  NFA_READ_CPLT_EVT will be sent, to notify the application
    408 **                  with the NDEF data and status
    409 **
    410 ** Returns:         void
    411 **
    412 *******************************************************************************/
    413 STATIC void Mfc_ReadNdef_Completion_Routine(void *NdefCtxt, NFCSTATUS status)
    414 {
    415     (void)NdefCtxt;
    416     tNFA_CONN_EVT_DATA conn_evt_data;
    417     tNFA_NDEF_EVT_DATA p_data;
    418 
    419     conn_evt_data.status = status;
    420 #if(NFC_NXP_NOT_OPEN_INCLUDED == TRUE)
    421     pthread_mutex_lock(&SharedDataMutex);
    422 #endif
    423     if(NFCSTATUS_SUCCESS == status)
    424     {
    425         p_data.ndef_data.len    = NdefInfo.psUpperNdefMsg->length;
    426         p_data.ndef_data.p_data = NdefInfo.psUpperNdefMsg->buffer;
    427         (*gphNxpExtns_Context.p_ndef_cback) (NFA_NDEF_DATA_EVT, &p_data);
    428     }
    429     else
    430     {
    431     }
    432 
    433     (*gphNxpExtns_Context.p_conn_cback) (NFA_READ_CPLT_EVT, &conn_evt_data);
    434 
    435     if( NdefInfo.psUpperNdefMsg->buffer != NULL)
    436     {
    437         free (NdefInfo.psUpperNdefMsg->buffer);
    438         NdefInfo.psUpperNdefMsg->buffer = NULL;
    439     }
    440 #if(NFC_NXP_NOT_OPEN_INCLUDED == TRUE)
    441     pthread_mutex_unlock(&SharedDataMutex);
    442 #endif
    443     return;
    444 }
    445 
    446 /*******************************************************************************
    447 **
    448 ** Function         Mfc_WriteNdef_Completion_Routine
    449 **
    450 ** Description      Notify NDEF write completion for Mifare Classic Tag to JNI
    451 **
    452 **                  Upon completion of NDEF write, a
    453 **                  NFA_WRITE_CPLT_EVT will be sent along with status
    454 **
    455 ** Returns:         void
    456 **
    457 *******************************************************************************/
    458 STATIC void Mfc_WriteNdef_Completion_Routine(void *NdefCtxt, NFCSTATUS status)
    459 {
    460     (void)NdefCtxt;
    461     tNFA_CONN_EVT_DATA conn_evt_data;
    462 
    463     conn_evt_data.status = status;
    464     (*gphNxpExtns_Context.p_conn_cback) (NFA_WRITE_CPLT_EVT, &conn_evt_data);
    465 
    466     return;
    467 }
    468 
    469 /*******************************************************************************
    470 **
    471 ** Function         Mfc_FormatNdef_Completion_Routine
    472 **
    473 ** Description      Notify NDEF format completion for Mifare Classic Tag to JNI
    474 **
    475 **                  Upon completion of NDEF format, a
    476 **                  NFA_FORMAT_CPLT_EVT will be sent along with status
    477 **
    478 ** Returns:         void
    479 **
    480 *******************************************************************************/
    481 STATIC void Mfc_FormatNdef_Completion_Routine(void *NdefCtxt, NFCSTATUS status)
    482 {
    483     (void)NdefCtxt;
    484     tNFA_CONN_EVT_DATA conn_evt_data;
    485 
    486     conn_evt_data.status = status;
    487     (*gphNxpExtns_Context.p_conn_cback) (NFA_FORMAT_CPLT_EVT, &conn_evt_data);
    488 
    489     return;
    490 }
    491 
    492 /*******************************************************************************
    493 **
    494 ** Function          phFriNfc_ValidateParams
    495 **
    496 ** Description      This function is a common function which validates NdefRd
    497 **                  and NdefWr parameters.
    498 **
    499 ** Returns          NFCSTATUS_SUCCESS  - All the params are valid
    500 **                  NFCSTATUS_FAILED   - otherwise
    501 **
    502 *******************************************************************************/
    503 STATIC NFCSTATUS phFriNfc_ValidateParams(uint8_t             *PacketData,
    504                                     uint32_t            *PacketDataLength,
    505                                     uint8_t             Offset,
    506                                     phFriNfc_NdefMap_t  *pNdefMap,
    507                                     uint8_t             bNdefReq)
    508 {
    509 
    510     if( (pNdefMap == NULL) || (PacketData == NULL)
    511         || (PacketDataLength == NULL) )
    512     {
    513         return NFCSTATUS_FAILED;
    514     }
    515 
    516     if( pNdefMap->CardState == PH_NDEFMAP_CARD_STATE_INVALID )
    517     {
    518         return NFCSTATUS_FAILED;
    519     }
    520 
    521     if( bNdefReq == PH_FRINFC_NDEF_READ_REQ )
    522     {
    523         if( (Offset != PH_FRINFC_NDEFMAP_SEEK_CUR) && (Offset != PH_FRINFC_NDEFMAP_SEEK_BEGIN) )
    524         {
    525             return NFCSTATUS_FAILED;
    526         }
    527         if( pNdefMap->CardState == PH_NDEFMAP_CARD_STATE_INITIALIZED )
    528         {
    529             pNdefMap->NumOfBytesRead  = PacketDataLength;
    530             *pNdefMap->NumOfBytesRead = 0;
    531             return NFCSTATUS_EOF_NDEF_CONTAINER_REACHED;
    532         }
    533         if( (pNdefMap->PrevOperation == PH_FRINFC_NDEFMAP_WRITE_OPE) &&
    534             (Offset != PH_FRINFC_NDEFMAP_SEEK_BEGIN) )
    535         {
    536             return NFCSTATUS_FAILED; /* return INVALID_DEVICE_REQUEST */
    537         }
    538         if( Offset == PH_FRINFC_NDEFMAP_SEEK_BEGIN )
    539         {
    540             pNdefMap->ApduBuffIndex = 0;
    541             *pNdefMap->DataCount    = 0;
    542         }
    543         else if ( (pNdefMap->bPrevReadMode == PH_FRINFC_NDEFMAP_SEEK_BEGIN) ||
    544                   (pNdefMap->bPrevReadMode == PH_FRINFC_NDEFMAP_SEEK_CUR) )
    545         {
    546 
    547         }
    548         else
    549         {
    550             return NFCSTATUS_FAILED;
    551         }
    552     }
    553     else if( bNdefReq == PH_FRINFC_NDEF_WRITE_REQ )
    554     {
    555         if( pNdefMap->CardState == PH_NDEFMAP_CARD_STATE_READ_ONLY )
    556         {
    557             pNdefMap->WrNdefPacketLength  = PacketDataLength;
    558             *pNdefMap->WrNdefPacketLength = 0x00;
    559             return NFCSTATUS_NOT_ALLOWED;
    560         }
    561     }
    562 
    563     return NFCSTATUS_SUCCESS;
    564 }
    565 
    566 /*******************************************************************************
    567 **
    568 ** Function         Mfc_SetRdOnly_Completion_Routine
    569 **
    570 ** Description      Notify NDEF read only completion for Mifare Classic Tag to JNI
    571 **
    572 **                  Upon completion of NDEF format, a
    573 **                  NFA_SET_TAG_RO_EVT will be sent along with status
    574 **
    575 ** Returns:         void
    576 **
    577 *******************************************************************************/
    578 STATIC void Mfc_SetRdOnly_Completion_Routine(void *NdefCtxt, NFCSTATUS status)
    579 {
    580     (void)NdefCtxt;
    581     tNFA_CONN_EVT_DATA conn_evt_data;
    582     ALOGE("%s status = 0x%x", __func__, status);
    583     conn_evt_data.status = status;
    584     (*gphNxpExtns_Context.p_conn_cback) (NFA_SET_TAG_RO_EVT, &conn_evt_data);
    585 
    586     return;
    587 }
    588 
    589 /*******************************************************************************
    590 **
    591 ** Function        Mfc_SetReadOnly
    592 **
    593 **
    594 ** Description:    It triggers ConvertToReadOnly  for Mifare Classic Tag.
    595 **
    596 ** Returns:
    597 **                  NFCSTATUS_SUCCESS if successfully initiated
    598 **                  NFCSTATUS_FAILED otherwise
    599 **
    600 *******************************************************************************/
    601 NFCSTATUS Mfc_SetReadOnly(uint8_t *secrtkey, uint8_t len)
    602 {
    603     NXPLOG_EXTNS_D("%s Entering ", __func__);
    604     NFCSTATUS status = NFCSTATUS_FAILED;
    605     uint8_t mif_secrete_key[6] = {0};
    606     uint8_t id = 0;
    607     EXTNS_SetCallBackFlag(false);
    608     memcpy(mif_secrete_key,secrtkey,len);
    609     gphNxpExtns_Context.CallBackMifare = phFriNfc_MifareStdMap_Process;
    610     gphNxpExtns_Context.CallBackCtxt   = NdefMap;
    611     for (id = 0; id < len; id++)
    612     {
    613         ALOGV("secrtkey[%d] = 0x%x", id, secrtkey[id]);
    614         ALOGV("mif_secrete_key[%d] = 0x%x", id, mif_secrete_key[id]);
    615     }
    616     /* Set Completion Routine for ReadNdef */
    617     NdefMap->CompletionRoutine[0].CompletionRoutine = Mfc_SetRdOnly_Completion_Routine;
    618     if(NdefInfo.is_ndef == 0)
    619     {
    620         status = NFCSTATUS_NON_NDEF_COMPLIANT;
    621         goto Mfc_SetRdOnly;
    622     }
    623     else if( (NdefInfo.is_ndef == 1) && (NdefInfo.NdefActualSize == 0) )
    624     {
    625 #if(NFC_NXP_NOT_OPEN_INCLUDED == TRUE)
    626         pthread_mutex_lock(&SharedDataMutex);
    627 #endif
    628         NdefInfo.psUpperNdefMsg->length = NdefInfo.NdefActualSize;
    629 #if(NFC_NXP_NOT_OPEN_INCLUDED == TRUE)
    630         pthread_mutex_unlock(&SharedDataMutex);
    631 #endif
    632         status = NFCSTATUS_SUCCESS;
    633         goto Mfc_SetRdOnly;
    634     }
    635     else
    636     {
    637         status = phFriNfc_MifareStdMap_ConvertToReadOnly(NdefMap, mif_secrete_key);
    638     }
    639     if ( NFCSTATUS_PENDING == status )
    640     {
    641         status = NFCSTATUS_SUCCESS;
    642     }
    643 
    644 Mfc_SetRdOnly:
    645     return status;
    646 }
    647 
    648 /*******************************************************************************
    649 **
    650 ** Function         Mfc_ReadNdef
    651 **
    652 ** Description      It triggers receiving of the NDEF message from Mifare Classic Tag.
    653 **
    654 **
    655 ** Returns:
    656 **                  NFCSTATUS_SUCCESS - if successfully initiated
    657 **                  NFCSTATUS_FAILED  - otherwise
    658 **
    659 *******************************************************************************/
    660 NFCSTATUS Mfc_ReadNdef(void)
    661 {
    662     NFCSTATUS status = NFCSTATUS_FAILED;
    663     uint8_t            *PacketData = NULL;
    664     uint32_t           *PacketDataLength = NULL;
    665     phLibNfc_Ndef_EOffset_t Offset;
    666 
    667     EXTNS_SetCallBackFlag(false);
    668 
    669     Offset = phLibNfc_Ndef_EBegin;
    670 
    671     gphNxpExtns_Context.CallBackMifare = phFriNfc_MifareStdMap_Process;
    672     gphNxpExtns_Context.CallBackCtxt   = NdefMap;
    673 #if(NFC_NXP_NOT_OPEN_INCLUDED == TRUE)
    674     pthread_mutex_lock(&SharedDataMutex);
    675 #endif
    676     if(NdefInfo.is_ndef == 0)
    677     {
    678         status = NFCSTATUS_NON_NDEF_COMPLIANT;
    679         goto Mfc_RdNdefEnd;
    680     }
    681     else if( (NdefInfo.is_ndef == 1) && (NdefInfo.NdefActualSize == 0) )
    682     {
    683         NdefInfo.psUpperNdefMsg->length = NdefInfo.NdefActualSize;
    684         status = NFCSTATUS_SUCCESS;
    685         goto Mfc_RdNdefEnd;
    686     }
    687     else
    688     {
    689         NdefInfo.psUpperNdefMsg->buffer = malloc(NdefInfo.NdefActualSize);
    690         if ( NULL == NdefInfo.psUpperNdefMsg->buffer)
    691         {
    692            goto Mfc_RdNdefEnd;
    693         }
    694         NdefInfo.psUpperNdefMsg->length = NdefInfo.NdefActualSize;
    695 
    696         /* Set Completion Routine for ReadNdef */
    697         NdefMap->CompletionRoutine[1].CompletionRoutine = Mfc_ReadNdef_Completion_Routine;
    698         NdefInfo.NdefContinueRead = (uint8_t) ((phLibNfc_Ndef_EBegin==Offset) ?
    699                                                         PH_FRINFC_NDEFMAP_SEEK_BEGIN :
    700                                                         PH_FRINFC_NDEFMAP_SEEK_CUR);
    701     }
    702 
    703     PacketData             = NdefInfo.psUpperNdefMsg->buffer;
    704     PacketDataLength       = (uint32_t*)&(NdefInfo.psUpperNdefMsg->length);
    705     NdefMap->bCurrReadMode = Offset;
    706     status = phFriNfc_ValidateParams (PacketData, PacketDataLength, Offset, NdefMap, PH_FRINFC_NDEF_READ_REQ);
    707     if( status != NFCSTATUS_SUCCESS )
    708     {
    709         goto Mfc_RdNdefEnd;
    710     }
    711 
    712     status = phFriNfc_MifareStdMap_RdNdef(NdefMap, PacketData, PacketDataLength, Offset);
    713 
    714     if(NFCSTATUS_INSUFFICIENT_STORAGE == status)
    715     {
    716         NdefInfo.psUpperNdefMsg->length = 0x00;
    717         status = NFCSTATUS_SUCCESS;
    718     }
    719 
    720     if ( NFCSTATUS_PENDING == status )
    721     {
    722         status = NFCSTATUS_SUCCESS;
    723     }
    724 
    725 Mfc_RdNdefEnd:
    726     if( status != NFCSTATUS_SUCCESS )
    727     {
    728         if ( NULL != NdefInfo.psUpperNdefMsg->buffer )
    729         {
    730             free(NdefInfo.psUpperNdefMsg->buffer);
    731             NdefInfo.psUpperNdefMsg->buffer = NULL;
    732         }
    733         status = NFCSTATUS_FAILED;
    734     }
    735 #if(NFC_NXP_NOT_OPEN_INCLUDED == TRUE)
    736     pthread_mutex_unlock(&SharedDataMutex);
    737 #endif
    738     return status;
    739 
    740 }
    741 /*******************************************************************************
    742 **
    743 ** Function         Mfc_PresenceCheck
    744 **
    745 ** Description      It triggers receiving of the NDEF message from Mifare Classic Tag.
    746 **
    747 **
    748 ** Returns:
    749 **                  NFCSTATUS_SUCCESS - if successfully initiated
    750 **                  NFCSTATUS_FAILED  - otherwise
    751 **
    752 *******************************************************************************/
    753 NFCSTATUS Mfc_PresenceCheck(void)
    754 {
    755     NFCSTATUS status = NFCSTATUS_SUCCESS;
    756 
    757     if (gAuthCmdBuf.auth_status == true)
    758     {
    759         EXTNS_SetCallBackFlag(false);
    760         status = nativeNfcExtns_doTransceive(gAuthCmdBuf.pauth_cmd->buffer,
    761              gAuthCmdBuf.pauth_cmd->length);
    762         if (status != NFCSTATUS_PENDING)
    763         {
    764             gAuthCmdBuf.auth_sent = false;
    765             status = NFCSTATUS_FAILED;
    766         }
    767         else
    768         {
    769             gAuthCmdBuf.auth_sent = true;
    770             status = NFCSTATUS_SUCCESS;
    771         }
    772     }
    773     else
    774     {
    775         status = NFCSTATUS_NOT_ALLOWED;
    776     }
    777     NXPLOG_EXTNS_D("%s status = 0x%x", __func__, status);
    778     return status;
    779 }
    780 /*******************************************************************************
    781 **
    782 ** Function         Mfc_WriteNdef
    783 **
    784 ** Description      It triggers the NDEF data write to Mifare Classic Tag.
    785 **
    786 **
    787 ** Returns:
    788 **                  NFCSTATUS_SUCCESS - if successfully initiated
    789 **                  NFCSTATUS_FAILED  - otherwise
    790 **
    791 *******************************************************************************/
    792 NFCSTATUS Mfc_WriteNdef(uint8_t *p_data, uint32_t len)
    793 {
    794     NFCSTATUS status = NFCSTATUS_SUCCESS;
    795     uint8_t            *PacketData = NULL;
    796     uint32_t           *PacketDataLength = NULL;
    797 
    798     if( p_data == NULL || len == 0 )
    799     {
    800         NXPLOG_EXTNS_E("MFC Error: Invalid Parameters to Ndef Write");
    801         status = NFCSTATUS_FAILED;
    802         goto Mfc_WrNdefEnd;
    803     }
    804 
    805     EXTNS_SetCallBackFlag(false);
    806     gphNxpExtns_Context.CallBackMifare = phFriNfc_MifareStdMap_Process;
    807     gphNxpExtns_Context.CallBackCtxt   = NdefMap;
    808 #if(NFC_NXP_NOT_OPEN_INCLUDED == TRUE)
    809     pthread_mutex_lock(&SharedDataMutex);
    810 #endif
    811     if( NdefInfo.is_ndef == PH_LIBNFC_INTERNAL_CHK_NDEF_NOT_DONE )
    812     {
    813         status = NFCSTATUS_REJECTED;
    814         goto Mfc_WrNdefEnd;
    815     }
    816     else if( NdefInfo.is_ndef == 0 )
    817     {
    818         status = NFCSTATUS_NON_NDEF_COMPLIANT;
    819         goto Mfc_WrNdefEnd;
    820     }
    821     else if( len > NdefInfo.NdefLength )
    822     {
    823         status = NFCSTATUS_NOT_ENOUGH_MEMORY;
    824         goto Mfc_WrNdefEnd;
    825     }
    826     else
    827     {
    828         NdefInfo.psUpperNdefMsg->buffer = p_data;
    829         NdefInfo.psUpperNdefMsg->length = len;
    830 
    831         NdefInfo.AppWrLength    = len;
    832         NdefMap->CompletionRoutine[2].CompletionRoutine = Mfc_WriteNdef_Completion_Routine;
    833         if( 0 == len )
    834         {
    835             /* TODO: Erase the Tag */
    836         }
    837         else
    838         {
    839             NdefMap->ApduBuffIndex = 0x00;
    840             *NdefMap->DataCount    = 0x00;
    841             PacketData             = NdefInfo.psUpperNdefMsg->buffer;
    842             PacketDataLength       = &(NdefInfo.dwWrLength);
    843             NdefMap->WrNdefPacketLength = PacketDataLength;
    844             NdefInfo.dwWrLength = len;
    845 
    846             status = phFriNfc_ValidateParams (PacketData, PacketDataLength, 0, NdefMap, PH_FRINFC_NDEF_WRITE_REQ);
    847             if( status != NFCSTATUS_SUCCESS )
    848             {
    849                 goto Mfc_WrNdefEnd;
    850             }
    851 
    852             status = phFriNfc_MifareStdMap_WrNdef(NdefMap, PacketData, PacketDataLength, PH_FRINFC_NDEFMAP_SEEK_BEGIN);
    853 
    854             if ( status == NFCSTATUS_PENDING )
    855             {
    856                 status = NFCSTATUS_SUCCESS;
    857             }
    858         }
    859     }
    860 
    861 Mfc_WrNdefEnd:
    862 #if(NFC_NXP_NOT_OPEN_INCLUDED == TRUE)
    863     pthread_mutex_unlock(&SharedDataMutex);
    864 #endif
    865     if( status != NFCSTATUS_SUCCESS )
    866     {
    867         status = NFCSTATUS_FAILED;
    868     }
    869     return status;
    870 }
    871 /*******************************************************************************
    872 **
    873 ** Function          phFriNfc_NdefSmtCrd_Reset__
    874 **
    875 ** Description      This function Resets the component instance to the initial
    876 **                  state and initializes the internal variables.
    877 **
    878 ** Returns          NFCSTATUS_SUCCESS
    879 **
    880 *******************************************************************************/
    881 STATIC NFCSTATUS phFriNfc_NdefSmtCrd_Reset__(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt,
    882                                       uint8_t *SendRecvBuffer,
    883                                       uint16_t *SendRecvBuffLen)
    884 {
    885 //    NFCSTATUS status = NFCSTATUS_FAILED;                      /*commented to eliminate unused variable warning*/
    886     uint8_t     index;
    887 
    888     /* Initialize the state to Init */
    889     NdefSmtCrdFmt->State = PH_FRINFC_SMTCRDFMT_STATE_RESET_INIT;
    890 
    891     for(index = 0;index<PH_FRINFC_SMTCRDFMT_CR;index++)
    892     {
    893         /* Initialize the NdefMap Completion Routine to Null */
    894         NdefSmtCrdFmt->CompletionRoutine[index].CompletionRoutine = NULL;
    895         /* Initialize the NdefMap Completion Routine context to Null  */
    896         NdefSmtCrdFmt->CompletionRoutine[index].Context = NULL;
    897     }
    898 
    899     /* Trx Buffer registered */
    900     NdefSmtCrdFmt->SendRecvBuf = SendRecvBuffer;
    901 
    902     /* Trx Buffer Size */
    903     NdefSmtCrdFmt->SendRecvLength = SendRecvBuffLen;
    904 
    905     /* Register Transfer Buffer Length */
    906     NdefSmtCrdFmt->SendLength = 0;
    907 
    908     /* Initialize the Format status flag*/
    909     NdefSmtCrdFmt->FmtProcStatus = 0;
    910 
    911     /* Reset the Card Type */
    912     NdefSmtCrdFmt->CardType = 0;
    913 
    914     /* Reset MapCompletion Info*/
    915     NdefSmtCrdFmt->SmtCrdFmtCompletionInfo.CompletionRoutine = NULL;
    916     NdefSmtCrdFmt->SmtCrdFmtCompletionInfo.Context = NULL;
    917 
    918     phFriNfc_MfStd_Reset(NdefSmtCrdFmt);
    919 
    920     return NFCSTATUS_SUCCESS;
    921 }
    922 
    923 /*******************************************************************************
    924 **
    925 ** Function         Mfc_FormatNdef
    926 **
    927 ** Description      It triggers the NDEF format of Mifare Classic Tag.
    928 **
    929 **
    930 ** Returns:
    931 **                  NFCSTATUS_SUCCESS - if successfully initiated
    932 **                  NFCSTATUS_FAILED  - otherwise
    933 **
    934 *******************************************************************************/
    935 NFCSTATUS Mfc_FormatNdef(uint8_t *secretkey, uint8_t len)
    936 {
    937     NFCSTATUS status = NFCSTATUS_FAILED;
    938     uint8_t   mif_std_key[6] = {0};
    939 //    static uint8_t   Index;                                               /*commented to eliminate unused variable warning*/
    940     uint8_t     sak = 0;
    941 
    942     EXTNS_SetCallBackFlag(false);
    943 
    944     memcpy(mif_std_key,secretkey,len);
    945     memcpy(current_key,secretkey,len);
    946 
    947     if( NULL == NdefSmtCrdFmt ||
    948         NULL == NdefMap || NULL == NdefMap->SendRecvBuf )
    949     {
    950         goto Mfc_FormatEnd;
    951     }
    952     NdefSmtCrdFmt->pTransceiveInfo = NdefMap->pTransceiveInfo;
    953 
    954     gphNxpExtns_Context.CallBackMifare = phFriNfc_MfStd_Process;
    955     gphNxpExtns_Context.CallBackCtxt   = NdefSmtCrdFmt;
    956 
    957     NdefInfo.NdefSendRecvLen = NDEF_SENDRCV_BUF_LEN;
    958     phFriNfc_NdefSmtCrd_Reset__(NdefSmtCrdFmt, NdefMap->SendRecvBuf, &(NdefInfo.NdefSendRecvLen));
    959 
    960     /* Register Callbacks */
    961     NdefSmtCrdFmt->CompletionRoutine[0].CompletionRoutine = Mfc_FormatNdef_Completion_Routine;
    962     NdefSmtCrdFmt->CompletionRoutine[1].CompletionRoutine = Mfc_FormatNdef_Completion_Routine;
    963     NdefSmtCrdFmt->psRemoteDevInfo = NdefMap->psRemoteDevInfo;
    964     sak = NdefSmtCrdFmt->psRemoteDevInfo->RemoteDevInfo.Iso14443A_Info.Sak;
    965 
    966     if((0x08 == (sak & 0x18)) || (0x18 == (sak & 0x18)) ||
    967        (0x01 == sak))
    968     {
    969         NdefSmtCrdFmt->CardType = (uint8_t) (((sak & 0x18) == 0x08)?
    970                         PH_FRINFC_SMTCRDFMT_MFSTD_1K_CRD:(((sak & 0x19) == 0x19)?
    971                         PH_FRINFC_SMTCRDFMT_MFSTD_2K_CRD:
    972                         PH_FRINFC_SMTCRDFMT_MFSTD_4K_CRD));
    973         status = phFriNfc_MfStd_Format( NdefSmtCrdFmt, mif_std_key);
    974     }
    975 
    976     if( NFCSTATUS_PENDING == status )
    977     {
    978         status = NFCSTATUS_SUCCESS;
    979     }
    980 
    981 Mfc_FormatEnd:
    982     if( status != NFCSTATUS_SUCCESS )
    983     {
    984         status = NFCSTATUS_FAILED;
    985     }
    986 
    987     return status;
    988 }
    989 
    990 /*******************************************************************************
    991 **
    992 ** Function         phNxNciExtns_MifareStd_Reconnect
    993 **
    994 ** Description      This function sends the deactivate command to NFCC for Mifare
    995 **
    996 **
    997 ** Returns:
    998 **                  NFCSTATUS_PENDING - if successfully initiated
    999 **                  NFCSTATUS_FAILED  - otherwise
   1000 **
   1001 *******************************************************************************/
   1002 NFCSTATUS phNxNciExtns_MifareStd_Reconnect(void)
   1003 {
   1004     tNFA_STATUS status;
   1005 
   1006     EXTNS_SetDeactivateFlag(true);
   1007     if (NFA_STATUS_OK != (status = NFA_Deactivate (true))) /* deactivate to sleep state */
   1008     {
   1009         NXPLOG_EXTNS_E ("%s: deactivate failed, status = %d", __func__, status);
   1010         return NFCSTATUS_FAILED;
   1011     }
   1012 
   1013     return NFCSTATUS_PENDING;
   1014 
   1015 }
   1016 
   1017 /*******************************************************************************
   1018 **
   1019 ** Function         Mfc_DeactivateCbackSelect
   1020 **
   1021 ** Description      This function select the Mifare tag
   1022 **
   1023 **
   1024 ** Returns:         void
   1025 **
   1026 *******************************************************************************/
   1027 void Mfc_DeactivateCbackSelect(void)
   1028 {
   1029     tNFA_STATUS status;
   1030 
   1031     EXTNS_SetConnectFlag(true);
   1032     if (NFA_STATUS_OK != (status = NFA_Select (0x01, phNciNfc_e_RfProtocolsMifCProtocol,
   1033                                                      phNciNfc_e_RfInterfacesTagCmd_RF)))
   1034     {
   1035         NXPLOG_EXTNS_E ("%s: NFA_Select failed, status = %d", __func__, status);
   1036     }
   1037 
   1038     return;
   1039 }
   1040 
   1041 /*******************************************************************************
   1042 **
   1043 ** Function         Mfc_ActivateCback
   1044 **
   1045 ** Description      This function invoke the callback when receive the response
   1046 **
   1047 **
   1048 ** Returns:         void
   1049 **
   1050 **
   1051 *******************************************************************************/
   1052 void Mfc_ActivateCback(void)
   1053 {
   1054     gphNxpExtns_Context.CallBackMifare(gphNxpExtns_Context.CallBackCtxt, NFCSTATUS_SUCCESS);
   1055     return;
   1056 }
   1057 
   1058 /*******************************************************************************
   1059 **
   1060 ** Function         Mfc_Transceive
   1061 **
   1062 ** Description      Sends raw frame to Mifare Classic Tag.
   1063 **
   1064 ** Returns          NFCSTATUS_SUCCESS - if successfully initiated
   1065 **                  NFCSTATUS_FAILED  - otherwise
   1066 **
   1067 *******************************************************************************/
   1068 NFCSTATUS Mfc_Transceive(uint8_t *p_data, uint32_t len)
   1069 {
   1070     NFCSTATUS status = NFCSTATUS_FAILED;
   1071     uint8_t i = 0x00;
   1072 
   1073     gphNxpExtns_Context.RawWriteCallBack = false;
   1074     gphNxpExtns_Context.CallBackMifare = NULL;
   1075     gphNxpExtns_Context.CallBackCtxt   = NdefMap;
   1076 
   1077     EXTNS_SetCallBackFlag(true);
   1078     if( p_data[0] == 0x60 || p_data[0] == 0x61 )
   1079     {
   1080 
   1081         NdefMap->Cmd.MfCmd = p_data[0];
   1082 
   1083         NdefMap->SendRecvBuf[i++] = p_data[1];
   1084 
   1085         NdefMap->SendRecvBuf[i++] = p_data[6]; /* TODO, handle 7 byte UID */
   1086         NdefMap->SendRecvBuf[i++] = p_data[7];
   1087         NdefMap->SendRecvBuf[i++] = p_data[8];
   1088         NdefMap->SendRecvBuf[i++] = p_data[9];
   1089         NdefMap->SendRecvBuf[i++] = p_data[10];
   1090         NdefMap->SendRecvBuf[i++] = p_data[11];
   1091 
   1092         status = phFriNfc_ExtnsTransceive(NdefMap->pTransceiveInfo,
   1093                               NdefMap->Cmd,
   1094                               NdefMap->SendRecvBuf,
   1095                               NdefMap->SendLength,
   1096                               NdefMap->SendRecvLength);
   1097     }
   1098     else if( p_data[0] == 0xA0 )
   1099     {
   1100         EXTNS_SetCallBackFlag(false);
   1101         NdefMap->Cmd.MfCmd = phNfc_eMifareWrite16;
   1102         gphNxpExtns_Context.RawWriteCallBack = true;
   1103 
   1104         memcpy(NdefMap->SendRecvBuf, &p_data[1], len-1);
   1105         NdefMap->SendLength = len-1;
   1106         status = phFriNfc_ExtnsTransceive(NdefMap->pTransceiveInfo,
   1107                               NdefMap->Cmd,
   1108                               NdefMap->SendRecvBuf,
   1109                               NdefMap->SendLength,
   1110                               NdefMap->SendRecvLength);
   1111     }
   1112     else if( (p_data[0] == phNfc_eMifareInc) || (p_data[0] == phNfc_eMifareDec) )
   1113     {
   1114 
   1115         EXTNS_SetCallBackFlag(false);
   1116         NdefMap->Cmd.MfCmd = p_data[0];
   1117         gphNxpExtns_Context.RawWriteCallBack = true;
   1118 
   1119         memcpy(NdefMap->SendRecvBuf, &p_data[1], len-1);
   1120         NdefMap->SendLength = len - 1;
   1121         status = phFriNfc_ExtnsTransceive(NdefMap->pTransceiveInfo,
   1122                               NdefMap->Cmd,
   1123                               NdefMap->SendRecvBuf,
   1124                               NdefMap->SendLength,
   1125                               NdefMap->SendRecvLength);
   1126     }
   1127     else if( ((p_data[0] == phNfc_eMifareTransfer) || (p_data[0] == phNfc_eMifareRestore)) && (len == 2) )
   1128     {
   1129         NdefMap->Cmd.MfCmd = p_data[0];
   1130         if (p_data[0] == phNfc_eMifareRestore)
   1131         {
   1132             EXTNS_SetCallBackFlag(false);
   1133             gphNxpExtns_Context.RawWriteCallBack = true;
   1134             memcpy(NdefMap->SendRecvBuf, &p_data[1], len -1);
   1135             NdefMap->SendLength = len - 1;
   1136         }
   1137         else
   1138         {
   1139             memcpy(NdefMap->SendRecvBuf, p_data, len);
   1140             NdefMap->SendLength = len;
   1141         }
   1142         status = phFriNfc_ExtnsTransceive(NdefMap->pTransceiveInfo,
   1143                               NdefMap->Cmd,
   1144                               NdefMap->SendRecvBuf,
   1145                               NdefMap->SendLength,
   1146                               NdefMap->SendRecvLength);
   1147 
   1148     }
   1149     else
   1150     {
   1151         NdefMap->Cmd.MfCmd = phNfc_eMifareRaw;
   1152 
   1153         memcpy(NdefMap->SendRecvBuf, p_data, len);
   1154         NdefMap->SendLength = len;
   1155         status = phFriNfc_ExtnsTransceive(NdefMap->pTransceiveInfo,
   1156                               NdefMap->Cmd,
   1157                               NdefMap->SendRecvBuf,
   1158                               NdefMap->SendLength,
   1159                               NdefMap->SendRecvLength);
   1160     }
   1161     if (NFCSTATUS_PENDING == status)
   1162     {
   1163         status = NFCSTATUS_SUCCESS;
   1164     }
   1165     else
   1166     {
   1167         NXPLOG_EXTNS_E("ERROR: Mfc_Transceive = 0x%x", status);
   1168     }
   1169 
   1170     return status;
   1171 }
   1172 
   1173 /*******************************************************************************
   1174 **
   1175 ** Function         nativeNfcExtns_doTransceive
   1176 **
   1177 ** Description      Sends raw frame to BCM stack.
   1178 **
   1179 ** Returns          NFCSTATUS_PENDING - if successfully initiated
   1180 **                  NFCSTATUS_FAILED  - otherwise
   1181 **
   1182 *******************************************************************************/
   1183 STATIC NFCSTATUS nativeNfcExtns_doTransceive(uint8_t *buff, uint16_t buffSz)
   1184 {
   1185     NFCSTATUS wStatus = NFCSTATUS_PENDING;
   1186     tNFA_STATUS status = NFA_SendRawFrame (buff, buffSz, NFA_DM_DEFAULT_PRESENCE_CHECK_START_DELAY);
   1187 
   1188     if (status != NFA_STATUS_OK)
   1189     {
   1190         NXPLOG_EXTNS_E ("%s: fail send; error=%d", __func__, status);
   1191         wStatus = NFCSTATUS_FAILED;
   1192     }
   1193 
   1194     return wStatus;
   1195 }
   1196 
   1197 /*******************************************************************************
   1198 **
   1199 ** Function          phNciNfc_RecvMfResp
   1200 **
   1201 ** Description      This function shall be invoked as part of ReaderMgmt data
   1202 **                  exchange sequence handler on receiving response/data from NFCC
   1203 **
   1204 ** Returns          NFCSTATUS_SUCCESS - Data Reception is successful
   1205 **                  NFCSTATUS_FAILED  - Data Reception failed
   1206 **
   1207 *******************************************************************************/
   1208 STATIC NFCSTATUS
   1209 phNciNfc_RecvMfResp(phNciNfc_Buff_t* RspBuffInfo,
   1210                         NFCSTATUS          wStatus
   1211                        )
   1212 {
   1213     NFCSTATUS               status = NFCSTATUS_SUCCESS;
   1214     uint16_t                wPldDataSize = 0;
   1215     phNciNfc_ExtnRespId_t   RecvdExtnRspId = phNciNfc_e_InvalidRsp;
   1216     uint16_t                wRecvDataSz = 0;
   1217 
   1218     if(NULL == RspBuffInfo)
   1219     {
   1220       status = NFCSTATUS_FAILED;
   1221     }
   1222     else
   1223     {
   1224         if((0 == (RspBuffInfo->wLen))
   1225                 || (PH_NCINFC_STATUS_OK != wStatus)
   1226                 || (NULL == (RspBuffInfo->pBuff))
   1227                 )
   1228         {
   1229             status = NFCSTATUS_FAILED;
   1230         }
   1231         else
   1232         {
   1233             RecvdExtnRspId = (phNciNfc_ExtnRespId_t)RspBuffInfo->pBuff[0];
   1234 
   1235             switch(RecvdExtnRspId)
   1236             {
   1237                 case phNciNfc_e_MfXchgDataRsp:
   1238                 {
   1239                         /* check the status byte */
   1240                     if( PH_NCINFC_STATUS_OK == RspBuffInfo->pBuff[RspBuffInfo->wLen-1] )
   1241                     {
   1242                         status = NFCSTATUS_SUCCESS;
   1243 
   1244                         /* DataLen = TotalRecvdLen - (sizeof(RspId) + sizeof(Status)) */
   1245                         wPldDataSize = ((RspBuffInfo->wLen) -
   1246                             (PHNCINFC_EXTNID_SIZE + PHNCINFC_EXTNSTATUS_SIZE));
   1247                         wRecvDataSz = NCI_MAX_DATA_LEN;
   1248 
   1249                         /* wPldDataSize = wPldDataSize-1; ==> ignoring the last status byte appended with data */
   1250                         if((wPldDataSize) <= wRecvDataSz)
   1251                         {
   1252                             /* Extract the data part from pBuff[2] & fill it to be sent to upper layer */
   1253                             memcpy(NdefMap->SendRecvBuf, &(RspBuffInfo->pBuff[1]),(wPldDataSize));
   1254                             /* update the number of bytes received from lower layer,excluding the status byte */
   1255                             *(NdefMap->SendRecvLength) = wPldDataSize;
   1256                         }
   1257                         else
   1258                         {
   1259                             //TODO:- Map some status for remaining extra data received to be sent back to caller??
   1260                             status = NFCSTATUS_FAILED;
   1261                         }
   1262                     }
   1263                     else
   1264                     {
   1265                         status = NFCSTATUS_FAILED;
   1266                     }
   1267                 }
   1268                 break;
   1269 
   1270                 case phNciNfc_e_MfcAuthRsp:
   1271                 {
   1272                     /* check the status byte */
   1273                     if(PH_NCINFC_STATUS_OK == RspBuffInfo->pBuff[1])
   1274                     {
   1275                         if (gAuthCmdBuf.auth_sent ==  true)
   1276                         {
   1277                             MfcPresenceCheckResult(NFCSTATUS_SUCCESS);
   1278                             return NFCSTATUS_SUCCESS;
   1279                         }
   1280                         gAuthCmdBuf.auth_status = true;
   1281                         status = NFCSTATUS_SUCCESS;
   1282 
   1283                         /* DataLen = TotalRecvdLen - (sizeof(RspId) + sizeof(Status)) */
   1284                         wPldDataSize = ((RspBuffInfo->wLen) -
   1285                             (PHNCINFC_EXTNID_SIZE + PHNCINFC_EXTNSTATUS_SIZE));
   1286 
   1287                         /* Extract the data part from pBuff[2] & fill it to be sent to upper layer */
   1288                         memcpy(NdefMap->SendRecvBuf, &(RspBuffInfo->pBuff[2]),wPldDataSize);
   1289                         /* update the number of bytes received from lower layer,excluding the status byte */
   1290                         *(NdefMap->SendRecvLength) = wPldDataSize;
   1291                     }
   1292                     else
   1293                     {
   1294                         if (gAuthCmdBuf.auth_sent ==  true)
   1295                         {
   1296                             gAuthCmdBuf.auth_status = false;
   1297                             MfcPresenceCheckResult(NFCSTATUS_FAILED);
   1298                             return NFCSTATUS_SUCCESS;
   1299                         }
   1300                         else
   1301                         {
   1302                             /* Reset the stored auth command buffer */
   1303                             memset(gAuthCmdBuf.pauth_cmd->buffer, 0 , NCI_MAX_DATA_LEN);
   1304                             gAuthCmdBuf.pauth_cmd->length = 0;
   1305                             gAuthCmdBuf.auth_status = false;
   1306                         }
   1307                         status = NFCSTATUS_FAILED;
   1308                     }
   1309                 }
   1310                 break;
   1311 
   1312                 default:
   1313                 {
   1314                     status = NFCSTATUS_FAILED;
   1315                 }
   1316                 break;
   1317             }
   1318         }
   1319     }
   1320 
   1321     return status;
   1322 }
   1323 
   1324 /*******************************************************************************
   1325 **
   1326 ** Function         phLibNfc_SendWrt16CmdPayload
   1327 **
   1328 ** Description      This function map the raw write cmd
   1329 **
   1330 ** Returns          NFCSTATUS_SUCCESS            - Command framing done
   1331 **                  NFCSTATUS_INVALID_PARAMETER  - Otherwise
   1332 **
   1333 *******************************************************************************/
   1334 STATIC NFCSTATUS phLibNfc_SendWrt16CmdPayload(phNfc_sTransceiveInfo_t*    pTransceiveInfo,
   1335                                     pphNciNfc_TransceiveInfo_t   pMappedTranscvIf)
   1336 {
   1337     NFCSTATUS wStatus = NFCSTATUS_SUCCESS;
   1338 
   1339     if( (NULL != pTransceiveInfo->sSendData.buffer) &&
   1340         (0 != (pTransceiveInfo->sSendData.length)))
   1341     {
   1342         memcpy(pMappedTranscvIf->tSendData.pBuff, pTransceiveInfo->sSendData.buffer,
   1343                               (pTransceiveInfo->sSendData.length));
   1344         pMappedTranscvIf->tSendData.wLen              = pTransceiveInfo->sSendData.length;
   1345         pMappedTranscvIf->uCmd.T2TCmd                 = phNciNfc_eT2TRaw;
   1346     }
   1347     else
   1348     {
   1349         wStatus = NFCSTATUS_INVALID_PARAMETER;
   1350     }
   1351 
   1352     if ( gphNxpExtns_Context.RawWriteCallBack == true )
   1353     {
   1354         EXTNS_SetCallBackFlag(true);
   1355         gphNxpExtns_Context.RawWriteCallBack = false;
   1356     }
   1357 
   1358     return wStatus;
   1359 }
   1360 
   1361 /*******************************************************************************
   1362 **
   1363 ** Function         phLibNfc_SendIncDecCmdPayload
   1364 **
   1365 ** Description      This function prepares the Increment/Decrement Value to be
   1366 **                  sent. This is called after sending the Increment/Decrement
   1367 **                  command is already sent and successfull
   1368 **
   1369 ** Returns          NFCSTATUS_SUCCESS            - Payload framing done
   1370 **                  NFCSTATUS_INVALID_PARAMETER  - Otherwise
   1371 **
   1372 *******************************************************************************/
   1373 STATIC NFCSTATUS phLibNfc_SendIncDecCmdPayload(phNfc_sTransceiveInfo_t*    pTransceiveInfo,
   1374                                     pphNciNfc_TransceiveInfo_t   pMappedTranscvIf)
   1375 {
   1376     NFCSTATUS wStatus = NFCSTATUS_SUCCESS;
   1377 
   1378     if( (NULL != pTransceiveInfo->sSendData.buffer) &&
   1379         (0 != (pTransceiveInfo->sSendData.length)))
   1380     {
   1381         memcpy(pMappedTranscvIf->tSendData.pBuff, pTransceiveInfo->sSendData.buffer,
   1382                               (pTransceiveInfo->sSendData.length));
   1383         pMappedTranscvIf->tSendData.wLen              = pTransceiveInfo->sSendData.length;
   1384         pMappedTranscvIf->uCmd.T2TCmd                 = phNciNfc_eT2TRaw;
   1385     }
   1386     else
   1387     {
   1388         wStatus = NFCSTATUS_INVALID_PARAMETER;
   1389     }
   1390 
   1391     if ( gphNxpExtns_Context.RawWriteCallBack == true )
   1392     {
   1393         EXTNS_SetCallBackFlag(true);
   1394         gphNxpExtns_Context.RawWriteCallBack = false;
   1395     }
   1396 
   1397     return wStatus;
   1398 }
   1399 
   1400 /*******************************************************************************
   1401 **
   1402 ** Function         Mfc_RecvPacket
   1403 **
   1404 ** Description      Decodes Mifare Classic Tag Response
   1405 **                  This is called from NFA_SendRaw Callback
   1406 **
   1407 ** Returns:
   1408 **                  NFCSTATUS_SUCCESS - if successfully initiated
   1409 **                  NFCSTATUS_FAILED  - otherwise
   1410 **
   1411 *******************************************************************************/
   1412 NFCSTATUS Mfc_RecvPacket(uint8_t *buff, uint8_t buffSz)
   1413 {
   1414     NFCSTATUS    status = NFCSTATUS_SUCCESS;
   1415     phNciNfc_Buff_t         RspBuff;
   1416     uint8_t *pcmd_buff;
   1417     uint16_t buffSize;
   1418 
   1419     RspBuff.pBuff = buff;
   1420     RspBuff.wLen  = buffSz;
   1421     status = phNciNfc_RecvMfResp(&RspBuff, status);
   1422     if (true == gAuthCmdBuf.auth_sent)
   1423     {
   1424         ALOGV("%s Mfc Check Presence in progress", __func__);
   1425         gAuthCmdBuf.auth_sent = false;
   1426         return status;
   1427     }
   1428     if(true == gphNxpExtns_Context.writecmdFlag && (NFCSTATUS_SUCCESS == status ))
   1429     {
   1430         pcmd_buff = (uint8_t *)malloc((uint32_t)MAX_BUFF_SIZE);
   1431         if( NULL == pcmd_buff )
   1432         {
   1433             return NFCSTATUS_FAILED;
   1434         }
   1435         buffSize = MAX_BUFF_SIZE;
   1436         gphNxpExtns_Context.writecmdFlag = false;
   1437         phLibNfc_SendWrt16CmdPayload(NdefMap->pTransceiveInfo, &tNciTranscvInfo);
   1438         status = phNciNfc_SendMfReq(tNciTranscvInfo, pcmd_buff, &buffSize);
   1439         if ( NFCSTATUS_PENDING != status )
   1440         {
   1441             NXPLOG_EXTNS_E("ERROR : Mfc_RecvPacket: 0x%x", status);
   1442         }
   1443         else
   1444         {
   1445             status = NFCSTATUS_SUCCESS;
   1446         }
   1447         if( pcmd_buff != NULL )
   1448         {
   1449             free(pcmd_buff);
   1450             pcmd_buff = NULL;
   1451         }
   1452     }
   1453     else if(true == gphNxpExtns_Context.incrdecflag && (NFCSTATUS_SUCCESS == status ))
   1454     {
   1455         pcmd_buff = (uint8_t *)malloc((uint32_t)MAX_BUFF_SIZE);
   1456         if( NULL == pcmd_buff )
   1457         {
   1458             return NFCSTATUS_FAILED;
   1459         }
   1460         buffSize = MAX_BUFF_SIZE;
   1461         gphNxpExtns_Context.incrdecflag = false;
   1462         phLibNfc_SendIncDecCmdPayload(NdefMap->pTransceiveInfo, &tNciTranscvInfo);
   1463         status = phNciNfc_SendMfReq(tNciTranscvInfo, pcmd_buff, &buffSize);
   1464         if ( NFCSTATUS_PENDING != status )
   1465         {
   1466             NXPLOG_EXTNS_E("ERROR : Mfc_RecvPacket: 0x%x", status);
   1467         }
   1468         else
   1469         {
   1470             status = NFCSTATUS_SUCCESS;
   1471         }
   1472         gphNxpExtns_Context.incrdecstatusflag = true;
   1473         if( pcmd_buff != NULL )
   1474         {
   1475             free(pcmd_buff);
   1476             pcmd_buff = NULL;
   1477         }
   1478 
   1479     }
   1480     else
   1481     {
   1482         if( gphNxpExtns_Context.CallBackMifare != NULL )
   1483         {
   1484             if( (gphNxpExtns_Context.incrdecstatusflag == true) && status == 0xB2 )
   1485             {
   1486                 gphNxpExtns_Context.incrdecstatusflag = false;
   1487                 status = NFCSTATUS_SUCCESS;
   1488             }
   1489             gphNxpExtns_Context.CallBackMifare(gphNxpExtns_Context.CallBackCtxt, status);
   1490         }
   1491     }
   1492 
   1493     return status;
   1494 }
   1495 
   1496 /*******************************************************************************
   1497 **
   1498 ** Function         phNciNfc_MfCreateXchgDataHdr
   1499 **
   1500 ** Description      This function builds the payload header for mifare XchgData
   1501 **                  request to be sent to NFCC.
   1502 **
   1503 ** Returns          NFCSTATUS_PENDING            - Command framing done
   1504 **                  NFCSTATUS_FAILED             - Otherwise
   1505 **
   1506 *******************************************************************************/
   1507 STATIC
   1508 NFCSTATUS
   1509 phNciNfc_MfCreateXchgDataHdr(phNciNfc_TransceiveInfo_t tTranscvInfo,
   1510                              uint8_t *buff, uint16_t *buffSz)
   1511 
   1512 {
   1513     NFCSTATUS   status = NFCSTATUS_SUCCESS;
   1514     uint8_t     i = 0;
   1515 
   1516     buff[i++] = phNciNfc_e_MfRawDataXchgHdr;
   1517     memcpy(&buff[i],tTranscvInfo.tSendData.pBuff,tTranscvInfo.tSendData.wLen);
   1518     *buffSz = i + tTranscvInfo.tSendData.wLen;
   1519 
   1520     status = nativeNfcExtns_doTransceive(buff, (uint16_t) *buffSz);
   1521 
   1522     return status;
   1523 }
   1524 
   1525 /*******************************************************************************
   1526 **
   1527 ** Function         phNciNfc_MfCreateAuthCmdHdr
   1528 **
   1529 ** Description      This function builds the payload header for mifare
   1530 **                  classic Authenticate command to be sent to NFCC.
   1531 **
   1532 ** Returns          NFCSTATUS_PENDING            - Command framing done
   1533 **                  NFCSTATUS_FAILED             - Otherwise
   1534 **
   1535 *******************************************************************************/
   1536 STATIC
   1537 NFCSTATUS
   1538 phNciNfc_MfCreateAuthCmdHdr(phNciNfc_TransceiveInfo_t tTranscvInfo,
   1539                             uint8_t    bBlockAddr,
   1540                             uint8_t    *buff,
   1541                             uint16_t    *buffSz)
   1542 {
   1543     NFCSTATUS               status = NFCSTATUS_SUCCESS;
   1544 //    pphNciNfc_RemoteDevInformation_t  pActivDev = NULL;           /*commented to eliminate unused variable warning*/
   1545     uint8_t bKey = 0x00;
   1546 
   1547     /*No need to check range of block address*/
   1548     /*To check for Authenticate A or Authenticate B type command*/
   1549     if(PHNCINFC_AUTHENTICATION_KEYB ==
   1550        tTranscvInfo.tSendData.pBuff[0] )
   1551     {
   1552         bKey = bKey | PHNCINFC_ENABLE_KEY_B;
   1553     }
   1554 
   1555     /*TO Do last 4 bits of Key to be set based of firmware implementation*/
   1556     /*this value is hardcoded but based on firmware implementation change this value*/
   1557     bKey = (bKey | PHNCINFC_AUTHENTICATION_KEY);
   1558 
   1559     bKey |= tTranscvInfo.tSendData.pBuff[2];
   1560 
   1561     /*For authentication extension no need to copy tSendData buffer of tTranscvInfo */
   1562     tTranscvInfo.tSendData.wLen = 0x00;
   1563 
   1564     buff[0] = phNciNfc_e_MfcAuthReq;
   1565     buff[1] = bBlockAddr;
   1566     buff[2] = bKey;
   1567 
   1568     *buffSz = 0x03;
   1569     if (bKey & PH_NCINFC_MIFARECLASSIC_EMBEDDED_KEY)
   1570     {
   1571         memcpy(&buff[3],&tTranscvInfo.tSendData.pBuff[3], PHLIBNFC_MFC_AUTHKEYLEN);
   1572         *buffSz += PHLIBNFC_MFC_AUTHKEYLEN;
   1573     }
   1574     /* Store the auth command buffer to use further for presence check */
   1575     if (gAuthCmdBuf.pauth_cmd != NULL)
   1576     {
   1577         memset(gAuthCmdBuf.pauth_cmd->buffer, 0, NCI_MAX_DATA_LEN);
   1578         gAuthCmdBuf.pauth_cmd->length = *buffSz;
   1579         memcpy(gAuthCmdBuf.pauth_cmd->buffer, buff, *buffSz);
   1580     }
   1581     status = nativeNfcExtns_doTransceive(buff,(uint16_t) *buffSz);
   1582 
   1583     return status;
   1584 }
   1585 
   1586 /*******************************************************************************
   1587 **
   1588 ** Function         phNciNfc_SendMfReq
   1589 **
   1590 ** Description      This function shall be invoked as part of ReaderMgmt data
   1591 **                  exchange sequence handler.
   1592 **                  It shall send the request packet to NFCC.
   1593 **
   1594 ** Returns          NFCSTATUS_PENDING  - Send request is Pending
   1595 **                  NFCSTATUS_FAILED   - otherwise
   1596 **
   1597 *******************************************************************************/
   1598 STATIC NFCSTATUS
   1599 phNciNfc_SendMfReq(phNciNfc_TransceiveInfo_t tTranscvInfo, uint8_t *buff, uint16_t *buffSz)
   1600 {
   1601     NFCSTATUS status = NFCSTATUS_SUCCESS;
   1602 
   1603     switch(tTranscvInfo.uCmd.T2TCmd)
   1604     {
   1605         case phNciNfc_eT2TRaw:
   1606         {
   1607             status = phNciNfc_MfCreateXchgDataHdr(tTranscvInfo, buff, buffSz);
   1608         }
   1609         break;
   1610         case phNciNfc_eT2TAuth:
   1611         {
   1612             status = phNciNfc_MfCreateAuthCmdHdr(tTranscvInfo,
   1613                 (tTranscvInfo.bAddr), buff, buffSz);
   1614         }
   1615         break;
   1616         default:
   1617         {
   1618             status = NFCSTATUS_FAILED;
   1619             break;
   1620         }
   1621     }
   1622 
   1623     return status;
   1624 }
   1625 
   1626 /*******************************************************************************
   1627 **
   1628 ** Function         phLibNfc_CalSectorAddress
   1629 **
   1630 ** Description      This function update the sector address for Mifare classic
   1631 **
   1632 ** Returns          none
   1633 **
   1634 *******************************************************************************/
   1635 STATIC void phLibNfc_CalSectorAddress(uint8_t *Sector_Address)
   1636 {
   1637     uint8_t BlockNumber = 0x00;
   1638 
   1639     if(NULL != Sector_Address)
   1640     {
   1641         BlockNumber = *Sector_Address;
   1642         if(BlockNumber >= PHLIBNFC_MIFARESTD4K_BLK128)
   1643         {
   1644             *Sector_Address = (uint8_t)(PHLIBNFC_MIFARESTD_SECTOR_NO32 +
   1645                               ((BlockNumber - PHLIBNFC_MIFARESTD4K_BLK128)/
   1646                                PHLIBNFC_MIFARESTD_BLOCK_BYTES));
   1647         }
   1648         else
   1649         {
   1650             *Sector_Address = BlockNumber/PHLIBNFC_NO_OF_BLKPERSECTOR;
   1651         }
   1652      }
   1653     else
   1654     {
   1655     }
   1656 
   1657     return;
   1658 }
   1659 
   1660 /*******************************************************************************
   1661 **
   1662 ** Function         phLibNfc_GetKeyNumberMFC
   1663 **
   1664 ** Description      This function find key number based on authentication command
   1665 **
   1666 ** Returns          NFCSTATUS_SUCCESS  - If found the key number
   1667 **                  NFCSTATUS_FAILED   - otherwise
   1668 **
   1669 *******************************************************************************/
   1670 STATIC NFCSTATUS phLibNfc_GetKeyNumberMFC(uint8_t *buffer,uint8_t *bKey)
   1671 {
   1672     int32_t sdwStat   = 0X00;
   1673     NFCSTATUS wStatus = NFCSTATUS_INVALID_PARAMETER;
   1674 
   1675     /*Key Configuration
   1676     uint8_t NdefKey[PHLIBNFC_MFC_AUTHKEYLEN] = {0xD3,0XF7,0xD3,0XF7,0xD3,0XF7};
   1677     uint8_t RawKey[PHLIBNFC_MFC_AUTHKEYLEN] = {0xFF,0XFF,0xFF,0XFF,0xFF,0XFF};
   1678     uint8_t MadKey[PHLIBNFC_MFC_AUTHKEYLEN] = {0xA0,0XA1,0xA2,0XA3,0xA4,0XA5};
   1679     uint8_t Key[PHLIBNFC_MFC_AUTHKEYLEN] = {0x00,0x00,0x00,0x00,0x00,0x00}; */ /*Key used during ndef format*/
   1680 
   1681     uint8_t bIndex = 0x00;
   1682     uint8_t bNoOfKeys = 0x00;
   1683 
   1684 #if PHLIBNFC_NXPETENSION_CONFIGURE_MFKEYS
   1685     uint8_t aMfc_keys[NXP_NUMBER_OF_MFC_KEYS][NXP_MFC_KEY_SIZE] = NXP_MFC_KEYS;
   1686 #else
   1687     uint8_t aMfc_keys[1][1] = {{0x00}};
   1688 #endif
   1689 
   1690     if(NULL != bKey &&
   1691        NULL != buffer )
   1692     {
   1693        bNoOfKeys = sizeof(aMfc_keys)/NXP_MFC_KEY_SIZE;
   1694         /* Traverse through the keys stored to determine whether keys is preloaded key */
   1695        for(bIndex = 0; bIndex < bNoOfKeys; bIndex++)
   1696        {
   1697            /* Check passed key is NDEF key */
   1698            sdwStat = memcmp(&buffer[PHLIBNFC_MFCUIDLEN_INAUTHCMD],
   1699                                   aMfc_keys[bIndex], PHLIBNFC_MFC_AUTHKEYLEN);
   1700            if(!sdwStat)
   1701            {
   1702                NXPLOG_EXTNS_E("Mifare : phLibNfc_GetKeyNumberMFC Key found");
   1703                *bKey = bIndex;
   1704                wStatus = NFCSTATUS_SUCCESS;
   1705                break;
   1706            }
   1707         }
   1708        NXPLOG_EXTNS_E("Mifare : phLibNfc_GetKeyNumberMFC returning = 0x%x Key = 0x%x", wStatus, *bKey);
   1709     }
   1710     else
   1711     {
   1712         wStatus = NFCSTATUS_FAILED;
   1713         NXPLOG_EXTNS_E("Mifare : phLibNfc_GetKeyNumberMFC returning = 0x%x", wStatus);
   1714     }
   1715 
   1716     return wStatus;
   1717 }
   1718 
   1719 /*******************************************************************************
   1720 **
   1721 ** Function         phLibNfc_ChkAuthCmdMFC
   1722 **
   1723 ** Description      This function Check Authentication command send is proper or not
   1724 **
   1725 ** Returns          NFCSTATUS_SUCCESS  - Authenticate command is proper
   1726 **                  NFCSTATUS_FAILED   - otherwise
   1727 **
   1728 *******************************************************************************/
   1729 STATIC NFCSTATUS phLibNfc_ChkAuthCmdMFC(phNfc_sTransceiveInfo_t* pTransceiveInfo,
   1730                                  uint8_t *bKey)
   1731 {
   1732     NFCSTATUS wStatus  = NFCSTATUS_SUCCESS;
   1733 
   1734     if(NULL != pTransceiveInfo &&
   1735        NULL != pTransceiveInfo->sSendData.buffer &&
   1736        0 != pTransceiveInfo->sSendData.length &&
   1737        NULL != bKey)
   1738     {
   1739         if((pTransceiveInfo->cmd.MfCmd == phNfc_eMifareAuthentA ||
   1740            pTransceiveInfo->cmd.MfCmd == phNfc_eMifareAuthentB ))
   1741         {
   1742             wStatus = phLibNfc_GetKeyNumberMFC(pTransceiveInfo->sSendData.buffer,bKey);
   1743         }
   1744         else
   1745         {
   1746             wStatus = NFCSTATUS_FAILED;
   1747         }
   1748     }else
   1749     {
   1750         wStatus = NFCSTATUS_FAILED;
   1751     }
   1752     return wStatus;
   1753 }
   1754 
   1755 /*******************************************************************************
   1756 **
   1757 ** Function         phLibNfc_MifareMap
   1758 **
   1759 ** Description      Mifare Mapping Utility function
   1760 **
   1761 ** Returns          NFCSTATUS_SUCCESS             - Mapping is proper
   1762 **                  NFCSTATUS_INVALID_PARAMETER   - otherwise
   1763 **
   1764 *******************************************************************************/
   1765 STATIC NFCSTATUS phLibNfc_MifareMap(phNfc_sTransceiveInfo_t*    pTransceiveInfo,
   1766                                     pphNciNfc_TransceiveInfo_t   pMappedTranscvIf)
   1767 {
   1768     NFCSTATUS status = NFCSTATUS_SUCCESS;
   1769     uint8_t bBuffIdx = 0;
   1770     uint8_t bSectorNumber;
   1771     uint8_t bKey = 0;
   1772 
   1773     switch(pTransceiveInfo->cmd.MfCmd)
   1774     {
   1775         case phNfc_eMifareRead16:
   1776         {
   1777             if( (NULL != pTransceiveInfo->sRecvData.buffer) &&
   1778                 (0 != (pTransceiveInfo->sRecvData.length)))
   1779             {
   1780                 pMappedTranscvIf->tSendData.pBuff[bBuffIdx++] = phNfc_eMifareRead16;
   1781                 pMappedTranscvIf->tSendData.pBuff[bBuffIdx++] = pTransceiveInfo->addr;
   1782                 pMappedTranscvIf->tSendData.wLen              = bBuffIdx;
   1783                 pMappedTranscvIf->uCmd.T2TCmd                 = phNciNfc_eT2TRaw;
   1784             }
   1785             else
   1786             {
   1787                 status = NFCSTATUS_INVALID_PARAMETER;
   1788             }
   1789         }
   1790         break;
   1791 
   1792         case phNfc_eMifareWrite16:
   1793         {
   1794             if( (NULL != pTransceiveInfo->sSendData.buffer) &&
   1795                 (0 != (pTransceiveInfo->sSendData.length)))
   1796             {
   1797                 pMappedTranscvIf->tSendData.pBuff[bBuffIdx++] = phNfc_eMifareWrite16;
   1798                 pMappedTranscvIf->tSendData.pBuff[bBuffIdx++] = pTransceiveInfo->addr;
   1799                 memcpy(&(pMappedTranscvIf->tSendData.pBuff[bBuffIdx]),pTransceiveInfo->sSendData.buffer,
   1800                                       (pTransceiveInfo->sSendData.length));
   1801                 pMappedTranscvIf->tSendData.wLen              = bBuffIdx + pTransceiveInfo->sSendData.length;
   1802                 pMappedTranscvIf->uCmd.T2TCmd                 = phNciNfc_eT2TRaw;
   1803             }
   1804             else
   1805             {
   1806                 status = NFCSTATUS_INVALID_PARAMETER;
   1807             }
   1808         }
   1809         break;
   1810 
   1811         case phNfc_eMifareAuthentA:
   1812         case phNfc_eMifareAuthentB:
   1813         {
   1814             if( (NULL != pTransceiveInfo->sSendData.buffer) &&
   1815                 (0 != (pTransceiveInfo->sSendData.length)) &&
   1816                 (NULL != pTransceiveInfo->sRecvData.buffer) &&
   1817                 (0 != (pTransceiveInfo->sRecvData.length))
   1818                 )
   1819             {
   1820                 status = phLibNfc_ChkAuthCmdMFC(pTransceiveInfo, &bKey);
   1821                 if(NFCSTATUS_FAILED != status )
   1822                 {
   1823                     bSectorNumber = pTransceiveInfo->addr;
   1824                     phLibNfc_CalSectorAddress(&bSectorNumber);
   1825                     /*For creating extension command header pTransceiveInfo's MfCmd get used*/
   1826                     pMappedTranscvIf->tSendData.pBuff[bBuffIdx++] = pTransceiveInfo->cmd.MfCmd;
   1827                     pMappedTranscvIf->tSendData.pBuff[bBuffIdx++] = bSectorNumber;
   1828                     pMappedTranscvIf->uCmd.T2TCmd = phNciNfc_eT2TAuth;
   1829                     pMappedTranscvIf->bAddr = bSectorNumber;
   1830                     pMappedTranscvIf->bNumBlock = pTransceiveInfo->NumBlock;
   1831                     if(NFCSTATUS_SUCCESS == status)
   1832                     {
   1833                         pMappedTranscvIf->tSendData.pBuff[bBuffIdx++] = bKey;
   1834                         (pMappedTranscvIf->tSendData.wLen) = (uint16_t)(bBuffIdx);
   1835 
   1836                     }
   1837                     else if(NFCSTATUS_INVALID_PARAMETER == status)
   1838                     {
   1839                         bKey = bKey | PH_NCINFC_MIFARECLASSIC_EMBEDDED_KEY;
   1840                         pMappedTranscvIf->tSendData.pBuff[bBuffIdx++] = bKey;
   1841                         memcpy(&pMappedTranscvIf->tSendData.pBuff[bBuffIdx],
   1842                                 &pTransceiveInfo->sSendData.buffer[PHLIBNFC_MFCUIDLEN_INAUTHCMD], PHLIBNFC_MFC_AUTHKEYLEN);
   1843 
   1844                         (pMappedTranscvIf->tSendData.wLen) = (uint16_t)(bBuffIdx + PHLIBNFC_MFC_AUTHKEYLEN);
   1845                         status = NFCSTATUS_SUCCESS;
   1846                     }
   1847                     else
   1848                     {
   1849                         /* do nothing */
   1850                     }
   1851                 }
   1852             }
   1853             else
   1854             {
   1855                 status = NFCSTATUS_INVALID_PARAMETER;
   1856             }
   1857         }
   1858         break;
   1859 
   1860         case phNfc_eMifareRaw:
   1861         {
   1862 
   1863         }
   1864         break;
   1865 
   1866         default:
   1867         {
   1868             status = NFCSTATUS_INVALID_PARAMETER;
   1869             break;
   1870         }
   1871     }
   1872 
   1873     return status;
   1874 }
   1875 
   1876 /*******************************************************************************
   1877 **
   1878 ** Function         phLibNfc_MapCmds
   1879 **
   1880 ** Description      This function maps the command request from libnfc level to nci level
   1881 **
   1882 ** Returns          NFCSTATUS_SUCCESS           - Mapping of command is successful
   1883 **                  NFCSTATUS_INVALID_PARAMETER - One or more of the supplied
   1884 **                  parameters could not be interpreted properly
   1885 **
   1886 *******************************************************************************/
   1887 STATIC NFCSTATUS phLibNfc_MapCmds(phNciNfc_RFDevType_t         RemDevType,
   1888                            phNfc_sTransceiveInfo_t*  pTransceiveInfo,
   1889                            pphNciNfc_TransceiveInfo_t   pMappedTranscvIf)
   1890 {
   1891 
   1892     NFCSTATUS status = NFCSTATUS_SUCCESS;
   1893 
   1894     if((NULL == pTransceiveInfo) || (NULL == pMappedTranscvIf))
   1895     {
   1896         return NFCSTATUS_FAILED;
   1897     }
   1898     switch(RemDevType)
   1899     {
   1900         case phNciNfc_eMifare1k_PICC:
   1901         case phNciNfc_eMifare4k_PICC:
   1902         {
   1903             status = phLibNfc_MifareMap(pTransceiveInfo,pMappedTranscvIf);
   1904             break;
   1905         }
   1906         default:
   1907         {
   1908             break;
   1909         }
   1910     }
   1911 
   1912     return status;
   1913 }
   1914 
   1915 /*******************************************************************************
   1916 **
   1917 ** Function         phLibNfc_SendAuthCmd
   1918 **
   1919 ** Description      This function Send authentication command to NFCC
   1920 **
   1921 ** Returns          NFCSTATUS_SUCCESS           - Parameters are proper
   1922 **                  NFCSTATUS_INVALID_PARAMETER - Otherwise
   1923 **
   1924 *******************************************************************************/
   1925 STATIC NFCSTATUS phLibNfc_SendAuthCmd(phNfc_sTransceiveInfo_t *pTransceiveInfo,
   1926                                       phNciNfc_TransceiveInfo_t  *tNciTranscvInfo)
   1927 {
   1928     NFCSTATUS wStatus = NFCSTATUS_SUCCESS;
   1929 
   1930     wStatus = phLibNfc_MapCmds(phNciNfc_eMifare1k_PICC, pTransceiveInfo, tNciTranscvInfo);
   1931 
   1932     return wStatus;
   1933 }
   1934 
   1935 /*******************************************************************************
   1936 **
   1937 ** Function         phLibNfc_SendWrt16Cmd
   1938 **
   1939 ** Description      This function maps Mifarewirte16 commands
   1940 **
   1941 ** Returns          NFCSTATUS_SUCCESS           - Parameters are mapped
   1942 **                  NFCSTATUS_INVALID_PARAMETER - Otherwise
   1943 **
   1944 *******************************************************************************/
   1945 STATIC NFCSTATUS phLibNfc_SendWrt16Cmd(phNfc_sTransceiveInfo_t*    pTransceiveInfo,
   1946                                     pphNciNfc_TransceiveInfo_t   pMappedTranscvIf)
   1947 {
   1948     NFCSTATUS wStatus = NFCSTATUS_SUCCESS;
   1949     uint8_t bBuffIdx = 0x00;
   1950 
   1951     if( (NULL != pTransceiveInfo->sSendData.buffer) &&
   1952         (0 != (pTransceiveInfo->sSendData.length)))
   1953     {
   1954         pMappedTranscvIf->tSendData.pBuff[bBuffIdx++] = phNfc_eMifareWrite16;
   1955         pMappedTranscvIf->tSendData.pBuff[bBuffIdx++] = pTransceiveInfo->addr;
   1956         pMappedTranscvIf->tSendData.wLen              = bBuffIdx;
   1957         pMappedTranscvIf->uCmd.T2TCmd                 = phNciNfc_eT2TRaw;
   1958     }
   1959     else
   1960     {
   1961         wStatus = NFCSTATUS_INVALID_PARAMETER;
   1962     }
   1963 
   1964     return wStatus;
   1965 }
   1966 
   1967 /*******************************************************************************
   1968 **
   1969 ** Function         phLibNfc_SendIncDecCmd
   1970 **
   1971 ** Description      This function prepares the Increment/Decrement command
   1972 **                  to be sent, increment/decrement value is sent separately
   1973 **
   1974 ** Returns          NFCSTATUS_SUCCESS           - Params are mapped
   1975 **                  NFCSTATUS_INVALID_PARAMETER - Otherwise
   1976 **
   1977 *******************************************************************************/
   1978 STATIC NFCSTATUS phLibNfc_SendIncDecCmd(phNfc_sTransceiveInfo_t*    pTransceiveInfo,
   1979                                     pphNciNfc_TransceiveInfo_t   pMappedTranscvIf,
   1980                                     uint8_t IncDecCmd)
   1981 {
   1982     NFCSTATUS wStatus = NFCSTATUS_SUCCESS;
   1983     uint8_t bBuffIdx = 0x00;
   1984 
   1985     if( (NULL != pTransceiveInfo->sSendData.buffer) &&
   1986         (0 != (pTransceiveInfo->sSendData.length)))
   1987     {
   1988         pMappedTranscvIf->tSendData.pBuff[bBuffIdx++] = IncDecCmd;
   1989         pMappedTranscvIf->tSendData.pBuff[bBuffIdx++] = pTransceiveInfo->addr;
   1990         pMappedTranscvIf->tSendData.wLen              = bBuffIdx;
   1991         pMappedTranscvIf->uCmd.T2TCmd                 = phNciNfc_eT2TRaw;
   1992     }
   1993     else
   1994     {
   1995         wStatus = NFCSTATUS_INVALID_PARAMETER;
   1996     }
   1997 
   1998     return wStatus;
   1999 }
   2000 
   2001 /*******************************************************************************
   2002 **
   2003 ** Function         phLibNfc_SendRawCmd
   2004 **
   2005 ** Description      This function maps Mifare raw command
   2006 **
   2007 ** Returns          NFCSTATUS_SUCCESS           - Parameters are mapped
   2008 **                  NFCSTATUS_INVALID_PARAMETER - Otherwise
   2009 **
   2010 *******************************************************************************/
   2011 STATIC NFCSTATUS phLibNfc_SendRawCmd(phNfc_sTransceiveInfo_t*    pTransceiveInfo,
   2012                                     pphNciNfc_TransceiveInfo_t   pMappedTranscvIf)
   2013 {
   2014     NFCSTATUS wStatus = NFCSTATUS_SUCCESS;
   2015 //    uint8_t bBuffIdx = 0x00;                                  /*commented to eliminate unused variable warning*/
   2016 
   2017     if( (NULL != pTransceiveInfo->sSendData.buffer) &&
   2018         (0 != (pTransceiveInfo->sSendData.length)))
   2019     {
   2020         memcpy(pMappedTranscvIf->tSendData.pBuff, pTransceiveInfo->sSendData.buffer,
   2021                               (pTransceiveInfo->sSendData.length));
   2022         pMappedTranscvIf->tSendData.wLen              = pTransceiveInfo->sSendData.length;
   2023         pMappedTranscvIf->uCmd.T2TCmd                 = phNciNfc_eT2TRaw;
   2024     }
   2025     else
   2026     {
   2027         wStatus = NFCSTATUS_INVALID_PARAMETER;
   2028     }
   2029 
   2030     return wStatus;
   2031 }
   2032 
   2033 /*******************************************************************************
   2034 **
   2035 ** Function         phFriNfc_ExtnsTransceive
   2036 **
   2037 ** Description      This function maps Mifare raw command and send it to NFCC
   2038 **
   2039 ** Returns          NFCSTATUS_PENDING           - Operation successful
   2040 **                  NFCSTATUS_INVALID_PARAMETER - Otherwise
   2041 **
   2042 *******************************************************************************/
   2043 NFCSTATUS phFriNfc_ExtnsTransceive(phNfc_sTransceiveInfo_t *pTransceiveInfo,
   2044                                    phNfc_uCmdList_t Cmd,
   2045                                    uint8_t *SendRecvBuf,
   2046                                    uint16_t SendLength,
   2047                                    uint16_t *SendRecvLength)
   2048 {
   2049     (void)SendRecvLength;
   2050     NFCSTATUS status = NFCSTATUS_FAILED;
   2051     uint8_t *buff=NULL;
   2052     uint16_t buffSz=0;
   2053     uint8_t i = 0;
   2054     uint32_t length = SendLength;
   2055     uint8_t restore_payload[]={0x00, 0x00, 0x00, 0x00,};
   2056 
   2057     buff = (uint8_t *)malloc((uint32_t)MAX_BUFF_SIZE);
   2058     if( NULL == buff )
   2059     {
   2060         return status;
   2061     }
   2062 
   2063     pTransceiveInfo->cmd = Cmd;
   2064 
   2065     if( (Cmd.MfCmd == phNfc_eMifareAuthentA) ||
   2066         (Cmd.MfCmd == phNfc_eMifareAuthentB) )
   2067     {
   2068         pTransceiveInfo->addr = SendRecvBuf[i++];
   2069         pTransceiveInfo->sSendData.buffer[4] = SendRecvBuf[i++];
   2070         pTransceiveInfo->sSendData.buffer[5] = SendRecvBuf[i++];
   2071         pTransceiveInfo->sSendData.buffer[6] = SendRecvBuf[i++];
   2072         pTransceiveInfo->sSendData.buffer[7] = SendRecvBuf[i++];
   2073         pTransceiveInfo->sSendData.buffer[8] = SendRecvBuf[i++];
   2074         pTransceiveInfo->sSendData.buffer[9] = SendRecvBuf[i++];
   2075 
   2076         pTransceiveInfo->cmd.MfCmd = Cmd.MfCmd;
   2077 
   2078         pTransceiveInfo->sSendData.length = length;
   2079         pTransceiveInfo->sRecvData.length = MAX_BUFF_SIZE;
   2080         status = phLibNfc_MifareMap(pTransceiveInfo, &tNciTranscvInfo);
   2081     }
   2082     else if( Cmd.MfCmd == phNfc_eMifareWrite16 )
   2083     {
   2084         pTransceiveInfo->addr = SendRecvBuf[i++];
   2085         length = SendLength - i;
   2086         memcpy(pTransceiveInfo->sSendData.buffer, &SendRecvBuf[i], length);
   2087         pTransceiveInfo->sSendData.length = length;
   2088         pTransceiveInfo->sRecvData.length = MAX_BUFF_SIZE;
   2089 
   2090         gphNxpExtns_Context.writecmdFlag = true;
   2091 
   2092         status = phLibNfc_SendWrt16Cmd(pTransceiveInfo, &tNciTranscvInfo);
   2093     }
   2094     else if( (Cmd.MfCmd == phNfc_eMifareInc) || (Cmd.MfCmd == phNfc_eMifareDec) )
   2095     {
   2096         pTransceiveInfo->addr = SendRecvBuf[i++];
   2097         length = SendLength - i;
   2098         memcpy(pTransceiveInfo->sSendData.buffer, &SendRecvBuf[i], length);
   2099         pTransceiveInfo->sSendData.length = length;
   2100         pTransceiveInfo->sRecvData.length = MAX_BUFF_SIZE;
   2101 
   2102         gphNxpExtns_Context.incrdecflag = true;
   2103 
   2104         status = phLibNfc_SendIncDecCmd(pTransceiveInfo, &tNciTranscvInfo, Cmd.MfCmd);
   2105 
   2106     }
   2107     else if(Cmd.MfCmd == phNfc_eMifareRestore)
   2108     {
   2109         pTransceiveInfo->addr = SendRecvBuf[i++];
   2110         length = SendLength - i;
   2111         memcpy(pTransceiveInfo->sSendData.buffer, &restore_payload[0], sizeof(restore_payload));
   2112         pTransceiveInfo->sSendData.length = length + sizeof(restore_payload);
   2113         pTransceiveInfo->sRecvData.length = MAX_BUFF_SIZE;
   2114 
   2115         gphNxpExtns_Context.incrdecflag = true;
   2116 
   2117         status = phLibNfc_SendIncDecCmd(pTransceiveInfo, &tNciTranscvInfo, Cmd.MfCmd);
   2118 
   2119     }
   2120     else if ((Cmd.MfCmd == phNfc_eMifareRaw) || (Cmd.MfCmd == phNfc_eMifareTransfer ))
   2121     {
   2122         pTransceiveInfo->cmd.MfCmd = (phNfc_eMifareCmdList_t) phNciNfc_eT2TRaw;
   2123         memcpy(pTransceiveInfo->sSendData.buffer, SendRecvBuf, length);
   2124         pTransceiveInfo->sSendData.length = length;
   2125         pTransceiveInfo->sRecvData.length = MAX_BUFF_SIZE;
   2126         status = phLibNfc_SendRawCmd(pTransceiveInfo, &tNciTranscvInfo);
   2127     }
   2128     else
   2129     {
   2130         pTransceiveInfo->addr = SendRecvBuf[i++];
   2131         length = SendLength - i;
   2132         memcpy(pTransceiveInfo->sSendData.buffer, &SendRecvBuf[i], length);
   2133         pTransceiveInfo->sSendData.length = length;
   2134         pTransceiveInfo->sRecvData.length = MAX_BUFF_SIZE;
   2135         status = phLibNfc_MifareMap(pTransceiveInfo, &tNciTranscvInfo);
   2136     }
   2137 
   2138     if (NFCSTATUS_SUCCESS == status )
   2139     {
   2140         status = phNciNfc_SendMfReq(tNciTranscvInfo, buff, &buffSz);
   2141         if (NFCSTATUS_PENDING != status)
   2142         {
   2143             NXPLOG_EXTNS_E("ERROR : phNciNfc_SendMfReq()");
   2144         }
   2145     }
   2146     else
   2147     {
   2148         NXPLOG_EXTNS_E (" ERROR : Sending phNciNfc_SendMfReq");
   2149     }
   2150     if( buff != NULL )
   2151     {
   2152         free(buff);
   2153         buff = NULL;
   2154     }
   2155 
   2156     return status;
   2157 }
   2158