1121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao/*
2121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao * Copyright (C) 2012-2014 NXP Semiconductors
3121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao *
4121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao * Licensed under the Apache License, Version 2.0 (the "License");
5121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao * you may not use this file except in compliance with the License.
6121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao * You may obtain a copy of the License at
7121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao *
8121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao *      http://www.apache.org/licenses/LICENSE-2.0
9121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao *
10121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao * Unless required by applicable law or agreed to in writing, software
11121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao * distributed under the License is distributed on an "AS IS" BASIS,
12121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao * See the License for the specific language governing permissions and
14121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao * limitations under the License.
15121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao */
16121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao#include <phDal4Nfc_messageQueueLib.h>
17121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao#include <phNxpConfig.h>
186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#include <phNxpLog.h>
196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#include <phNxpNciHal.h>
206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#include <phNxpNciHal_Kovio.h>
216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#include <phNxpNciHal_NfcDepSWPrio.h>
226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#include <phNxpNciHal_ext.h>
236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#include <phTmlNfc.h>
24121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
2546e6e28414b5e37ffad65353916520fc56ea3a86Ruchi Kandoi/* Timeout value to wait for response from PN548AD */
2646e6e28414b5e37ffad65353916520fc56ea3a86Ruchi Kandoi#define HAL_EXTNS_WRITE_RSP_TIMEOUT (1000)
27121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
28121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao#undef P2P_PRIO_LOGIC_HAL_IMP
29121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
30121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao/******************* Global variables *****************************************/
31121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liaoextern phNxpNciHal_Control_t nxpncihal_ctrl;
32121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liaoextern phNxpNciProfile_Control_t nxpprofile_ctrl;
33121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
34121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liaoextern int kovio_detected;
35121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liaoextern int disable_kovio;
36121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liaoextern int send_to_upper_kovio;
37121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liaoextern uint32_t cleanup_timer;
3836d7231ec9344bed2996be1293e97d082fa22294Jizhou Liaouint8_t icode_detected = 0x00;
39121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liaouint8_t icode_send_eof = 0x00;
406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#if (NFC_NXP_CHIP_TYPE == PN548C2)
41ae2234d1cdd7c35543a795dcb51a6537ffce2007Jizhou Liaouint8_t nfcdep_detected = 0x00;
4236d7231ec9344bed2996be1293e97d082fa22294Jizhou Liao#endif
43121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liaostatic uint8_t ee_disc_done = 0x00;
444a179646f6d5567830a0383050aee7610a0222a6Ruchi Kandoiuint8_t EnableP2P_PrioLogic = false;
45121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liaostatic uint32_t RfDiscID = 1;
46121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liaostatic uint32_t RfProtocolType = 4;
47121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao/* NFCEE Set mode */
48121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liaostatic uint8_t setEEModeDone = 0x00;
496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic uint8_t cmd_nfcee_setmode_enable[] = {0x22, 0x01, 0x02, 0x01, 0x01};
50121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
51121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao/* External global variable to get FW version from NCI response*/
52121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liaoextern uint32_t wFwVerRsp;
53121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao/* External global variable to get FW version from FW file*/
54121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liaoextern uint16_t wFwVer;
55121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
56b98e5975e665aedf5e786133cbf88986d03ac501Jizhou Liaouint16_t fw_maj_ver;
57b98e5975e665aedf5e786133cbf88986d03ac501Jizhou Liaouint16_t rom_version;
58121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao/* local buffer to store CORE_INIT response */
59121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liaostatic uint32_t bCoreInitRsp[40];
60121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liaostatic uint32_t iCoreInitRspLen;
61121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
62121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liaoextern uint32_t timeoutTimerId;
63121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
64121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liaoextern NFCSTATUS read_retry();
657b6b94cbca2aaf93afc4bb32094d143e46daf4adJizhou Liao
66121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao/************** HAL extension functions ***************************************/
676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic void hal_extns_write_rsp_timeout_cb(uint32_t TimerId, void* pContext);
68121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
69121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao/*Proprietary cmd sent to HAL to send reader mode flag
70121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao * Last byte of 4 byte proprietary cmd data contains ReaderMode flag
71121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao * If this flag is enabled, NFC-DEP protocol is modified to T3T protocol
72121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao * if FrameRF interface is selected. This needs to be done as the FW
73121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao * always sends Ntf for FrameRF with NFC-DEP even though FrameRF with T3T is
74121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao * previously selected with DISCOVER_SELECT_CMD
75121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao */
76121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao#define PROPRIETARY_CMD_FELICA_READER_MODE 0xFE
77121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liaostatic uint8_t gFelicaReaderMode;
78121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
79121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao/*******************************************************************************
80121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao**
81121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao** Function         phNxpNciHal_ext_init
82121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao**
83121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao** Description      initialize extension function
84121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao**
85121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao*******************************************************************************/
866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid phNxpNciHal_ext_init(void) {
876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  icode_detected = 0x00;
886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  icode_send_eof = 0x00;
896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  setEEModeDone = 0x00;
906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  kovio_detected = 0x00;
916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  disable_kovio = 0x00;
926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  send_to_upper_kovio = 0x01;
936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  EnableP2P_PrioLogic = false;
94121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao}
95121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
96121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao/*******************************************************************************
97121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao**
98121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao** Function         phNxpNciHal_process_ext_rsp
99121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao**
100121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao** Description      Process extension function response
101121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao**
102121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao** Returns          NFCSTATUS_SUCCESS if success
103121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao**
104121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao*******************************************************************************/
1056fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoiNFCSTATUS phNxpNciHal_process_ext_rsp(uint8_t* p_ntf, uint16_t* p_len) {
1066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NFCSTATUS status = NFCSTATUS_SUCCESS;
1076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint16_t rf_technology_length_param = 0;
1086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
1096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_ntf[0] == 0x61 && p_ntf[1] == 0x05 && p_ntf[4] == 0x03 &&
1106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_ntf[5] == 0x05 && nxpprofile_ctrl.profile_type == EMV_CO_PROFILE) {
1116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_ntf[4] = 0xFF;
1126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_ntf[5] = 0xFF;
1136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_ntf[6] = 0xFF;
1146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    NXPLOG_NCIHAL_D("Nfc-Dep Detect in EmvCo profile - Restart polling");
1156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
1166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
1176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_ntf[0] == 0x61 && p_ntf[1] == 0x05 && p_ntf[4] == 0x01 &&
1186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_ntf[5] == 0x05 && p_ntf[6] == 0x02 && gFelicaReaderMode) {
1196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /*If FelicaReaderMode is enabled,Change Protocol to T3T from NFC-DEP
1206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi         * when FrameRF interface is selected*/
1216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_ntf[5] = 0x03;
1226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    NXPLOG_NCIHAL_D("FelicaReaderMode:Activity 1.1");
1236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
124121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
125121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao#ifdef P2P_PRIO_LOGIC_HAL_IMP
1266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_ntf[0] == 0x61 && p_ntf[1] == 0x05 && p_ntf[4] == 0x02 &&
1276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_ntf[5] == 0x04 && nxpprofile_ctrl.profile_type == NFC_FORUM_PROFILE) {
1286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    EnableP2P_PrioLogic = true;
1296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
1306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
1316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NXPLOG_NCIHAL_D("Is EnableP2P_PrioLogic: 0x0%X", EnableP2P_PrioLogic);
1326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (phNxpDta_IsEnable() == false) {
1336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if ((icode_detected != 1) && (kovio_detected != 1) &&
1346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        (EnableP2P_PrioLogic == true)) {
1356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (phNxpNciHal_NfcDep_comapre_ntf(p_ntf, *p_len) == NFCSTATUS_FAILED) {
1366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        status = phNxpNciHal_NfcDep_rsp_ext(p_ntf, p_len);
1376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        if (status != NFCSTATUS_INVALID_PARAMETER) {
1386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          return status;
139121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        }
1406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
141121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    }
1426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
143121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao#endif
144121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
1456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  status = NFCSTATUS_SUCCESS;
1466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  status = phNxpNciHal_kovio_rsp_ext(p_ntf, p_len);
147121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
1486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_ntf[0] == 0x61 && p_ntf[1] == 0x05) {
1496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#if (NFC_NXP_CHIP_TYPE == PN548C2)
1506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (nfcdep_detected) {
1516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfcdep_detected = 0x00;
1526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    }
15336d7231ec9344bed2996be1293e97d082fa22294Jizhou Liao#endif
154ae2234d1cdd7c35543a795dcb51a6537ffce2007Jizhou Liao
1556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    switch (p_ntf[4]) {
1566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      case 0x00:
1576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        NXPLOG_NCIHAL_D("NxpNci: RF Interface = NFCEE Direct RF");
1586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        break;
1596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      case 0x01:
1606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        NXPLOG_NCIHAL_D("NxpNci: RF Interface = Frame RF");
1616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        break;
1626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      case 0x02:
1636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        NXPLOG_NCIHAL_D("NxpNci: RF Interface = ISO-DEP");
1646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        break;
1656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      case 0x03:
1666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        NXPLOG_NCIHAL_D("NxpNci: RF Interface = NFC-DEP");
1676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#if (NFC_NXP_CHIP_TYPE == PN548C2)
1686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        nfcdep_detected = 0x01;
16936d7231ec9344bed2996be1293e97d082fa22294Jizhou Liao#endif
1706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        break;
1716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      case 0x80:
1726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        NXPLOG_NCIHAL_D("NxpNci: RF Interface = MIFARE");
1736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        break;
1746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      default:
1756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        NXPLOG_NCIHAL_D("NxpNci: RF Interface = Unknown");
1766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        break;
1776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    }
1786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
1796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    switch (p_ntf[5]) {
1806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      case 0x01:
1816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        NXPLOG_NCIHAL_D("NxpNci: Protocol = T1T");
1826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        phNxpDta_T1TEnable();
1836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        break;
1846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      case 0x02:
1856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        NXPLOG_NCIHAL_D("NxpNci: Protocol = T2T");
1866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        break;
1876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      case 0x03:
1886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        NXPLOG_NCIHAL_D("NxpNci: Protocol = T3T");
1896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        break;
1906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      case 0x04:
1916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        NXPLOG_NCIHAL_D("NxpNci: Protocol = ISO-DEP");
1926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        break;
1936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      case 0x05:
1946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        NXPLOG_NCIHAL_D("NxpNci: Protocol = NFC-DEP");
1956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        break;
1966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      case 0x06:
1976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        NXPLOG_NCIHAL_D("NxpNci: Protocol = 15693");
1986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        break;
1996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      case 0x80:
2006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        NXPLOG_NCIHAL_D("NxpNci: Protocol = MIFARE");
2016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        break;
2026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#if (NFC_NXP_CHIP_TYPE != PN547C2)
2036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      case 0x81:
204121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao#else
2056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      case 0x8A:
206121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao#endif
2076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        NXPLOG_NCIHAL_D("NxpNci: Protocol = Kovio");
2086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        break;
2096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      default:
2106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        NXPLOG_NCIHAL_D("NxpNci: Protocol = Unknown");
2116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        break;
2126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    }
2136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
2146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    switch (p_ntf[6]) {
2156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      case 0x00:
2166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        NXPLOG_NCIHAL_D("NxpNci: Mode = A Passive Poll");
2176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        break;
2186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      case 0x01:
2196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        NXPLOG_NCIHAL_D("NxpNci: Mode = B Passive Poll");
2206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        break;
2216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      case 0x02:
2226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        NXPLOG_NCIHAL_D("NxpNci: Mode = F Passive Poll");
2236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        break;
2246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      case 0x03:
2256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        NXPLOG_NCIHAL_D("NxpNci: Mode = A Active Poll");
2266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        break;
2276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      case 0x05:
2286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        NXPLOG_NCIHAL_D("NxpNci: Mode = F Active Poll");
2296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        break;
2306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      case 0x06:
2316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        NXPLOG_NCIHAL_D("NxpNci: Mode = 15693 Passive Poll");
2326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        break;
2336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#if (NFC_NXP_CHIP_TYPE != PN547C2)
2346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      case 0x70:
235121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao#else
2366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      case 0x77:
23736d7231ec9344bed2996be1293e97d082fa22294Jizhou Liao#endif
2386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        NXPLOG_NCIHAL_D("NxpNci: Mode = Kovio");
2396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        break;
2406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      case 0x80:
2416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        NXPLOG_NCIHAL_D("NxpNci: Mode = A Passive Listen");
2426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        break;
2436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      case 0x81:
2446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        NXPLOG_NCIHAL_D("NxpNci: Mode = B Passive Listen");
2456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        break;
2466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      case 0x82:
2476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        NXPLOG_NCIHAL_D("NxpNci: Mode = F Passive Listen");
2486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        break;
2496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      case 0x83:
2506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        NXPLOG_NCIHAL_D("NxpNci: Mode = A Active Listen");
2516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        break;
2526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      case 0x85:
2536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        NXPLOG_NCIHAL_D("NxpNci: Mode = F Active Listen");
2546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        break;
2556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      case 0x86:
2566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        NXPLOG_NCIHAL_D("NxpNci: Mode = 15693 Passive Listen");
2576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        break;
2586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      default:
2596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        NXPLOG_NCIHAL_D("NxpNci: Mode = Unknown");
2606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        break;
2616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    }
2626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
2636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
2646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_ntf[0] == 0x61 && p_ntf[1] == 0x05 && p_ntf[2] == 0x15 &&
2656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_ntf[4] == 0x01 && p_ntf[5] == 0x06 && p_ntf[6] == 0x06) {
2666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    NXPLOG_NCIHAL_D("> Going through workaround - notification of ISO 15693");
2676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    icode_detected = 0x01;
2686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_ntf[21] = 0x01;
2696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_ntf[22] = 0x01;
2706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else if (icode_detected == 1 && icode_send_eof == 2) {
2716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    icode_send_eof = 3;
2726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else if (p_ntf[0] == 0x00 && p_ntf[1] == 0x00 && icode_detected == 1) {
2736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (icode_send_eof == 3) {
2746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      icode_send_eof = 0;
2756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    }
2766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (p_ntf[p_ntf[2] + 2] == 0x00) {
2776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      NXPLOG_NCIHAL_D("> Going through workaround - data of ISO 15693");
2786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_ntf[2]--;
2796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      (*p_len)--;
2806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    } else {
2816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_ntf[p_ntf[2] + 2] |= 0x01;
2826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    }
2836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else if (p_ntf[2] == 0x02 && p_ntf[1] == 0x00 && icode_detected == 1) {
2846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    NXPLOG_NCIHAL_D("> ICODE EOF response do not send to upper layer");
2856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else if (p_ntf[0] == 0x61 && p_ntf[1] == 0x06 && icode_detected == 1) {
2866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    NXPLOG_NCIHAL_D("> Polling Loop Re-Started");
2876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    icode_detected = 0;
2886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    icode_send_eof = 0;
2896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else if (*p_len == 4 && p_ntf[0] == 0x40 && p_ntf[1] == 0x02 &&
2906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi             p_ntf[2] == 0x01 && p_ntf[3] == 0x06) {
2916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    NXPLOG_NCIHAL_D("> Deinit workaround for LLCP set_config 0x%x 0x%x 0x%x",
2926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                    p_ntf[21], p_ntf[22], p_ntf[23]);
2936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_ntf[0] = 0x40;
2946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_ntf[1] = 0x02;
2956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_ntf[2] = 0x02;
2966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_ntf[3] = 0x00;
2976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_ntf[4] = 0x00;
2986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    *p_len = 5;
2996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else if ((p_ntf[0] == 0x40) && (p_ntf[1] == 0x01)) {
3006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    int len = p_ntf[2] + 2; /*include 2 byte header*/
3016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    wFwVerRsp = (((uint32_t)p_ntf[len - 2]) << 16U) |
3026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                (((uint32_t)p_ntf[len - 1]) << 8U) | p_ntf[len];
3036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (wFwVerRsp == 0) status = NFCSTATUS_FAILED;
3046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    iCoreInitRspLen = *p_len;
3056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    memcpy(bCoreInitRsp, p_ntf, *p_len);
3066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    NXPLOG_NCIHAL_D("NxpNci> FW Version: %x.%x.%x", p_ntf[len - 2],
3076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                    p_ntf[len - 1], p_ntf[len]);
3086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    fw_maj_ver = p_ntf[len - 1];
3096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    rom_version = p_ntf[len - 2];
3106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
3116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  // 4200 02 00 01
3126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  else if (p_ntf[0] == 0x42 && p_ntf[1] == 0x00 && ee_disc_done == 0x01) {
3136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    NXPLOG_NCIHAL_D("Going through workaround - NFCEE_DISCOVER_RSP");
3146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (p_ntf[4] == 0x01) {
3156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_ntf[4] = 0x00;
3166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
3176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      ee_disc_done = 0x00;
3186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    }
3196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    NXPLOG_NCIHAL_D("Going through workaround - NFCEE_DISCOVER_RSP - END");
3206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
3216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else if (p_ntf[0] == 0x61 && p_ntf[1] == 0x03 /*&& cleanup_timer!=0*/) {
3226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (cleanup_timer != 0) {
3236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* if RF Notification Type of RF_DISCOVER_NTF is Last Notification */
3246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (0 == (*(p_ntf + 2 + (*(p_ntf + 2))))) {
3256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        phNxpNciHal_select_RF_Discovery(RfDiscID, RfProtocolType);
326ae2234d1cdd7c35543a795dcb51a6537ffce2007Jizhou Liao        status = NFCSTATUS_FAILED;
327ae2234d1cdd7c35543a795dcb51a6537ffce2007Jizhou Liao        return status;
3286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      } else {
3296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        RfDiscID = p_ntf[3];
3306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        RfProtocolType = p_ntf[4];
3316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
3326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      status = NFCSTATUS_FAILED;
3336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return status;
3346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    }
3356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else if (p_ntf[0] == 0x41 && p_ntf[1] == 0x04 && cleanup_timer != 0) {
3366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    status = NFCSTATUS_FAILED;
3376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return status;
3386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else if (p_ntf[0] == 0x60 && p_ntf[1] == 0x00) {
3396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    NXPLOG_NCIHAL_E("CORE_RESET_NTF received!");
3406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#if (NFC_NXP_CHIP_TYPE == PN548C2)
3416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (nfcdep_detected &&
3426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        !(p_ntf[2] == 0x06 && p_ntf[3] == 0xA0 && p_ntf[4] == 0x00 &&
3436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          ((p_ntf[5] == 0xC9 && p_ntf[6] == 0x95 && p_ntf[7] == 0x00 &&
3446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            p_ntf[8] == 0x00) ||
3456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi           (p_ntf[5] == 0x07 && p_ntf[6] == 0x39 && p_ntf[7] == 0xF2 &&
3466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            p_ntf[8] == 0x00)))) {
3476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfcdep_detected = 0x00;
348121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    }
349121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao#endif
3506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    phNxpNciHal_emergency_recovery();
3516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    status = NFCSTATUS_FAILED;
352121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    return status;
3536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
3546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#if (NFC_NXP_CHIP_TYPE == PN547C2)
3556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  else if (p_ntf[0] == 0x61 && p_ntf[1] == 0x05 && p_ntf[4] == 0x02 &&
3566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi           p_ntf[5] == 0x80 && p_ntf[6] == 0x00) {
3576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    NXPLOG_NCIHAL_D(
3586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "Going through workaround - iso-dep  interface  mifare protocol with "
3596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "sak value not equal to 0x20");
3606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    rf_technology_length_param = p_ntf[9];
3616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if ((p_ntf[9 + rf_technology_length_param] & 0x20) != 0x20) {
3626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_ntf[4] = 0x80;
3636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    }
3646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
3656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#endif
3666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  else if (*p_len == 4 && p_ntf[0] == 0x4F && p_ntf[1] == 0x11 &&
3676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi           p_ntf[2] == 0x01) {
3686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (p_ntf[3] == 0x00) {
3696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      NXPLOG_NCIHAL_D(
3706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          ">  Workaround for ISO-DEP Presence Check, ignore response and wait "
3716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          "for notification");
3726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_ntf[0] = 0x60;
3736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_ntf[1] = 0x06;
3746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_ntf[2] = 0x03;
3756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_ntf[3] = 0x01;
3766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_ntf[4] = 0x00;
3776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_ntf[5] = 0x01;
3786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      *p_len = 6;
3796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    } else {
3806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      NXPLOG_NCIHAL_D(
3816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          ">  Workaround for ISO-DEP Presence Check, presence check return "
3826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          "failed");
3836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_ntf[0] = 0x60;
3846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_ntf[1] = 0x08;
3856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_ntf[2] = 0x02;
3866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_ntf[3] = 0xB2;
3876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_ntf[4] = 0x00;
3886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      *p_len = 5;
3896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    }
3906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else if (*p_len == 4 && p_ntf[0] == 0x6F && p_ntf[1] == 0x11 &&
3916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi             p_ntf[2] == 0x01) {
3926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (p_ntf[3] == 0x01) {
3936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      NXPLOG_NCIHAL_D(
3946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          ">  Workaround for ISO-DEP Presence Check - Card still in field");
3956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_ntf[0] = 0x00;
3966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_ntf[1] = 0x00;
3976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_ntf[2] = 0x01;
3986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_ntf[3] = 0x7E;
3996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    } else {
4006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      NXPLOG_NCIHAL_D(
4016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          ">  Workaround for ISO-DEP Presence Check - Card not in field");
4026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_ntf[0] = 0x60;
4036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_ntf[1] = 0x08;
4046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_ntf[2] = 0x02;
4056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_ntf[3] = 0xB2;
4066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_ntf[4] = 0x00;
4076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      *p_len = 5;
4086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    }
4096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
4106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /*
4116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  else if(p_ntf[0] == 0x61 && p_ntf[1] == 0x05 && p_ntf[4] == 0x01 && p_ntf[5]
4126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  == 0x00 && p_ntf[6] == 0x01)
4136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  {
4146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      NXPLOG_NCIHAL_D("Picopass type 3-B with undefined protocol is not
4156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  supported, disabling");
4166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_ntf[4] = 0xFF;
4176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_ntf[5] = 0xFF;
4186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_ntf[6] = 0xFF;
4196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }*/
4206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return status;
422121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao}
423121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
424121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao/******************************************************************************
425121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao * Function         phNxpNciHal_process_ext_cmd_rsp
426121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao *
427121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao * Description      This function process the extension command response. It
428121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao *                  also checks the received response to expected response.
429121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao *
430121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao * Returns          returns NFCSTATUS_SUCCESS if response is as expected else
431121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao *                  returns failure.
432121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao *
433121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao ******************************************************************************/
4346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic NFCSTATUS phNxpNciHal_process_ext_cmd_rsp(uint16_t cmd_len,
4356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                                 uint8_t* p_cmd) {
4366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NFCSTATUS status = NFCSTATUS_FAILED;
4376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint16_t data_written = 0;
4386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Create the local semaphore */
4406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (phNxpNciHal_init_cb_data(&nxpncihal_ctrl.ext_cb_data, NULL) !=
4416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      NFCSTATUS_SUCCESS) {
4426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    NXPLOG_NCIHAL_D("Create ext_cb_data failed");
4436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return NFCSTATUS_FAILED;
4446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
4456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  nxpncihal_ctrl.ext_cb_data.status = NFCSTATUS_SUCCESS;
4476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Send ext command */
4496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  data_written = phNxpNciHal_write_unlocked(cmd_len, p_cmd);
4506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (data_written != cmd_len) {
4516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    NXPLOG_NCIHAL_D("phNxpNciHal_write failed for hal ext");
4526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    goto clean_and_return;
4536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
4546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Start timer */
4566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  status = phOsalNfc_Timer_Start(timeoutTimerId, HAL_EXTNS_WRITE_RSP_TIMEOUT,
4576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                 &hal_extns_write_rsp_timeout_cb, NULL);
4586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (NFCSTATUS_SUCCESS == status) {
4596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    NXPLOG_NCIHAL_D("Response timer started");
4606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
4616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    NXPLOG_NCIHAL_E("Response timer not started!!!");
4626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    status = NFCSTATUS_FAILED;
4636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    goto clean_and_return;
4646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
4656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Wait for rsp */
4676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NXPLOG_NCIHAL_D("Waiting after ext cmd sent");
4686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (SEM_WAIT(nxpncihal_ctrl.ext_cb_data)) {
4696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    NXPLOG_NCIHAL_E("p_hal_ext->ext_cb_data.sem semaphore error");
4706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    goto clean_and_return;
4716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
4726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Stop Timer */
4746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  status = phOsalNfc_Timer_Stop(timeoutTimerId);
4756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (NFCSTATUS_SUCCESS == status) {
4776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    NXPLOG_NCIHAL_D("Response timer stopped");
4786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
4796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    NXPLOG_NCIHAL_E("Response timer stop ERROR!!!");
4806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    status = NFCSTATUS_FAILED;
4816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    goto clean_and_return;
4826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
4836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (nxpncihal_ctrl.ext_cb_data.status != NFCSTATUS_SUCCESS) {
4856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    NXPLOG_NCIHAL_E(
4866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "Callback Status is failed!! Timer Expired!! Couldn't read it! 0x%x",
4876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        nxpncihal_ctrl.ext_cb_data.status);
4886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    status = NFCSTATUS_FAILED;
4896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    goto clean_and_return;
4906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
4916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NXPLOG_NCIHAL_D("Checking response");
4936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  status = NFCSTATUS_SUCCESS;
494121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
495121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liaoclean_and_return:
4966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  phNxpNciHal_cleanup_cb_data(&nxpncihal_ctrl.ext_cb_data);
497121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
4986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return status;
499121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao}
500121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
501121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao/******************************************************************************
502121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao * Function         phNxpNciHal_write_ext
503121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao *
504121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao * Description      This function inform the status of phNxpNciHal_open
505121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao *                  function to libnfc-nci.
506121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao *
507121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao * Returns          It return NFCSTATUS_SUCCESS then continue with send else
508121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao *                  sends NFCSTATUS_FAILED direct response is prepared and
509121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao *                  do not send anything to NFCC.
510121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao *
511121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao ******************************************************************************/
512121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
5136fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoiNFCSTATUS phNxpNciHal_write_ext(uint16_t* cmd_len, uint8_t* p_cmd_data,
5146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                uint16_t* rsp_len, uint8_t* p_rsp_data) {
5156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NFCSTATUS status = NFCSTATUS_SUCCESS;
5166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
5176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  unsigned long retval = 0;
5186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  int isfound =
5196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      GetNxpNumValue(NAME_MIFARE_READER_ENABLE, &retval, sizeof(unsigned long));
5206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
5216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  phNxpNciHal_NfcDep_cmd_ext(p_cmd_data, cmd_len);
5226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
5236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (phNxpDta_IsEnable() == true) {
5246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    status = phNxpNHal_DtaUpdate(cmd_len, p_cmd_data, rsp_len, p_rsp_data);
5256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
5266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
5276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_cmd_data[0] == PROPRIETARY_CMD_FELICA_READER_MODE &&
5286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_cmd_data[1] == PROPRIETARY_CMD_FELICA_READER_MODE &&
5296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_cmd_data[2] == PROPRIETARY_CMD_FELICA_READER_MODE) {
5306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    NXPLOG_NCIHAL_D("Received proprietary command to set Felica Reader mode:%d",
5316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                    p_cmd_data[3]);
5326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    gFelicaReaderMode = p_cmd_data[3];
5336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* frame the dummy response */
5346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    *rsp_len = 4;
5356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_rsp_data[0] = 0x00;
5366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_rsp_data[1] = 0x00;
5376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_rsp_data[2] = 0x00;
5386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_rsp_data[3] = 0x00;
5396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    status = NFCSTATUS_FAILED;
5406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else if (p_cmd_data[0] == 0x20 && p_cmd_data[1] == 0x02 &&
5416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi             p_cmd_data[2] == 0x05 && p_cmd_data[3] == 0x01 &&
5426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi             p_cmd_data[4] == 0xA0 && p_cmd_data[5] == 0x44 &&
5436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi             p_cmd_data[6] == 0x01 && p_cmd_data[7] == 0x01) {
5446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nxpprofile_ctrl.profile_type = EMV_CO_PROFILE;
5456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    NXPLOG_NCIHAL_D("EMV_CO_PROFILE mode - Enabled");
5466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    status = NFCSTATUS_SUCCESS;
5476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else if (p_cmd_data[0] == 0x20 && p_cmd_data[1] == 0x02 &&
5486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi             p_cmd_data[2] == 0x05 && p_cmd_data[3] == 0x01 &&
5496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi             p_cmd_data[4] == 0xA0 && p_cmd_data[5] == 0x44 &&
5506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi             p_cmd_data[6] == 0x01 && p_cmd_data[7] == 0x00) {
5516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    NXPLOG_NCIHAL_D("NFC_FORUM_PROFILE mode - Enabled");
5526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nxpprofile_ctrl.profile_type = NFC_FORUM_PROFILE;
5536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    status = NFCSTATUS_SUCCESS;
5546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
555121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
5566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (nxpprofile_ctrl.profile_type == EMV_CO_PROFILE) {
5576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (p_cmd_data[0] == 0x21 && p_cmd_data[1] == 0x06 &&
5586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_cmd_data[2] == 0x01 && p_cmd_data[3] == 0x03) {
559121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao#if 0
560121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao            //Needs clarification whether to keep it or not
561121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao            NXPLOG_NCIHAL_D ("EmvCo Poll mode - RF Deactivate discard");
562121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao            phNxpNciHal_print_packet("SEND", p_cmd_data, *cmd_len);
563121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao            *rsp_len = 4;
564121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao            p_rsp_data[0] = 0x41;
565121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao            p_rsp_data[1] = 0x06;
566121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao            p_rsp_data[2] = 0x01;
567121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao            p_rsp_data[3] = 0x00;
568121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao            phNxpNciHal_print_packet("RECV", p_rsp_data, 4);
569121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao            status = NFCSTATUS_FAILED;
570121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao#endif
5716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    } else if (p_cmd_data[0] == 0x21 && p_cmd_data[1] == 0x03) {
5726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      NXPLOG_NCIHAL_D("EmvCo Poll mode - Discover map only for A and B");
5736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_cmd_data[2] = 0x05;
5746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_cmd_data[3] = 0x02;
5756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_cmd_data[4] = 0x00;
5766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_cmd_data[5] = 0x01;
5776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_cmd_data[6] = 0x01;
5786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_cmd_data[7] = 0x01;
5796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      *cmd_len = 8;
5806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    }
5816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
5826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
5836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (retval == 0x01 && p_cmd_data[0] == 0x21 && p_cmd_data[1] == 0x00) {
5846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    NXPLOG_NCIHAL_D("Going through extns - Adding Mifare in RF Discovery");
5856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_cmd_data[2] += 3;
5866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_cmd_data[3] += 1;
5876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_cmd_data[*cmd_len] = 0x80;
5886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_cmd_data[*cmd_len + 1] = 0x01;
5896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_cmd_data[*cmd_len + 2] = 0x80;
5906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    *cmd_len += 3;
5916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    status = NFCSTATUS_SUCCESS;
5926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    NXPLOG_NCIHAL_D(
5936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "Going through extns - Adding Mifare in RF Discovery - END");
5946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else if (p_cmd_data[3] == 0x81 && p_cmd_data[4] == 0x01 &&
5956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi             p_cmd_data[5] == 0x03) {
5966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    NXPLOG_NCIHAL_D("> Going through workaround - set host list");
5976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
5986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#if (NFC_NXP_CHIP_TYPE != PN547C2)
5996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    *cmd_len = 8;
6006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
6016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_cmd_data[2] = 0x05;
6026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_cmd_data[6] = 0x02;
6036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_cmd_data[7] = 0xC0;
604121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao#else
6056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    *cmd_len = 7;
606121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
6076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_cmd_data[2] = 0x04;
6086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_cmd_data[6] = 0xC0;
609121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao#endif
610121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
6116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    NXPLOG_NCIHAL_D("> Going through workaround - set host list - END");
6126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    status = NFCSTATUS_SUCCESS;
6136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else if (icode_detected) {
6146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if ((p_cmd_data[3] & 0x40) == 0x40 &&
6156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        (p_cmd_data[4] == 0x21 || p_cmd_data[4] == 0x22 ||
6166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi         p_cmd_data[4] == 0x24 || p_cmd_data[4] == 0x27 ||
6176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi         p_cmd_data[4] == 0x28 || p_cmd_data[4] == 0x29 ||
6186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi         p_cmd_data[4] == 0x2a)) {
6196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      NXPLOG_NCIHAL_D("> Send EOF set");
6206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      icode_send_eof = 1;
6216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    }
6226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
6236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (p_cmd_data[3] == 0x20 || p_cmd_data[3] == 0x24 ||
6246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_cmd_data[3] == 0x60) {
6256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      NXPLOG_NCIHAL_D("> NFC ISO_15693 Proprietary CMD ");
6266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_cmd_data[3] += 0x02;
6276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    }
6286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else if (p_cmd_data[0] == 0x21 && p_cmd_data[1] == 0x03) {
6296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    NXPLOG_NCIHAL_D("> Polling Loop Started");
6306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    icode_detected = 0;
6316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    icode_send_eof = 0;
6326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#if (NFC_NXP_CHIP_TYPE == PN548C2)
6336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    // Cache discovery cmd for recovery
6346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    phNxpNciHal_discovery_cmd_ext(p_cmd_data, *cmd_len);
63536d7231ec9344bed2996be1293e97d082fa22294Jizhou Liao#endif
6366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
6376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  // 22000100
6386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  else if (p_cmd_data[0] == 0x22 && p_cmd_data[1] == 0x00 &&
6396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi           p_cmd_data[2] == 0x01 && p_cmd_data[3] == 0x00) {
6406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    // ee_disc_done = 0x01;//Reader Over SWP event getting
6416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    *rsp_len = 0x05;
6426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_rsp_data[0] = 0x42;
6436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_rsp_data[1] = 0x00;
6446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_rsp_data[2] = 0x02;
6456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_rsp_data[3] = 0x00;
6466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_rsp_data[4] = 0x00;
6476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    phNxpNciHal_print_packet("RECV", p_rsp_data, 5);
6486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    status = NFCSTATUS_FAILED;
6496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
6506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  // 2002 0904 3000 3100 3200 5000
6516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  else if ((p_cmd_data[0] == 0x20 && p_cmd_data[1] == 0x02) &&
6526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi           ((p_cmd_data[2] == 0x09 && p_cmd_data[3] == 0x04) /*||
6536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            (p_cmd_data[2] == 0x0D && p_cmd_data[3] == 0x04)*/
6546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            )) {
6556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    *cmd_len += 0x01;
6566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_cmd_data[2] += 0x01;
6576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_cmd_data[9] = 0x01;
6586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_cmd_data[10] = 0x40;
6596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_cmd_data[11] = 0x50;
6606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_cmd_data[12] = 0x00;
6616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
6626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    NXPLOG_NCIHAL_D("> Going through workaround - Dirty Set Config ");
6636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    //        phNxpNciHal_print_packet("SEND", p_cmd_data, *cmd_len);
6646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    NXPLOG_NCIHAL_D("> Going through workaround - Dirty Set Config - End ");
6656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
6666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  //    20020703300031003200
6676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  //    2002 0301 3200
6686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  else if ((p_cmd_data[0] == 0x20 && p_cmd_data[1] == 0x02) &&
6696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi           ((p_cmd_data[2] == 0x07 && p_cmd_data[3] == 0x03) ||
6706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            (p_cmd_data[2] == 0x03 && p_cmd_data[3] == 0x01 &&
6716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi             p_cmd_data[4] == 0x32))) {
6726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    NXPLOG_NCIHAL_D("> Going through workaround - Dirty Set Config ");
6736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    phNxpNciHal_print_packet("SEND", p_cmd_data, *cmd_len);
6746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    *rsp_len = 5;
6756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_rsp_data[0] = 0x40;
6766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_rsp_data[1] = 0x02;
6776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_rsp_data[2] = 0x02;
6786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_rsp_data[3] = 0x00;
6796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_rsp_data[4] = 0x00;
6806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
6816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    phNxpNciHal_print_packet("RECV", p_rsp_data, 5);
6826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    status = NFCSTATUS_FAILED;
6836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    NXPLOG_NCIHAL_D("> Going through workaround - Dirty Set Config - End ");
6846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
6856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
6866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  // 2002 0D04 300104 310100 320100 500100
6876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  // 2002 0401 320100
6886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  else if ((p_cmd_data[0] == 0x20 && p_cmd_data[1] == 0x02) &&
6896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi           (
6906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi               /*(p_cmd_data[2] == 0x0D && p_cmd_data[3] == 0x04)*/
6916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi               (p_cmd_data[2] == 0x04 && p_cmd_data[3] == 0x01 &&
6926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                p_cmd_data[4] == 0x32 && p_cmd_data[5] == 0x00))) {
6936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    //        p_cmd_data[12] = 0x40;
6946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
6956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    NXPLOG_NCIHAL_D("> Going through workaround - Dirty Set Config ");
6966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    phNxpNciHal_print_packet("SEND", p_cmd_data, *cmd_len);
6976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_cmd_data[6] = 0x60;
6986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
6996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    phNxpNciHal_print_packet("RECV", p_rsp_data, 5);
7006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    //        status = NFCSTATUS_FAILED;
7016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    NXPLOG_NCIHAL_D("> Going through workaround - Dirty Set Config - End ");
7026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else if (p_cmd_data[0] == 0x21 && p_cmd_data[1] == 0x00) {
7036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    NXPLOG_NCIHAL_D(
7046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "> Going through workaround - Add Mifare Classic in Discovery Map");
7056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_cmd_data[*cmd_len] = 0x80;
7066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_cmd_data[*cmd_len + 1] = 0x01;
7076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_cmd_data[*cmd_len + 2] = 0x80;
7086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_cmd_data[5] = 0x01;
7096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_cmd_data[6] = 0x01;
7106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_cmd_data[2] += 3;
7116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_cmd_data[3] += 1;
7126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    *cmd_len += 3;
7136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else if (*cmd_len == 3 && p_cmd_data[0] == 0x00 && p_cmd_data[1] == 0x00 &&
7146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi             p_cmd_data[2] == 0x00) {
7156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    NXPLOG_NCIHAL_D("> Going through workaround - ISO-DEP Presence Check ");
7166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_cmd_data[0] = 0x2F;
7176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_cmd_data[1] = 0x11;
7186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_cmd_data[2] = 0x00;
7196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    status = NFCSTATUS_SUCCESS;
7206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    NXPLOG_NCIHAL_D(
7216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "> Going through workaround - ISO-DEP Presence Check - End");
7226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
723121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao#if 0
724121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    else if ( (p_cmd_data[0] == 0x20 && p_cmd_data[1] == 0x02 ) &&
725121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao                 ((p_cmd_data[2] == 0x09 && p_cmd_data[3] == 0x04) ||
726121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao                     (p_cmd_data[2] == 0x0B && p_cmd_data[3] == 0x05) ||
727121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao                     (p_cmd_data[2] == 0x07 && p_cmd_data[3] == 0x02) ||
728121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao                     (p_cmd_data[2] == 0x0A && p_cmd_data[3] == 0x03) ||
729121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao                     (p_cmd_data[2] == 0x0A && p_cmd_data[3] == 0x04) ||
730121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao                     (p_cmd_data[2] == 0x05 && p_cmd_data[3] == 0x02))
731121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao             )
732121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    {
733121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        NXPLOG_NCIHAL_D ("> Going through workaround - Dirty Set Config ");
734121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        phNxpNciHal_print_packet("SEND", p_cmd_data, *cmd_len);
735121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        *rsp_len = 5;
736121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        p_rsp_data[0] = 0x40;
737121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        p_rsp_data[1] = 0x02;
738121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        p_rsp_data[2] = 0x02;
739121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        p_rsp_data[3] = 0x00;
740121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        p_rsp_data[4] = 0x00;
741121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
742121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        phNxpNciHal_print_packet("RECV", p_rsp_data, 5);
743121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        status = NFCSTATUS_FAILED;
744121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        NXPLOG_NCIHAL_D ("> Going through workaround - Dirty Set Config - End ");
745121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    }
746121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
747121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    else if((p_cmd_data[0] == 0x20 && p_cmd_data[1] == 0x02) &&
748121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao           ((p_cmd_data[3] == 0x00) ||
749121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao           ((*cmd_len >= 0x06) && (p_cmd_data[5] == 0x00)))) /*If the length of the first param id is zero don't allow*/
750121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    {
751121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        NXPLOG_NCIHAL_D ("> Going through workaround - Dirty Set Config ");
752121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        phNxpNciHal_print_packet("SEND", p_cmd_data, *cmd_len);
753121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        *rsp_len = 5;
754121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        p_rsp_data[0] = 0x40;
755121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        p_rsp_data[1] = 0x02;
756121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        p_rsp_data[2] = 0x02;
757121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        p_rsp_data[3] = 0x00;
758121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        p_rsp_data[4] = 0x00;
759121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
760121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        phNxpNciHal_print_packet("RECV", p_rsp_data, 5);
761121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        status = NFCSTATUS_FAILED;
762121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao        NXPLOG_NCIHAL_D ("> Going through workaround - Dirty Set Config - End ");
763121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao    }
764121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao#endif
7656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  else if ((wFwVerRsp & 0x0000FFFF) == wFwVer) {
7666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* skip CORE_RESET and CORE_INIT from Brcm */
7676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (p_cmd_data[0] == 0x20 && p_cmd_data[1] == 0x00 &&
7686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_cmd_data[2] == 0x01 && p_cmd_data[3] == 0x01) {
7696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      //            *rsp_len = 6;
7706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      //
7716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      //            NXPLOG_NCIHAL_D("> Going - core reset optimization");
7726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      //
7736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      //            p_rsp_data[0] = 0x40;
7746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      //            p_rsp_data[1] = 0x00;
7756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      //            p_rsp_data[2] = 0x03;
7766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      //            p_rsp_data[3] = 0x00;
7776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      //            p_rsp_data[4] = 0x10;
7786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      //            p_rsp_data[5] = 0x01;
7796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      //
7806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      //            status = NFCSTATUS_FAILED;
7816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      //            NXPLOG_NCIHAL_D("> Going - core reset optimization - END");
7826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    }
7836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* CORE_INIT */
7846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    else if (p_cmd_data[0] == 0x20 && p_cmd_data[1] == 0x01 &&
7856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi             p_cmd_data[2] == 0x00) {
7866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      //            NXPLOG_NCIHAL_D("> Going - core init optimization");
7876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      //            *rsp_len = iCoreInitRspLen;
7886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      //            memcpy(p_rsp_data, bCoreInitRsp, iCoreInitRspLen);
7896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      //            status = NFCSTATUS_FAILED;
7906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      //            NXPLOG_NCIHAL_D("> Going - core init optimization - END");
7916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    }
7926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
7936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
7946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#if (NFC_NXP_CHIP_TYPE == PN548C2)
7956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_cmd_data[0] == 0x20 && p_cmd_data[1] == 0x02) {
7966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    uint8_t temp;
7976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    uint8_t* p = p_cmd_data + 4;
7986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    uint8_t* end = p_cmd_data + *cmd_len;
7996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    while (p < end) {
8006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (*p == 0x53)  // LF_T3T_FLAGS
8016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      {
8026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        NXPLOG_NCIHAL_D("> Going through workaround - LF_T3T_FLAGS swap");
8036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        temp = *(p + 3);
8046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        *(p + 3) = *(p + 2);
8056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        *(p + 2) = temp;
8066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        NXPLOG_NCIHAL_D("> Going through workaround - LF_T3T_FLAGS - End");
8076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        status = NFCSTATUS_SUCCESS;
8086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        break;
8096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
8106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (*p == 0xA0) {
8116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p += *(p + 2) + 3;
8126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      } else {
8136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p += *(p + 1) + 2;
8146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
8156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    }
8166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
81707adce3e1ad4f3c9aa86025b7bbeb16fe5fda8ddJizhou Liao#endif
81807adce3e1ad4f3c9aa86025b7bbeb16fe5fda8ddJizhou Liao
8196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return status;
820121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao}
821121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
822121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao/******************************************************************************
823121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao * Function         phNxpNciHal_send_ext_cmd
824121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao *
825121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao * Description      This function send the extension command to NFCC. No
826121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao *                  response is checked by this function but it waits for
827121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao *                  the response to come.
828121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao *
829121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao * Returns          Returns NFCSTATUS_SUCCESS if sending cmd is successful and
830121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao *                  response is received.
831121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao *
832121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao ******************************************************************************/
8336fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoiNFCSTATUS phNxpNciHal_send_ext_cmd(uint16_t cmd_len, uint8_t* p_cmd) {
8346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NFCSTATUS status = NFCSTATUS_FAILED;
835121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
8366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  HAL_ENABLE_EXT();
8376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  nxpncihal_ctrl.cmd_len = cmd_len;
8386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  memcpy(nxpncihal_ctrl.p_cmd_data, p_cmd, cmd_len);
8396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  status = phNxpNciHal_process_ext_cmd_rsp(nxpncihal_ctrl.cmd_len,
8406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                           nxpncihal_ctrl.p_cmd_data);
8416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  HAL_DISABLE_EXT();
842121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
8436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return status;
844121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao}
845121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao
846121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao/******************************************************************************
847121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao * Function         hal_extns_write_rsp_timeout_cb
848121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao *
849121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao * Description      Timer call back function
850121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao *
851121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao * Returns          None
852121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao *
853121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao ******************************************************************************/
8546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic void hal_extns_write_rsp_timeout_cb(uint32_t timerId, void* pContext) {
8556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UNUSED(timerId);
8566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UNUSED(pContext);
8576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NXPLOG_NCIHAL_E("hal_extns_write_rsp_timeout_cb - write timeout!!!");
8586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  nxpncihal_ctrl.ext_cb_data.status = NFCSTATUS_FAILED;
8596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  usleep(1);
8606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  SEM_POST(&(nxpncihal_ctrl.ext_cb_data));
8616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
8626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return;
863121096a3511ea4ac559dea3ef7d39f0df00c97a6Jizhou Liao}
864