nfa_ee_main.c revision 45e68232b8524aca5165dca28b994ec8c11593b1
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
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#ifndef NFA_EE_DISCV_TIMEOUT_VAL
43#define NFA_EE_DISCV_TIMEOUT_VAL    2000
44#endif
45
46
47/*****************************************************************************
48**  Constants
49*****************************************************************************/
50static 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
62const 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*******************************************************************************/
100void 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*******************************************************************************/
130void 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*******************************************************************************/
147void 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*******************************************************************************/
208void 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*******************************************************************************/
267void 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*******************************************************************************/
315void 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*******************************************************************************/
366UINT8 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*******************************************************************************/
386tNFA_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*******************************************************************************/
421tNFA_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*******************************************************************************/
450void 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*******************************************************************************/
520void 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*******************************************************************************/
538void 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*******************************************************************************/
551static 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*******************************************************************************/
582static 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*******************************************************************************/
646BOOLEAN 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