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
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_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 *******************************************************************************/
nfa_ee_init(void)97 void 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 *******************************************************************************/
nfa_ee_sys_enable(void)127 void 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 *******************************************************************************/
nfa_ee_restore_one_ecb(tNFA_EE_ECB * p_cb)152 void 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 *******************************************************************************/
nfa_ee_proc_nfcc_power_mode(UINT8 nfcc_power_mode)213 void 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 *******************************************************************************/
nfa_ee_proc_hci_info_cback(void)275 void 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 *******************************************************************************/
nfa_ee_proc_evt(tNFC_RESPONSE_EVT event,void * p_data)323 void 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 *******************************************************************************/
nfa_ee_ecb_to_mask(tNFA_EE_ECB * p_cb)378 UINT8 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 *******************************************************************************/
nfa_ee_find_ecb(UINT8 nfcee_id)398 tNFA_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 *******************************************************************************/
nfa_ee_find_ecb_by_conn_id(UINT8 conn_id)433 tNFA_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 *******************************************************************************/
nfa_ee_sys_disable(void)462 void 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 *******************************************************************************/
nfa_ee_check_disable(void)532 void 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 *******************************************************************************/
nfa_ee_reg_cback_enable_done(tNFA_EE_ENABLE_DONE_CBACK * p_cback)550 void 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 *******************************************************************************/
nfa_ee_sm_st_2_str(UINT8 state)563 static 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 *******************************************************************************/
nfa_ee_sm_evt_2_str(UINT16 event)594 static 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 *******************************************************************************/
nfa_ee_evt_hdlr(BT_HDR * p_msg)662 BOOLEAN 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