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