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