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