• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /******************************************************************************
2  *
3  *  Copyright (C) 2010-2013 Broadcom Corporation
4  *
5  *  Licensed under the Apache License, Version 2.0 (the "License");
6  *  you may not use this file except in compliance with the License.
7  *  You may obtain a copy of the License at:
8  *
9  *  http://www.apache.org/licenses/LICENSE-2.0
10  *
11  *  Unless required by applicable law or agreed to in writing, software
12  *  distributed under the License is distributed on an "AS IS" BASIS,
13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  *  See the License for the specific language governing permissions and
15  *  limitations under the License.
16  *
17  ******************************************************************************/
18 
19 
20 /******************************************************************************
21  *
22  *  This is the main implementation file for the NFA EE.
23  *
24  ******************************************************************************/
25 #include <string.h>
26 #include "nfc_api.h"
27 #include "nfa_sys.h"
28 #include "nfa_sys_int.h"
29 #include "nfa_dm_int.h"
30 #include "nfa_ee_int.h"
31 
32 extern void nfa_ee_vs_cback (tNFC_VS_EVT event, BT_HDR *p_data);
33 /*****************************************************************************
34 **  Global Variables
35 *****************************************************************************/
36 
37 /* system manager control block definition */
38 #if NFA_DYNAMIC_MEMORY == FALSE
39 tNFA_EE_CB nfa_ee_cb;
40 #endif
41 
42 #ifndef NFA_EE_DISCV_TIMEOUT_VAL
43 #define NFA_EE_DISCV_TIMEOUT_VAL    2000
44 #endif
45 
46 
47 /*****************************************************************************
48 **  Constants
49 *****************************************************************************/
50 static const tNFA_SYS_REG nfa_ee_sys_reg =
51 {
52     nfa_ee_sys_enable,
53     nfa_ee_evt_hdlr,
54     nfa_ee_sys_disable,
55     nfa_ee_proc_nfcc_power_mode
56 };
57 
58 
59 #define NFA_EE_NUM_ACTIONS  (NFA_EE_MAX_EVT & 0x00ff)
60 
61 
62 const tNFA_EE_SM_ACT nfa_ee_actions[] =
63 {
64     /* NFA-EE action function/ internal events */
65     nfa_ee_api_discover     ,   /* NFA_EE_API_DISCOVER_EVT      */
66     nfa_ee_api_register     ,   /* NFA_EE_API_REGISTER_EVT      */
67     nfa_ee_api_deregister   ,   /* NFA_EE_API_DEREGISTER_EVT    */
68     nfa_ee_api_mode_set     ,   /* NFA_EE_API_MODE_SET_EVT      */
69     nfa_ee_api_set_tech_cfg ,   /* NFA_EE_API_SET_TECH_CFG_EVT  */
70     nfa_ee_api_set_proto_cfg,   /* NFA_EE_API_SET_PROTO_CFG_EVT */
71     nfa_ee_api_add_aid      ,   /* NFA_EE_API_ADD_AID_EVT       */
72     nfa_ee_api_remove_aid   ,   /* NFA_EE_API_REMOVE_AID_EVT    */
73     nfa_ee_api_update_now   ,   /* NFA_EE_API_UPDATE_NOW_EVT    */
74     nfa_ee_api_connect      ,   /* NFA_EE_API_CONNECT_EVT       */
75     nfa_ee_api_send_data    ,   /* NFA_EE_API_SEND_DATA_EVT     */
76     nfa_ee_api_disconnect   ,   /* NFA_EE_API_DISCONNECT_EVT    */
77     nfa_ee_nci_disc_rsp     ,   /* NFA_EE_NCI_DISC_RSP_EVT      */
78     nfa_ee_nci_disc_ntf     ,   /* NFA_EE_NCI_DISC_NTF_EVT      */
79     nfa_ee_nci_mode_set_rsp ,   /* NFA_EE_NCI_MODE_SET_RSP_EVT  */
80     nfa_ee_nci_conn         ,   /* NFA_EE_NCI_CONN_EVT          */
81     nfa_ee_nci_conn         ,   /* NFA_EE_NCI_DATA_EVT          */
82     nfa_ee_nci_action_ntf   ,   /* NFA_EE_NCI_ACTION_NTF_EVT    */
83     nfa_ee_nci_disc_req_ntf ,   /* NFA_EE_NCI_DISC_REQ_NTF_EVT  */
84     nfa_ee_rout_timeout     ,   /* NFA_EE_ROUT_TIMEOUT_EVT      */
85     nfa_ee_discv_timeout    ,   /* NFA_EE_DISCV_TIMEOUT_EVT     */
86     nfa_ee_lmrt_to_nfcc         /* NFA_EE_CFG_TO_NFCC_EVT       */
87 };
88 
89 
90 /*******************************************************************************
91 **
92 ** Function         nfa_ee_init
93 **
94 ** Description      Initialize NFA EE control block
95 **                  register to NFA SYS
96 **
97 ** Returns          None
98 **
99 *******************************************************************************/
nfa_ee_init(void)100 void nfa_ee_init (void)
101 {
102     int xx;
103 
104     NFA_TRACE_DEBUG0 ("nfa_ee_init ()");
105 
106     /* initialize control block */
107     memset (&nfa_ee_cb, 0, sizeof (tNFA_EE_CB));
108     for (xx = 0; xx < NFA_EE_MAX_EE_SUPPORTED; xx++)
109     {
110         nfa_ee_cb.ecb[xx].nfcee_id       = NFA_EE_INVALID;
111         nfa_ee_cb.ecb[xx].ee_status      = NFC_NFCEE_STATUS_INACTIVE;
112     }
113 
114     nfa_ee_cb.ecb[NFA_EE_CB_4_DH].ee_status       = NFC_NFCEE_STATUS_ACTIVE;
115     nfa_ee_cb.ecb[NFA_EE_CB_4_DH].nfcee_id        = NFC_DH_ID;
116 
117     /* register message handler on NFA SYS */
118     nfa_sys_register (NFA_ID_EE,  &nfa_ee_sys_reg);
119 }
120 
121 /*******************************************************************************
122 **
123 ** Function         nfa_ee_sys_enable
124 **
125 ** Description      Enable NFA EE
126 **
127 ** Returns          None
128 **
129 *******************************************************************************/
nfa_ee_sys_enable(void)130 void nfa_ee_sys_enable (void)
131 {
132     /* collect NFCEE information */
133     NFC_NfceeDiscover (TRUE);
134     nfa_sys_start_timer (&nfa_ee_cb.discv_timer, NFA_EE_DISCV_TIMEOUT_EVT, NFA_EE_DISCV_TIMEOUT_VAL);
135 }
136 
137 /*******************************************************************************
138 **
139 ** Function         nfa_ee_restore_one_ecb
140 **
141 ** Description      activate the NFCEE and restore the routing when
142 **                  changing power state from low power mode to full power mode
143 **
144 ** Returns          None
145 **
146 *******************************************************************************/
nfa_ee_restore_one_ecb(tNFA_EE_ECB * p_cb)147 void nfa_ee_restore_one_ecb (tNFA_EE_ECB *p_cb)
148 {
149     UINT8   mask;
150     tNFC_NFCEE_MODE_SET_REVT    rsp;
151     tNFA_EE_NCI_MODE_SET        ee_msg;
152 
153     NFA_TRACE_DEBUG4 ("nfa_ee_restore_one_ecb () nfcee_id:0x%x, ecb_flags:0x%x ee_status:0x%x ee_old_status: 0x%x", p_cb->nfcee_id, p_cb->ecb_flags, p_cb->ee_status, p_cb->ee_old_status);
154     if ((p_cb->nfcee_id != NFA_EE_INVALID) && (p_cb->ee_status & NFA_EE_STATUS_RESTORING) == 0 && (p_cb->ee_old_status & NFA_EE_STATUS_RESTORING) != 0)
155     {
156         p_cb->ee_old_status &= ~NFA_EE_STATUS_RESTORING;
157         mask = nfa_ee_ecb_to_mask(p_cb);
158         if (p_cb->ee_status != p_cb->ee_old_status)
159         {
160             p_cb->ecb_flags   |= NFA_EE_ECB_FLAGS_RESTORE;
161             if (p_cb->ee_old_status == NFC_NFCEE_STATUS_ACTIVE)
162             {
163                 NFC_NfceeModeSet (p_cb->nfcee_id, NFC_MODE_ACTIVATE);
164 
165                 if (nfa_ee_cb.ee_cfged & mask)
166                 {
167                     /* if any routing is configured on this NFCEE. need to mark this NFCEE as changed
168                      * to cause the configuration to be sent to NFCC again */
169                     p_cb->ecb_flags |= NFA_EE_ECB_FLAGS_ROUTING;
170                     p_cb->ecb_flags |= NFA_EE_ECB_FLAGS_VS;
171                 }
172             }
173             else
174             {
175                 NFC_NfceeModeSet (p_cb->nfcee_id, NFC_MODE_DEACTIVATE);
176             }
177         }
178         else if (p_cb->ee_status == NFC_NFCEE_STATUS_ACTIVE)
179         {
180             /* the initial NFCEE status after start up is the same as the current status and it's active:
181              * process the same as the host gets activate rsp */
182             p_cb->ecb_flags   |= NFA_EE_ECB_FLAGS_RESTORE;
183             if (nfa_ee_cb.ee_cfged & mask)
184             {
185                 /* if any routing is configured on this NFCEE. need to mark this NFCEE as changed
186                  * to cause the configuration to be sent to NFCC again */
187                 p_cb->ecb_flags |= NFA_EE_ECB_FLAGS_ROUTING;
188                 p_cb->ecb_flags |= NFA_EE_ECB_FLAGS_VS;
189             }
190             rsp.mode        = NFA_EE_MD_ACTIVATE;
191             rsp.nfcee_id    = p_cb->nfcee_id;
192             rsp.status      = NFA_STATUS_OK;
193             ee_msg.p_data   = &rsp;
194             nfa_ee_nci_mode_set_rsp ((tNFA_EE_MSG *) &ee_msg);
195         }
196     }
197 }
198 
199 /*******************************************************************************
200 **
201 ** Function         nfa_ee_proc_nfcc_power_mode
202 **
203 ** Description      Restore NFA EE sub-module
204 **
205 ** Returns          None
206 **
207 *******************************************************************************/
nfa_ee_proc_nfcc_power_mode(UINT8 nfcc_power_mode)208 void nfa_ee_proc_nfcc_power_mode (UINT8 nfcc_power_mode)
209 {
210     UINT32          xx;
211     tNFA_EE_ECB     *p_cb;
212     BOOLEAN         proc_complete = TRUE;
213 
214     NFA_TRACE_DEBUG1 ("nfa_ee_proc_nfcc_power_mode (): nfcc_power_mode=%d", nfcc_power_mode);
215     /* if NFCC power state is change to full power */
216     if (nfcc_power_mode == NFA_DM_PWR_MODE_FULL)
217     {
218         p_cb = nfa_ee_cb.ecb;
219         for (xx = 0; xx < NFA_EE_MAX_EE_SUPPORTED; xx++, p_cb++)
220         {
221             p_cb->ee_old_status = 0;
222             if (xx >= nfa_ee_cb.cur_ee)
223                 p_cb->nfcee_id = NFA_EE_INVALID;
224 
225             if ((p_cb->nfcee_id != NFA_EE_INVALID) && (p_cb->ee_interface[0] != NFC_NFCEE_INTERFACE_HCI_ACCESS) && (p_cb->ee_status  != NFA_EE_STATUS_REMOVED))
226             {
227                 proc_complete       = FALSE;
228                 /* NFA_EE_STATUS_RESTORING bit makes sure the ee_status restore to ee_old_status
229                  * NFA_EE_STATUS_RESTORING bit is cleared in ee_status at NFCEE_DISCOVER NTF.
230                  * NFA_EE_STATUS_RESTORING bit is cleared in ee_old_status at restoring the activate/inactive status after NFCEE_DISCOVER NTF */
231                 p_cb->ee_status    |= NFA_EE_STATUS_RESTORING;
232                 p_cb->ee_old_status = p_cb->ee_status;
233                 /* NFA_EE_FLAGS_RESTORE bit makes sure the routing/nci logical connection is restore to prior to entering low power mode */
234                 p_cb->ecb_flags    |= NFA_EE_ECB_FLAGS_RESTORE;
235             }
236         }
237         nfa_ee_cb.em_state          = NFA_EE_EM_STATE_RESTORING;
238         nfa_ee_cb.num_ee_expecting  = 0;
239         if (nfa_sys_is_register (NFA_ID_HCI))
240         {
241             nfa_ee_cb.ee_flags   |= NFA_EE_FLAG_WAIT_HCI;
242             nfa_ee_cb.ee_flags   |= NFA_EE_FLAG_NOTIFY_HCI;
243         }
244         NFC_NfceeDiscover (TRUE);
245         nfa_sys_start_timer (&nfa_ee_cb.discv_timer, NFA_EE_DISCV_TIMEOUT_EVT, NFA_EE_DISCV_TIMEOUT_VAL);
246     }
247     else
248     {
249         nfa_sys_stop_timer (&nfa_ee_cb.timer);
250         nfa_sys_stop_timer (&nfa_ee_cb.discv_timer);
251         nfa_ee_cb.num_ee_expecting = 0;
252     }
253 
254     if (proc_complete)
255         nfa_sys_cback_notify_nfcc_power_mode_proc_complete (NFA_ID_EE);
256 }
257 
258 /*******************************************************************************
259 **
260 ** Function         nfa_ee_proc_hci_info_cback
261 **
262 ** Description      HCI initialization complete from power off sleep mode
263 **
264 ** Returns          None
265 **
266 *******************************************************************************/
nfa_ee_proc_hci_info_cback(void)267 void nfa_ee_proc_hci_info_cback (void)
268 {
269     UINT32          xx;
270     tNFA_EE_ECB     *p_cb;
271     tNFA_EE_MSG     data;
272 
273     NFA_TRACE_DEBUG0 ("nfa_ee_proc_hci_info_cback ()");
274     /* if NFCC power state is change to full power */
275     nfa_ee_cb.ee_flags   &= ~NFA_EE_FLAG_WAIT_HCI;
276 
277     p_cb = nfa_ee_cb.ecb;
278     for (xx = 0; xx < NFA_EE_MAX_EE_SUPPORTED; xx++, p_cb++)
279     {
280         /* NCI spec says: An NFCEE_DISCOVER_NTF that contains a Protocol type of "HCI Access"
281          * SHALL NOT contain any other additional Protocol
282          * i.e. check only first supported NFCEE interface is HCI access */
283         /* NFA_HCI module handles restoring configurations for HCI access */
284         if (p_cb->ee_interface[0] != NFC_NFCEE_INTERFACE_HCI_ACCESS)
285         {
286             nfa_ee_restore_one_ecb (p_cb);
287         }
288     }
289 
290     if (nfa_ee_restore_ntf_done())
291     {
292         nfa_ee_check_restore_complete();
293         if (nfa_ee_cb.em_state == NFA_EE_EM_STATE_INIT_DONE)
294         {
295             if (nfa_ee_cb.discv_timer.in_use)
296             {
297                 nfa_sys_stop_timer (&nfa_ee_cb.discv_timer);
298                 data.hdr.event = NFA_EE_DISCV_TIMEOUT_EVT;
299                 nfa_ee_evt_hdlr((BT_HDR *)&data);
300             }
301         }
302     }
303 }
304 
305 /*******************************************************************************
306 **
307 ** Function         nfa_ee_proc_evt
308 **
309 ** Description      Process NFCEE related events from NFC stack
310 **
311 **
312 ** Returns          None
313 **
314 *******************************************************************************/
nfa_ee_proc_evt(tNFC_RESPONSE_EVT event,void * p_data)315 void nfa_ee_proc_evt (tNFC_RESPONSE_EVT event, void *p_data)
316 {
317     tNFA_EE_INT_EVT         int_event=0;
318     tNFA_EE_NCI_RESPONSE    cbk;
319     BT_HDR                  *p_hdr;
320 
321     switch (event)
322     {
323     case NFC_NFCEE_DISCOVER_REVT:                /* 4  NFCEE Discover response */
324         int_event   = NFA_EE_NCI_DISC_RSP_EVT;
325         break;
326 
327     case NFC_NFCEE_INFO_REVT:                    /* 5  NFCEE Discover Notification */
328         int_event    = NFA_EE_NCI_DISC_NTF_EVT;
329         break;
330 
331     case NFC_NFCEE_MODE_SET_REVT:                /* 6  NFCEE Mode Set response */
332         int_event   = NFA_EE_NCI_MODE_SET_RSP_EVT;
333         break;
334 
335     case NFC_EE_ACTION_REVT:
336         int_event   = NFA_EE_NCI_ACTION_NTF_EVT;
337         break;
338 
339     case NFC_EE_DISCOVER_REQ_REVT:               /* 10 EE Discover Req notification */
340         int_event   = NFA_EE_NCI_DISC_REQ_NTF_EVT;
341         break;
342 
343     }
344 
345     NFA_TRACE_DEBUG2 ("nfa_ee_proc_evt: event=0x%02x int_event:0x%x", event, int_event);
346     if (int_event)
347     {
348         p_hdr           = (BT_HDR *) &cbk;
349         cbk.hdr.event   = int_event;
350         cbk.p_data      = p_data;
351 
352         nfa_ee_evt_hdlr (p_hdr);
353     }
354 
355 }
356 
357 /*******************************************************************************
358 **
359 ** Function         nfa_ee_ecb_to_mask
360 **
361 ** Description      Given a ecb, return the bit mask to be used in nfa_ee_cb.ee_cfged
362 **
363 ** Returns          the bitmask for the given ecb.
364 **
365 *******************************************************************************/
nfa_ee_ecb_to_mask(tNFA_EE_ECB * p_cb)366 UINT8 nfa_ee_ecb_to_mask (tNFA_EE_ECB *p_cb)
367 {
368     UINT8   mask;
369     UINT8   index;
370 
371     index = (UINT8) (p_cb - nfa_ee_cb.ecb);
372     mask  = 1 << index;
373 
374     return mask;
375 }
376 
377 /*******************************************************************************
378 **
379 ** Function         nfa_ee_find_ecb
380 **
381 ** Description      Return the ecb associated with the given nfcee_id
382 **
383 ** Returns          tNFA_EE_ECB
384 **
385 *******************************************************************************/
nfa_ee_find_ecb(UINT8 nfcee_id)386 tNFA_EE_ECB * nfa_ee_find_ecb (UINT8 nfcee_id)
387 {
388     UINT32  xx;
389     tNFA_EE_ECB *p_ret = NULL, *p_cb;
390     NFA_TRACE_DEBUG0 ("nfa_ee_find_ecb ()");
391 
392     if (nfcee_id == NFC_DH_ID)
393     {
394         p_ret = &nfa_ee_cb.ecb[NFA_EE_CB_4_DH];
395     }
396     else
397     {
398         p_cb = nfa_ee_cb.ecb;
399         for (xx = 0; xx < NFA_EE_MAX_EE_SUPPORTED; xx++, p_cb++)
400         {
401             if (nfcee_id == p_cb->nfcee_id)
402             {
403                 p_ret = p_cb;
404                 break;
405             }
406         }
407     }
408 
409     return p_ret;
410 }
411 
412 /*******************************************************************************
413 **
414 ** Function         nfa_ee_find_ecb_by_conn_id
415 **
416 ** Description      Return the ecb associated with the given connection id
417 **
418 ** Returns          tNFA_EE_ECB
419 **
420 *******************************************************************************/
nfa_ee_find_ecb_by_conn_id(UINT8 conn_id)421 tNFA_EE_ECB * nfa_ee_find_ecb_by_conn_id (UINT8 conn_id)
422 {
423     UINT32  xx;
424     tNFA_EE_ECB *p_ret = NULL, *p_cb;
425     NFA_TRACE_DEBUG0 ("nfa_ee_find_ecb_by_conn_id ()");
426 
427     p_cb = nfa_ee_cb.ecb;
428     for (xx = 0; xx < nfa_ee_cb.cur_ee; xx++, p_cb++)
429     {
430         if (conn_id == p_cb->conn_id)
431         {
432             p_ret = p_cb;
433             break;
434         }
435     }
436 
437     return p_ret;
438 }
439 
440 /*******************************************************************************
441 **
442 ** Function         nfa_ee_sys_disable
443 **
444 ** Description      Deregister NFA EE from NFA SYS/DM
445 **
446 **
447 ** Returns          None
448 **
449 *******************************************************************************/
nfa_ee_sys_disable(void)450 void nfa_ee_sys_disable (void)
451 {
452     UINT32  xx;
453     tNFA_EE_ECB *p_cb;
454     tNFA_EE_MSG     msg;
455 
456     NFA_TRACE_DEBUG0 ("nfa_ee_sys_disable ()");
457 
458     nfa_ee_cb.em_state = NFA_EE_EM_STATE_DISABLED;
459     /* report NFA_EE_DEREGISTER_EVT to all registered to EE */
460     for (xx = 0; xx < NFA_EE_MAX_CBACKS; xx++)
461     {
462         if (nfa_ee_cb.p_ee_cback[xx])
463         {
464             msg.deregister.index     = xx;
465             nfa_ee_api_deregister (&msg);
466         }
467     }
468 
469     nfa_ee_cb.num_ee_expecting  = 0;
470     p_cb = nfa_ee_cb.ecb;
471     for (xx = 0; xx < nfa_ee_cb.cur_ee; xx++, p_cb++)
472     {
473         if (p_cb->conn_st == NFA_EE_CONN_ST_CONN)
474         {
475             if (nfa_sys_is_graceful_disable ())
476             {
477                 /* Disconnect NCI connection on graceful shutdown */
478                 msg.disconnect.p_cb = p_cb;
479                 nfa_ee_api_disconnect (&msg);
480                 nfa_ee_cb.num_ee_expecting++;
481             }
482             else
483             {
484                 /* fake NFA_EE_DISCONNECT_EVT on ungraceful shutdown */
485                 msg.conn.conn_id    = p_cb->conn_id;
486                 msg.conn.event      = NFC_CONN_CLOSE_CEVT;
487                 nfa_ee_nci_conn (&msg);
488             }
489         }
490     }
491 
492     if (nfa_ee_cb.num_ee_expecting)
493     {
494         nfa_ee_cb.ee_flags |= NFA_EE_FLAG_WAIT_DISCONN;
495         nfa_ee_cb.em_state  = NFA_EE_EM_STATE_DISABLING;
496     }
497 
498 
499     nfa_sys_stop_timer (&nfa_ee_cb.timer);
500     nfa_sys_stop_timer (&nfa_ee_cb.discv_timer);
501 
502     /* If Application initiated NFCEE discovery, fake/report the event */
503     nfa_ee_report_disc_done (FALSE);
504 
505     /* deregister message handler on NFA SYS */
506     if (nfa_ee_cb.em_state == NFA_EE_EM_STATE_DISABLED)
507         nfa_sys_deregister (NFA_ID_EE);
508 
509 }
510 
511 /*******************************************************************************
512 **
513 ** Function         nfa_ee_check_disable
514 **
515 ** Description      Check if it is safe to move to disabled state
516 **
517 ** Returns          None
518 **
519 *******************************************************************************/
nfa_ee_check_disable(void)520 void nfa_ee_check_disable (void)
521 {
522     if (!(nfa_ee_cb.ee_flags & NFA_EE_FLAG_WAIT_DISCONN))
523     {
524         nfa_ee_cb.em_state = NFA_EE_EM_STATE_DISABLED;
525         nfa_sys_deregister (NFA_ID_EE);
526     }
527 }
528 /*******************************************************************************
529 **
530 ** Function         nfa_ee_reg_cback_enable_done
531 **
532 ** Description      Allow a module to register to EE to be notified when NFA-EE
533 **                  finishes enable process
534 **
535 ** Returns          None
536 **
537 *******************************************************************************/
nfa_ee_reg_cback_enable_done(tNFA_EE_ENABLE_DONE_CBACK * p_cback)538 void nfa_ee_reg_cback_enable_done (tNFA_EE_ENABLE_DONE_CBACK *p_cback)
539 {
540     nfa_ee_cb.p_enable_cback = p_cback;
541 }
542 
543 #if (BT_TRACE_VERBOSE == TRUE)
544 /*******************************************************************************
545 **
546 ** Function         nfa_ee_sm_st_2_str
547 **
548 ** Description      convert nfa-ee state to string
549 **
550 *******************************************************************************/
nfa_ee_sm_st_2_str(UINT8 state)551 static char *nfa_ee_sm_st_2_str (UINT8 state)
552 {
553     switch (state)
554     {
555     case NFA_EE_EM_STATE_INIT:
556         return "INIT";
557 
558     case NFA_EE_EM_STATE_INIT_DONE:
559         return "INIT_DONE";
560 
561     case NFA_EE_EM_STATE_RESTORING:
562         return "RESTORING";
563 
564     case NFA_EE_EM_STATE_DISABLING:
565         return "DISABLING";
566 
567     case NFA_EE_EM_STATE_DISABLED:
568         return "DISABLED";
569 
570     default:
571         return "Unknown";
572     }
573 }
574 
575 /*******************************************************************************
576 **
577 ** Function         nfa_ee_sm_evt_2_str
578 **
579 ** Description      convert nfa-ee evt to string
580 **
581 *******************************************************************************/
nfa_ee_sm_evt_2_str(UINT16 event)582 static char *nfa_ee_sm_evt_2_str (UINT16 event)
583 {
584     switch (event)
585     {
586     case NFA_EE_API_DISCOVER_EVT:
587         return "API_DISCOVER";
588     case NFA_EE_API_REGISTER_EVT:
589         return "API_REGISTER";
590     case NFA_EE_API_DEREGISTER_EVT:
591         return "API_DEREGISTER";
592     case NFA_EE_API_MODE_SET_EVT:
593         return "API_MODE_SET";
594     case NFA_EE_API_SET_TECH_CFG_EVT:
595         return "API_SET_TECH_CFG";
596     case NFA_EE_API_SET_PROTO_CFG_EVT:
597         return "API_SET_PROTO_CFG";
598     case NFA_EE_API_ADD_AID_EVT:
599         return "API_ADD_AID";
600     case NFA_EE_API_REMOVE_AID_EVT:
601         return "API_REMOVE_AID";
602     case NFA_EE_API_UPDATE_NOW_EVT:
603         return "API_UPDATE_NOW";
604     case NFA_EE_API_CONNECT_EVT:
605         return "API_CONNECT";
606     case NFA_EE_API_SEND_DATA_EVT:
607         return "API_SEND_DATA";
608     case NFA_EE_API_DISCONNECT_EVT:
609         return "API_DISCONNECT";
610     case NFA_EE_NCI_DISC_RSP_EVT:
611         return "NCI_DISC_RSP";
612     case NFA_EE_NCI_DISC_NTF_EVT:
613         return "NCI_DISC_NTF";
614     case NFA_EE_NCI_MODE_SET_RSP_EVT:
615         return "NCI_MODE_SET";
616     case NFA_EE_NCI_CONN_EVT:
617         return "NCI_CONN";
618     case NFA_EE_NCI_DATA_EVT:
619         return "NCI_DATA";
620     case NFA_EE_NCI_ACTION_NTF_EVT:
621         return "NCI_ACTION";
622     case NFA_EE_NCI_DISC_REQ_NTF_EVT:
623         return "NCI_DISC_REQ";
624     case NFA_EE_ROUT_TIMEOUT_EVT:
625         return "ROUT_TIMEOUT";
626     case NFA_EE_DISCV_TIMEOUT_EVT:
627         return "NFA_EE_DISCV_TIMEOUT_EVT";
628     case NFA_EE_CFG_TO_NFCC_EVT:
629         return "CFG_TO_NFCC";
630     default:
631         return "Unknown";
632     }
633 }
634 #endif /* BT_TRACE_VERBOSE */
635 
636 /*******************************************************************************
637 **
638 ** Function         nfa_ee_evt_hdlr
639 **
640 ** Description      Processing event for NFA EE
641 **
642 **
643 ** Returns          TRUE if p_msg needs to be deallocated
644 **
645 *******************************************************************************/
nfa_ee_evt_hdlr(BT_HDR * p_msg)646 BOOLEAN nfa_ee_evt_hdlr (BT_HDR *p_msg)
647 {
648     tNFA_EE_MSG *p_evt_data = (tNFA_EE_MSG *) p_msg;
649     UINT16  event = p_msg->event & 0x00ff;
650     BOOLEAN act = FALSE;
651 
652 #if (BT_TRACE_VERBOSE == TRUE)
653     NFA_TRACE_DEBUG4 ("nfa_ee_evt_hdlr (): Event %s(0x%02x), State: %s(%d)",
654         nfa_ee_sm_evt_2_str (p_evt_data->hdr.event), p_evt_data->hdr.event,
655         nfa_ee_sm_st_2_str (nfa_ee_cb.em_state), nfa_ee_cb.em_state);
656 #else
657     NFA_TRACE_DEBUG2 ("nfa_ee_evt_hdlr (): Event 0x%02x, State: %d", p_evt_data->hdr.event, nfa_ee_cb.em_state);
658 #endif
659 
660     switch (nfa_ee_cb.em_state)
661     {
662     case NFA_EE_EM_STATE_INIT_DONE:
663     case NFA_EE_EM_STATE_RESTORING:
664         act = TRUE;
665         break;
666     case NFA_EE_EM_STATE_INIT:
667         if ((p_msg->event == NFA_EE_NCI_DISC_NTF_EVT) || (p_msg->event == NFA_EE_NCI_DISC_RSP_EVT))
668             act = TRUE;
669         break;
670     case NFA_EE_EM_STATE_DISABLING:
671         if (p_msg->event == NFA_EE_NCI_CONN_EVT)
672             act = TRUE;
673         break;
674     }
675     if (act)
676     {
677         if (event < NFA_EE_NUM_ACTIONS)
678         {
679             (*nfa_ee_actions[event]) (p_evt_data);
680         }
681     }
682     else
683     {
684         /* if the data event is not handled by action function, free the data packet */
685         if (p_msg->event == NFA_EE_NCI_DATA_EVT)
686             GKI_freebuf (p_evt_data->conn.p_data);
687     }
688 
689     return TRUE;
690 }
691 
692 
693