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 * \file  hHciNfc_PipeMgmt.c                                                   *
22 * \brief HCI Pipe Management Routines.                                        *
23 *                                                                             *
24 *                                                                             *
25 * Project: NFC-FRI-1.1                                                        *
26 *                                                                             *
27 * $Date: Tue Aug 18 10:12:39 2009 $                                           *
28 * $Author: ing04880 $                                                         *
29 * $Revision: 1.42 $                                                           *
30 * $Aliases: NFC_FRI1.1_WK934_R31_1,NFC_FRI1.1_WK941_PREP1,NFC_FRI1.1_WK941_PREP2,NFC_FRI1.1_WK941_1,NFC_FRI1.1_WK943_R32_1,NFC_FRI1.1_WK949_PREP1,NFC_FRI1.1_WK943_R32_10,NFC_FRI1.1_WK943_R32_13,NFC_FRI1.1_WK943_R32_14,NFC_FRI1.1_WK1007_R33_1,NFC_FRI1.1_WK1007_R33_4,NFC_FRI1.1_WK1017_PREP1,NFC_FRI1.1_WK1017_R34_1,NFC_FRI1.1_WK1017_R34_2,NFC_FRI1.1_WK1023_R35_1 $
31 *                                                                             *
32 * =========================================================================== *
33 */
34 
35 
36 /*
37 ***************************** Header File Inclusion ****************************
38 */
39 
40 #include <phNfcConfig.h>
41 #include <phNfcCompId.h>
42 #include <phHciNfc_Pipe.h>
43 #include <phOsalNfc.h>
44 #include <phHciNfc_AdminMgmt.h>
45 #include <phHciNfc_LinkMgmt.h>
46 #include <phHciNfc_IDMgmt.h>
47 #include <phHciNfc_DevMgmt.h>
48 #include <phHciNfc_PollingLoop.h>
49 #include <phHciNfc_RFReader.h>
50 #include <phHciNfc_RFReaderA.h>
51 #ifdef TYPE_B
52 #include <phHciNfc_RFReaderB.h>
53 #endif
54 #ifdef TYPE_FELICA
55 #include <phHciNfc_Felica.h>
56 #endif
57 #ifdef TYPE_JEWEL
58 #include <phHciNfc_Jewel.h>
59 #endif
60 #ifdef TYPE_ISO15693
61 #include <phHciNfc_ISO15693.h>
62 #endif
63 #ifdef ENABLE_P2P
64 #include <phHciNfc_NfcIPMgmt.h>
65 #endif
66 #ifdef HOST_EMULATION
67 #include <phHciNfc_CE_A.h>
68 #include <phHciNfc_CE_B.h>
69 #endif
70 #include <phHciNfc_WI.h>
71 #include <phHciNfc_SWP.h>
72 
73 /*
74 ****************************** Macro Definitions *******************************
75 */
76 
77 /*
78 *************************** Structure and Enumeration ***************************
79 */
80 static phHciNfc_GateID_t host_gate_list[] = {
81         phHciNfc_IdentityMgmtGate,
82         phHciNfc_PN544MgmtGate,
83         phHciNfc_PollingLoopGate,
84         phHciNfc_RFReaderAGate,
85 #ifdef TYPE_B
86         phHciNfc_RFReaderBGate,
87 #endif
88 
89 #ifdef TYPE_FELICA
90         phHciNfc_RFReaderFGate,
91 #endif
92 
93 #ifdef TYPE_JEWEL
94         phHciNfc_JewelReaderGate,
95 #endif
96 
97 #ifdef TYPE_ISO15693
98         phHciNfc_ISO15693Gate,
99 #endif
100 
101 #ifdef ENABLE_P2P
102         phHciNfc_NFCIP1InitRFGate,
103         phHciNfc_NFCIP1TargetRFGate,
104 #endif
105         phHciNfc_NfcWIMgmtGate,
106         phHciNfc_SwpMgmtGate,
107 #if defined(HOST_EMULATION) && ( NXP_UICC_CE_RIGHTS < 0x01 )
108         phHciNfc_CETypeAGate,
109         phHciNfc_CETypeBGate,
110 #endif
111         phHciNfc_UnknownGate
112 };
113 
114 /*
115 *************************** Static Function Declaration **************************
116 */
117 
118 static
119 NFCSTATUS
120 phHciNfc_Create_Pipe(
121                         phHciNfc_sContext_t     *psHciContext,
122                         void                    *pHwRef,
123                         phHciNfc_Gate_Info_t    *destination,
124                         phHciNfc_Pipe_Info_t    **ppPipeHandle
125                     );
126 
127 
128 /*
129 *************************** Function Definitions ***************************
130 */
131 
132 
133 /*!
134  * \brief Creation of the Pipe
135  *
136  * This function creates the pipe between a source host's gate and destination
137  * host's gate
138  *
139  */
140 
141 static
142 NFCSTATUS
phHciNfc_Create_Pipe(phHciNfc_sContext_t * psHciContext,void * pHwRef,phHciNfc_Gate_Info_t * destination,phHciNfc_Pipe_Info_t ** ppPipeHandle)143 phHciNfc_Create_Pipe(
144                         phHciNfc_sContext_t     *psHciContext,
145                         void                    *pHwRef,
146                         phHciNfc_Gate_Info_t    *destination,
147                         phHciNfc_Pipe_Info_t    **ppPipeHandle
148                     )
149 {
150     NFCSTATUS       status = NFCSTATUS_SUCCESS;
151 
152     *ppPipeHandle = (phHciNfc_Pipe_Info_t *)
153                         phOsalNfc_GetMemory( sizeof(phHciNfc_Pipe_Info_t) );
154 
155     if(NULL != *ppPipeHandle)
156     {
157         /* The Source Host is the Terminal Host */
158         (*ppPipeHandle)->pipe.source.host_id    = (uint8_t) phHciNfc_TerminalHostID;
159 
160         /* The Source Gate is same as the Destination Gate */
161         (*ppPipeHandle)->pipe.source.gate_id    =
162                                 ((phHciNfc_Gate_Info_t *)destination)->gate_id;
163         (*ppPipeHandle)->pipe.dest.host_id =
164                                 ((phHciNfc_Gate_Info_t *)destination)->host_id;
165         (*ppPipeHandle)->pipe.dest.gate_id  =
166                                 ((phHciNfc_Gate_Info_t *)destination)->gate_id;
167 
168         /* if( hciMode_Override == psHciContext->hci_mode ) */
169         {
170             /* The Pipe ID is unknown until it is assigned */
171             (*ppPipeHandle)->pipe.pipe_id   = (uint8_t) HCI_UNKNOWN_PIPE_ID;
172 
173             status = phHciNfc_Send_Admin_Cmd( psHciContext, pHwRef,
174                                         ADM_CREATE_PIPE, (PIPEINFO_SIZE-1)
175                                                     ,*ppPipeHandle );
176         }
177     }
178     else
179     {
180         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INSUFFICIENT_RESOURCES);
181     }
182     return status;
183 }
184 
185 
186 NFCSTATUS
phHciNfc_Update_Pipe(phHciNfc_sContext_t * psHciContext,void * pHwRef,phHciNfc_PipeMgmt_Seq_t * p_pipe_seq)187 phHciNfc_Update_Pipe(
188                         phHciNfc_sContext_t     *psHciContext,
189                         void                    *pHwRef,
190                         phHciNfc_PipeMgmt_Seq_t *p_pipe_seq
191                     )
192 {
193     static uint8_t pipe_index = HCI_DYNAMIC_PIPE_ID;
194     phHciNfc_Pipe_Info_t  *p_pipe_info = NULL;
195     NFCSTATUS       status = NFCSTATUS_SUCCESS;
196 
197 
198     for (pipe_index = 0;
199             (pipe_index +  HCI_DYNAMIC_PIPE_ID) <=
200                 (uint8_t)(sizeof(host_gate_list)/sizeof(phHciNfc_GateID_t) );
201                     pipe_index++)
202     {
203         status = phHciNfc_Allocate_Resource((void **)&p_pipe_info,
204                                             sizeof(phHciNfc_Pipe_Info_t));
205 
206         if( (NFCSTATUS_SUCCESS == status)
207             && (NULL != p_pipe_info))
208         {
209             /* The Source Host is the Terminal Host */
210             p_pipe_info->pipe.source.host_id  = (uint8_t) phHciNfc_TerminalHostID;
211 
212             /* The Source Gate is same as the Destination Gate */
213             p_pipe_info->pipe.source.gate_id    =
214                                     host_gate_list[pipe_index];
215             p_pipe_info->pipe.dest.host_id =
216                                     phHciNfc_HostControllerID;
217             p_pipe_info->pipe.dest.gate_id  =
218                                     host_gate_list[pipe_index];
219             /* The Pipe ID is unknown until it is assigned */
220             p_pipe_info->pipe.pipe_id   = (uint8_t) HCI_UNKNOWN_PIPE_ID;
221 
222             /* Initialise the Resources for the particular Gate */
223 
224             status = phHciNfc_Create_All_Pipes(psHciContext,
225                                             pHwRef, p_pipe_seq );
226 
227             if( NFCSTATUS_SUCCESS == status )
228             {
229                 uint8_t pipe_id = (uint8_t)(pipe_index + HCI_DYNAMIC_PIPE_ID);
230                 status = phHciNfc_Update_PipeInfo( psHciContext, p_pipe_seq ,
231                                         pipe_id, p_pipe_info );
232                 if( NFCSTATUS_SUCCESS == status )
233                 {
234                     p_pipe_info->pipe.pipe_id = pipe_id;
235                     psHciContext->p_pipe_list[pipe_id] = p_pipe_info;
236                 }
237                 else
238                 {
239                     phOsalNfc_FreeMemory(p_pipe_info);
240                 }
241                 p_pipe_info = NULL;
242             }
243             else
244             {
245                 phOsalNfc_FreeMemory(p_pipe_info);
246                 p_pipe_info = NULL;
247             }
248         }
249         else
250         {
251             status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INSUFFICIENT_RESOURCES);
252         }
253     }
254 
255     if( NFCSTATUS_SUCCESS == status )
256     {
257         status = phHciNfc_LinkMgmt_Initialise( psHciContext,pHwRef );
258         if(NFCSTATUS_SUCCESS == status)
259         {
260             status = phHciNfc_ReaderMgmt_Initialise( psHciContext,pHwRef );
261         }
262         if(NFCSTATUS_SUCCESS == status)
263         {
264             status = phHciNfc_EmuMgmt_Initialise( psHciContext,pHwRef );
265         }
266     }
267 
268     return status;
269 }
270 
271 
272 /*!
273  * \brief Deletion of the Pipe
274  *
275  * This function Deletes a pipe created between a terminal host's gate and
276  *  destination host's gate
277  *
278  */
279 
280 NFCSTATUS
phHciNfc_Delete_Pipe(phHciNfc_sContext_t * psHciContext,void * pHwRef,phHciNfc_Pipe_Info_t * pPipeHandle)281 phHciNfc_Delete_Pipe(
282                         phHciNfc_sContext_t     *psHciContext,
283                         void                    *pHwRef,
284                         phHciNfc_Pipe_Info_t    *pPipeHandle
285                     )
286 {
287     NFCSTATUS       status=NFCSTATUS_SUCCESS;
288     NFCSTATUS       cmd_status = NFCSTATUS_SUCCESS;
289 
290     if( (NULL == psHciContext)
291         || (NULL == pHwRef)
292         || (NULL == pPipeHandle)
293      )
294     {
295       status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
296     }
297     else
298     {
299         cmd_status = phHciNfc_Send_Admin_Cmd( psHciContext, pHwRef,
300                             ADM_DELETE_PIPE, PIPEID_LEN, pPipeHandle );
301         status = ( (cmd_status == NFCSTATUS_PENDING)?
302                                         NFCSTATUS_SUCCESS : cmd_status);
303     }
304 
305     return status;
306 }
307 
308 #ifdef HOST_EMULATION
309 
310 NFCSTATUS
phHciNfc_CE_Pipes_OP(phHciNfc_sContext_t * psHciContext,void * pHwRef,phHciNfc_PipeMgmt_Seq_t * p_pipe_seq)311 phHciNfc_CE_Pipes_OP(
312                                 phHciNfc_sContext_t             *psHciContext,
313                                 void                            *pHwRef,
314                                 phHciNfc_PipeMgmt_Seq_t         *p_pipe_seq
315                              )
316 {
317     NFCSTATUS                   status = NFCSTATUS_SUCCESS;
318     phHciNfc_Pipe_Info_t        *p_pipe_info = NULL;
319     /* uint8_t                      pipe_id = (uint8_t) HCI_UNKNOWN_PIPE_ID; */
320 
321     if( (NULL == psHciContext) || (NULL == pHwRef) )
322     {
323       status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
324     }
325     else
326     {
327         switch( *p_pipe_seq )
328         {
329             case PIPE_CARD_A_CREATE:
330             {
331                 phHciNfc_Gate_Info_t        id_dest;
332 
333                 id_dest.host_id = (uint8_t)phHciNfc_HostControllerID;
334                 id_dest.gate_id = (uint8_t)phHciNfc_CETypeAGate;
335 
336                 status = phHciNfc_CE_A_Init_Resources ( psHciContext );
337                 if(status == NFCSTATUS_SUCCESS)
338                 {
339                     status = phHciNfc_Create_Pipe( psHciContext, pHwRef,
340                                 &id_dest, &p_pipe_info);
341                     status = ((NFCSTATUS_PENDING == status )?
342                                         NFCSTATUS_SUCCESS : status);
343                 }
344                 break;
345             }
346             case PIPE_CARD_B_CREATE:
347             {
348                 phHciNfc_Gate_Info_t        id_dest;
349 
350                 id_dest.host_id = (uint8_t)phHciNfc_HostControllerID;
351                 id_dest.gate_id = (uint8_t)phHciNfc_CETypeBGate;
352 
353                 status = phHciNfc_CE_B_Init_Resources ( psHciContext );
354                 if(status == NFCSTATUS_SUCCESS)
355                 {
356                     status = phHciNfc_Create_Pipe( psHciContext, pHwRef,
357                                 &id_dest, &p_pipe_info);
358                     status = ((NFCSTATUS_PENDING == status )?
359                                         NFCSTATUS_SUCCESS : status);
360                 }
361                 break;
362             }
363 #if 0
364             case PIPE_CARD_F_CREATE:
365             {
366                 phHciNfc_Gate_Info_t        id_dest;
367 
368                 id_dest.host_id = (uint8_t)phHciNfc_HostControllerID;
369                 id_dest.gate_id = (uint8_t)phHciNfc_CETypeFGate;
370 
371                 /* status = phHciNfc_Card_Emulation_Init (psHciContext , TYPE_F); */
372                 if(status == NFCSTATUS_SUCCESS)
373                 {
374                     status = phHciNfc_Create_Pipe( psHciContext, pHwRef,
375                                 &id_dest, &p_pipe_info);
376                      /* status = ((NFCSTATUS_PENDING == status )?
377                                         NFCSTATUS_SUCCESS : status); */
378                 }
379                 break;
380             }
381             case PIPE_CARD_A_DELETE:
382             {
383                 status = phHciNfc_CE_A_Get_PipeID( psHciContext, &pipe_id );
384                 p_pipe_info = psHciContext->p_pipe_list[pipe_id];
385                 if(status == NFCSTATUS_SUCCESS)
386                 {
387                     status = phHciNfc_Delete_Pipe( psHciContext, pHwRef,
388                                 p_pipe_info);
389                     status = ((NFCSTATUS_PENDING == status )?
390                                         NFCSTATUS_SUCCESS : status);
391                 }
392                 break;
393             }
394             case PIPE_CARD_B_DELETE:
395             {
396                 status = phHciNfc_CE_B_Get_PipeID( psHciContext, &pipe_id );
397                 p_pipe_info = psHciContext->p_pipe_list[pipe_id];
398                 if(status == NFCSTATUS_SUCCESS)
399                 {
400                     status = phHciNfc_Delete_Pipe( psHciContext, pHwRef,
401                                 p_pipe_info);
402                     status = ((NFCSTATUS_PENDING == status )?
403                                         NFCSTATUS_SUCCESS : status);
404                 }
405                 break;
406             }
407 #endif
408             /* case PIPE_MGMT_END : */
409             default:
410             {
411                 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_SEQUENCE);
412                 break;
413             }
414         }
415     }
416 
417     return status;
418 }
419 #endif
420 
421 
422 /*!
423  * \brief Creates the Pipes of all the Supported Gates .
424  *
425  * This function Creates the pipes for all the supported gates
426  */
427 
428 NFCSTATUS
phHciNfc_Create_All_Pipes(phHciNfc_sContext_t * psHciContext,void * pHwRef,phHciNfc_PipeMgmt_Seq_t * p_pipe_seq)429 phHciNfc_Create_All_Pipes(
430                                 phHciNfc_sContext_t             *psHciContext,
431                                 void                            *pHwRef,
432                                 phHciNfc_PipeMgmt_Seq_t         *p_pipe_seq
433                              )
434 {
435     NFCSTATUS                           status = NFCSTATUS_SUCCESS;
436     phHciNfc_Pipe_Info_t                *p_pipe_info = NULL;
437 
438     if( (NULL == psHciContext) || (NULL == pHwRef)
439         || (NULL == p_pipe_seq) )
440     {
441       status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
442     }
443     else
444     {
445 
446         switch( *p_pipe_seq )
447         {
448             /* Admin pipe close sequence */
449             case PIPE_IDMGMT_CREATE:
450             {
451                 phHciNfc_Gate_Info_t        id_dest;
452 
453                 id_dest.host_id = (uint8_t)phHciNfc_HostControllerID;
454                 id_dest.gate_id = (uint8_t)phHciNfc_IdentityMgmtGate;
455 
456                 status = phHciNfc_IDMgmt_Init_Resources (psHciContext);
457                 if((status == NFCSTATUS_SUCCESS)
458 #ifdef ESTABLISH_SESSION
459                     && (hciMode_Session != psHciContext->hci_mode)
460 #endif
461                     )
462                 {
463                     status = phHciNfc_Create_Pipe( psHciContext, pHwRef,
464                                 &id_dest, &p_pipe_info);
465                     /* status = ((NFCSTATUS_PENDING == status )?
466                                         NFCSTATUS_SUCCESS : status); */
467                 }
468                 break;
469             }
470             case PIPE_PN544MGMT_CREATE:
471             {
472                 phHciNfc_Gate_Info_t        id_dest;
473 
474                 id_dest.host_id = (uint8_t)phHciNfc_HostControllerID;
475                 id_dest.gate_id = (uint8_t)phHciNfc_PN544MgmtGate;
476 
477                 status = phHciNfc_DevMgmt_Init_Resources (psHciContext);
478                 if((status == NFCSTATUS_SUCCESS)
479 #ifdef ESTABLISH_SESSION
480                     && (hciMode_Session != psHciContext->hci_mode)
481 #endif
482                     )
483                 {
484                     status = phHciNfc_Create_Pipe( psHciContext, pHwRef,
485                                 &id_dest, &p_pipe_info);
486                     if(HCI_SELF_TEST == psHciContext->init_mode)
487                     {
488                         status = ((NFCSTATUS_PENDING == status )?
489                                         NFCSTATUS_SUCCESS : status);
490                     }
491                 }
492                 break;
493             }
494             case PIPE_POLLINGLOOP_CREATE:
495             {
496                 phHciNfc_Gate_Info_t        id_dest;
497 
498                 id_dest.host_id = (uint8_t)phHciNfc_HostControllerID;
499                 id_dest.gate_id = (uint8_t)phHciNfc_PollingLoopGate;
500 
501                 status = phHciNfc_PollLoop_Init_Resources (psHciContext);
502                 if((status == NFCSTATUS_SUCCESS)
503 #ifdef ESTABLISH_SESSION
504                     && (hciMode_Session != psHciContext->hci_mode)
505 #endif
506                     )
507                 {
508                     status = phHciNfc_Create_Pipe( psHciContext, pHwRef,
509                                 &id_dest, &p_pipe_info);
510                     /* status = ((NFCSTATUS_PENDING == status )?
511                                         NFCSTATUS_SUCCESS : status); */
512                 }
513                 break;
514             }
515             case PIPE_READER_A_CREATE:
516             {
517                 phHciNfc_Gate_Info_t        id_dest;
518 
519                 id_dest.host_id = (uint8_t)phHciNfc_HostControllerID;
520                 id_dest.gate_id = (uint8_t)phHciNfc_RFReaderAGate;
521 
522                 status = phHciNfc_ReaderA_Init_Resources (psHciContext);
523                 if((status == NFCSTATUS_SUCCESS)
524 #ifdef ESTABLISH_SESSION
525                     && (hciMode_Session != psHciContext->hci_mode)
526 #endif
527                     )
528                 {
529                     status = phHciNfc_Create_Pipe( psHciContext, pHwRef,
530                                 &id_dest, &p_pipe_info);
531                     /* status = ((NFCSTATUS_PENDING == status )?
532                                         NFCSTATUS_SUCCESS : status); */
533                 }
534                 break;
535             }
536 #ifdef TYPE_B
537             case PIPE_READER_B_CREATE:
538             {
539                 phHciNfc_Gate_Info_t        id_dest;
540 
541                 id_dest.host_id = (uint8_t)phHciNfc_HostControllerID;
542                 id_dest.gate_id = (uint8_t)phHciNfc_RFReaderBGate;
543 
544                 status = phHciNfc_ReaderB_Init_Resources (psHciContext);
545                 if((status == NFCSTATUS_SUCCESS)
546 #ifdef ESTABLISH_SESSION
547                     && (hciMode_Session != psHciContext->hci_mode)
548 #endif
549                     )
550                 {
551                     status = phHciNfc_Create_Pipe( psHciContext, pHwRef,
552                                 &id_dest, &p_pipe_info);
553                     /* status = ((NFCSTATUS_PENDING == status )?
554                                         NFCSTATUS_SUCCESS : status); */
555                 }
556                 break;
557             }
558 /* #ifdef TYPE_B*/
559 #endif
560 #ifdef TYPE_FELICA
561             case PIPE_READER_F_CREATE:
562             {
563                 phHciNfc_Gate_Info_t        id_dest;
564 
565                 id_dest.host_id = (uint8_t)phHciNfc_HostControllerID;
566                 id_dest.gate_id = (uint8_t)phHciNfc_RFReaderFGate;
567 
568                 status = phHciNfc_Felica_Init_Resources (psHciContext);
569                 if((status == NFCSTATUS_SUCCESS)
570 #ifdef ESTABLISH_SESSION
571                     && (hciMode_Session != psHciContext->hci_mode)
572 #endif
573                     )
574                 {
575                     status = phHciNfc_Create_Pipe( psHciContext, pHwRef,
576                                 &id_dest, &p_pipe_info);
577                     /* status = ((NFCSTATUS_PENDING == status )?
578                                         NFCSTATUS_SUCCESS : status); */
579                 }
580                 break;
581             }
582 #endif
583 #ifdef TYPE_JEWEL
584             case PIPE_READER_JWL_CREATE:
585             {
586                 phHciNfc_Gate_Info_t        id_dest;
587 
588                 id_dest.host_id = (uint8_t)phHciNfc_HostControllerID;
589                 id_dest.gate_id = (uint8_t)phHciNfc_JewelReaderGate;
590 
591                 status = phHciNfc_Jewel_Init_Resources (psHciContext);
592                 if((status == NFCSTATUS_SUCCESS)
593 #ifdef ESTABLISH_SESSION
594                     && (hciMode_Session != psHciContext->hci_mode)
595 #endif
596                     )
597                 {
598                     status = phHciNfc_Create_Pipe( psHciContext, pHwRef,
599                                 &id_dest, &p_pipe_info);
600                     /* status = ((NFCSTATUS_PENDING == status )?
601                                         NFCSTATUS_SUCCESS : status); */
602                 }
603                 break;
604             }
605 #endif /* #ifdef TYPE_JEWEL */
606 #ifdef TYPE_ISO15693
607             case PIPE_READER_ISO15693_CREATE:
608             {
609                 phHciNfc_Gate_Info_t        id_dest;
610 
611                 id_dest.host_id = (uint8_t)phHciNfc_HostControllerID;
612                 id_dest.gate_id = (uint8_t)phHciNfc_ISO15693Gate;
613 
614                 status = phHciNfc_ISO15693_Init_Resources (psHciContext);
615                 if((status == NFCSTATUS_SUCCESS)
616 #ifdef ESTABLISH_SESSION
617                     && (hciMode_Session != psHciContext->hci_mode)
618 #endif
619                     )
620                 {
621                     status = phHciNfc_Create_Pipe( psHciContext, pHwRef,
622                                 &id_dest, &p_pipe_info);
623                     /* status = ((NFCSTATUS_PENDING == status )?
624                                         NFCSTATUS_SUCCESS : status); */
625                 }
626                 break;
627             }
628 #endif /* #ifdef TYPE_ISO15693 */
629             case PIPE_NFC_INITIATOR_CREATE:
630             {
631                 phHciNfc_Gate_Info_t        id_dest;
632 
633                 id_dest.host_id = (uint8_t)phHciNfc_HostControllerID;
634                 id_dest.gate_id = (uint8_t)phHciNfc_NFCIP1InitRFGate;
635 #ifdef ENABLE_P2P
636                 status = phHciNfc_Initiator_Init_Resources (psHciContext);
637                 if((status == NFCSTATUS_SUCCESS)
638 #ifdef ESTABLISH_SESSION
639                     && (hciMode_Session != psHciContext->hci_mode)
640 #endif
641                     )
642                 {
643                     status = phHciNfc_Create_Pipe( psHciContext, pHwRef,
644                                 &id_dest, &p_pipe_info);
645                     /* status = ((NFCSTATUS_PENDING == status )?
646                                         NFCSTATUS_SUCCESS : status); */
647                 }
648 #endif
649                 break;
650             }
651             case PIPE_NFC_TARGET_CREATE:
652             {
653                 phHciNfc_Gate_Info_t        id_dest;
654 
655                 id_dest.host_id = (uint8_t)phHciNfc_HostControllerID;
656                 id_dest.gate_id = (uint8_t)phHciNfc_NFCIP1TargetRFGate;
657 
658 #ifdef ENABLE_P2P
659                 status = phHciNfc_Target_Init_Resources (psHciContext);
660                 if((status == NFCSTATUS_SUCCESS)
661 #ifdef ESTABLISH_SESSION
662                     && (hciMode_Session != psHciContext->hci_mode)
663 #endif
664                     )
665                 {
666                     status = phHciNfc_Create_Pipe( psHciContext, pHwRef,
667                                 &id_dest, &p_pipe_info);
668                     /* status = ((NFCSTATUS_PENDING == status )?
669                                         NFCSTATUS_SUCCESS : status); */
670                 }
671 #endif
672                 break;
673             }
674             case PIPE_WI_CREATE:
675             {
676                 phHciNfc_Gate_Info_t        id_dest;
677 
678                 id_dest.host_id = (uint8_t)phHciNfc_HostControllerID;
679                 id_dest.gate_id = (uint8_t)phHciNfc_NfcWIMgmtGate;
680 
681                 status = phHciNfc_WI_Init_Resources ( psHciContext );
682                 if((status == NFCSTATUS_SUCCESS)
683 #ifdef ESTABLISH_SESSION
684                     && (hciMode_Session != psHciContext->hci_mode)
685 #endif
686                     )
687                 {
688                     status = phHciNfc_Create_Pipe( psHciContext, pHwRef,
689                                 &id_dest, &p_pipe_info);
690                      /* status = ((NFCSTATUS_PENDING == status )?
691                                         NFCSTATUS_SUCCESS : status); */
692                 }
693                 break;
694             }
695             case PIPE_SWP_CREATE:
696             {
697                 phHciNfc_Gate_Info_t        id_dest;
698 
699                 id_dest.host_id = (uint8_t)phHciNfc_HostControllerID;
700                 id_dest.gate_id = (uint8_t)phHciNfc_SwpMgmtGate;
701 
702                 status = phHciNfc_SWP_Init_Resources ( psHciContext );
703 
704                 if((status == NFCSTATUS_SUCCESS)
705 #ifdef ESTABLISH_SESSION
706                     && (hciMode_Session != psHciContext->hci_mode)
707 #endif
708                     )
709                 {
710                     status = phHciNfc_Create_Pipe( psHciContext, pHwRef,
711                                 &id_dest, &p_pipe_info);
712                     status = ((NFCSTATUS_PENDING == status )?
713                                         NFCSTATUS_SUCCESS : status);
714                 }
715                 break;
716             }
717             /* case PIPE_MGMT_END : */
718             default:
719             {
720                 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_SEQUENCE);
721                 break;
722             }
723 
724         } /* End of Pipe Seq Switch */
725 
726     } /* End of Null Check for the Context */
727 
728     return status;
729 }
730 
731 /*!
732  * \brief Deletes the Pipes of all the Supported Gates .
733  *
734  * This function Deletes the pipes for all the supported gates
735  */
736 
737 NFCSTATUS
phHciNfc_Delete_All_Pipes(phHciNfc_sContext_t * psHciContext,void * pHwRef,phHciNfc_PipeMgmt_Seq_t pipeSeq)738 phHciNfc_Delete_All_Pipes(
739                                 phHciNfc_sContext_t             *psHciContext,
740                                 void                            *pHwRef,
741                                 phHciNfc_PipeMgmt_Seq_t         pipeSeq
742                              )
743 {
744     NFCSTATUS                           status = NFCSTATUS_SUCCESS;
745     phHciNfc_Pipe_Info_t                *p_pipe_info = NULL;
746     uint8_t                             length = 0;
747 
748     if( (NULL == psHciContext) || (NULL == pHwRef) )
749     {
750       status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
751     }
752     else
753     {
754         /* pipeSeq = PIPE_DELETE_ALL; */
755 
756         if ( PIPE_DELETE_ALL == pipeSeq )
757         {
758             /* Admin pipe close sequence */
759             p_pipe_info = psHciContext->p_pipe_list[PIPETYPE_STATIC_ADMIN];
760             status = phHciNfc_Send_Admin_Cmd( psHciContext,
761                                     pHwRef, ADM_CLEAR_ALL_PIPE,
762                                         length, p_pipe_info);
763             status = ((NFCSTATUS_PENDING == status)?
764                                 NFCSTATUS_SUCCESS : status);
765         }
766         else
767         {
768             status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_SEQUENCE);
769         }
770 
771 
772     } /* End of Null Check for the Context */
773 
774     return status;
775 }
776 
777 
778 
779 NFCSTATUS
phHciNfc_Update_PipeInfo(phHciNfc_sContext_t * psHciContext,phHciNfc_PipeMgmt_Seq_t * pPipeSeq,uint8_t pipe_id,phHciNfc_Pipe_Info_t * pPipeInfo)780 phHciNfc_Update_PipeInfo(
781                                 phHciNfc_sContext_t             *psHciContext,
782                                 phHciNfc_PipeMgmt_Seq_t         *pPipeSeq,
783                                 uint8_t                         pipe_id,
784                                 phHciNfc_Pipe_Info_t            *pPipeInfo
785                       )
786 {
787     phHciNfc_GateID_t           gate_id = phHciNfc_UnknownGate;
788     NFCSTATUS                   status = NFCSTATUS_SUCCESS;
789 
790     if(
791         (NULL == psHciContext) || (NULL == pPipeSeq)
792         || ( NULL == pPipeInfo )
793       )
794     {
795         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
796     }
797     else
798     {
799         gate_id = (phHciNfc_GateID_t )pPipeInfo->pipe.dest.gate_id ;
800         switch( gate_id )
801         {
802             /* Identity Management Pipe Creation */
803             case phHciNfc_IdentityMgmtGate:
804             {
805                 status = phHciNfc_IDMgmt_Update_PipeInfo(psHciContext,
806                             pipe_id, pPipeInfo);
807                 if(NFCSTATUS_SUCCESS == status)
808                 {
809                     *pPipeSeq = PIPE_PN544MGMT_CREATE;
810                 }
811                 break;
812             }
813             case  phHciNfc_PN544MgmtGate:
814             {
815                 status = phHciNfc_DevMgmt_Update_PipeInfo(psHciContext,
816                             pipe_id, pPipeInfo);
817                 if(NFCSTATUS_SUCCESS == status)
818                 {
819                     *pPipeSeq = ( HCI_SELF_TEST != psHciContext->init_mode )?
820                                 PIPE_POLLINGLOOP_CREATE:PIPE_DELETE_ALL;
821                 }
822                 break;
823             }
824             case  phHciNfc_PollingLoopGate:
825             {
826                 status = phHciNfc_PollLoop_Update_PipeInfo(psHciContext,
827                             pipe_id, pPipeInfo);
828                 if(NFCSTATUS_SUCCESS == status)
829                 {
830                     *pPipeSeq = PIPE_READER_A_CREATE;
831                 }
832                 break;
833             }
834             case  phHciNfc_RFReaderAGate:
835             {
836                 status = phHciNfc_ReaderA_Update_PipeInfo(psHciContext,
837                             pipe_id, pPipeInfo);
838                 if(NFCSTATUS_SUCCESS == status)
839                 {
840 
841 #if defined (TYPE_B)
842                     *pPipeSeq = PIPE_READER_B_CREATE;
843 /* #if defined (TYPE_B) */
844 #elif defined (TYPE_FELICA)
845                     *pPipeSeq = PIPE_READER_F_CREATE;
846 /* #if defined (TYPE_FELICA) */
847 #elif defined (TYPE_JEWEL)
848                     *pPipeSeq = PIPE_READER_JWL_CREATE;
849 /* #if defined (TYPE_JEWEL) */
850 #elif defined (TYPE_ISO15693)
851                     *pPipeSeq = PIPE_READER_ISO15693_CREATE;
852 /* #if defined (TYPE_ISO15693) */
853 #elif  defined(ENABLE_P2P)
854                     *pPipeSeq = PIPE_NFC_INITIATOR_CREATE;
855 /* #if defined(ENABLE_P2P) */
856  /*lint -e{91} suppress "Line exceeds"*/
857 #elif !defined(TYPE_B) && !defined(TYPE_FELICA) && !defined(TYPE_JEWEL) && !defined(TYPE_ISO15693) && !defined(ENABLE_P2P)
858                     *pPipeSeq = PIPE_WI_CREATE;
859 #endif
860                 }
861                 break;
862             }
863 #ifdef TYPE_B
864             case  phHciNfc_RFReaderBGate:
865             {
866                 status = phHciNfc_ReaderB_Update_PipeInfo(psHciContext,
867                             pipe_id, pPipeInfo);
868                 if(NFCSTATUS_SUCCESS == status)
869                 {
870 #if defined (TYPE_FELICA)
871                     *pPipeSeq = PIPE_READER_F_CREATE;
872 /* #if defined (TYPE_FELICA) */
873 #elif defined (TYPE_JEWEL)
874                     *pPipeSeq = PIPE_READER_JWL_CREATE;
875 /* #if defined (TYPE_JEWEL) */
876 #elif defined (TYPE_ISO15693)
877                     *pPipeSeq = PIPE_READER_ISO15693_CREATE;
878 /* #if defined (TYPE_ISO15693) */
879 #elif  defined(ENABLE_P2P)
880                     *pPipeSeq = PIPE_NFC_INITIATOR_CREATE;
881 /* #if defined(ENABLE_P2P) */
882  /*lint -e{91} suppress "Line exceeds"*/
883 #elif !defined(TYPE_FELICA) && !defined(TYPE_JEWEL) && !defined(TYPE_ISO15693) && !defined(ENABLE_P2P)
884                     *pPipeSeq = PIPE_WI_CREATE;
885 #endif
886                 }
887                 break;
888             }
889 #endif
890 #ifdef TYPE_FELICA
891             case  phHciNfc_RFReaderFGate:
892             {
893                 status = phHciNfc_Felica_Update_PipeInfo(psHciContext,
894                             pipe_id, pPipeInfo);
895                 if(NFCSTATUS_SUCCESS == status)
896                 {
897 #if defined (TYPE_JEWEL)
898                     *pPipeSeq = PIPE_READER_JWL_CREATE;
899 /* #if defined (TYPE_JEWEL) */
900 #elif defined (TYPE_ISO15693)
901                     *pPipeSeq = PIPE_READER_ISO15693_CREATE;
902 /* #if defined (TYPE_ISO15693) */
903 #elif  defined(ENABLE_P2P)
904                     *pPipeSeq = PIPE_NFC_INITIATOR_CREATE;
905 /* #if defined(ENABLE_P2P) */
906 #elif !defined(TYPE_JEWEL) && !defined(TYPE_ISO15693) && !defined(ENABLE_P2P)
907                     *pPipeSeq = PIPE_WI_CREATE;
908 #endif
909                 }
910                 break;
911             }
912 #endif
913 #ifdef TYPE_JEWEL
914             case  phHciNfc_JewelReaderGate:
915             {
916                 status = phHciNfc_Jewel_Update_PipeInfo(psHciContext,
917                             pipe_id, pPipeInfo);
918                 if(NFCSTATUS_SUCCESS == status)
919                 {
920 #if defined (TYPE_ISO15693)
921                     *pPipeSeq = PIPE_READER_ISO15693_CREATE;
922 /* #if defined (TYPE_ISO15693) */
923 #elif  defined(ENABLE_P2P)
924                     *pPipeSeq = PIPE_NFC_INITIATOR_CREATE;
925 /* #if defined(ENABLE_P2P) */
926 #elif !defined(TYPE_ISO15693) && !defined(ENABLE_P2P)
927                     *pPipeSeq = PIPE_WI_CREATE;
928 #endif
929                 }
930                 break;
931             }
932 #endif /* #ifdef TYPE_JEWEL */
933 #if defined (TYPE_ISO15693)
934             case  phHciNfc_ISO15693Gate:
935             {
936                 status = phHciNfc_ISO15693_Update_PipeInfo(psHciContext,
937                             pipe_id, pPipeInfo);
938                 if(NFCSTATUS_SUCCESS == status)
939                 {
940 
941 #ifdef ENABLE_P2P
942                     *pPipeSeq = PIPE_NFC_INITIATOR_CREATE;
943 #else
944                     *pPipeSeq = PIPE_WI_CREATE;
945 #endif /* #ifdef ENABLE_P2P */
946                 }
947                 break;
948             }
949 #endif /* #if defined (TYPE_ISO15693) */
950             case  phHciNfc_NFCIP1InitRFGate:
951             {
952 #ifdef ENABLE_P2P
953                 status = phHciNfc_Initiator_Update_PipeInfo(psHciContext,
954                             pipe_id, pPipeInfo);
955                 if(NFCSTATUS_SUCCESS == status)
956                 {
957                     *pPipeSeq = PIPE_NFC_TARGET_CREATE;
958                 }
959 #endif
960                 break;
961             }
962             case  phHciNfc_NFCIP1TargetRFGate:
963             {
964 #ifdef ENABLE_P2P
965                 status = phHciNfc_Target_Update_PipeInfo(psHciContext,
966                             pipe_id, pPipeInfo);
967                 if(NFCSTATUS_SUCCESS == status)
968                 {
969                     *pPipeSeq = PIPE_WI_CREATE;
970                 }
971 #endif
972                 break;
973             }
974             case  phHciNfc_NfcWIMgmtGate:
975             {
976                 status = phHciNfc_WI_Update_PipeInfo(psHciContext,
977                             pipe_id, pPipeInfo);
978                 if(NFCSTATUS_SUCCESS == status)
979                 {
980                     *pPipeSeq = PIPE_SWP_CREATE;
981                 }
982                 break;
983             }
984             case  phHciNfc_SwpMgmtGate:
985             {
986                 status = phHciNfc_SWP_Update_PipeInfo(psHciContext,
987                             pipe_id, pPipeInfo);
988                 if(NFCSTATUS_SUCCESS == status)
989                 {
990                     *pPipeSeq = PIPE_DELETE_ALL;
991                 }
992                 break;
993             }
994             case phHciNfc_ConnectivityGate:
995             {
996                 status = phHciNfc_Uicc_Update_PipeInfo(psHciContext,
997                                 pipe_id, pPipeInfo);
998                 break;
999             }
1000 #ifdef HOST_EMULATION
1001             case phHciNfc_CETypeAGate:
1002             {
1003                 status = phHciNfc_CE_A_Update_PipeInfo(psHciContext,
1004                                 pipe_id, pPipeInfo);
1005                 if(NFCSTATUS_SUCCESS == status)
1006                 {
1007                     *pPipeSeq = PIPE_CARD_B_CREATE;
1008                 }
1009                 break;
1010             }
1011             case phHciNfc_CETypeBGate:
1012             {
1013                 status = phHciNfc_CE_B_Update_PipeInfo(psHciContext,
1014                                 pipe_id, pPipeInfo);
1015                 if(NFCSTATUS_SUCCESS == status)
1016                 {
1017                     *pPipeSeq = PIPE_DELETE_ALL;
1018                 }
1019                 break;
1020             }
1021 #endif
1022             case phHciNfc_UnknownGate:
1023             default:
1024             {
1025                 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_HCI_GATE_NOT_SUPPORTED );
1026                 break;
1027             }
1028             /*End of the default Switch Case */
1029 
1030         } /*End of the Index Switch */
1031     } /* End of Context and the Identity information validity check */
1032 
1033     return status;
1034 }
1035 
1036 
1037 /*!
1038  * \brief Opening the Pipe
1039  *
1040  * This function opens the the pipe created between a terminal host's gate and
1041  *  destination host's gate
1042  *
1043  */
1044 
1045 NFCSTATUS
phHciNfc_Open_Pipe(phHciNfc_sContext_t * psHciContext,void * pHwRef,phHciNfc_Pipe_Info_t * pPipeHandle)1046 phHciNfc_Open_Pipe(
1047                         phHciNfc_sContext_t     *psHciContext,
1048                         void                    *pHwRef,
1049                         phHciNfc_Pipe_Info_t    *pPipeHandle
1050                     )
1051 {
1052     uint8_t                 pipe_id = (uint8_t) HCI_UNKNOWN_PIPE_ID;
1053     NFCSTATUS               status = NFCSTATUS_SUCCESS;
1054     NFCSTATUS               cmd_status = NFCSTATUS_SUCCESS;
1055 
1056     if( (NULL == psHciContext)
1057         || ( NULL == pHwRef )
1058         || ( NULL == pPipeHandle )
1059       )
1060     {
1061         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
1062     }
1063     else
1064     {
1065         /* Obtain the pipe_id from the pipe_handle */
1066         pipe_id = pPipeHandle->pipe.pipe_id;
1067 
1068         if ( pipe_id <= PHHCINFC_MAX_PIPE)
1069         {
1070             cmd_status = phHciNfc_Send_Generic_Cmd( psHciContext,pHwRef,
1071                                     pipe_id, ANY_OPEN_PIPE);
1072             status = ( (cmd_status == NFCSTATUS_PENDING)?
1073                                         NFCSTATUS_SUCCESS : cmd_status);
1074         }
1075     }
1076     return status;
1077 }
1078 
1079 
1080 /*!
1081  * \brief Closing the Pipe
1082  *
1083  * This function Closes the the pipe created between a terminal host's gate and
1084  *  destination host's gate
1085  *
1086  */
1087 
1088 NFCSTATUS
phHciNfc_Close_Pipe(phHciNfc_sContext_t * psHciContext,void * pHwRef,phHciNfc_Pipe_Info_t * pPipeHandle)1089 phHciNfc_Close_Pipe(
1090                         phHciNfc_sContext_t     *psHciContext,
1091                         void                    *pHwRef,
1092                         phHciNfc_Pipe_Info_t    *pPipeHandle
1093                     )
1094 {
1095     uint8_t                 pipe_id = (uint8_t) HCI_UNKNOWN_PIPE_ID;
1096     NFCSTATUS               status = NFCSTATUS_SUCCESS;
1097     NFCSTATUS               cmd_status = NFCSTATUS_SUCCESS;
1098 
1099     if( (NULL == psHciContext)
1100         || ( NULL == pHwRef )
1101         || ( NULL == pPipeHandle )
1102       )
1103     {
1104         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
1105     }
1106     else
1107     {
1108         /* Obtain the pipe_id from the pipe_handle */
1109         pipe_id = pPipeHandle->pipe.pipe_id;
1110 
1111         if( (uint8_t)HCI_UNKNOWN_PIPE_ID > pipe_id)
1112         {
1113             cmd_status = phHciNfc_Send_Generic_Cmd(
1114                                         psHciContext, pHwRef, pipe_id,
1115                                         ANY_CLOSE_PIPE );
1116 
1117             status = ((cmd_status == NFCSTATUS_PENDING)?
1118                                 NFCSTATUS_SUCCESS : cmd_status);
1119         }
1120     }
1121     return status;
1122 }
1123