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 31extern 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 38tNFA_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*****************************************************************************/ 49static 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 61const 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*******************************************************************************/ 99void 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*******************************************************************************/ 129void 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*******************************************************************************/ 146void 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*******************************************************************************/ 207void 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*******************************************************************************/ 265void 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*******************************************************************************/ 298void 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*******************************************************************************/ 349UINT8 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*******************************************************************************/ 369tNFA_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*******************************************************************************/ 404tNFA_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*******************************************************************************/ 433void 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*******************************************************************************/ 494void 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*******************************************************************************/ 507static 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*******************************************************************************/ 538static 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*******************************************************************************/ 602BOOLEAN 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