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