Initialize Tizen 2.3
[adaptation/devices/nfc-plugin-nxp.git] / src / phHciNfc_Sequence.c
1 /*
2  * Copyright (C) 2010 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
17
18 /*!
19 * =========================================================================== *
20 *                                                                             *
21 *                                                                             *
22 * \file  phHciNfc_Sequence.c                                                  *
23 * \brief State Machine Implementation for the HCI Management and              *
24 * and the Function Sequence for a particular State                            *
25 *                                                                             *
26 *                                                                             *
27 * Project: NFC-FRI-1.1                                                        *
28 *                                                                             *
29 * $Date: Tue Jun  8 09:33:46 2010 $                                           *
30 * $Author: ing04880 $                                                         *
31 * $Revision: 1.85 $                                                           *
32 * $Aliases: NFC_FRI1.1_WK1023_R35_1 $  
33 *                                                                             *
34 * =========================================================================== *
35 */
36
37 /*
38 ################################################################################
39 ***************************** Header File Inclusion ****************************
40 ################################################################################
41 */
42
43 #include <phNfcCompId.h>
44 #include <phNfcConfig.h>
45 #include <phHciNfc.h>
46 #include <phHciNfc_Sequence.h>
47 #include <phHciNfc_AdminMgmt.h>
48 #include <phHciNfc_IDMgmt.h>
49 #include <phHciNfc_LinkMgmt.h>
50 #include <phHciNfc_DevMgmt.h>
51 #include <phHciNfc_PollingLoop.h>
52 #include <phHciNfc_RFReader.h>
53 #include <phHciNfc_RFReaderA.h>
54 #include <phHciNfc_Emulation.h>
55 #ifdef ENABLE_P2P
56 #include <phHciNfc_NfcIPMgmt.h>
57 #endif
58 #include <phHciNfc_SWP.h>
59 #include <phHciNfc_WI.h>
60 #include <phOsalNfc.h>
61
62 /*
63 ################################################################################
64 ****************************** Macro Definitions *******************************
65 ################################################################################
66 */
67
68 /* Address Definitions for HAL Configuration */
69 #define NFC_ADDRESS_HAL_CONF            0x9FD0U
70
71
72 /*
73 ################################################################################
74 ********************** Structure/Enumeration Definitions ***********************
75 ################################################################################
76 */
77
78
79 #ifdef VALIDATE_FSM
80
81 typedef struct phHciNfc_sFsm
82 {
83     phHciNfc_eState_t from_state;
84     phHciNfc_eState_t to_state;
85     uint8_t           valid;
86 }phHciNfc_sFsm_t;
87
88 static phHciNfc_sFsm_t phHciNfc_Valid_Fsm[] = {
89     {hciState_Reset,        hciState_Initialise ,   TRUE},
90         /*  {hciState_Reset,        hciState_Config,            FALSE}, */
91     {hciState_Initialise,   hciState_Config,            TRUE},
92     {hciState_Initialise,   hciState_Release,       TRUE},
93     {hciState_Config,       hciState_Connect,       TRUE},
94     {hciState_Config,       hciState_Release,       TRUE},
95     {hciState_Connect,      hciState_Activate,      TRUE},
96     {hciState_Connect,      hciState_Transact,      TRUE},
97     {hciState_Connect,      hciState_Disconnect,    TRUE},
98     {hciState_Disconnect,   hciState_Config,            TRUE},
99     /*  {hciState_Disconnect,   hciState_Release,       TRUE}, */
100     {hciState_Reset,        hciState_Initialise,    TRUE},
101 };
102
103 #endif
104
105
106 /*
107 ################################################################################
108 ************************* Function Prototype Declaration ***********************
109 ################################################################################
110 */
111
112
113 static
114 NFCSTATUS
115 phHciNfc_Config_Sequence(
116                          phHciNfc_sContext_t        *psHciContext,
117                          void                   *pHwRef
118                          );
119
120
121 /**
122  * \ingroup grp_hci_nfc
123  *
124  *  The phHciNfc_Connect_Sequence function sequence selects the  
125  *  discovered target for performing the transaction.
126  *
127  *  \param[in]  psHciContext            psHciContext is the context of
128  *                                      the HCI Layer.
129  *  \param[in]  pHwRef                  pHwRef is the Information of
130  *                                      the Device Interface Link .
131  *
132  *  \retval NFCSTATUS_SUCCESS           HCI target selection sequence successful.
133  *  \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters
134  *                                      could not be interpreted properly.
135  *  \retval Other errors                Other related errors
136  *
137  */
138
139 static
140 NFCSTATUS
141 phHciNfc_Transact_Sequence(
142                             phHciNfc_sContext_t     *psHciContext,
143                             void                    *pHwRef
144                          );
145
146 /**
147  * \ingroup grp_hci_nfc
148  *
149  *  The phHciNfc_Info_Sequence function sequence selects the  
150  *  discovered target for performing the transaction.
151  *
152  *  \param[in]  psHciContext            psHciContext is the context of
153  *                                      the HCI Layer.
154  *  \param[in]  pHwRef                  pHwRef is the Information of
155  *                                      the Device Interface Link .
156  *
157  *  \retval NFCSTATUS_SUCCESS           HCI target selection sequence successful.
158  *  \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters
159  *                                      could not be interpreted properly.
160  *  \retval Other errors                Other related errors
161  *
162  */
163
164 static
165 NFCSTATUS
166 phHciNfc_Info_Sequence(
167                             phHciNfc_sContext_t     *psHciContext,
168                             void                    *pHwRef
169                    );
170
171 static
172 NFCSTATUS
173 phHciNfc_Test_Sequence(
174                             phHciNfc_sContext_t     *psHciContext,
175                             void                    *pHwRef,
176                             NFCSTATUS               test_status,
177                             uint8_t                 *pdata,
178                             uint8_t                 length
179                          );
180
181 #ifdef HCI_FSM_RESET
182
183 static
184 void
185 phHciNfc_FSM_Reset(
186                         phHciNfc_sContext_t *psHciContext
187                     );
188
189 #endif
190
191 static
192 NFCSTATUS
193 phHciNfc_IO_Sequence(
194                             phHciNfc_sContext_t     *psHciContext,
195                             void                    *pHwRef,
196                             NFCSTATUS               test_status,
197                             uint8_t                 *pdata,
198                             uint8_t                 length
199                     );
200
201 static
202 NFCSTATUS
203 phHciNfc_Pending_Sequence(
204                                 phHciNfc_sContext_t     *psHciContext,
205                                 void                    *pHwRef
206                           );
207
208
209 /*
210 ################################################################################
211 ***************************** Function Definitions *****************************
212 ################################################################################
213 */
214
215 NFCSTATUS 
216 phHciNfc_FSM_Validate( 
217                       phHciNfc_sContext_t *psHciContext,  
218                       phHciNfc_eState_t state,  
219                       uint8_t validate_type
220                     )
221 {
222     NFCSTATUS           status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_STATE);
223     phHciNfc_eState_t   cur_state = (phHciNfc_eState_t) 
224         psHciContext->hci_state.cur_state;
225
226     switch(validate_type)
227     {
228         case NFC_FSM_CURRENT:
229         {
230             if( cur_state == (uint8_t) state )
231             {
232                 status = NFCSTATUS_SUCCESS;
233             }
234             break;
235         }
236         case NFC_FSM_NEXT:
237         {
238             phHciNfc_eState_t   next_state = state;
239             switch (cur_state)
240             {
241                 case hciState_Reset:
242                 {
243                     switch(next_state)
244                     {
245                         /* Specifies the Starting of the init Sequence */
246                         case hciState_Initialise:
247                         /* Initialise to Perform Test on 
248                            the Antenna/SWP Link */
249                         case hciState_Test:
250                         {
251                             status = NFCSTATUS_SUCCESS;
252                             break;
253                         }
254                         default:
255                             break;
256                     }
257                     break;
258                 }
259                 case hciState_Initialise:
260                 {
261                     switch(next_state)
262                     {
263                         /* Discovery Resume after connect failure */
264                         case hciState_Initialise:
265                         /* Configuring the Discovery/Emulation */
266                         case hciState_Config:
267                         /* Configuring the Memory */
268                         case hciState_IO:
269                         /* Occurence of the Tag Discovered Event */
270                         case hciState_Select:
271                         /* Occurence of the Target Activated Event */
272                         case hciState_Listen:
273                         /* Specifies the Starting of the Release Sequence */
274                         case hciState_Release:
275                         {
276                             status = NFCSTATUS_SUCCESS;
277                             break;
278                         }
279                         default:
280                             break;
281                     }
282                     break;
283                 }
284                 case hciState_Test:
285                 {
286                     if ((hciState_Test == next_state )
287                         || (hciState_IO == next_state)
288                         || (hciState_Release == next_state))
289                     {
290                         /*  Next Test/Reset Sequence */
291                         status = NFCSTATUS_SUCCESS;
292                     }
293                     break;
294                 }
295                 case hciState_Select:
296                 {
297                     switch(next_state)
298                     {
299                         /* Restart the Wheel */
300                         case hciState_Initialise:
301                             /* Select the next Tag in the Field or 
302                              * already Selected Tag Again 
303                              */
304                         /* Configuring the Memory */
305                         case hciState_IO:
306                         case hciState_Select:
307                         /* Configuring the Discovery/Emulation */
308                         case hciState_Config:
309                             /* Re-Activate the Target or 
310                              * Discover the next target 
311                              */
312                         case hciState_Reactivate:
313                         /* Connect the Discovered Target */
314                         case hciState_Connect:
315                         /* Specifies the Starting of the Release Sequence */
316                         case hciState_Release:
317                         {
318                             status = NFCSTATUS_SUCCESS;
319                             break;
320                         }
321                         default:
322                             break;
323                     }
324                     break;
325                 }
326                 case hciState_Connect:
327                 {
328                     switch(next_state)
329                     {
330                         /* Disabling the Tag Discovery */
331                         case hciState_Initialise:
332                             /* Configuring the Discovery/Emulation */
333                             /* This should not be allowed if the target
334                             * is connected.
335                             */
336                         /* Configuring the Memory */
337                         case hciState_IO:
338                         case hciState_Config:
339                             /* Re-Activate the Target or 
340                              * Discover the next target 
341                              */
342                         case hciState_Reactivate:
343                         /* Intermediate Transceive State */
344                         case hciState_Transact:
345                         /* Intermediate Presence Check State */
346                         case hciState_Presence:
347                         /* Disconnect the Target Connected */
348                         case hciState_Disconnect:
349                         /* Specifies the Starting of the Release Sequence */
350                         case hciState_Release:
351                         {
352                             status = NFCSTATUS_SUCCESS;
353                             break;
354                         }
355                         default:
356                             break;
357                     }
358                     break;
359                 }
360                 case hciState_Listen:
361                 {
362                     switch(next_state)
363                     {
364                         /* Releasing from the Emulation/Target Mode */
365                         case hciState_Initialise:
366                         /* Occurence of the Tag Discovered Event 
367                         * after the Disconnect Operation
368                         */
369                         case hciState_Select:
370                         /* Configuring the Memory */
371                         case hciState_IO:
372                         /* Configuring the Discovery/Emulation */
373                         case hciState_Config:
374                         /* Intermediate Transceive State */
375                         case hciState_Transact:
376                         /* Specifies the Starting of the Release Sequence */
377                         case hciState_Release:
378                         {
379                             status = NFCSTATUS_SUCCESS;
380                             break;
381                         }
382                         default:
383                             break;
384                     }
385                     break;
386                 }
387                 case hciState_Reactivate:
388                 {
389                     switch(next_state)
390                     {
391                         /* Restart/Discovery after the Target is removed
392                          * after Reactivation.
393                         */
394                         /* case hciState_Initialise: */
395                         /* Re-Connect the Re-Activated Target */
396                         case hciState_Connect:
397                         /* Configuring the Memory */
398                         case hciState_IO:
399                         /* Configuring the Discovery/Emulation */
400                         case hciState_Config:
401                         /* Specifies the Starting of the Release Sequence */
402                         case hciState_Release:
403                         {
404                             status = NFCSTATUS_SUCCESS;
405                             break;
406                         }
407                         default:
408                             break;
409                     }
410                     break;
411                 }
412                 case hciState_Disconnect:
413                 {
414                     switch(next_state)
415                     {
416                         /* Discovery Resume after connect failure 
417                            after the disconnect */
418                         case hciState_Initialise:
419                         /* Configuring the Memory */
420                         case hciState_IO:
421                         /* Configuring the Discovery/Emulation */
422                         case hciState_Config:
423                         /* Occurence of the Tag Discovered Event 
424                         * after the Disconnect Operation
425                         */
426                         case hciState_Select:
427                         /* Occurence of the Target Activated Event */
428                         case hciState_Listen:
429                         /* Specifies the Starting of the Release Sequence */
430                         case hciState_Release:
431                         {
432                             status = NFCSTATUS_SUCCESS;
433                             break;
434                         }
435                         default:
436                         {
437                             break;
438                     }
439                     }
440                     break;
441                 }
442 #ifdef USE_M5
443                 case hciState_Presence:
444                 case hciState_Transact:
445                 case hciState_Release:
446                 {
447                     break;
448                 }
449 #endif
450                 /* case phHciNfc_Unknown: */
451                 default:
452                 {
453                     /* status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_STATE); */
454                     break;
455                 }
456             } /* End of State Validation Switch */
457             if( NFC_FSM_IN_PROGRESS == psHciContext->hci_state.transition )
458             {
459                 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_STATE);
460             }
461             break;
462         }
463         default:
464         {
465             HCI_DEBUG("State Validate Type:%x is Unknown/Incorrect \n",
466                                                             validate_type);
467             break;
468         }
469     }
470     return status;
471 }
472
473 NFCSTATUS
474 phHciNfc_FSM_Update(
475                     phHciNfc_sContext_t *psHciContext,
476                     phHciNfc_eState_t   next_state
477                     )
478 {
479     NFCSTATUS       status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_STATE);
480
481     HCI_DEBUG(" HCI: Current State --> %02u \n", 
482                             psHciContext->hci_state.cur_state );
483     HCI_DEBUG(" HCI: Transition Before FSM Update --> %02u \n", 
484                     psHciContext->hci_state.transition );
485     HCI_DEBUG(" HCI: Next State Before FSM Update --> %02u \n", 
486                             psHciContext->hci_state.next_state );
487
488     status = phHciNfc_FSM_Validate(psHciContext, next_state, NFC_FSM_NEXT );
489     if(NFCSTATUS_SUCCESS == status)
490     {
491         psHciContext->hci_state.next_state = (uint8_t) next_state;
492         psHciContext->hci_state.transition = NFC_FSM_IN_PROGRESS;
493         psHciContext->response_pending = FALSE;
494         HCI_DEBUG(" HCI: Next State After FSM Update --> %02u \n", 
495                                 psHciContext->hci_state.next_state );
496     }
497     else
498     {
499         HCI_DEBUG(" HCI: FSM - Invalid next state --> %02u \n", 
500                                 next_state );
501     }
502
503     return status;
504 }
505
506
507 NFCSTATUS
508 phHciNfc_FSM_Complete(
509                         phHciNfc_sContext_t *psHciContext
510                     )
511 {
512     NFCSTATUS       status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_STATE);
513
514     HCI_DEBUG("HCI: In Function: %s \n", __FUNCTION__);
515
516     HCI_DEBUG(" HCI: Transition Before FSM Complete --> %02u \n", 
517                     psHciContext->hci_state.transition );
518  
519     HCI_DEBUG(" HCI: Current State Before FSM Complete --> %02u \n", 
520                             psHciContext->hci_state.cur_state );
521
522     HCI_DEBUG(" HCI: Next State Before FSM Complete  --> %02u \n", 
523                             psHciContext->hci_state.next_state );
524
525     if( (NFC_FSM_IN_PROGRESS == psHciContext->hci_state.transition)
526       )
527     {
528         psHciContext->hci_state.cur_state = 
529                                     psHciContext->hci_state.next_state ;
530         psHciContext->hci_state.transition = NFC_FSM_COMPLETE ;
531         psHciContext->hci_state.next_state = (uint8_t) hciState_Unknown ;
532         /* Reset the HCI Sequence */
533         psHciContext->response_pending = FALSE;
534         psHciContext->hci_seq = HCI_INVALID_SEQ;
535         status = NFCSTATUS_SUCCESS;
536     }
537
538     HCI_DEBUG(" HCI: Current State After FSM Complete --> %02u \n", 
539                             psHciContext->hci_state.cur_state );
540
541     return status;
542 }
543
544 void
545 phHciNfc_FSM_Rollback(
546                         phHciNfc_sContext_t *psHciContext
547                     )
548 {
549
550     HCI_DEBUG("HCI: %s: transition=%02u, cur_state=%02u, next_state=%02u\n",
551             __func__,
552             psHciContext->hci_state.transition,
553             psHciContext->hci_state.cur_state,
554             psHciContext->hci_state.next_state);
555
556
557
558
559
560
561     if( (NFC_FSM_IN_PROGRESS  == psHciContext->hci_state.transition)
562       )
563     {
564         psHciContext->hci_state.transition = NFC_FSM_COMPLETE ;
565         psHciContext->hci_state.next_state = (uint8_t) hciState_Unknown ;
566         /* Reset the HCI Sequence */
567         psHciContext->hci_seq = HCI_INVALID_SEQ;
568         psHciContext->response_pending = FALSE;
569     }
570 }
571
572 #ifdef HCI_FSM_RESET
573 static
574 void
575 phHciNfc_FSM_Reset(
576                         phHciNfc_sContext_t *psHciContext
577                     )
578 {
579
580     if( (hciState_Reset  != psHciContext->hci_state.cur_state )
581       )
582     {
583         psHciContext->hci_state.cur_state = (uint8_t) hciState_Initialise ;
584         psHciContext->hci_state.transition = NFC_FSM_COMPLETE ;
585         psHciContext->hci_state.next_state = (uint8_t) hciState_Unknown ;
586         /* Reset the HCI Sequence */
587         psHciContext->hci_seq = HCI_INVALID_SEQ;
588     }
589
590 }
591 #endif
592
593
594
595 static
596 NFCSTATUS
597 phHciNfc_Pending_Sequence(
598                                 phHciNfc_sContext_t     *psHciContext,
599                                 void                    *pHwRef
600                           )
601 {
602     NFCSTATUS           status = NFCSTATUS_SUCCESS;
603
604     PHNFC_UNUSED_VARIABLE(status);
605
606     HCI_DEBUG("HCI: psHciContext->target_release --> %s \n",
607             (psHciContext->target_release)?"TRUE":"FALSE");
608     if(TRUE == psHciContext->target_release)
609     {
610 #ifdef SW_RELEASE_TARGET
611         status = phHciNfc_ReaderMgmt_Deselect( 
612             psHciContext, pHwRef, phHal_eISO14443_A_PICC, TRUE);
613         if(NFCSTATUS_PENDING == status )
614         {
615             psHciContext->target_release = FALSE ;
616         }
617     }
618     else
619     {
620         status = psHciContext->error_status;
621 #else
622       psHciContext->target_release = FALSE ;
623 #endif
624     }
625
626     return status;
627 }
628
629
630 void
631 phHciNfc_Error_Sequence(
632                                 void            *psContext,
633                                 void            *pHwRef,
634                                 NFCSTATUS       error_status,
635                                 void            *pdata,
636                                 uint8_t         length
637                         )
638 {
639     NFCSTATUS           status = NFCSTATUS_SUCCESS;
640     phHciNfc_sContext_t *psHciContext = (phHciNfc_sContext_t *)psContext;
641
642     PHNFC_UNUSED_VARIABLE(status);
643
644     HCI_DEBUG("HCI: In Function: %s \n",
645         __FUNCTION__);
646
647     HCI_DEBUG ("HCI : Error Status : %04X\n", error_status);
648
649     HCI_DEBUG(" HCI: Current HCI State --> %02u \n", 
650                             psHciContext->hci_state.cur_state );
651     HCI_DEBUG(" HCI: Next HCI State --> %02u \n", 
652                             psHciContext->hci_state.next_state );
653
654
655     if ( NFC_FSM_IN_PROGRESS == psHciContext->hci_state.transition )
656     {
657         switch(psHciContext->hci_state.next_state)
658         {
659             case hciState_Initialise:
660             {
661                 if (hciState_Reset == psHciContext->hci_state.cur_state)
662                 {
663                     phNfc_sCompletionInfo_t     comp_info={FALSE,0, NULL};
664
665                     phHciNfc_Release_Lower( psHciContext, pHwRef );
666                     /* Release all the resources and 
667                     * Notify the Receive Error Scenario to the Upper Layer 
668                     */
669                     comp_info.status = error_status ;
670                     phHciNfc_Release_Notify (psHciContext, pHwRef,
671                         NFC_NOTIFY_INIT_FAILED, &comp_info);
672                 }
673                 else if (hciState_Config == psHciContext->hci_state.cur_state)
674                 {
675                     /* Notify the Poll/Emulation Configure failure to the upper layer */
676
677                     phNfc_sCompletionInfo_t     comp_info={FALSE,0, NULL};
678
679                     comp_info.status = error_status ;
680
681                     psHciContext->error_status = error_status;
682                     status = phHciNfc_Pending_Sequence(psHciContext, pHwRef );
683                     /* Rollback the FSM as the Poll/Emulation configuration Failed */
684                     phHciNfc_FSM_Rollback(psHciContext);
685                     psHciContext->error_status = NFCSTATUS_SUCCESS;
686                     phHciNfc_Notify(psHciContext->p_upper_notify,
687                         psHciContext->p_upper_context, pHwRef,
688                         NFC_NOTIFY_CONFIG_ERROR, &comp_info);
689                 }
690                 else
691                 {
692
693                     /* Notify the Poll Configure failure to the upper layer */
694                     phNfc_sCompletionInfo_t     comp_info={FALSE,0, NULL};
695
696
697                     psHciContext->error_status = error_status;
698                     status = phHciNfc_Pending_Sequence(psHciContext, pHwRef );
699                     /* Rollback the FSM as the Poll Disable Failed */
700                     phHciNfc_FSM_Rollback(psHciContext);
701                     comp_info.status = error_status ;
702                     psHciContext->error_status = NFCSTATUS_SUCCESS;
703                     phHciNfc_Notify(psHciContext->p_upper_notify,
704                         psHciContext->p_upper_context, pHwRef,
705                         NFC_NOTIFY_ERROR, &comp_info);
706                 }
707                 break;
708             }
709             case hciState_Test:
710             {
711                 status = phHciNfc_Test_Sequence( psHciContext, pHwRef , error_status, 
712                                                             (uint8_t *)pdata, length );
713                 break;
714             }
715             case hciState_IO:
716             {
717                 status = phHciNfc_IO_Sequence( psHciContext, pHwRef , error_status, 
718                                                             (uint8_t *)pdata, length );
719                 break;
720             }
721             case hciState_Config:
722             {
723                 /* Notify the Configure failure to the upper layer */
724                 phNfc_sCompletionInfo_t     comp_info={FALSE,0, NULL};
725
726                 psHciContext->error_status = error_status;
727                 status = phHciNfc_Pending_Sequence(psHciContext, pHwRef );
728                 /* Rollback the FSM as the Poll Failed */
729                 phHciNfc_FSM_Rollback(psHciContext);
730                 comp_info.status = psHciContext->error_status ;
731                 psHciContext->error_status = NFCSTATUS_SUCCESS;
732                 phHciNfc_Notify(psHciContext->p_upper_notify,
733                     psHciContext->p_upper_context, pHwRef,
734                     NFC_NOTIFY_CONFIG_ERROR, &comp_info);
735                 break;
736             }
737             case hciState_Select:
738             {
739                 /* Notify the Configure failure to the upper layer */
740                 phNfc_sCompletionInfo_t     comp_info={FALSE,0, NULL};
741
742                 /* Rollback the FSM as the Target Discovery Failed */
743                 phHciNfc_FSM_Rollback(psHciContext);
744                 status = phHciNfc_ReaderMgmt_Update_Sequence(
745                                                 psHciContext, INFO_SEQ );
746                 comp_info.status = error_status ;
747                 phHciNfc_Notify(psHciContext->p_upper_notify,
748                     psHciContext->p_upper_context, pHwRef,
749                     NFC_NOTIFY_DISCOVERY_ERROR, &comp_info);
750
751 #if 0
752                 /* Polling Wheel will be restarted by the upper layer 
753                  * to Rediscover again */
754                 if(NFCSTATUS_SUCCESS == status)
755                 {
756                     status = phHciNfc_ReaderMgmt_Deselect( 
757                         psHciContext, pHwRef, phHal_eISO14443_A_PICC, FALSE);
758                 }
759                 phHciNfc_FSM_Rollback(psHciContext);
760 #endif
761                 break;
762             }
763             case hciState_Transact:
764                 /* Notify the Transceive failure to the upper layer */
765             {
766                 phNfc_sTransactionInfo_t        transact_info={FALSE,0,NULL,NULL,0};
767
768                 /* Rollback the FSM as the Transceive Failed */
769                 phHciNfc_FSM_Rollback(psHciContext);
770                 transact_info.status = error_status;
771                 transact_info.buffer = NULL;
772                 transact_info.length = FALSE;
773                 psHciContext->p_xchg_info = NULL ;
774                 phHciNfc_Notify(psHciContext->p_upper_notify,
775                     psHciContext->p_upper_context, pHwRef,
776                     NFC_NOTIFY_TRANSCEIVE_ERROR, &transact_info);
777                 break;
778
779             }
780             case hciState_Connect:
781             {
782                 /* Notify the General failure to the upper layer */
783                 phNfc_sCompletionInfo_t     comp_info={FALSE,0, NULL};
784
785                 /* psHciContext->host_rf_type = phHal_eUnknown_DevType; */
786                 status = phHciNfc_ReaderMgmt_Update_Sequence(
787                                                 psHciContext, INFO_SEQ );
788                 psHciContext->p_target_info = NULL;
789                 psHciContext->hci_state.cur_state = hciState_Select;
790                 phHciNfc_FSM_Rollback(psHciContext);
791                 comp_info.status = error_status ;
792                 phHciNfc_Notify(psHciContext->p_upper_notify,
793                     psHciContext->p_upper_context, pHwRef,
794                     NFC_NOTIFY_CONNECT_FAILED, &comp_info);
795                 break;
796             }
797             case hciState_Reactivate:
798             {
799                 /* Notify the General failure to the upper layer */
800                 phNfc_sCompletionInfo_t     comp_info={FALSE,0, NULL};
801
802                 /* psHciContext->host_rf_type = phHal_eUnknown_DevType; 
803                 status = phHciNfc_ReaderMgmt_Update_Sequence(
804                                                 psHciContext, INFO_SEQ );
805                 psHciContext->p_target_info = NULL;
806                 psHciContext->hci_state.cur_state = hciState_Select;  */
807                 phHciNfc_FSM_Rollback(psHciContext);
808                 comp_info.status = error_status ;
809                 phHciNfc_Notify(psHciContext->p_upper_notify,
810                     psHciContext->p_upper_context, pHwRef,
811                     NFC_NOTIFY_CONNECT_FAILED, &comp_info);
812                 break;
813             }
814             case hciState_Presence:
815             {
816                 phNfc_sCompletionInfo_t     comp_info={FALSE,0, NULL};
817
818                 /* Roll Back to Connect State as Presence Check is Complete */
819                 phHciNfc_FSM_Rollback(psHciContext);
820
821                 /* Initialisation Complete Notification to the Upper Layer */
822                 comp_info.status = error_status;
823                 phHciNfc_Notify(psHciContext->p_upper_notify,
824                             psHciContext->p_upper_context, pHwRef,
825                              NFC_NOTIFY_ERROR, &comp_info);
826                 HCI_PRINT(" HCI Remote Target Removed from the Field. \n");
827                 break;
828             }
829             /* Notify the Connect or Disconnect failure to the upper layer */
830             case hciState_Disconnect:
831             {
832                 /* Notify the General failure to the upper layer */
833                 phNfc_sCompletionInfo_t     comp_info={FALSE,0, NULL};
834
835                 phHciNfc_FSM_Rollback(psHciContext);
836                 comp_info.status = error_status ;
837                 phHciNfc_Notify(psHciContext->p_upper_notify,
838                     psHciContext->p_upper_context, pHwRef,
839                     NFC_NOTIFY_DISCONNECT_FAILED, &comp_info);
840                 break;
841             }
842             case hciState_Release:
843             {
844 #ifdef NXP_HCI_SHUTDOWN_OVERRIDE
845                 status = phHciNfc_Release_Sequence(psHciContext ,pHwRef);
846 #else
847                 phNfc_sCompletionInfo_t     comp_info={FALSE,0, NULL};
848
849                 phHciNfc_Release_Lower( psHciContext, pHwRef );
850                 /* Release all the resources and 
851                 * Notify the Receive Error Scenario to the Upper Layer 
852                 */
853                 comp_info.status = error_status ;
854                 phHciNfc_Release_Notify (psHciContext, pHwRef,
855                     NFC_NOTIFY_DEINIT_FAILED, &comp_info);
856 #endif
857                 break;
858             }
859             default:
860             {
861                 /* Notify the General failure to the upper layer */
862                 phNfc_sCompletionInfo_t     comp_info={FALSE,0, NULL};
863
864                 phHciNfc_FSM_Rollback(psHciContext);
865                 comp_info.status = error_status ;
866                 psHciContext->error_status = error_status;
867                 status = phHciNfc_Pending_Sequence(psHciContext, pHwRef );
868                 if (NFCSTATUS_PENDING != status)
869                 {
870                     psHciContext->error_status = NFCSTATUS_SUCCESS;
871                     phHciNfc_Notify(psHciContext->p_upper_notify,
872                         psHciContext->p_upper_context, pHwRef,
873                         NFC_NOTIFY_ERROR, &comp_info);
874                 }
875                 break;
876             }
877
878         } /* End of the Processing of HCI State*/
879     }
880     else
881     {
882         /* Notify the General failure to the upper layer */
883         phNfc_sCompletionInfo_t     comp_info={FALSE,0, NULL};
884         phHciNfc_FSM_Rollback(psHciContext);
885         comp_info.status = error_status ;
886         /* Disable the Notification to the Upper Layer */
887         if(NFCSTATUS_BOARD_COMMUNICATION_ERROR
888                             == PHNFCSTATUS(error_status))
889         {
890             phHciNfc_Notify(psHciContext->p_upper_notify,
891                         psHciContext->p_upper_context, pHwRef,
892                             NFC_NOTIFY_ERROR, &comp_info);
893         }
894         else
895         {
896             psHciContext->error_status = error_status;
897             status = phHciNfc_Pending_Sequence(psHciContext, pHwRef );
898             if (NFCSTATUS_PENDING != status)
899             {
900                 psHciContext->error_status = NFCSTATUS_SUCCESS;
901             }
902         }
903     }
904     return;
905 }
906
907
908
909 NFCSTATUS
910 phHciNfc_Resume_Sequence(
911                                 phHciNfc_sContext_t     *psHciContext,
912                                 void                    *pHwRef
913                           )
914 {
915     NFCSTATUS           status = NFCSTATUS_SUCCESS;
916
917     HCI_DEBUG("HCI: %s: cur_state=%02u, next_state=%02u",
918         __FUNCTION__,
919         psHciContext->hci_state.cur_state,
920         psHciContext->hci_state.next_state);
921
922
923
924
925     switch(psHciContext->hci_state.next_state)
926     {
927         /* Process the Admin Gate Response based on the HCI State */
928         case hciState_Initialise:
929         {
930             switch (psHciContext->hci_state.cur_state)
931             {
932                 /* Initialise State after Power on */
933                 case hciState_Reset:
934                 {
935                     status = phHciNfc_Initialise_Sequence(psHciContext ,pHwRef);
936                     break;
937                 }
938                 /* Initialise State after Power on */
939                 case hciState_Config:
940                 {
941                     status = phHciNfc_Config_Sequence(psHciContext ,pHwRef);
942                     break;
943                 }
944                 /* Discovery Resume after connect failure */
945                 case hciState_Initialise:
946                 case hciState_Select:
947                 case hciState_Connect:
948                 {
949                     phNfc_sCompletionInfo_t     comp_info={FALSE,0, NULL};
950
951                     /* Update to the Intialise state as the discovery wheel is 
952                      * restarted.
953                      */
954                     status = phHciNfc_FSM_Complete(psHciContext);
955
956                     psHciContext->host_rf_type = phHal_eUnknown_DevType;
957                     psHciContext->p_target_info = NULL;
958                     psHciContext->p_xchg_info = NULL;
959
960                     /* Initialisation Complete Notification to the Upper Layer */
961                     comp_info.status = status;
962                     phHciNfc_Notify(psHciContext->p_upper_notify,
963                                 psHciContext->p_upper_context, pHwRef,
964                                 NFC_NOTIFY_POLL_RESTARTED , &comp_info);
965                     HCI_PRINT(" HCI Remote Target Still Present in the Field. \n");
966                     break;
967                 }
968                 default:
969                 {
970                     status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_STATE);
971                     break;
972                 }
973             }
974             break;
975         }
976         case hciState_Release:
977         {
978             status = phHciNfc_Release_Sequence(psHciContext ,pHwRef);
979             break;
980         }
981         case hciState_Config:
982         {
983             status = phHciNfc_Config_Sequence(psHciContext ,pHwRef);
984             break;
985         }
986         case hciState_Listen:
987         case hciState_Select:
988         {
989             status = phHciNfc_Info_Sequence( psHciContext, pHwRef );
990             break;
991         }
992         case hciState_Reactivate:
993         case hciState_Connect:
994         {
995             status = phHciNfc_Connect_Sequence( psHciContext, pHwRef );
996             break;
997         }
998         case hciState_Transact:
999         {
1000             status = phHciNfc_Transact_Sequence( 
1001                                             psHciContext, pHwRef );
1002             break;
1003         }
1004         case hciState_Presence:
1005         {
1006             phNfc_sCompletionInfo_t     comp_info={FALSE,0, NULL};
1007
1008             /* Roll Back to Connect State as Presence Check is Complete */
1009             phHciNfc_FSM_Rollback(psHciContext);
1010
1011             /* Initialisation Complete Notification to the Upper Layer */
1012             comp_info.status = NFCSTATUS_SUCCESS;
1013             phHciNfc_Notify(psHciContext->p_upper_notify,
1014                         psHciContext->p_upper_context, pHwRef,
1015                         NFC_NOTIFY_TARGET_PRESENT , &comp_info);
1016             HCI_PRINT(" HCI Remote Target Still Present in the Field. \n");
1017             break;
1018         }
1019         case hciState_Disconnect:
1020         {
1021             status = phHciNfc_Disconnect_Sequence( psHciContext, pHwRef );
1022             break;
1023         }
1024         case hciState_Test:
1025         {
1026             status = phHciNfc_Test_Sequence( psHciContext, pHwRef , status, NULL, 0 );
1027             break;
1028         }
1029         case hciState_IO:
1030         {
1031             status = phHciNfc_IO_Sequence( psHciContext, pHwRef , status, NULL, 0 );
1032             break;
1033         }
1034         case hciState_Unknown:
1035         {
1036             break;
1037         }
1038         default:
1039         {
1040             status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_STATE);
1041             break;
1042         }
1043     } /* End of the Processing of HCI State*/
1044
1045     return status;
1046 }
1047
1048
1049 NFCSTATUS
1050 phHciNfc_Initialise_Sequence(
1051                                 phHciNfc_sContext_t     *psHciContext,
1052                                 void                    *pHwRef
1053                              )
1054 {
1055     NFCSTATUS                   status = NFCSTATUS_SUCCESS;
1056     static  uint8_t             config = 0;
1057
1058     PHNFC_UNUSED_VARIABLE(config);
1059
1060     switch(psHciContext->hci_seq)
1061     {
1062         case ADMIN_INIT_SEQ:
1063         {
1064             status = phHciNfc_Admin_Initialise( psHciContext,pHwRef );
1065             if(NFCSTATUS_SUCCESS == status)
1066             {
1067 #ifdef ESTABLISH_SESSION
1068                 if( hciMode_Session == psHciContext->hci_mode)
1069                 {
1070                     /* TODO: Initialise Link Management 
1071                             Gate Resources */
1072                     NFCSTATUS info_status = NFCSTATUS_SUCCESS;
1073                     PHNFC_UNUSED_VARIABLE(info_status);
1074                     info_status = phHciNfc_IDMgmt_Update_Sequence( 
1075                                                 psHciContext, INFO_SEQ );
1076
1077                     if(NFCSTATUS_SUCCESS == info_status)
1078                     {
1079                         psHciContext->hci_seq = PL_STOP_SEQ;
1080                     }
1081                     else
1082                     {
1083                         psHciContext->hci_seq = HCI_END_SEQ;
1084                         status = PHNFCSTVAL(CID_NFC_HCI,
1085                                     NFCSTATUS_INVALID_HCI_SEQUENCE);
1086                     }
1087                 }
1088                 else
1089 #endif
1090                 {
1091                     psHciContext->hci_seq = LINK_MGMT_INIT_SEQ;
1092                 }
1093             }
1094             break;
1095         }
1096         case LINK_MGMT_INIT_SEQ:
1097         {
1098             status = phHciNfc_LinkMgmt_Initialise( psHciContext,pHwRef );
1099             if(NFCSTATUS_SUCCESS == status)
1100             {
1101                 psHciContext->hci_seq = IDENTITY_INIT_SEQ;
1102             }
1103             break;
1104         }
1105         case IDENTITY_INIT_SEQ:
1106         {
1107             status = phHciNfc_IDMgmt_Initialise( psHciContext,pHwRef );
1108             if(NFCSTATUS_SUCCESS == status)
1109             {
1110                 psHciContext->hci_seq = DEV_INIT_SEQ;
1111             }
1112             break;
1113         }
1114         case DEV_INIT_SEQ:
1115         {
1116             status = phHciNfc_DevMgmt_Initialise( psHciContext,pHwRef );
1117             if(NFCSTATUS_SUCCESS == status)
1118             {
1119                 if (HCI_SELF_TEST != psHciContext->init_mode)
1120                 {
1121                     psHciContext->hci_seq = PL_INIT_SEQ;
1122                 }
1123                 else
1124                 {
1125 #if defined( ESTABLISH_SESSION )
1126                     NFCSTATUS info_status = NFCSTATUS_SUCCESS;
1127                     PHNFC_UNUSED_VARIABLE(info_status);
1128                     info_status = phHciNfc_IDMgmt_Update_Sequence( 
1129                                                 psHciContext, INFO_SEQ );
1130
1131                     if(NFCSTATUS_SUCCESS == info_status)
1132                     {
1133 #if ( NXP_HAL_MEM_INFO_SIZE > 0x00U )
1134                         psHciContext->hci_seq = DEV_HAL_INFO_SEQ;
1135 #else
1136                         psHciContext->hci_seq = IDENTITY_INFO_SEQ;
1137 #endif /* #if ( NXP_HAL_MEM_INFO_SIZE > 0x00U ) */
1138                     }
1139                     else
1140                     {
1141                         psHciContext->hci_seq = HCI_END_SEQ;
1142                         status = PHNFCSTVAL(CID_NFC_HCI,
1143                                     NFCSTATUS_INVALID_HCI_SEQUENCE);
1144                     }
1145 #elif ( NXP_HAL_MEM_INFO_SIZE > 0x00U )
1146                     psHciContext->hci_seq = DEV_HAL_INFO_SEQ;
1147 #else
1148                     psHciContext->hci_seq = HCI_END_SEQ;
1149 #endif /* #ifdef ESTABLISH_SESSION */
1150                 }
1151
1152             }
1153             break;
1154         }
1155         case PL_INIT_SEQ:
1156         {
1157             status = phHciNfc_PollLoop_Initialise( psHciContext,pHwRef );
1158             if(NFCSTATUS_SUCCESS == status)
1159             {
1160                 NFCSTATUS reset_status = NFCSTATUS_SUCCESS;
1161                 PHNFC_UNUSED_VARIABLE(reset_status);
1162                 reset_status = phHciNfc_ReaderMgmt_Update_Sequence(
1163                                                     psHciContext, RESET_SEQ );
1164                 psHciContext->hci_seq = READER_MGMT_INIT_SEQ;
1165             }
1166             break;
1167         }
1168         case READER_MGMT_INIT_SEQ:
1169         {
1170             status = phHciNfc_ReaderMgmt_Initialise( psHciContext,pHwRef );
1171             if(NFCSTATUS_SUCCESS == status)
1172             {
1173                 NFCSTATUS reset_status = NFCSTATUS_SUCCESS;
1174                 PHNFC_UNUSED_VARIABLE(reset_status);
1175                 reset_status =  phHciNfc_EmuMgmt_Update_Seq( 
1176                                                 psHciContext, RESET_SEQ );
1177                 psHciContext->hci_seq = EMULATION_INIT_SEQ;
1178             }
1179             break;
1180         }
1181         case EMULATION_INIT_SEQ:
1182         {
1183             status = phHciNfc_EmuMgmt_Initialise( psHciContext,pHwRef );
1184             if(NFCSTATUS_SUCCESS == status)
1185             {
1186 #if defined( ESTABLISH_SESSION )
1187                 psHciContext->hci_seq = ADMIN_SESSION_SEQ;
1188 #elif ( NXP_HAL_MEM_INFO_SIZE > 0x00U )
1189                 psHciContext->hci_seq = DEV_HAL_INFO_SEQ;
1190 #else
1191                 psHciContext->hci_seq = HCI_END_SEQ;
1192 #endif
1193             }
1194             break;
1195         }
1196 #ifdef ESTABLISH_SESSION
1197         case ADMIN_SESSION_SEQ:
1198         {
1199             status = phHciNfc_Admin_Initialise( psHciContext,pHwRef );
1200             if(NFCSTATUS_SUCCESS == status)
1201             {
1202 #if ( NXP_HAL_MEM_INFO_SIZE > 0x00U )
1203                 psHciContext->hci_seq = DEV_HAL_INFO_SEQ;
1204 #else
1205                 psHciContext->hci_seq = IDENTITY_INFO_SEQ;
1206 #endif /* #if ( NXP_HAL_MEM_INFO_SIZE > 0x00U ) */
1207             }
1208             break;
1209         }
1210         case PL_STOP_SEQ:
1211         {
1212             status = phHciNfc_ReaderMgmt_Disable_Discovery( 
1213                                                 psHciContext, pHwRef );
1214             if(NFCSTATUS_SUCCESS == status)
1215             {
1216 #if defined( SW_AUTO_ACTIVATION )
1217                 psHciContext->hci_seq = READER_SW_AUTO_SEQ;
1218 #elif ( NXP_HAL_MEM_INFO_SIZE > 0x00U )
1219                 psHciContext->hci_seq = DEV_HAL_INFO_SEQ;
1220 #else
1221                 psHciContext->hci_seq = IDENTITY_INFO_SEQ;
1222 #endif /* #if ( NXP_HAL_MEM_INFO_SIZE > 0x00U ) */
1223             }
1224             break;
1225         }
1226 #ifdef SW_AUTO_ACTIVATION
1227         case READER_SW_AUTO_SEQ:
1228         {
1229             uint8_t     activate_enable = FALSE;
1230             uint8_t     rdr_enable = TRUE;
1231
1232             status = phHciNfc_ReaderA_Update_Info( 
1233                     psHciContext, HCI_READER_A_ENABLE, 
1234                                             &rdr_enable);
1235             if(status == NFCSTATUS_SUCCESS)
1236             {
1237                 status = phHciNfc_ReaderA_Auto_Activate( psHciContext,
1238                                                 pHwRef, activate_enable );
1239                 if(status == NFCSTATUS_SUCCESS)
1240                 {
1241                     psHciContext->hci_seq = IDENTITY_INFO_SEQ;
1242                 }
1243             }
1244             break;
1245         }
1246 #endif
1247         /* fall through */
1248         case IDENTITY_INFO_SEQ:
1249         {
1250             status = phHciNfc_IDMgmt_Info_Sequence( psHciContext,pHwRef );
1251             if(NFCSTATUS_SUCCESS == status)
1252             {
1253                 if ((HCI_SELF_TEST != psHciContext->init_mode)
1254                     /* && ( TRUE == ((phHal_sHwReference_t *)pHwRef)->se_detect ) */
1255                     && (HCI_CUSTOM_INIT != psHciContext->init_mode)
1256                     && (HCI_NFC_DEVICE_TEST != psHciContext->init_mode))
1257                 {
1258                     NFCSTATUS info_status = NFCSTATUS_SUCCESS;
1259                     PHNFC_UNUSED_VARIABLE(info_status);
1260                     info_status = phHciNfc_EmuMgmt_Update_Seq( 
1261                                                 psHciContext, INFO_SEQ );
1262
1263                     if(NFCSTATUS_SUCCESS == info_status)
1264                     {
1265                         psHciContext->hci_seq = EMULATION_SWP_SEQ;
1266                     }
1267                 }
1268                 else
1269                 {
1270                     psHciContext->hci_seq = HCI_END_SEQ;
1271                 }
1272             }
1273             break;
1274         }
1275         case EMULATION_SWP_SEQ:
1276         {
1277             status = phHciNfc_EmuMgmt_Initialise( psHciContext,pHwRef );
1278             if(NFCSTATUS_SUCCESS == status)
1279             {
1280                 psHciContext->hci_seq = HCI_END_SEQ;
1281             }
1282             break;
1283         }
1284 #endif /* #ifdef ESTABLISH_SESSION */
1285
1286 #if ( NXP_HAL_MEM_INFO_SIZE > 0x00U )
1287         case DEV_HAL_INFO_SEQ:
1288         {
1289             static uint8_t      mem_index = 0;
1290             status = phHciNfc_DevMgmt_Get_Info(psHciContext, pHwRef,
1291                         (NFC_ADDRESS_HAL_CONF + mem_index),
1292                             (psHciContext->hal_mem_info + mem_index));
1293             if(NFCSTATUS_PENDING == status)
1294             {
1295                 mem_index++;
1296                 if (NXP_HAL_MEM_INFO_SIZE <= mem_index )
1297                 {
1298                     NFCSTATUS info_status = NFCSTATUS_SUCCESS;
1299                     PHNFC_UNUSED_VARIABLE(info_status);
1300                     info_status = phHciNfc_IDMgmt_Update_Sequence(
1301                                                 psHciContext, INFO_SEQ );
1302                     mem_index = 0;
1303                     psHciContext->hci_seq = IDENTITY_INFO_SEQ;
1304                     /* psHciContext->hci_seq =
1305                             (HCI_SELF_TEST != psHciContext->init_mode)?
1306                                     IDENTITY_INFO_SEQ : HCI_END_SEQ; */
1307                 }
1308             }
1309             break;
1310         }
1311 #endif /* #if ( NXP_HAL_MEM_INFO_SIZE > 0x00U ) */
1312         case HCI_END_SEQ:
1313         {
1314             phHal_sMemInfo_t    *p_mem_info =
1315                     (phHal_sMemInfo_t *) ( psHciContext->hal_mem_info );
1316             if (
1317                 (HCI_SELF_TEST == psHciContext->init_mode )
1318                 || (HCI_NFC_DEVICE_TEST == psHciContext->init_mode )
1319                 )
1320             {
1321                 psHciContext->hci_state.next_state
1322                     = (uint8_t) hciState_Test;
1323             }
1324             status = phHciNfc_FSM_Complete ( psHciContext );
1325 #ifdef UICC_CONNECTIVITY_PATCH
1326             phHciNfc_Uicc_Connectivity( psHciContext, pHwRef );
1327 #endif /* #ifdef UICC_CONNECTIVITY_PATCH */
1328
1329 #if ( NXP_HAL_MEM_INFO_SIZE > 0x00U )
1330             if(NXP_FW_UPLOAD_SUCCESS != p_mem_info->fw_magic )
1331             {
1332                 status = PHNFCSTVAL( CID_NFC_HCI, NFCSTATUS_FAILED );
1333             }
1334 #endif /* #if ( NXP_HAL_MEM_INFO_SIZE > 0x00U ) */
1335
1336             /* Initialisation Complete Notification to the Upper Layer */
1337             if(NFCSTATUS_SUCCESS == status)
1338             {
1339                 phNfc_sCompletionInfo_t     comp_info={FALSE,0, NULL};
1340
1341                 comp_info.status = status;
1342                 phHciNfc_Notify(psHciContext->p_upper_notify,
1343                         psHciContext->p_upper_context, pHwRef,
1344                                 NFC_NOTIFY_INIT_COMPLETED, &comp_info);
1345                 HCI_PRINT("HCI Initialisation Completed \n");
1346             }
1347             else
1348             {
1349                 pphNfcIF_Notification_CB_t  p_upper_notify = psHciContext->p_upper_notify;
1350                 void                        *pcontext = psHciContext->p_upper_context;
1351                 phNfc_sCompletionInfo_t     comp_info;
1352
1353
1354                 phHciNfc_Release_Lower( psHciContext, pHwRef );
1355                 phHciNfc_Release_Resources( &psHciContext );
1356                  /* Notify the Failure to the Upper Layer */
1357                 comp_info.status = status;
1358                 phHciNfc_Notify( p_upper_notify, pcontext, pHwRef,
1359                                 NFC_NOTIFY_INIT_FAILED, &comp_info);
1360                 HCI_PRINT("HCI FSM Initialisation Error \n");
1361             }
1362             break;
1363         }
1364         default:
1365             break;
1366     }
1367
1368     return status;
1369 }
1370
1371
1372 NFCSTATUS
1373 phHciNfc_Release_Sequence(
1374                             phHciNfc_sContext_t     *psHciContext,
1375                             void                    *pHwRef
1376                          )
1377 {
1378     NFCSTATUS           status = NFCSTATUS_SUCCESS;
1379
1380     switch(psHciContext->hci_seq)
1381     {
1382         case PL_STOP_SEQ:
1383         {
1384             status = phHciNfc_ReaderMgmt_Disable_Discovery( 
1385                                                 psHciContext, pHwRef );
1386             if(NFCSTATUS_SUCCESS == status)
1387             {
1388                 (void)phHciNfc_EmuMgmt_Update_Seq( 
1389                                     psHciContext, REL_SEQ );
1390                 psHciContext->hci_seq = EMULATION_REL_SEQ;
1391                 status = NFCSTATUS_PENDING;
1392             }
1393             break;
1394         }
1395         case EMULATION_REL_SEQ:
1396         {
1397             status = phHciNfc_EmuMgmt_Release( psHciContext,pHwRef );
1398             if(NFCSTATUS_SUCCESS == status)
1399             {
1400                 (void)phHciNfc_DevMgmt_Update_Sequence( 
1401                                     psHciContext, REL_SEQ );
1402                 psHciContext->hci_seq = ADMIN_REL_SEQ;
1403                 status = NFCSTATUS_PENDING;
1404             }
1405             break;
1406         }
1407         case DEV_REL_SEQ:
1408         {
1409             NFCSTATUS info_status = NFCSTATUS_SUCCESS;
1410             PHNFC_UNUSED_VARIABLE(info_status);
1411             info_status = phHciNfc_DevMgmt_Update_Sequence(
1412                                             psHciContext, REL_SEQ );
1413             status = phHciNfc_DevMgmt_Release( psHciContext, pHwRef );
1414             if(NFCSTATUS_SUCCESS == status)
1415             {
1416                 psHciContext->hci_seq = HCI_END_SEQ;
1417                 status = NFCSTATUS_PENDING;
1418             }
1419             break;
1420         }
1421         case READER_MGMT_REL_SEQ:
1422         {
1423             status = phHciNfc_ReaderMgmt_Release( psHciContext,pHwRef );
1424             if(NFCSTATUS_SUCCESS == status)
1425             {
1426                 psHciContext->hci_seq = PL_REL_SEQ;
1427                 status = NFCSTATUS_PENDING;
1428             }
1429             break;
1430         }
1431         case PL_REL_SEQ:
1432         {
1433             status = phHciNfc_PollLoop_Release( psHciContext,pHwRef );
1434             if(NFCSTATUS_SUCCESS == status)
1435             {
1436                 psHciContext->hci_seq = IDENTITY_REL_SEQ;
1437                 status = NFCSTATUS_PENDING;
1438             }
1439             break;
1440         }
1441         case IDENTITY_REL_SEQ:
1442         {
1443             status = phHciNfc_IDMgmt_Release( psHciContext,pHwRef );
1444             if(NFCSTATUS_SUCCESS == status)
1445             {
1446                 psHciContext->hci_seq = LINK_MGMT_REL_SEQ;
1447                 status = NFCSTATUS_PENDING;
1448             }
1449             break;
1450         }
1451         case LINK_MGMT_REL_SEQ:
1452         {
1453             status = phHciNfc_LinkMgmt_Release( psHciContext,pHwRef );
1454             if(NFCSTATUS_SUCCESS == status)
1455             {
1456                 psHciContext->hci_seq = ADMIN_REL_SEQ;
1457                 status = NFCSTATUS_PENDING;
1458             }
1459             break;
1460         }
1461         case ADMIN_REL_SEQ:
1462         {
1463             /*  Admin Management Release Sequence */
1464             status = phHciNfc_Admin_Release( psHciContext,pHwRef, phHciNfc_TerminalHostID );
1465             if(NFCSTATUS_SUCCESS == status)
1466             {
1467                 psHciContext->hci_seq = DEV_REL_SEQ;
1468                 status = NFCSTATUS_PENDING;
1469             }
1470             break;
1471         }
1472         case HCI_END_SEQ:
1473         {
1474             pphNfcIF_Notification_CB_t  p_upper_notify = 
1475                                             psHciContext->p_upper_notify;
1476             phNfc_sLowerIF_t            *plower_if = 
1477                                             &(psHciContext->lower_interface);
1478             void                        *pcontext = 
1479                                                 psHciContext->p_upper_context;
1480             phNfc_sCompletionInfo_t     comp_info;
1481
1482
1483             status = plower_if->release((void *)plower_if->pcontext,
1484                                             (void *)pHwRef);
1485
1486             phHciNfc_Release_Resources( &psHciContext );
1487             /* De-Initialisation Complete Notification to the Upper Layer */
1488             comp_info.status = status;
1489             phHciNfc_Notify(p_upper_notify, pcontext, pHwRef,
1490                                     NFC_NOTIFY_DEINIT_COMPLETED, &comp_info);
1491
1492             HCI_PRINT("HCI Release Completed \n");
1493             break;
1494         }
1495         default:
1496         {
1497             /* psHciContext->hci_seq = HCI_END_SEQ; */
1498             break;
1499         }
1500     }
1501
1502     return status;
1503 }
1504
1505
1506 static
1507 NFCSTATUS
1508 phHciNfc_Config_Sequence(
1509                            phHciNfc_sContext_t      *psHciContext,
1510                            void                 *pHwRef
1511                         )
1512 {
1513     NFCSTATUS                   status = NFCSTATUS_SUCCESS;
1514     phNfc_sCompletionInfo_t     comp_info = {FALSE,0,NULL};
1515
1516     switch(psHciContext->config_type)
1517     {
1518         case POLL_LOOP_CFG:
1519         {
1520             status = phHciNfc_PollLoop_Sequence( psHciContext, pHwRef );
1521             break;
1522         }
1523         case SMX_WI_MODE:
1524         {
1525             status = phHciNfc_SmartMx_Mode_Sequence( psHciContext, pHwRef );
1526             break;
1527         }
1528 #ifdef ENABLE_P2P
1529         case NFC_GENERAL_CFG:
1530         {
1531             if(TARGET_GENERAL_SEQ == psHciContext->hci_seq)
1532             {
1533                 status = phHciNfc_NfcIP_SetATRInfo( psHciContext,
1534                                         pHwRef, NFCIP_TARGET, 
1535                                         psHciContext->p_config_params);
1536                     if( NFCSTATUS_PENDING != status )
1537                     {
1538                         /* Roll Back the State Machine to its Original State */
1539                         phHciNfc_FSM_Rollback ( psHciContext );
1540                     }
1541                     else
1542                     {
1543                         psHciContext->hci_seq = HCI_END_SEQ;
1544                     }
1545             }
1546             else
1547             {
1548                 status = phHciNfc_Pending_Sequence(psHciContext, pHwRef );
1549                 if (NFCSTATUS_PENDING != status)
1550                 {
1551                     /* Roll Back to its Current State as Configuration is Complete */
1552                     phHciNfc_FSM_Rollback(psHciContext); 
1553
1554                     HCI_PRINT(" NFC-IP(P2P) Configuration Completed. \n");
1555                     comp_info.status = status;
1556                     psHciContext->error_status = NFCSTATUS_SUCCESS;
1557                     phHciNfc_Notify(psHciContext->p_upper_notify,
1558                                     psHciContext->p_upper_context, pHwRef,
1559                                         NFC_NOTIFY_CONFIG_SUCCESS , &comp_info);
1560                 }
1561             }
1562             break;
1563         }
1564 #endif
1565         case SWP_PROTECT_CFG:
1566         case SWP_EVT_CFG:
1567         case SMX_WI_CFG:
1568         {
1569             /* Roll Back to its Current State as Configuration is Complete */
1570             phHciNfc_FSM_Rollback(psHciContext); 
1571
1572             HCI_DEBUG(" %s Configuration Completed. \n",
1573                   ((SMX_WI_CFG == psHciContext->config_type)?
1574                         "SmartMX" : "SWP Event/Protection"));
1575
1576             comp_info.status = status;
1577             phHciNfc_Notify(psHciContext->p_upper_notify,
1578                                 psHciContext->p_upper_context, pHwRef,
1579                                 NFC_NOTIFY_CONFIG_SUCCESS, &comp_info);
1580             break;
1581         }
1582         case NFC_TARGET_CFG:
1583         {
1584             status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
1585             break;
1586         }
1587         case UICC_SWP_CFG:
1588 #if 0
1589         {
1590             phHal_sEmulationCfg_t   *p_emulation_cfg = 
1591                                         (phHal_sEmulationCfg_t * )
1592                                                 psHciContext->p_config_params;
1593             if (NULL != p_emulation_cfg)
1594             {
1595                 phHal_sUiccEmuCfg_t   *uicc_config = 
1596                                     &p_emulation_cfg->config.uiccEmuCfg;
1597                 if( TRUE == uicc_config->enableUicc )
1598                 {
1599                     status = phHciNfc_Uicc_Connect_Status(psHciContext,pHwRef);
1600                     if( NFCSTATUS_PENDING == status )
1601                     {
1602                         break;
1603                     } /* Or Else Fall through to notify the above layer */
1604                 }
1605             }
1606         }
1607 #endif
1608         /* fall through */
1609         case NFC_CE_A_CFG:
1610         case NFC_CE_B_CFG:
1611         {
1612             status = phHciNfc_EmulationCfg_Sequence( psHciContext, pHwRef );
1613             break;
1614         }
1615         default:
1616         {
1617             status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_SEQUENCE);       
1618             break;
1619         }
1620     }
1621     
1622     return status;
1623 }
1624
1625
1626 NFCSTATUS
1627 phHciNfc_PollLoop_Sequence(
1628                            phHciNfc_sContext_t      *psHciContext,
1629                            void                 *pHwRef
1630                            )
1631 {
1632     NFCSTATUS           status = NFCSTATUS_SUCCESS;
1633     phHal_sADD_Cfg_t    *p_poll_config = (phHal_sADD_Cfg_t * )
1634         psHciContext->p_config_params;
1635     if (NULL != p_poll_config)
1636     {
1637         uint8_t speed = 
1638                 p_poll_config->NfcIP_Mode;
1639         switch(psHciContext->hci_seq)
1640         {
1641             case PL_DURATION_SEQ:
1642             {
1643                 status = phHciNfc_PollLoop_Cfg( psHciContext, pHwRef,
1644                     (uint8_t)PL_DURATION , NULL);
1645                 if(NFCSTATUS_SUCCESS == status)
1646                 {
1647 #if defined (ENABLE_P2P) && defined (TARGET_SPEED)
1648                     psHciContext->hci_seq = TARGET_SPEED_SEQ;
1649 #elif defined (ENABLE_P2P) && defined (INITIATOR_SPEED)
1650                     psHciContext->hci_seq = INITIATOR_SPEED_SEQ;
1651 #elif defined (ENABLE_P2P) &&  defined (NFCIP_TGT_DISABLE_CFG)
1652                     psHciContext->hci_seq = PL_TGT_DISABLE_SEQ;
1653 #else
1654                     psHciContext->hci_seq = PL_CONFIG_PHASE_SEQ;  
1655 #endif
1656
1657                     status = NFCSTATUS_PENDING;
1658                 }
1659                 break;
1660             }
1661 #if defined (ENABLE_P2P) && defined (TARGET_SPEED)
1662             case TARGET_SPEED_SEQ:
1663             {
1664 #define NFCIP_ACTIVE_SHIFT      0x03U
1665 #define NFCIP_PASSIVE_MASK      0x07U
1666                 uint8_t mode = ( NXP_NFCIP_ACTIVE_DEFAULT << NFCIP_ACTIVE_SHIFT ) |
1667                                                                         ( DEFAULT_NFCIP_TARGET_MODE_SUPPORT & NFCIP_PASSIVE_MASK );
1668                 status = 
1669                     phHciNfc_NfcIP_SetMode( psHciContext, pHwRef, NFCIP_TARGET,
1670                      (uint8_t) mode );
1671                 if(NFCSTATUS_PENDING == status)
1672                 {
1673 #if defined (INITIATOR_SPEED)
1674                     psHciContext->hci_seq = INITIATOR_SPEED_SEQ;
1675 #elif defined (NFCIP_TGT_DISABLE_CFG)
1676                     psHciContext->hci_seq = PL_TGT_DISABLE_SEQ;
1677 #else
1678                     psHciContext->hci_seq = PL_CONFIG_PHASE_SEQ;  
1679 #endif
1680                     status = NFCSTATUS_PENDING;
1681                 }
1682                 break;
1683             }
1684 #endif
1685 #if defined (ENABLE_P2P) && defined (INITIATOR_SPEED)
1686             case INITIATOR_SPEED_SEQ:
1687             {
1688                 status = 
1689                     phHciNfc_NfcIP_SetMode( psHciContext, pHwRef, NFCIP_INITIATOR,
1690                      (uint8_t) (speed & DEFAULT_NFCIP_INITIATOR_MODE_SUPPORT));
1691                 if(NFCSTATUS_PENDING == status)
1692                 {
1693 #if defined (NFCIP_TGT_DISABLE_CFG)
1694                     psHciContext->hci_seq = PL_TGT_DISABLE_SEQ;
1695 #else
1696                     psHciContext->hci_seq = PL_CONFIG_PHASE_SEQ;  
1697 #endif
1698                     status = NFCSTATUS_PENDING;
1699                 }
1700                 break;
1701             }
1702 #endif
1703 #if defined (ENABLE_P2P) && defined (NFCIP_TGT_DISABLE_CFG)
1704             case PL_TGT_DISABLE_SEQ:
1705             {
1706                 /* Configure the Polling Loop Target Disable Parameter */
1707                 status = phHciNfc_PollLoop_Cfg( psHciContext, pHwRef,
1708                 (uint8_t)PL_DISABLE_TARGET, &p_poll_config->NfcIP_Tgt_Disable );
1709                 if(NFCSTATUS_SUCCESS == status)
1710                 {
1711                     psHciContext->hci_seq = PL_CONFIG_PHASE_SEQ;  
1712                     status = NFCSTATUS_PENDING;
1713                 }
1714                 break;
1715             }
1716 #endif
1717             case PL_CONFIG_PHASE_SEQ:
1718             {
1719                 phHal_sPollDevInfo_t *p_poll_info = 
1720                                 &(p_poll_config->PollDevInfo.PollCfgInfo);
1721
1722                 p_poll_info->EnableIso14443A = 
1723                     ( (p_poll_info->EnableIso14443A)
1724                                     || ( speed & (uint8_t)phHal_ePassive106 ) 
1725                                     );
1726                 p_poll_info->EnableFelica212 = 
1727                             ( (p_poll_info->EnableFelica212)
1728                                     || ( speed & (uint8_t)phHal_ePassive212 ) 
1729                                     );
1730                 p_poll_info->EnableFelica424 = 
1731                             ( (p_poll_info->EnableFelica424)
1732                                     || ( speed & (uint8_t)phHal_ePassive424 ) 
1733                                     );
1734                 /* Configure the Polling Loop Gate Parameters */
1735                 status = phHciNfc_PollLoop_Cfg( psHciContext, pHwRef,
1736                     (uint8_t)PL_RD_PHASES, NULL );
1737                 if(NFCSTATUS_SUCCESS == status)
1738                 {
1739                     if(((~(PL_RD_PHASES_DISABLE)) & 
1740                             p_poll_config->PollDevInfo.PollEnabled)!= 0)
1741                     {
1742                         psHciContext->hci_seq = READER_ENABLE_SEQ;
1743                     }
1744                     else
1745                     {
1746                         /* psHciContext->hci_seq = READER_DISABLE_SEQ; */
1747                         psHciContext->hci_seq = HCI_END_SEQ;
1748                     }
1749                     status = NFCSTATUS_PENDING;
1750                 }
1751                 break;
1752             }
1753             case READER_ENABLE_SEQ:
1754             {
1755                 status = 
1756                     phHciNfc_ReaderMgmt_Enable_Discovery( 
1757                     psHciContext, pHwRef );
1758                 if(NFCSTATUS_SUCCESS == status)
1759                 {
1760                     /* psHciContext->hci_seq = PL_CONFIG_PHASE_SEQ; */
1761                     psHciContext->hci_seq = HCI_END_SEQ;  
1762                     status = NFCSTATUS_PENDING;
1763                 }
1764                 break;
1765             }
1766             case READER_DISABLE_SEQ:
1767             {
1768                 status = phHciNfc_ReaderMgmt_Disable_Discovery( 
1769                     psHciContext, pHwRef );
1770
1771                 if(NFCSTATUS_SUCCESS == status)
1772                 {
1773                     if((~(PL_RD_PHASES_DISABLE) & 
1774                             p_poll_config->PollDevInfo.PollEnabled)!= 0)
1775                     {
1776                         psHciContext->hci_seq = PL_DURATION_SEQ;
1777                     }
1778                     else
1779                     {
1780 #if defined (ENABLE_P2P) && defined (INITIATOR_SPEED)
1781                         psHciContext->hci_seq = INITIATOR_SPEED_SEQ;
1782 #elif defined (ENABLE_P2P) &&  defined (NFCIP_TGT_DISABLE_CFG)
1783                         psHciContext->hci_seq = PL_TGT_DISABLE_SEQ;
1784 #else
1785                         psHciContext->hci_seq = PL_CONFIG_PHASE_SEQ;  
1786 #endif
1787                         /* psHciContext->hci_seq = HCI_END_SEQ; */
1788                     }
1789                     status = NFCSTATUS_PENDING;
1790                 }
1791                 break;
1792             }
1793             case HCI_END_SEQ:
1794             {
1795                 phNfc_sCompletionInfo_t     comp_info;
1796                 status = phHciNfc_Pending_Sequence(psHciContext, pHwRef );
1797                 if (NFCSTATUS_PENDING != status)
1798                 {
1799                     /* status = phHciNfc_FSM_Complete ( psHciContext );*/
1800                     phHciNfc_FSM_Rollback ( psHciContext );
1801                     /* Poll Configuration Notification to the Upper Layer */
1802                     if((~(PL_RD_PHASES_DISABLE) & 
1803                             p_poll_config->PollDevInfo.PollEnabled)!= 0)
1804                     {
1805                         comp_info.status = status;
1806                         phHciNfc_Notify(psHciContext->p_upper_notify,
1807                             psHciContext->p_upper_context, pHwRef,
1808                             NFC_NOTIFY_POLL_ENABLED, &comp_info);
1809                     } 
1810                     else
1811                     {
1812                         comp_info.status = status;
1813                         phHciNfc_Notify(psHciContext->p_upper_notify,
1814                             psHciContext->p_upper_context, pHwRef,
1815                             NFC_NOTIFY_POLL_DISABLED, &comp_info);
1816                     }
1817                     HCI_PRINT("HCI Discovery Configuration Completed \n");
1818                 }
1819                 break;
1820             }
1821             default:
1822             {
1823                 /* psHciContext->hci_seq = HCI_END_SEQ; */
1824                 break;
1825             }
1826         }/* End of the Poll Sequence Switch */
1827     }/* End of the Poll Config info Check */
1828
1829     return status;
1830 }
1831
1832
1833 NFCSTATUS
1834 phHciNfc_EmulationCfg_Sequence(
1835                             phHciNfc_sContext_t     *psHciContext,
1836                             void                    *pHwRef
1837                          )
1838 {
1839     NFCSTATUS               status = NFCSTATUS_SUCCESS;
1840     static phNfc_sCompletionInfo_t      comp_info = {FALSE,0,NULL};
1841 #if defined(HOST_EMULATION)
1842     phHciNfc_GateID_t       ce_gate = phHciNfc_UnknownGate;
1843 #endif  /* #ifdef HOST_EMULATION */
1844     phHal_sEmulationCfg_t   *p_emulation_cfg = (phHal_sEmulationCfg_t * )
1845                                         psHciContext->p_config_params;
1846 #ifdef UICC_SESSION_RESET
1847     uint8_t                 uicc_clear_pipes = FALSE;
1848 #endif
1849
1850
1851     if (NULL != p_emulation_cfg)
1852     {
1853 #if defined(HOST_EMULATION)
1854         if(NFC_HOST_CE_A_EMULATION == p_emulation_cfg->emuType)
1855         {
1856             psHciContext->config_type = NFC_CE_A_CFG;
1857             if (NULL == psHciContext->p_ce_a_info)
1858             {
1859                 ce_gate = phHciNfc_CETypeAGate;
1860             }
1861         }
1862         else if (NFC_HOST_CE_B_EMULATION == p_emulation_cfg->emuType)
1863         {
1864             psHciContext->config_type = NFC_CE_B_CFG;
1865             if (NULL == psHciContext->p_ce_b_info)
1866             {
1867                 ce_gate = phHciNfc_CETypeBGate;
1868             }
1869         }
1870 #ifdef UICC_SESSION_RESET
1871         else if ((NFC_UICC_EMULATION == p_emulation_cfg->emuType)
1872             &&(FALSE == p_emulation_cfg->config.uiccEmuCfg.enableUicc)
1873             )
1874         {
1875             uicc_clear_pipes = TRUE;
1876         }
1877 #endif
1878         else
1879         {
1880             ;
1881         }
1882 #endif  /* #ifdef HOST_EMULATION */
1883
1884         switch(psHciContext->hci_seq)
1885         {
1886 #if defined(HOST_EMULATION)
1887             case ADMIN_CE_SEQ:
1888             {
1889                 if(phHciNfc_UnknownGate != ce_gate)
1890                 {
1891                     status = phHciNfc_Admin_CE_Init(psHciContext, pHwRef, ce_gate);
1892                 }
1893                 else
1894                 {
1895                     status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_NOT_ALLOWED);
1896                 }
1897
1898                 if(NFCSTATUS_SUCCESS == status)
1899                 {
1900                     psHciContext->hci_seq = EMULATION_CONFIG_SEQ;
1901                     /* psHciContext->hci_seq = HCI_END_SEQ; */
1902                     status = NFCSTATUS_PENDING;
1903                 }
1904                 break;
1905             }
1906 #endif
1907             case EMULATION_CONFIG_SEQ:
1908             {
1909                 status = phHciNfc_Emulation_Cfg(psHciContext, pHwRef, 
1910                                                 psHciContext->config_type);
1911                 if(NFCSTATUS_SUCCESS == status)
1912                 {
1913                     /* psHciContext->hci_seq = PL_CONFIG_PHASE_SEQ; */
1914 #ifdef UICC_SESSION_RESET
1915                     if(UICC_SWP_CFG == psHciContext->config_type)
1916                     {
1917                         psHciContext->hci_seq = ADMIN_REL_SEQ;
1918                     }
1919                     else
1920 #endif /* UICC_SESSION_RESET */
1921                     {
1922                         psHciContext->hci_seq = HCI_END_SEQ;
1923                     }
1924                     status = NFCSTATUS_PENDING;
1925                 }
1926                 break;
1927             }
1928 #ifdef UICC_SESSION_RESET
1929             case ADMIN_REL_SEQ:
1930             {
1931                 if (TRUE == uicc_clear_pipes)
1932                 {
1933                     /*  Admin Management UICC Release Sequence */
1934                     status = phHciNfc_Admin_Release( psHciContext,pHwRef, phHciNfc_UICCHostID );
1935                     if(NFCSTATUS_SUCCESS == status)
1936                     {
1937                         psHciContext->hci_seq = HCI_END_SEQ;
1938                         if (UICC_SWP_CFG == psHciContext->config_type)
1939                         {
1940                             (void)phHciNfc_SWP_Update_Sequence(psHciContext, 
1941                                                                         CONFIG_SEQ );
1942                         }
1943                         status = NFCSTATUS_PENDING;
1944                     }
1945                     break;
1946                 }
1947             }
1948 #endif /* UICC_SESSION_RESET */
1949             /* fall through */
1950             case HCI_END_SEQ:
1951             {
1952                 phHciNfc_FSM_Rollback(psHciContext); 
1953
1954                 HCI_PRINT(" Emulation Configuration Completed. \n");
1955
1956                 comp_info.status = status;
1957                 phHciNfc_Notify(psHciContext->p_upper_notify,
1958                                  psHciContext->p_upper_context, pHwRef,
1959                                    NFC_NOTIFY_CONFIG_SUCCESS, &comp_info);
1960                 break;
1961             }
1962             default:
1963             {
1964                 /* psHciContext->hci_seq = HCI_END_SEQ; */
1965                 break;
1966             }
1967         }
1968         /*
1969             NFC_CE_A_CFG;
1970             NFC_CE_B_CFG; */
1971
1972     }/* End of the Emulation Config info Check */
1973     
1974     return status;
1975 }
1976
1977
1978 NFCSTATUS
1979 phHciNfc_SmartMx_Mode_Sequence(
1980                            phHciNfc_sContext_t      *psHciContext,
1981                            void                     *pHwRef
1982                           )
1983 {
1984     NFCSTATUS           status = NFCSTATUS_SUCCESS;
1985     phHal_sADD_Cfg_t    *p_poll_config = (phHal_sADD_Cfg_t * )
1986         psHciContext->p_config_params;
1987     phNfc_sCompletionInfo_t     comp_info = {FALSE,0,NULL};
1988     if (NULL != p_poll_config)
1989     {
1990         switch(psHciContext->hci_seq)
1991         {
1992             case READER_DISABLE_SEQ:
1993             {
1994                 status = phHciNfc_ReaderMgmt_Disable_Discovery( 
1995                     psHciContext, pHwRef );
1996                 if(NFCSTATUS_SUCCESS == status)
1997                 {
1998                     psHciContext->hci_seq = EMULATION_CONFIG_SEQ;
1999                     /* psHciContext->hci_seq = HCI_END_SEQ; */
2000                     status = NFCSTATUS_PENDING;
2001                 }
2002                 break;
2003             }
2004             case EMULATION_CONFIG_SEQ:
2005             {
2006                 status = phHciNfc_WI_Configure_Mode( 
2007                     psHciContext, pHwRef,psHciContext->smx_mode );
2008                 if(NFCSTATUS_SUCCESS == status)
2009                 {
2010                     psHciContext->hci_seq = PL_CONFIG_PHASE_SEQ;
2011                     /* psHciContext->hci_seq = HCI_END_SEQ; */
2012                     status = NFCSTATUS_PENDING;
2013                 }
2014                 break;
2015             }
2016             case PL_CONFIG_PHASE_SEQ:
2017             {
2018                 /* Configure the Polling Loop Gate Parameters */
2019                 status = phHciNfc_PollLoop_Cfg( psHciContext, pHwRef,
2020                     (uint8_t)PL_RD_PHASES, NULL );
2021                 if(NFCSTATUS_SUCCESS == status)
2022                 {
2023                     psHciContext->hci_seq = READER_ENABLE_SEQ;
2024                     status = NFCSTATUS_PENDING;
2025                 }
2026                 break;
2027             }
2028             case READER_ENABLE_SEQ:
2029             {
2030                 status = 
2031                     phHciNfc_ReaderMgmt_Enable_Discovery( 
2032                     psHciContext, pHwRef );
2033                 if(NFCSTATUS_SUCCESS == status)
2034                 {
2035                     /* psHciContext->hci_seq = PL_CONFIG_PHASE_SEQ; */
2036                     psHciContext->hci_seq = HCI_END_SEQ;  
2037                     status = NFCSTATUS_PENDING;
2038                 }
2039                 break;
2040             }
2041             case HCI_END_SEQ:
2042             {
2043                 status = phHciNfc_Pending_Sequence(psHciContext, pHwRef );
2044                 if (NFCSTATUS_PENDING != status)
2045                 {
2046                     /* status = phHciNfc_FSM_Complete ( psHciContext );*/
2047                     phHciNfc_FSM_Rollback ( psHciContext );
2048                     if( hciState_Disconnect == psHciContext->hci_state.cur_state)
2049                     {
2050                         psHciContext->host_rf_type = phHal_eUnknown_DevType;
2051                         psHciContext->p_target_info = NULL;
2052                         psHciContext->p_xchg_info = NULL;
2053                     }
2054                     /* Poll Configuration Notification to the Upper Layer */
2055                     if((~(PL_RD_PHASES_DISABLE) & 
2056                             p_poll_config->PollDevInfo.PollEnabled)!= 0)
2057                     {
2058                         comp_info.status = status;
2059                         phHciNfc_Notify(psHciContext->p_upper_notify,
2060                             psHciContext->p_upper_context, pHwRef,
2061                             NFC_NOTIFY_POLL_ENABLED, &comp_info);
2062                     } 
2063                     else
2064                     {
2065                         comp_info.status = status;
2066                         phHciNfc_Notify(psHciContext->p_upper_notify,
2067                             psHciContext->p_upper_context, pHwRef,
2068                             NFC_NOTIFY_POLL_DISABLED, &comp_info);
2069                     }
2070                     HCI_PRINT("HCI Discovery Configuration Completed \n");
2071                 }
2072                 break;
2073             }
2074             default:
2075             {
2076                 /* psHciContext->hci_seq = HCI_END_SEQ; */
2077                 break;
2078             }
2079         }/* End of the Poll Sequence Switch */
2080     }/* End of the Poll Config info Check */
2081
2082     return status;
2083 }
2084
2085
2086 NFCSTATUS
2087 phHciNfc_Connect_Sequence(
2088                             phHciNfc_sContext_t     *psHciContext,
2089                             void                    *pHwRef
2090                          )
2091 {
2092     NFCSTATUS           status = NFCSTATUS_SUCCESS;
2093     static phNfc_sCompletionInfo_t      comp_info = {FALSE,0,NULL};
2094     phHal_eRemDevType_t         target_type = phHal_eUnknown_DevType;
2095
2096     if( NULL != psHciContext->p_target_info )
2097     {
2098
2099         target_type = psHciContext->p_target_info->RemDevType;
2100         switch(psHciContext->hci_seq)
2101         {
2102             case READER_REACTIVATE_SEQ:
2103             {
2104                 /* Complete the Reactivate Sequence and notify the HAL */
2105                 status = phHciNfc_FSM_Complete ( psHciContext );
2106                 /* Reactivate Complete Notification to the Upper Layer */
2107                 if(NFCSTATUS_SUCCESS == status)
2108                 {
2109                     comp_info.status = status;
2110                     phHciNfc_Notify(psHciContext->p_upper_notify,
2111                                     psHciContext->p_upper_context, pHwRef,
2112                                     NFC_NOTIFY_TARGET_REACTIVATED , &comp_info);
2113                     HCI_PRINT(" HCI Remote Target Reactivated. \n");
2114                 }
2115                 else
2116                 {
2117                     comp_info.status = status;
2118                     phHciNfc_FSM_Rollback ( psHciContext );
2119                     phHciNfc_Notify(psHciContext->p_upper_notify,
2120                         psHciContext->p_upper_context, pHwRef,
2121                         NFC_NOTIFY_ERROR , &comp_info);
2122                     HCI_PRINT("HCI FSM Invalid Selection State \n");
2123                     HCI_PRINT("HCI Remote Target Reactivation Failed \n");
2124                 }
2125                 break;
2126             }
2127             case READER_SELECT_SEQ:
2128             {
2129                 /* If the Target is Mifare then it should fall through */
2130                 if(( phHal_eMifare_PICC != target_type ) 
2131                     &&(phHal_eISO14443_3A_PICC != target_type)
2132 #ifdef TYPE_B
2133                     &&  ( phHal_eISO14443_B_PICC != target_type )
2134                     &&  ( phHal_eISO14443_4B_PICC != target_type )
2135 #endif
2136 #ifdef TYPE_FELICA
2137                     &&  ( phHal_eFelica_PICC != target_type )
2138 #endif
2139 #ifdef TYPE_JEWEL
2140                     &&  ( phHal_eJewel_PICC != target_type )
2141 #endif /* #ifdef TYPE_JEWEL */
2142 #ifdef TYPE_ISO15693
2143                     &&  ( phHal_eISO15693_PICC != target_type )
2144 #endif /* #ifdef TYPE_ISO15693 */
2145
2146                     )
2147                 {
2148                     status = phHciNfc_ReaderMgmt_Info_Sequence( psHciContext, pHwRef );
2149                     if(NFCSTATUS_SUCCESS == status)
2150                     {
2151                         psHciContext->hci_seq = HCI_END_SEQ;
2152                         status = NFCSTATUS_PENDING;
2153                     }
2154                     break;
2155                 }
2156             }
2157             /* fall through */
2158             case HCI_END_SEQ:
2159             {
2160                 /* Complete the Connect Sequence and notify the HAL */
2161                 status = phHciNfc_FSM_Complete ( psHciContext );
2162                 /* Connection Complete Notification to the Upper Layer */
2163                 if(NFCSTATUS_SUCCESS == status)
2164                 {
2165                     /* Invalidate the previously polled RF Reader Type */
2166                     /* psHciContext->host_rf_type = phHal_eInvalidRFType;*/
2167                     comp_info.status = status;
2168                     phHciNfc_Notify(psHciContext->p_upper_notify,
2169                                     psHciContext->p_upper_context, pHwRef,
2170                                     NFC_NOTIFY_TARGET_CONNECTED , &comp_info);
2171                     HCI_PRINT(" HCI Remote Target Selected for Transaction. \n");
2172                 }
2173                 else
2174                 {
2175                     comp_info.status = status;
2176                     /* phHciNfc_FSM_Rollback ( psHciContext ); */
2177                     phHciNfc_Notify(psHciContext->p_upper_notify,
2178                         psHciContext->p_upper_context, pHwRef,
2179                         NFC_NOTIFY_ERROR , &comp_info);
2180                     HCI_PRINT("HCI FSM Invalid Selection State \n");
2181                     HCI_PRINT("HCI Remote Target Selection Failed \n");
2182                 }
2183                 break;
2184             }
2185             default:
2186             {
2187                 HCI_PRINT("\t Invalid HCI Connect Sequence \n");
2188                 /* psHciContext->hci_seq = HCI_END_SEQ; */
2189                 break;
2190             }
2191         }/* End of the Connect Sequence Switch */
2192     }
2193
2194     return status;
2195 }
2196
2197
2198 NFCSTATUS
2199 phHciNfc_Disconnect_Sequence(
2200                             phHciNfc_sContext_t     *psHciContext,
2201                             void                    *pHwRef
2202                          )
2203 {
2204     NFCSTATUS           status = NFCSTATUS_SUCCESS;
2205     static phNfc_sCompletionInfo_t      comp_info = {FALSE, 0 , NULL};
2206     phHal_eRemDevType_t         target_type = phHal_eUnknown_DevType;
2207     uint8_t             re_poll = 0;
2208
2209     if( NULL != psHciContext->p_target_info )
2210     {
2211
2212         target_type = psHciContext->p_target_info->RemDevType;
2213         switch(psHciContext->hci_seq)
2214         {
2215             case READER_UICC_DISPATCH_SEQ:
2216             {
2217                 status = phHciNfc_ReaderMgmt_UICC_Dispatch( 
2218                                 psHciContext, pHwRef, target_type );
2219                 psHciContext->hci_seq = READER_DESELECT_SEQ;
2220                 if(NFCSTATUS_PENDING == status)
2221                 {
2222                     break;
2223                 }
2224             }
2225             /* fall through */
2226             case READER_DESELECT_SEQ:
2227             {
2228                 re_poll = (uint8_t) ( NULL != psHciContext->p_config_params )?
2229                                 *((uint8_t *)psHciContext->p_config_params):FALSE;
2230                 status = phHciNfc_ReaderMgmt_Deselect( 
2231                                 psHciContext, pHwRef, target_type, re_poll);
2232                 if(NFCSTATUS_PENDING == status)
2233                 {
2234                     psHciContext->hci_seq = HCI_END_SEQ;
2235                     psHciContext->p_config_params = NULL;
2236                 }
2237                 break;
2238             }
2239             case HCI_END_SEQ:
2240             {
2241                 /* Complete the Disconnect Sequence and notify the HAL */
2242                 status = phHciNfc_FSM_Complete ( psHciContext );
2243                 /* Disconnect Notification to the Upper Layer */
2244                 if(NFCSTATUS_SUCCESS == status)
2245                 {
2246                     /* Invalidate the previously polled RF Reader Type */
2247                     psHciContext->host_rf_type = phHal_eUnknown_DevType;
2248                     psHciContext->p_target_info = NULL;
2249                     psHciContext->p_xchg_info = NULL;
2250                     comp_info.status = status;
2251                     phHciNfc_Notify(psHciContext->p_upper_notify,
2252                                     psHciContext->p_upper_context, pHwRef,
2253                                     NFC_NOTIFY_TARGET_DISCONNECTED , &comp_info);
2254                     HCI_PRINT(" HCI Remote Target De-Selected. \n");
2255                 }
2256                 else
2257                 {
2258                     comp_info.status = status;
2259                     /* phHciNfc_FSM_Rollback ( psHciContext ); */
2260                     phHciNfc_Notify(psHciContext->p_upper_notify,
2261                         psHciContext->p_upper_context, pHwRef,
2262                         NFC_NOTIFY_ERROR , &comp_info);
2263                     HCI_PRINT("HCI FSM Invalid De-Selection State \n");
2264                     HCI_PRINT("HCI Remote Target De-Selection Failed \n");
2265                 }
2266
2267                 break;
2268             }
2269             default:
2270             {
2271                 HCI_PRINT("\t Invalid HCI Connect Sequence \n");
2272                 /* psHciContext->hci_seq = HCI_END_SEQ; */
2273                 break;
2274             }
2275         }/* End of the Connect Sequence Switch */
2276     }
2277
2278     return status;
2279 }
2280
2281
2282 static
2283 NFCSTATUS
2284 phHciNfc_Transact_Sequence(
2285                             phHciNfc_sContext_t     *psHciContext,
2286                             void                    *pHwRef
2287                          )
2288 {
2289     static phNfc_sTransactionInfo_t transact_info = {FALSE,0,NULL,NULL,0};
2290
2291     pphNfcIF_Notification_CB_t  p_upper_notify = psHciContext->p_upper_notify;
2292     void                        *pcontext = psHciContext->p_upper_context;
2293     uint8_t                     transact_result = NFC_NOTIFY_ERROR;
2294
2295     /* Roll Back to Connect State as Transceive is Complete */
2296     phHciNfc_FSM_Rollback(psHciContext); 
2297
2298     switch (psHciContext->host_rf_type)
2299     {
2300         case phHal_eISO14443_A_PCD:
2301 #ifdef TYPE_B
2302         case phHal_eISO14443_B_PCD:
2303 #endif
2304         case phHal_eISO14443_BPrime_PCD:
2305 #ifdef TYPE_FELICA
2306         case phHal_eFelica_PCD:
2307 #endif
2308 #ifdef TYPE_ISO15693
2309         case phHal_eISO15693_PCD:
2310 #endif
2311         {
2312             if(ZERO != psHciContext->rx_index)
2313             {
2314                 transact_info.status = NFCSTATUS_SUCCESS;
2315                 transact_info.buffer = 
2316                                 &psHciContext->recv_buffer[psHciContext->rx_index];
2317                 transact_info.length = 
2318                                 psHciContext->rx_total - psHciContext->rx_index;
2319                 transact_result = NFC_NOTIFY_TRANSCEIVE_COMPLETED;
2320             }
2321             else
2322             {
2323                 transact_info.status = NFCSTATUS_FAILED;
2324                 transact_result = NFC_NOTIFY_TRANSCEIVE_ERROR;
2325             }
2326             HCI_PRINT(" HCI Transceive operation Completed. \n");
2327             psHciContext->p_xchg_info = NULL ;
2328             break;
2329         }
2330 #ifdef TYPE_JEWEL
2331         /* fall through */
2332         case phHal_eJewel_PCD:
2333 #endif
2334         {
2335             transact_info.status = NFCSTATUS_SUCCESS;
2336             transact_info.buffer = 
2337                             &psHciContext->recv_buffer[psHciContext->rx_index];
2338             transact_info.length = 
2339                             psHciContext->rx_total - psHciContext->rx_index;
2340             transact_result = NFC_NOTIFY_TRANSCEIVE_COMPLETED;
2341             HCI_PRINT(" HCI Transceive operation Completed. \n");
2342             psHciContext->p_xchg_info = NULL ;
2343             break;
2344         }
2345 #if defined(ENABLE_P2P)
2346         case phHal_eNfcIP1_Initiator:
2347         case phHal_eNfcIP1_Target:
2348 #endif
2349         {
2350             HCI_PRINT(" HCI Send operation Completed. \n");
2351             transact_info.status = NFCSTATUS_SUCCESS;
2352             transact_result = NFC_NOTIFY_SEND_COMPLETED;
2353             break;
2354         }
2355         case phHal_eUnknown_DevType:
2356         default:
2357         {
2358             transact_info.status  = 
2359                         PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
2360             break;
2361         }
2362
2363     }
2364     /* Notify the Transceive Completion to the Upper layer */
2365     phHciNfc_Notify( p_upper_notify, pcontext , pHwRef,
2366                     transact_result, &transact_info);
2367
2368     return (NFCSTATUS)NFCSTATUS_SUCCESS;
2369 }
2370
2371 static
2372 NFCSTATUS
2373 phHciNfc_Info_Sequence(
2374                             phHciNfc_sContext_t     *psHciContext,
2375                             void                    *pHwRef
2376                          )
2377 {
2378     NFCSTATUS           status = NFCSTATUS_SUCCESS;
2379
2380     HCI_DEBUG(" HCI: Info Sequence Entry --> Reader Type : %02X \n",
2381                                             psHciContext->host_rf_type);
2382     switch (psHciContext->host_rf_type)
2383     {
2384         case phHal_eISO14443_A_PCD:
2385 #ifdef TYPE_B
2386         case phHal_eISO14443_B_PCD:
2387 #endif
2388         case phHal_eISO14443_BPrime_PCD:
2389 #ifdef TYPE_FELICA
2390         case phHal_eFelica_PCD:
2391 #endif
2392 #ifdef TYPE_JEWEL
2393         case phHal_eJewel_PCD:
2394 #endif
2395 #ifdef TYPE_ISO15693
2396         case phHal_eISO15693_PCD:
2397 #endif
2398         {
2399             /* To update the select sequence to retrieve
2400             * the target information using the reader type.
2401             */
2402             status = phHciNfc_ReaderMgmt_Info_Sequence( psHciContext, pHwRef );
2403             break;
2404         }
2405 #if defined(ENABLE_P2P)
2406         case phHal_eNfcIP1_Initiator:
2407         case phHal_eNfcIP1_Target:
2408         {
2409             status = phHciNfc_NfcIP_Info_Sequence( psHciContext, pHwRef );
2410             break;
2411         }
2412 #endif
2413         case phHal_eUnknown_DevType:
2414         default:
2415         {
2416             status  = 
2417                     PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
2418             break;
2419         }
2420
2421     }
2422     return status;
2423 }
2424
2425 static
2426 NFCSTATUS
2427 phHciNfc_Test_Sequence(
2428                             phHciNfc_sContext_t     *psHciContext,
2429                             void                    *pHwRef,
2430                             NFCSTATUS               test_status,
2431                             uint8_t                 *pdata,
2432                             uint8_t                 length
2433                          )
2434 {
2435     NFCSTATUS           status = NFCSTATUS_SUCCESS;
2436     static phNfc_sCompletionInfo_t      comp_info = {0};
2437     static phNfc_sData_t test_result= {NULL,0};
2438
2439     /* Complete the Test Sequence and notify the HAL */
2440     status = phHciNfc_FSM_Complete ( psHciContext );
2441     /* Test Results to the Upper Layer */
2442     if(NFCSTATUS_SUCCESS == status)
2443     {
2444         comp_info.status = test_status;
2445         if ( (NULL != pdata) && (length >= HCP_HEADER_LEN) )
2446         {
2447             test_result.buffer = ( pdata + HCP_HEADER_LEN);
2448             test_result.length = length - HCP_HEADER_LEN;
2449         }
2450         else
2451         {
2452             status = phHciNfc_DevMgmt_Get_Test_Result( 
2453                                         psHciContext, &test_result );
2454         }
2455         comp_info.info = &test_result;
2456         phHciNfc_Notify(psHciContext->p_upper_notify,
2457                         psHciContext->p_upper_context, pHwRef,
2458                         NFC_NOTIFY_RESULT , &comp_info);
2459         HCI_DEBUG(" HCI System Test Completed : Status = %u\n", test_status);
2460     }
2461     else
2462     {
2463         comp_info.status = status;
2464         phHciNfc_FSM_Rollback ( psHciContext );
2465         phHciNfc_Notify(psHciContext->p_upper_notify,
2466             psHciContext->p_upper_context, pHwRef,
2467             NFC_NOTIFY_ERROR , &comp_info);
2468         HCI_PRINT("HCI FSM Invalid Test State \n");
2469     }
2470
2471     return status;
2472 }
2473
2474 static
2475 NFCSTATUS
2476 phHciNfc_IO_Sequence(
2477                             phHciNfc_sContext_t     *psHciContext,
2478                             void                    *pHwRef,
2479                             NFCSTATUS               io_status,
2480                             uint8_t                 *pdata,
2481                             uint8_t                 length
2482                          )
2483 {
2484     NFCSTATUS           status = NFCSTATUS_SUCCESS;
2485     static phNfc_sCompletionInfo_t      comp_info = {0};
2486
2487     /* To remove "warning (VS 4100) : unreferenced formal parameter" */
2488     PHNFC_UNUSED_VARIABLE(pdata);
2489     PHNFC_UNUSED_VARIABLE(length);
2490     /* Complete the Test Sequence and notify the HAL */
2491     phHciNfc_FSM_Rollback ( psHciContext );
2492     /* Test Results to the Upper Layer */
2493     comp_info.status = io_status;
2494     status = phHciNfc_Pending_Sequence(psHciContext, pHwRef );
2495     if(NFCSTATUS_SUCCESS == io_status)
2496     {
2497         phHciNfc_Notify(psHciContext->p_upper_notify,
2498                         psHciContext->p_upper_context, pHwRef,
2499                         NFC_IO_SUCCESS , &comp_info);
2500         HCI_PRINT(" HCI System IO Successful. \n");
2501     }
2502     else
2503     {
2504         phHciNfc_Notify(psHciContext->p_upper_notify,
2505             psHciContext->p_upper_context, pHwRef,
2506             NFC_IO_ERROR , &comp_info);
2507         HCI_PRINT("HCI IO Error \n");
2508     }
2509     return status;
2510 }
2511
2512
2513
2514 #ifdef OTHER_TAGS
2515
2516 NFCSTATUS
2517 phHciNfc_Activate_Sequence(
2518                             phHciNfc_sContext_t     *psHciContext,
2519                             void                    *pHwRef
2520                          )
2521 {
2522     NFCSTATUS           status = NFCSTATUS_SUCCESS;
2523
2524     return status;
2525 }
2526
2527
2528 #endif
2529
2530