nfa_ee_main.c revision 40e67c9ec7191cbda00cde97e4f988d1d5737762
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
32extern 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
39tNFA_EE_CB nfa_ee_cb;
40#endif
41
42/*****************************************************************************
43**  Constants
44*****************************************************************************/
45static 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
57const 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*******************************************************************************/
97void 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*******************************************************************************/
127void 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*******************************************************************************/
152void 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*******************************************************************************/
213void 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*******************************************************************************/
275void 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*******************************************************************************/
323void 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*******************************************************************************/
378UINT8 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*******************************************************************************/
398tNFA_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*******************************************************************************/
433tNFA_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*******************************************************************************/
462void 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*******************************************************************************/
532void 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*******************************************************************************/
550void 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*******************************************************************************/
563static 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*******************************************************************************/
594static 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*******************************************************************************/
662BOOLEAN 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