1 /*
2  * Copyright (C) 2012-2014 NXP Semiconductors
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 #include <phNxpNciHal_ext.h>
17 #include <phNxpNciHal.h>
18 #include <phTmlNfc.h>
19 #include <phDal4Nfc_messageQueueLib.h>
20 #include <phNxpNciHal_NfcDepSWPrio.h>
21 #include <phNxpNciHal_Kovio.h>
22 #include <phNxpLog.h>
23 #include <phNxpConfig.h>
24 
25 #define HAL_EXTNS_WRITE_RSP_TIMEOUT   (1000)                /* Timeout value to wait for response from PN548AD */
26 
27 #undef P2P_PRIO_LOGIC_HAL_IMP
28 
29 /******************* Global variables *****************************************/
30 extern phNxpNciHal_Control_t nxpncihal_ctrl;
31 extern phNxpNciProfile_Control_t nxpprofile_ctrl;
32 
33 extern int kovio_detected;
34 extern int disable_kovio;
35 extern int send_to_upper_kovio;
36 extern uint32_t cleanup_timer;
37 static uint8_t icode_detected = 0x00;
38 uint8_t icode_send_eof = 0x00;
39 static uint8_t ee_disc_done = 0x00;
40 uint8_t EnableP2P_PrioLogic = FALSE;
41 static uint32_t RfDiscID = 1;
42 static uint32_t RfProtocolType = 4;
43 /* NFCEE Set mode */
44 static uint8_t setEEModeDone = 0x00;
45 static uint8_t cmd_nfcee_setmode_enable[] = { 0x22, 0x01, 0x02, 0x01, 0x01 };
46 
47 /* External global variable to get FW version from NCI response*/
48 extern uint32_t wFwVerRsp;
49 /* External global variable to get FW version from FW file*/
50 extern uint16_t wFwVer;
51 
52 /* local buffer to store CORE_INIT response */
53 static uint32_t bCoreInitRsp[40];
54 static uint32_t iCoreInitRspLen;
55 
56 extern uint32_t timeoutTimerId;
57 
58 extern NFCSTATUS read_retry();
59 /************** HAL extension functions ***************************************/
60 static void hal_extns_write_rsp_timeout_cb(uint32_t TimerId, void *pContext);
61 
62 /*Proprietary cmd sent to HAL to send reader mode flag
63  * Last byte of 4 byte proprietary cmd data contains ReaderMode flag
64  * If this flag is enabled, NFC-DEP protocol is modified to T3T protocol
65  * if FrameRF interface is selected. This needs to be done as the FW
66  * always sends Ntf for FrameRF with NFC-DEP even though FrameRF with T3T is
67  * previously selected with DISCOVER_SELECT_CMD
68  */
69 #define PROPRIETARY_CMD_FELICA_READER_MODE 0xFE
70 static uint8_t gFelicaReaderMode;
71 
72 
73 /*******************************************************************************
74 **
75 ** Function         phNxpNciHal_ext_init
76 **
77 ** Description      initialize extension function
78 **
79 *******************************************************************************/
phNxpNciHal_ext_init(void)80 void phNxpNciHal_ext_init (void)
81 {
82     icode_detected = 0x00;
83     icode_send_eof = 0x00;
84     setEEModeDone = 0x00;
85     kovio_detected = 0x00;
86     disable_kovio = 0x00;
87     send_to_upper_kovio = 0x01;
88     EnableP2P_PrioLogic = FALSE;
89 }
90 
91 /*******************************************************************************
92 **
93 ** Function         phNxpNciHal_process_ext_rsp
94 **
95 ** Description      Process extension function response
96 **
97 ** Returns          NFCSTATUS_SUCCESS if success
98 **
99 *******************************************************************************/
phNxpNciHal_process_ext_rsp(uint8_t * p_ntf,uint16_t * p_len)100 NFCSTATUS phNxpNciHal_process_ext_rsp (uint8_t *p_ntf, uint16_t *p_len)
101 {
102 
103     NFCSTATUS status = NFCSTATUS_SUCCESS;
104     uint16_t rf_technology_length_param = 0;
105 
106     if (p_ntf[0] == 0x61 &&
107         p_ntf[1] == 0x05 &&
108         p_ntf[4] == 0x03 &&
109         p_ntf[5] == 0x05 &&
110         nxpprofile_ctrl.profile_type == EMV_CO_PROFILE)
111     {
112         p_ntf[4] = 0xFF;
113         p_ntf[5] = 0xFF;
114         p_ntf[6] = 0xFF;
115         NXPLOG_NCIHAL_D("Nfc-Dep Detect in EmvCo profile - Restart polling");
116     }
117 
118     if (p_ntf[0] == 0x61 &&
119         p_ntf[1] == 0x05 &&
120         p_ntf[4] == 0x01 &&
121         p_ntf[5] == 0x05 &&
122         p_ntf[6] == 0x02 &&
123         gFelicaReaderMode)
124     {
125      /*If FelicaReaderMode is enabled,Change Protocol to T3T from NFC-DEP
126           * when FrameRF interface is selected*/
127         p_ntf[5] = 0x03;
128         NXPLOG_NCIHAL_D("FelicaReaderMode:Activity 1.1");
129     }
130 
131 #ifdef P2P_PRIO_LOGIC_HAL_IMP
132     if(p_ntf[0] == 0x61 &&
133        p_ntf[1] == 0x05 &&
134        p_ntf[4] == 0x02 &&
135        p_ntf[5] == 0x04 &&
136        nxpprofile_ctrl.profile_type == NFC_FORUM_PROFILE)
137     {
138         EnableP2P_PrioLogic = TRUE;
139     }
140 
141     NXPLOG_NCIHAL_D("Is EnableP2P_PrioLogic: 0x0%X",  EnableP2P_PrioLogic);
142     if(phNxpDta_IsEnable() == FALSE)
143     {
144         if ((icode_detected != 1)&&(kovio_detected != 1) && (EnableP2P_PrioLogic == TRUE))
145         {
146             if (phNxpNciHal_NfcDep_comapre_ntf(p_ntf, *p_len) == NFCSTATUS_FAILED)
147             {
148                 status = phNxpNciHal_NfcDep_rsp_ext(p_ntf,p_len);
149                 if(status != NFCSTATUS_INVALID_PARAMETER)
150                 {
151                     return status;
152                 }
153             }
154         }
155     }
156 #endif
157 
158     status = NFCSTATUS_SUCCESS;
159     status = phNxpNciHal_kovio_rsp_ext(p_ntf,p_len);
160 
161     if (p_ntf[0] == 0x61 &&
162             p_ntf[1] == 0x05)
163     {
164         switch (p_ntf[4])
165         {
166         case 0x00:
167             NXPLOG_NCIHAL_D("NxpNci: RF Interface = NFCEE Direct RF");
168             break;
169         case 0x01:
170             NXPLOG_NCIHAL_D("NxpNci: RF Interface = Frame RF");
171             break;
172         case 0x02:
173             NXPLOG_NCIHAL_D("NxpNci: RF Interface = ISO-DEP");
174             break;
175         case 0x03:
176             NXPLOG_NCIHAL_D("NxpNci: RF Interface = NFC-DEP");
177             break;
178         case 0x80:
179             NXPLOG_NCIHAL_D("NxpNci: RF Interface = MIFARE");
180             break;
181         default:
182             NXPLOG_NCIHAL_D("NxpNci: RF Interface = Unknown");
183             break;
184         }
185 
186         switch (p_ntf[5])
187         {
188         case 0x01:
189             NXPLOG_NCIHAL_D("NxpNci: Protocol = T1T");
190             phNxpDta_T1TEnable();
191             break;
192         case 0x02:
193             NXPLOG_NCIHAL_D("NxpNci: Protocol = T2T");
194             break;
195         case 0x03:
196             NXPLOG_NCIHAL_D("NxpNci: Protocol = T3T");
197             break;
198         case 0x04:
199             NXPLOG_NCIHAL_D("NxpNci: Protocol = ISO-DEP");
200             break;
201         case 0x05:
202             NXPLOG_NCIHAL_D("NxpNci: Protocol = NFC-DEP");
203             break;
204         case 0x06:
205             NXPLOG_NCIHAL_D("NxpNci: Protocol = 15693");
206             break;
207         case 0x80:
208             NXPLOG_NCIHAL_D("NxpNci: Protocol = MIFARE");
209             break;
210 #if(NFC_NXP_CHIP_TYPE != PN547C2)
211         case 0x81:
212 #else
213         case 0x8A:
214 #endif
215             NXPLOG_NCIHAL_D("NxpNci: Protocol = Kovio");
216             break;
217         default:
218             NXPLOG_NCIHAL_D("NxpNci: Protocol = Unknown");
219             break;
220         }
221 
222         switch (p_ntf[6])
223         {
224         case 0x00:
225             NXPLOG_NCIHAL_D("NxpNci: Mode = A Passive Poll");
226             break;
227         case 0x01:
228             NXPLOG_NCIHAL_D("NxpNci: Mode = B Passive Poll");
229             break;
230         case 0x02:
231             NXPLOG_NCIHAL_D("NxpNci: Mode = F Passive Poll");
232             break;
233         case 0x03:
234             NXPLOG_NCIHAL_D("NxpNci: Mode = A Active Poll");
235             break;
236         case 0x05:
237             NXPLOG_NCIHAL_D("NxpNci: Mode = F Active Poll");
238             break;
239         case 0x06:
240             NXPLOG_NCIHAL_D("NxpNci: Mode = 15693 Passive Poll");
241             break;
242 #if(NFC_NXP_CHIP_TYPE != PN547C2)
243         case 0x70:
244 #else
245         case 0x77:
246 #endif
247             NXPLOG_NCIHAL_D("NxpNci: Mode = Kovio");
248             break;
249         case 0x80:
250             NXPLOG_NCIHAL_D("NxpNci: Mode = A Passive Listen");
251             break;
252         case 0x81:
253             NXPLOG_NCIHAL_D("NxpNci: Mode = B Passive Listen");
254             break;
255         case 0x82:
256             NXPLOG_NCIHAL_D("NxpNci: Mode = F Passive Listen");
257             break;
258         case 0x83:
259             NXPLOG_NCIHAL_D("NxpNci: Mode = A Active Listen");
260             break;
261         case 0x85:
262             NXPLOG_NCIHAL_D("NxpNci: Mode = F Active Listen");
263             break;
264         case 0x86:
265             NXPLOG_NCIHAL_D("NxpNci: Mode = 15693 Passive Listen");
266             break;
267         default:
268             NXPLOG_NCIHAL_D("NxpNci: Mode = Unknown");
269             break;
270         }
271     }
272 
273     if (p_ntf[0] == 0x61 &&
274             p_ntf[1] == 0x05 &&
275             p_ntf[2] == 0x15 &&
276             p_ntf[4] == 0x01 &&
277             p_ntf[5] == 0x06 &&
278             p_ntf[6] == 0x06)
279     {
280         NXPLOG_NCIHAL_D ("> Going through workaround - notification of ISO 15693");
281         icode_detected = 0x01;
282         p_ntf[21] = 0x01;
283         p_ntf[22] = 0x01;
284     }
285     else if (icode_detected == 1 &&
286             icode_send_eof == 2)
287     {
288         icode_send_eof = 3;
289         status = NFCSTATUS_FAILED;
290         return status;
291     }
292     else if (p_ntf[0] == 0x00 &&
293                 p_ntf[1] == 0x00 &&
294                 icode_detected == 1)
295     {
296         if (icode_send_eof == 3)
297         {
298             icode_send_eof = 0;
299         }
300         if (p_ntf[p_ntf[2]+ 2] == 0x00)
301         {
302             NXPLOG_NCIHAL_D ("> Going through workaround - data of ISO 15693");
303             p_ntf[2]--;
304             (*p_len)--;
305         }
306     }
307     else if (p_ntf[2] == 0x02 &&
308             p_ntf[1] == 0x00 && icode_detected == 1)
309     {
310         NXPLOG_NCIHAL_D ("> ICODE EOF response do not send to upper layer");
311     }
312     else if(p_ntf[0] == 0x61 &&
313             p_ntf[1] == 0x06 && icode_detected == 1)
314     {
315         NXPLOG_NCIHAL_D ("> Polling Loop Re-Started");
316         icode_detected = 0;
317         icode_send_eof = 0;
318     }
319     else if(*p_len == 4 &&
320                 p_ntf[0] == 0x40 &&
321                 p_ntf[1] == 0x02 &&
322                 p_ntf[2] == 0x01 &&
323                 p_ntf[3] == 0x06 )
324     {
325         NXPLOG_NCIHAL_D ("> Deinit workaround for LLCP set_config 0x%x 0x%x 0x%x", p_ntf[21], p_ntf[22], p_ntf[23]);
326         p_ntf[0] = 0x40;
327         p_ntf[1] = 0x02;
328         p_ntf[2] = 0x02;
329         p_ntf[3] = 0x00;
330         p_ntf[4] = 0x00;
331         *p_len = 5;
332     }
333     else if ((p_ntf[0] == 0x40) && (p_ntf[1] == 0x01))
334     {
335         int len = p_ntf[2] + 2; /*include 2 byte header*/
336         wFwVerRsp= (((uint32_t)p_ntf[len - 2])<< 16U)|(((uint32_t)p_ntf[len - 1])<< 8U)|p_ntf[len];
337         if(wFwVerRsp == 0)
338             status = NFCSTATUS_FAILED;
339         iCoreInitRspLen = *p_len;
340         memcpy(bCoreInitRsp, p_ntf, *p_len);
341         NXPLOG_NCIHAL_D ("NxpNci> FW Version: %x.%x.%x", p_ntf[len-2], p_ntf[len-1], p_ntf[len]);
342     }
343     //4200 02 00 01
344     else if(p_ntf[0] == 0x42 && p_ntf[1] == 0x00 && ee_disc_done == 0x01)
345     {
346         NXPLOG_NCIHAL_D("Going through workaround - NFCEE_DISCOVER_RSP");
347         if(p_ntf[4] == 0x01)
348         {
349             p_ntf[4] = 0x00;
350 
351             ee_disc_done = 0x00;
352         }
353         NXPLOG_NCIHAL_D("Going through workaround - NFCEE_DISCOVER_RSP - END");
354 
355     }
356     else if(p_ntf[0] == 0x61 && p_ntf[1] == 0x03 /*&& cleanup_timer!=0*/)
357     {
358         if(cleanup_timer!=0)
359         {
360             /* if RF Notification Type of RF_DISCOVER_NTF is Last Notification */
361             if(0== (*(p_ntf + 2 + (*(p_ntf+2)))))
362             {
363                 phNxpNciHal_select_RF_Discovery(RfDiscID,RfProtocolType);
364                 status = NFCSTATUS_FAILED;
365                 return status;
366             }
367             else
368             {
369                 RfDiscID=p_ntf[3];
370                 RfProtocolType=p_ntf[4];
371             }
372             status = NFCSTATUS_FAILED;
373             return status;
374 
375         }
376 
377     }
378     else if(p_ntf[0] == 0x41 && p_ntf[1] == 0x04 && cleanup_timer!=0)
379     {
380         status = NFCSTATUS_FAILED;
381         return status;
382     }
383     else if(p_ntf[0] == 0x60 && p_ntf[1] == 0x00)
384     {
385         NXPLOG_NCIHAL_E("CORE_RESET_NTF received!");
386         phNxpNciHal_emergency_recovery();
387     }
388 #if(NFC_NXP_CHIP_TYPE == PN547C2)
389     else if(p_ntf[0] == 0x61 && p_ntf[1] == 0x05
390             && p_ntf[4] == 0x02 && p_ntf[5] == 0x80
391             && p_ntf[6] == 0x00 )
392     {
393         NXPLOG_NCIHAL_D("Going through workaround - iso-dep  interface  mifare protocol with sak value not equal to 0x20");
394         rf_technology_length_param = p_ntf[9];
395         if((p_ntf[ 9 + rf_technology_length_param] & 0x20) != 0x20)
396         {
397             p_ntf[4] = 0x80;
398         }
399     }
400 #endif
401     /*
402     else if(p_ntf[0] == 0x61 && p_ntf[1] == 0x05 && p_ntf[4] == 0x01 && p_ntf[5] == 0x00 && p_ntf[6] == 0x01)
403     {
404         NXPLOG_NCIHAL_D("Picopass type 3-B with undefined protocol is not supported, disabling");
405         p_ntf[4] = 0xFF;
406         p_ntf[5] = 0xFF;
407         p_ntf[6] = 0xFF;
408     }*/
409 
410     return status;
411 }
412 
413 /******************************************************************************
414  * Function         phNxpNciHal_process_ext_cmd_rsp
415  *
416  * Description      This function process the extension command response. It
417  *                  also checks the received response to expected response.
418  *
419  * Returns          returns NFCSTATUS_SUCCESS if response is as expected else
420  *                  returns failure.
421  *
422  ******************************************************************************/
phNxpNciHal_process_ext_cmd_rsp(uint16_t cmd_len,uint8_t * p_cmd)423 static NFCSTATUS phNxpNciHal_process_ext_cmd_rsp(uint16_t cmd_len, uint8_t *p_cmd)
424 {
425     NFCSTATUS status = NFCSTATUS_FAILED;
426     uint16_t data_written = 0;
427 
428     /* Create the local semaphore */
429     if (phNxpNciHal_init_cb_data(&nxpncihal_ctrl.ext_cb_data, NULL)
430             != NFCSTATUS_SUCCESS)
431     {
432         NXPLOG_NCIHAL_D("Create ext_cb_data failed");
433         return NFCSTATUS_FAILED;
434     }
435 
436     nxpncihal_ctrl.ext_cb_data.status = NFCSTATUS_SUCCESS;
437 
438     /* Send ext command */
439     data_written = phNxpNciHal_write_unlocked(cmd_len, p_cmd);
440     if (data_written != cmd_len)
441     {
442         NXPLOG_NCIHAL_D("phNxpNciHal_write failed for hal ext");
443         goto clean_and_return;
444     }
445 
446     /* Start timer */
447     status = phOsalNfc_Timer_Start(timeoutTimerId,
448             HAL_EXTNS_WRITE_RSP_TIMEOUT,
449             &hal_extns_write_rsp_timeout_cb,
450             NULL);
451     if (NFCSTATUS_SUCCESS == status)
452     {
453         NXPLOG_NCIHAL_D("Response timer started");
454     }
455     else
456     {
457         NXPLOG_NCIHAL_E("Response timer not started!!!");
458         status  = NFCSTATUS_FAILED;
459         goto clean_and_return;
460     }
461 
462     /* Wait for rsp */
463     NXPLOG_NCIHAL_D("Waiting after ext cmd sent");
464     if (SEM_WAIT(nxpncihal_ctrl.ext_cb_data))
465     {
466         NXPLOG_NCIHAL_E("p_hal_ext->ext_cb_data.sem semaphore error");
467         goto clean_and_return;
468     }
469 
470     /* Stop Timer */
471     status = phOsalNfc_Timer_Stop(timeoutTimerId);
472 
473     if (NFCSTATUS_SUCCESS == status)
474     {
475         NXPLOG_NCIHAL_D("Response timer stopped");
476     }
477     else
478     {
479         NXPLOG_NCIHAL_E("Response timer stop ERROR!!!");
480         status  = NFCSTATUS_FAILED;
481         goto clean_and_return;
482     }
483 
484     if(nxpncihal_ctrl.ext_cb_data.status != NFCSTATUS_SUCCESS)
485     {
486         NXPLOG_NCIHAL_E("Callback Status is failed!! Timer Expired!! Couldn't read it! 0x%x", nxpncihal_ctrl.ext_cb_data.status);
487         status  = NFCSTATUS_FAILED;
488         goto clean_and_return;
489     }
490 
491     NXPLOG_NCIHAL_D("Checking response");
492     status = NFCSTATUS_SUCCESS;
493 
494 clean_and_return:
495     phNxpNciHal_cleanup_cb_data(&nxpncihal_ctrl.ext_cb_data);
496 
497     return status;
498 }
499 
500 /******************************************************************************
501  * Function         phNxpNciHal_write_ext
502  *
503  * Description      This function inform the status of phNxpNciHal_open
504  *                  function to libnfc-nci.
505  *
506  * Returns          It return NFCSTATUS_SUCCESS then continue with send else
507  *                  sends NFCSTATUS_FAILED direct response is prepared and
508  *                  do not send anything to NFCC.
509  *
510  ******************************************************************************/
511 
phNxpNciHal_write_ext(uint16_t * cmd_len,uint8_t * p_cmd_data,uint16_t * rsp_len,uint8_t * p_rsp_data)512 NFCSTATUS phNxpNciHal_write_ext(uint16_t *cmd_len, uint8_t *p_cmd_data,
513         uint16_t *rsp_len, uint8_t *p_rsp_data)
514 {
515     NFCSTATUS status = NFCSTATUS_SUCCESS;
516 
517     unsigned long retval = 0;
518     int isfound =  GetNxpNumValue(NAME_MIFARE_READER_ENABLE, &retval, sizeof(unsigned long));
519 
520     phNxpNciHal_NfcDep_cmd_ext(p_cmd_data, cmd_len);
521 
522     if(phNxpDta_IsEnable() == TRUE)
523     {
524         status = phNxpNHal_DtaUpdate(cmd_len, p_cmd_data,rsp_len, p_rsp_data);
525     }
526 
527     if (p_cmd_data[0] == PROPRIETARY_CMD_FELICA_READER_MODE &&
528         p_cmd_data[1] == PROPRIETARY_CMD_FELICA_READER_MODE &&
529         p_cmd_data[2] == PROPRIETARY_CMD_FELICA_READER_MODE)
530     {
531         NXPLOG_NCIHAL_D ("Received proprietary command to set Felica Reader mode:%d",p_cmd_data[3]);
532         gFelicaReaderMode = p_cmd_data[3];
533         /* frame the dummy response */
534         *rsp_len = 4;
535         p_rsp_data[0] = 0x00;
536         p_rsp_data[1] = 0x00;
537         p_rsp_data[2] = 0x00;
538         p_rsp_data[3] = 0x00;
539         status = NFCSTATUS_FAILED;
540     }
541     else if (p_cmd_data[0] == 0x20 &&
542             p_cmd_data[1] == 0x02 &&
543             p_cmd_data[2] == 0x05 &&
544             p_cmd_data[3] == 0x01 &&
545             p_cmd_data[4] == 0xA0 &&
546             p_cmd_data[5] == 0x44 &&
547             p_cmd_data[6] == 0x01 &&
548             p_cmd_data[7] == 0x01)
549     {
550         nxpprofile_ctrl.profile_type = EMV_CO_PROFILE;
551         NXPLOG_NCIHAL_D ("EMV_CO_PROFILE mode - Enabled");
552         status = NFCSTATUS_SUCCESS;
553     }
554     else if (p_cmd_data[0] == 0x20 &&
555             p_cmd_data[1] == 0x02 &&
556             p_cmd_data[2] == 0x05 &&
557             p_cmd_data[3] == 0x01 &&
558             p_cmd_data[4] == 0xA0 &&
559             p_cmd_data[5] == 0x44 &&
560             p_cmd_data[6] == 0x01 &&
561             p_cmd_data[7] == 0x00)
562     {
563         NXPLOG_NCIHAL_D ("NFC_FORUM_PROFILE mode - Enabled");
564         nxpprofile_ctrl.profile_type = NFC_FORUM_PROFILE;
565         status = NFCSTATUS_SUCCESS;
566     }
567 
568     if (nxpprofile_ctrl.profile_type == EMV_CO_PROFILE)
569     {
570         if (p_cmd_data[0] == 0x21 &&
571                 p_cmd_data[1] == 0x06 &&
572                 p_cmd_data[2] == 0x01 &&
573                 p_cmd_data[3] == 0x03)
574         {
575 #if 0
576             //Needs clarification whether to keep it or not
577             NXPLOG_NCIHAL_D ("EmvCo Poll mode - RF Deactivate discard");
578             phNxpNciHal_print_packet("SEND", p_cmd_data, *cmd_len);
579             *rsp_len = 4;
580             p_rsp_data[0] = 0x41;
581             p_rsp_data[1] = 0x06;
582             p_rsp_data[2] = 0x01;
583             p_rsp_data[3] = 0x00;
584             phNxpNciHal_print_packet("RECV", p_rsp_data, 4);
585             status = NFCSTATUS_FAILED;
586 #endif
587         }
588         else if(p_cmd_data[0] == 0x21 &&
589                 p_cmd_data[1] == 0x03 )
590         {
591             NXPLOG_NCIHAL_D ("EmvCo Poll mode - Discover map only for A and B");
592             p_cmd_data[2] = 0x05;
593             p_cmd_data[3] = 0x02;
594             p_cmd_data[4] = 0x00;
595             p_cmd_data[5] = 0x01;
596             p_cmd_data[6] = 0x01;
597             p_cmd_data[7] = 0x01;
598             *cmd_len = 8;
599         }
600     }
601 #if(NFC_NXP_CHIP_TYPE == PN547C2)
602     if (retval == 0x01 &&
603         p_cmd_data[0] == 0x21 &&
604         p_cmd_data[1] == 0x00)
605     {
606         NXPLOG_NCIHAL_D ("Going through extns - Adding Mifare in RF Discovery");
607         p_cmd_data[2] += 3;
608         p_cmd_data[3] += 1;
609         p_cmd_data[*cmd_len] = 0x80;
610         p_cmd_data[*cmd_len + 1] = 0x01;
611         p_cmd_data[*cmd_len + 2] = 0x80;
612         *cmd_len += 3;
613         status = NFCSTATUS_SUCCESS;
614         NXPLOG_NCIHAL_D ("Going through extns - Adding Mifare in RF Discovery - END");
615     }
616     else
617 #endif
618     if (p_cmd_data[3] == 0x81 &&
619             p_cmd_data[4] == 0x01 &&
620             p_cmd_data[5] == 0x03)
621     {
622         NXPLOG_NCIHAL_D("> Going through workaround - set host list");
623 
624 #if(NFC_NXP_CHIP_TYPE != PN547C2)
625         *cmd_len = 8;
626 
627         p_cmd_data[2] = 0x05;
628         p_cmd_data[6] = 0x02;
629         p_cmd_data[7] = 0xC0;
630 #else
631         *cmd_len = 7;
632 
633         p_cmd_data[2] = 0x04;
634         p_cmd_data[6] = 0xC0;
635 #endif
636 
637         NXPLOG_NCIHAL_D("> Going through workaround - set host list - END");
638         status = NFCSTATUS_SUCCESS;
639     }
640     else if(icode_detected)
641     {
642         if ((p_cmd_data[3] & 0x40) == 0x40 &&
643             (p_cmd_data[4] == 0x21 ||
644              p_cmd_data[4] == 0x22 ||
645              p_cmd_data[4] == 0x24 ||
646              p_cmd_data[4] == 0x27 ||
647              p_cmd_data[4] == 0x28 ||
648              p_cmd_data[4] == 0x29 ||
649              p_cmd_data[4] == 0x2a))
650         {
651             NXPLOG_NCIHAL_D ("> Send EOF set");
652             icode_send_eof = 1;
653         }
654 
655         if(p_cmd_data[3]  == 0x20 || p_cmd_data[3]  == 0x24 ||
656            p_cmd_data[3]  == 0x60)
657         {
658             NXPLOG_NCIHAL_D ("> NFC ISO_15693 Proprietary CMD ");
659             p_cmd_data[3] += 0x02;
660         }
661     }
662     else if(p_cmd_data[0] == 0x21 &&
663             p_cmd_data[1] == 0x03 )
664     {
665         NXPLOG_NCIHAL_D ("> Polling Loop Started");
666         icode_detected = 0;
667         icode_send_eof = 0;
668     }
669     //22000100
670     else if (p_cmd_data[0] == 0x22 &&
671             p_cmd_data[1] == 0x00 &&
672             p_cmd_data[2] == 0x01 &&
673             p_cmd_data[3] == 0x00
674             )
675     {
676         //ee_disc_done = 0x01;//Reader Over SWP event getting
677         *rsp_len = 0x05;
678         p_rsp_data[0] = 0x42;
679         p_rsp_data[1] = 0x00;
680         p_rsp_data[2] = 0x02;
681         p_rsp_data[3] = 0x00;
682         p_rsp_data[4] = 0x00;
683         phNxpNciHal_print_packet("RECV", p_rsp_data,5);
684         status = NFCSTATUS_FAILED;
685     }
686     //2002 0904 3000 3100 3200 5000
687     else if ( (p_cmd_data[0] == 0x20 && p_cmd_data[1] == 0x02 ) &&
688             ( (p_cmd_data[2] == 0x09 && p_cmd_data[3] == 0x04) /*||
689               (p_cmd_data[2] == 0x0D && p_cmd_data[3] == 0x04)*/
690             )
691     )
692     {
693         *cmd_len += 0x01;
694         p_cmd_data[2] += 0x01;
695         p_cmd_data[9] = 0x01;
696         p_cmd_data[10] = 0x40;
697         p_cmd_data[11] = 0x50;
698         p_cmd_data[12] = 0x00;
699 
700         NXPLOG_NCIHAL_D ("> Going through workaround - Dirty Set Config ");
701 //        phNxpNciHal_print_packet("SEND", p_cmd_data, *cmd_len);
702         NXPLOG_NCIHAL_D ("> Going through workaround - Dirty Set Config - End ");
703     }
704 //    20020703300031003200
705 //    2002 0301 3200
706     else if ( (p_cmd_data[0] == 0x20 && p_cmd_data[1] == 0x02 ) &&
707             (
708               (p_cmd_data[2] == 0x07 && p_cmd_data[3] == 0x03) ||
709               (p_cmd_data[2] == 0x03 && p_cmd_data[3] == 0x01 && p_cmd_data[4] == 0x32)
710             )
711     )
712     {
713         NXPLOG_NCIHAL_D ("> Going through workaround - Dirty Set Config ");
714         phNxpNciHal_print_packet("SEND", p_cmd_data, *cmd_len);
715         *rsp_len = 5;
716         p_rsp_data[0] = 0x40;
717         p_rsp_data[1] = 0x02;
718         p_rsp_data[2] = 0x02;
719         p_rsp_data[3] = 0x00;
720         p_rsp_data[4] = 0x00;
721 
722         phNxpNciHal_print_packet("RECV", p_rsp_data, 5);
723         status = NFCSTATUS_FAILED;
724         NXPLOG_NCIHAL_D ("> Going through workaround - Dirty Set Config - End ");
725     }
726 
727     //2002 0D04 300104 310100 320100 500100
728     //2002 0401 320100
729     else if ( (p_cmd_data[0] == 0x20 && p_cmd_data[1] == 0x02 ) &&
730             (
731               /*(p_cmd_data[2] == 0x0D && p_cmd_data[3] == 0x04)*/
732                 (p_cmd_data[2] == 0x04 && p_cmd_data[3] == 0x01 && p_cmd_data[4] == 0x32 && p_cmd_data[5] == 0x00)
733             )
734     )
735     {
736 //        p_cmd_data[12] = 0x40;
737 
738         NXPLOG_NCIHAL_D ("> Going through workaround - Dirty Set Config ");
739         phNxpNciHal_print_packet("SEND", p_cmd_data, *cmd_len);
740         p_cmd_data[6] = 0x60;
741 
742         phNxpNciHal_print_packet("RECV", p_rsp_data, 5);
743 //        status = NFCSTATUS_FAILED;
744         NXPLOG_NCIHAL_D ("> Going through workaround - Dirty Set Config - End ");
745     }
746 
747 #if 0
748     else if ( (p_cmd_data[0] == 0x20 && p_cmd_data[1] == 0x02 ) &&
749                  ((p_cmd_data[2] == 0x09 && p_cmd_data[3] == 0x04) ||
750                      (p_cmd_data[2] == 0x0B && p_cmd_data[3] == 0x05) ||
751                      (p_cmd_data[2] == 0x07 && p_cmd_data[3] == 0x02) ||
752                      (p_cmd_data[2] == 0x0A && p_cmd_data[3] == 0x03) ||
753                      (p_cmd_data[2] == 0x0A && p_cmd_data[3] == 0x04) ||
754                      (p_cmd_data[2] == 0x05 && p_cmd_data[3] == 0x02))
755              )
756     {
757         NXPLOG_NCIHAL_D ("> Going through workaround - Dirty Set Config ");
758         phNxpNciHal_print_packet("SEND", p_cmd_data, *cmd_len);
759         *rsp_len = 5;
760         p_rsp_data[0] = 0x40;
761         p_rsp_data[1] = 0x02;
762         p_rsp_data[2] = 0x02;
763         p_rsp_data[3] = 0x00;
764         p_rsp_data[4] = 0x00;
765 
766         phNxpNciHal_print_packet("RECV", p_rsp_data, 5);
767         status = NFCSTATUS_FAILED;
768         NXPLOG_NCIHAL_D ("> Going through workaround - Dirty Set Config - End ");
769     }
770 
771     else if((p_cmd_data[0] == 0x20 && p_cmd_data[1] == 0x02) &&
772            ((p_cmd_data[3] == 0x00) ||
773            ((*cmd_len >= 0x06) && (p_cmd_data[5] == 0x00)))) /*If the length of the first param id is zero don't allow*/
774     {
775         NXPLOG_NCIHAL_D ("> Going through workaround - Dirty Set Config ");
776         phNxpNciHal_print_packet("SEND", p_cmd_data, *cmd_len);
777         *rsp_len = 5;
778         p_rsp_data[0] = 0x40;
779         p_rsp_data[1] = 0x02;
780         p_rsp_data[2] = 0x02;
781         p_rsp_data[3] = 0x00;
782         p_rsp_data[4] = 0x00;
783 
784         phNxpNciHal_print_packet("RECV", p_rsp_data, 5);
785         status = NFCSTATUS_FAILED;
786         NXPLOG_NCIHAL_D ("> Going through workaround - Dirty Set Config - End ");
787     }
788 #endif
789     else if ((wFwVerRsp & 0x0000FFFF) == wFwVer)
790     {
791         /* skip CORE_RESET and CORE_INIT from Brcm */
792         if (p_cmd_data[0] == 0x20 &&
793             p_cmd_data[1] == 0x00 &&
794             p_cmd_data[2] == 0x01 &&
795             p_cmd_data[3] == 0x01
796             )
797         {
798 //            *rsp_len = 6;
799 //
800 //            NXPLOG_NCIHAL_D("> Going - core reset optimization");
801 //
802 //            p_rsp_data[0] = 0x40;
803 //            p_rsp_data[1] = 0x00;
804 //            p_rsp_data[2] = 0x03;
805 //            p_rsp_data[3] = 0x00;
806 //            p_rsp_data[4] = 0x10;
807 //            p_rsp_data[5] = 0x01;
808 //
809 //            status = NFCSTATUS_FAILED;
810 //            NXPLOG_NCIHAL_D("> Going - core reset optimization - END");
811         }
812         /* CORE_INIT */
813         else if (
814             p_cmd_data[0] == 0x20 &&
815             p_cmd_data[1] == 0x01 &&
816             p_cmd_data[2] == 0x00
817             )
818         {
819 //            NXPLOG_NCIHAL_D("> Going - core init optimization");
820 //            *rsp_len = iCoreInitRspLen;
821 //            memcpy(p_rsp_data, bCoreInitRsp, iCoreInitRspLen);
822 //            status = NFCSTATUS_FAILED;
823 //            NXPLOG_NCIHAL_D("> Going - core init optimization - END");
824         }
825     }
826     return status;
827 }
828 
829 /******************************************************************************
830  * Function         phNxpNciHal_send_ext_cmd
831  *
832  * Description      This function send the extension command to NFCC. No
833  *                  response is checked by this function but it waits for
834  *                  the response to come.
835  *
836  * Returns          Returns NFCSTATUS_SUCCESS if sending cmd is successful and
837  *                  response is received.
838  *
839  ******************************************************************************/
phNxpNciHal_send_ext_cmd(uint16_t cmd_len,uint8_t * p_cmd)840 NFCSTATUS phNxpNciHal_send_ext_cmd(uint16_t cmd_len, uint8_t *p_cmd)
841 {
842     NFCSTATUS status = NFCSTATUS_FAILED;
843 
844     HAL_ENABLE_EXT();
845     nxpncihal_ctrl.cmd_len = cmd_len;
846     memcpy(nxpncihal_ctrl.p_cmd_data, p_cmd, cmd_len);
847     status = phNxpNciHal_process_ext_cmd_rsp(nxpncihal_ctrl.cmd_len, nxpncihal_ctrl.p_cmd_data);
848     HAL_DISABLE_EXT();
849 
850     return status;
851 }
852 
853 /******************************************************************************
854  * Function         hal_extns_write_rsp_timeout_cb
855  *
856  * Description      Timer call back function
857  *
858  * Returns          None
859  *
860  ******************************************************************************/
hal_extns_write_rsp_timeout_cb(uint32_t timerId,void * pContext)861 static void hal_extns_write_rsp_timeout_cb(uint32_t timerId, void *pContext)
862 {
863     UNUSED(timerId);
864     UNUSED(pContext);
865     NXPLOG_NCIHAL_E("hal_extns_write_rsp_timeout_cb - write timeout!!!");
866     nxpncihal_ctrl.ext_cb_data.status = NFCSTATUS_FAILED;
867     usleep(1);
868     SEM_POST(&(nxpncihal_ctrl.ext_cb_data));
869 
870     return;
871 }
872