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