• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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  *  NFA interface to NFCEE - API functions
23  *
24  ******************************************************************************/
25 #include <string.h>
26 #include "nfa_ee_api.h"
27 #include "nfa_ee_int.h"
28 #include "nfa_sys_int.h"
29 #include "nfa_dm_int.h"
30 
31 /*****************************************************************************
32 **  APIs
33 *****************************************************************************/
34 /*******************************************************************************
35 **
36 ** Function         NFA_EeDiscover
37 **
38 ** Description      This function retrieves the NFCEE information from NFCC.
39 **                  The NFCEE information is reported in NFA_EE_DISCOVER_EVT.
40 **
41 **                  This function may be called when a system supports removable
42 **                  NFCEEs,
43 **
44 ** Returns          NFA_STATUS_OK if information is retrieved successfully
45 **                  NFA_STATUS_FAILED If wrong state (retry later)
46 **                  NFA_STATUS_INVALID_PARAM If bad parameter
47 **
48 *******************************************************************************/
NFA_EeDiscover(tNFA_EE_CBACK * p_cback)49 tNFA_STATUS NFA_EeDiscover(tNFA_EE_CBACK *p_cback)
50 {
51     tNFA_EE_API_DISCOVER *p_msg;
52     tNFA_STATUS status = NFA_STATUS_FAILED;
53 
54     NFA_TRACE_API0 ("NFA_EeDiscover()");
55 
56     if (nfa_ee_cb.em_state != NFA_EE_EM_STATE_INIT_DONE)
57     {
58         NFA_TRACE_ERROR1 ("NFA_EeDiscover bad em state: %d", nfa_ee_cb.em_state);
59         status = NFA_STATUS_FAILED;
60     }
61     else if ((nfa_ee_cb.p_ee_disc_cback != NULL) || (p_cback == NULL))
62     {
63         NFA_TRACE_ERROR0 ("NFA_EeDiscover() in progress or NULL callback function");
64         status = NFA_STATUS_INVALID_PARAM;
65     }
66     else if ((p_msg = (tNFA_EE_API_DISCOVER *) GKI_getbuf (sizeof(tNFA_EE_API_DISCOVER))) != NULL)
67     {
68         p_msg->hdr.event    = NFA_EE_API_DISCOVER_EVT;
69         p_msg->p_cback      = p_cback;
70 
71         nfa_sys_sendmsg (p_msg);
72 
73         status = NFA_STATUS_OK;
74     }
75 
76     return status;
77 }
78 
79 /*******************************************************************************
80 **
81 ** Function         NFA_EeGetInfo
82 **
83 ** Description      This function retrieves the NFCEE information from NFA.
84 **                  The actual number of NFCEE is returned in p_num_nfcee
85 **                  and NFCEE information is returned in p_info
86 **
87 ** Returns          NFA_STATUS_OK if information is retrieved successfully
88 **                  NFA_STATUS_FAILED If wrong state (retry later)
89 **                  NFA_STATUS_INVALID_PARAM If bad parameter
90 **
91 *******************************************************************************/
NFA_EeGetInfo(UINT8 * p_num_nfcee,tNFA_EE_INFO * p_info)92 tNFA_STATUS NFA_EeGetInfo(UINT8        *p_num_nfcee,
93                           tNFA_EE_INFO *p_info)
94 {
95     int   xx, ret = nfa_ee_cb.cur_ee;
96     tNFA_EE_ECB  *p_cb = nfa_ee_cb.ecb;
97     UINT8   max_ret;
98     UINT8   num_ret  = 0;
99 
100     NFA_TRACE_DEBUG2 ("NFA_EeGetInfo em_state:%d cur_ee:%d", nfa_ee_cb.em_state, nfa_ee_cb.cur_ee);
101     /* validate parameters */
102     if (p_info == NULL || p_num_nfcee == NULL)
103     {
104         NFA_TRACE_ERROR0 ("NFA_EeGetInfo bad parameter");
105         return (NFA_STATUS_INVALID_PARAM);
106     }
107     max_ret         = *p_num_nfcee;
108     *p_num_nfcee = 0;
109     if (nfa_ee_cb.em_state == NFA_EE_EM_STATE_INIT)
110     {
111         NFA_TRACE_ERROR1 ("NFA_EeGetInfo bad em state: %d", nfa_ee_cb.em_state);
112         return (NFA_STATUS_FAILED);
113     }
114 
115     /* compose output */
116     for (xx = 0; (xx < ret) && (num_ret < max_ret); xx++, p_cb++)
117     {
118         NFA_TRACE_DEBUG4 ("xx:%d max_ret:%d, num_ret:%d ee_status:0x%x", xx, max_ret, num_ret, p_cb->ee_status);
119         if ((p_cb->ee_status & NFA_EE_STATUS_INT_MASK) || (p_cb->ee_status == NFA_EE_STATUS_REMOVED))
120         {
121             continue;
122         }
123         p_info->ee_handle       = NFA_HANDLE_GROUP_EE | (tNFA_HANDLE)p_cb->nfcee_id;
124         p_info->ee_status       = p_cb->ee_status;
125         p_info->num_interface   = p_cb->num_interface;
126         p_info->num_tlvs        = p_cb->num_tlvs;
127         memcpy(p_info->ee_interface, p_cb->ee_interface, p_cb->num_interface);
128         memcpy(p_info->ee_tlv, p_cb->ee_tlv, p_cb->num_tlvs * sizeof(tNFA_EE_TLV));
129         p_info++;
130         num_ret++;
131     }
132     NFA_TRACE_DEBUG1 ("num_ret:%d", num_ret);
133     *p_num_nfcee = num_ret;
134     return (NFA_STATUS_OK);
135 }
136 
137 /*******************************************************************************
138 **
139 ** Function         NFA_EeRegister
140 **
141 ** Description      This function registers a callback function to receive the
142 **                  events from NFA-EE module.
143 **
144 ** Returns          NFA_STATUS_OK if successfully initiated
145 **                  NFA_STATUS_FAILED otherwise
146 **                  NFA_STATUS_INVALID_PARAM If bad parameter
147 **
148 *******************************************************************************/
NFA_EeRegister(tNFA_EE_CBACK * p_cback)149 tNFA_STATUS NFA_EeRegister(tNFA_EE_CBACK *p_cback)
150 {
151     tNFA_EE_API_REGISTER *p_msg;
152     tNFA_STATUS status = NFA_STATUS_FAILED;
153 
154     NFA_TRACE_API0 ("NFA_EeRegister()");
155 
156     if (p_cback == NULL)
157     {
158         NFA_TRACE_ERROR0 ("NFA_EeRegister(): with NULL callback function");
159         status = NFA_STATUS_INVALID_PARAM;
160     }
161     else if ((p_msg = (tNFA_EE_API_REGISTER *) GKI_getbuf (sizeof(tNFA_EE_API_REGISTER))) != NULL)
162     {
163         p_msg->hdr.event    = NFA_EE_API_REGISTER_EVT;
164         p_msg->p_cback      = p_cback;
165 
166         nfa_sys_sendmsg (p_msg);
167 
168         status = NFA_STATUS_OK;
169     }
170 
171     return status;
172 }
173 
174 /*******************************************************************************
175 **
176 ** Function         NFA_EeDeregister
177 **
178 ** Description      This function de-registers the callback function
179 **
180 ** Returns          NFA_STATUS_OK if successfully initiated
181 **                  NFA_STATUS_FAILED otherwise
182 **                  NFA_STATUS_INVALID_PARAM If bad parameter
183 **
184 *******************************************************************************/
NFA_EeDeregister(tNFA_EE_CBACK * p_cback)185 tNFA_STATUS NFA_EeDeregister(tNFA_EE_CBACK *p_cback)
186 {
187     tNFA_EE_API_DEREGISTER *p_msg;
188     tNFA_STATUS status = NFA_STATUS_INVALID_PARAM;
189     int         index  = NFA_EE_MAX_CBACKS;
190     int         xx;
191 
192     for (xx = 0; xx < NFA_EE_MAX_CBACKS; xx++)
193     {
194         if (nfa_ee_cb.p_ee_cback[xx] == p_cback)
195         {
196             index   = xx;
197             status  = NFA_STATUS_FAILED;
198             break;
199         }
200     }
201 
202     NFA_TRACE_API2 ("NFA_EeDeregister() %d, status:%d", index, status);
203     if ((status != NFA_STATUS_INVALID_PARAM) &&
204         (p_msg = (tNFA_EE_API_DEREGISTER *) GKI_getbuf (sizeof(tNFA_EE_API_DEREGISTER))) != NULL)
205     {
206         p_msg->hdr.event = NFA_EE_API_DEREGISTER_EVT;
207         p_msg->index     = index;
208 
209         nfa_sys_sendmsg (p_msg);
210 
211         status = NFA_STATUS_OK;
212     }
213 
214     return status;
215 }
216 
217 /*******************************************************************************
218 **
219 ** Function         NFA_EeModeSet
220 **
221 ** Description      This function is called to activate (mode = NFA_EE_MD_ACTIVATE)
222 **                  or deactivate (mode = NFA_EE_MD_DEACTIVATE) the NFCEE
223 **                  identified by the given ee_handle. The result of this
224 **                  operation is reported with the NFA_EE_MODE_SET_EVT.
225 **
226 ** Returns          NFA_STATUS_OK if successfully initiated
227 **                  NFA_STATUS_FAILED otherwise
228 **                  NFA_STATUS_INVALID_PARAM If bad parameter
229 **
230 *******************************************************************************/
NFA_EeModeSet(tNFA_HANDLE ee_handle,tNFA_EE_MD mode)231 tNFA_STATUS NFA_EeModeSet(tNFA_HANDLE    ee_handle,
232                           tNFA_EE_MD     mode)
233 {
234     tNFA_EE_API_MODE_SET *p_msg;
235     tNFA_STATUS status = NFA_STATUS_FAILED;
236     tNFA_EE_ECB *p_cb, *p_found = NULL;
237     UINT32  xx;
238     UINT8   nfcee_id = (ee_handle & 0xFF);
239 
240     p_cb = nfa_ee_cb.ecb;
241     for (xx = 0; xx < nfa_ee_cb.cur_ee; xx++, p_cb++)
242     {
243         if (nfcee_id == p_cb->nfcee_id)
244         {
245             p_found = p_cb;
246             break;
247         }
248     }
249     NFA_TRACE_API2 ("NFA_EeModeSet(): handle:<0x%x>, mode:0x%02X", ee_handle, mode);
250 
251     if (p_found == NULL)
252     {
253         NFA_TRACE_ERROR1 ("NFA_EeModeSet() invalid NFCEE:0x%04x", ee_handle);
254         status = NFA_STATUS_INVALID_PARAM;
255     }
256     else if ((p_msg = (tNFA_EE_API_MODE_SET *) GKI_getbuf (sizeof(tNFA_EE_API_MODE_SET))) != NULL)
257     {
258         p_msg->hdr.event        = NFA_EE_API_MODE_SET_EVT;
259         p_msg->nfcee_id         = nfcee_id;
260         p_msg->mode             = mode;
261         p_msg->p_cb             = p_found;
262 
263         nfa_sys_sendmsg (p_msg);
264 
265         status = NFA_STATUS_OK;
266     }
267 
268 
269     return status;
270 }
271 
272 
273 /*******************************************************************************
274 **
275 ** Function         NFA_EeSetDefaultTechRouting
276 **
277 ** Description      This function is called to add, change or remove the
278 **                  default routing based on RF technology in the listen mode
279 **                  routing table for the given ee_handle. The status of this
280 **                  operation is reported as the NFA_EE_SET_TECH_CFG_EVT.
281 **
282 ** Note:            If RF discovery is started, NFA_StopRfDiscovery()/NFA_RF_DISCOVERY_STOPPED_EVT
283 **                  should happen before calling this function
284 **
285 ** Note:            NFA_EeUpdateNow() should be called after last NFA-EE function
286 **                  to change the listen mode routing is called.
287 **
288 ** Returns          NFA_STATUS_OK if successfully initiated
289 **                  NFA_STATUS_FAILED otherwise
290 **                  NFA_STATUS_INVALID_PARAM If bad parameter
291 **
292 *******************************************************************************/
NFA_EeSetDefaultTechRouting(tNFA_HANDLE ee_handle,tNFA_TECHNOLOGY_MASK technologies_switch_on,tNFA_TECHNOLOGY_MASK technologies_switch_off,tNFA_TECHNOLOGY_MASK technologies_battery_off)293 tNFA_STATUS NFA_EeSetDefaultTechRouting(tNFA_HANDLE          ee_handle,
294                                         tNFA_TECHNOLOGY_MASK technologies_switch_on,
295                                         tNFA_TECHNOLOGY_MASK technologies_switch_off,
296                                         tNFA_TECHNOLOGY_MASK technologies_battery_off)
297 {
298     tNFA_EE_API_SET_TECH_CFG *p_msg;
299     tNFA_STATUS status = NFA_STATUS_FAILED;
300     UINT8       nfcee_id = (UINT8)(ee_handle & 0xFF);
301     tNFA_EE_ECB *p_cb;
302 
303     NFA_TRACE_API4 ("NFA_EeSetDefaultTechRouting(): handle:<0x%x>technology_mask:<0x%x>/<0x%x>/<0x%x>",
304         ee_handle, technologies_switch_on, technologies_switch_off, technologies_battery_off);
305     p_cb = nfa_ee_find_ecb (nfcee_id);
306 
307     if (p_cb == NULL)
308     {
309         NFA_TRACE_ERROR0 ("Bad ee_handle");
310         status = NFA_STATUS_INVALID_PARAM;
311     }
312     else if ((p_msg = (tNFA_EE_API_SET_TECH_CFG *) GKI_getbuf (sizeof(tNFA_EE_API_SET_TECH_CFG))) != NULL)
313     {
314         p_msg->hdr.event                = NFA_EE_API_SET_TECH_CFG_EVT;
315         p_msg->nfcee_id                 = nfcee_id;
316         p_msg->p_cb                     = p_cb;
317         p_msg->technologies_switch_on   = technologies_switch_on;
318         p_msg->technologies_switch_off  = technologies_switch_off;
319         p_msg->technologies_battery_off = technologies_battery_off;
320 
321         nfa_sys_sendmsg (p_msg);
322 
323         status = NFA_STATUS_OK;
324     }
325 
326     return status;
327 }
328 
329 /*******************************************************************************
330 **
331 ** Function         NFA_EeSetDefaultProtoRouting
332 **
333 ** Description      This function is called to add, change or remove the
334 **                  default routing based on Protocol in the listen mode routing
335 **                  table for the given ee_handle. The status of this
336 **                  operation is reported as the NFA_EE_SET_PROTO_CFG_EVT.
337 **
338 ** Note:            If RF discovery is started, NFA_StopRfDiscovery()/NFA_RF_DISCOVERY_STOPPED_EVT
339 **                  should happen before calling this function
340 **
341 ** Note:            NFA_EeUpdateNow() should be called after last NFA-EE function
342 **                  to change the listen mode routing is called.
343 **
344 ** Returns          NFA_STATUS_OK if successfully initiated
345 **                  NFA_STATUS_FAILED otherwise
346 **                  NFA_STATUS_INVALID_PARAM If bad parameter
347 **
348 *******************************************************************************/
NFA_EeSetDefaultProtoRouting(tNFA_HANDLE ee_handle,tNFA_PROTOCOL_MASK protocols_switch_on,tNFA_PROTOCOL_MASK protocols_switch_off,tNFA_PROTOCOL_MASK protocols_battery_off)349 tNFA_STATUS NFA_EeSetDefaultProtoRouting(tNFA_HANDLE         ee_handle,
350                                          tNFA_PROTOCOL_MASK  protocols_switch_on,
351                                          tNFA_PROTOCOL_MASK  protocols_switch_off,
352                                          tNFA_PROTOCOL_MASK  protocols_battery_off)
353 {
354     tNFA_EE_API_SET_PROTO_CFG *p_msg;
355     tNFA_STATUS status = NFA_STATUS_FAILED;
356     UINT8       nfcee_id = (UINT8)(ee_handle & 0xFF);
357     tNFA_EE_ECB *p_cb;
358 
359     NFA_TRACE_API4 ("NFA_EeSetDefaultProtoRouting(): handle:<0x%x>protocol_mask:<0x%x>/<0x%x>/<0x%x>",
360         ee_handle, protocols_switch_on, protocols_switch_off, protocols_battery_off);
361     p_cb = nfa_ee_find_ecb (nfcee_id);
362 
363     if (p_cb == NULL)
364     {
365         NFA_TRACE_ERROR0 ("Bad ee_handle");
366         status = NFA_STATUS_INVALID_PARAM;
367     }
368     else if ((p_msg = (tNFA_EE_API_SET_PROTO_CFG *) GKI_getbuf (sizeof(tNFA_EE_API_SET_PROTO_CFG))) != NULL)
369     {
370         p_msg->hdr.event                = NFA_EE_API_SET_PROTO_CFG_EVT;
371         p_msg->nfcee_id                 = nfcee_id;
372         p_msg->p_cb                     = p_cb;
373         p_msg->protocols_switch_on      = protocols_switch_on;
374         p_msg->protocols_switch_off     = protocols_switch_off;
375         p_msg->protocols_battery_off    = protocols_battery_off;
376 
377         nfa_sys_sendmsg (p_msg);
378 
379         status = NFA_STATUS_OK;
380     }
381 
382     return status;
383 }
384 
385 /*******************************************************************************
386 **
387 ** Function         NFA_EeAddAidRouting
388 **
389 ** Description      This function is called to add an AID entry in the
390 **                  listen mode routing table in NFCC. The status of this
391 **                  operation is reported as the NFA_EE_ADD_AID_EVT.
392 **
393 ** Note:            If RF discovery is started, NFA_StopRfDiscovery()/NFA_RF_DISCOVERY_STOPPED_EVT
394 **                  should happen before calling this function
395 **
396 ** Note:            NFA_EeUpdateNow() should be called after last NFA-EE function
397 **                  to change the listen mode routing is called.
398 **
399 ** Returns          NFA_STATUS_OK if successfully initiated
400 **                  NFA_STATUS_FAILED otherwise
401 **                  NFA_STATUS_INVALID_PARAM If bad parameter
402 **
403 *******************************************************************************/
NFA_EeAddAidRouting(tNFA_HANDLE ee_handle,UINT8 aid_len,UINT8 * p_aid,tNFA_EE_PWR_STATE power_state)404 tNFA_STATUS NFA_EeAddAidRouting(tNFA_HANDLE          ee_handle,
405                                 UINT8                aid_len,
406                                 UINT8               *p_aid,
407                                 tNFA_EE_PWR_STATE    power_state)
408 {
409     tNFA_EE_API_ADD_AID *p_msg;
410     tNFA_STATUS status = NFA_STATUS_FAILED;
411     UINT16 size = sizeof(tNFA_EE_API_ADD_AID) + aid_len;
412     UINT8       nfcee_id = (UINT8)(ee_handle & 0xFF);
413     tNFA_EE_ECB *p_cb;
414 
415     NFA_TRACE_API1 ("NFA_EeAddAidRouting(): handle:<0x%x>", ee_handle);
416     p_cb = nfa_ee_find_ecb (nfcee_id);
417 
418     /* validate parameters - make sure the AID is in valid length range */
419     if ((p_cb == NULL) || (aid_len == 0) || (p_aid == NULL) || (aid_len < NFA_MIN_AID_LEN) || (aid_len > NFA_MAX_AID_LEN))
420     {
421         NFA_TRACE_ERROR1 ("Bad ee_handle or AID (len=%d)", aid_len);
422         status = NFA_STATUS_INVALID_PARAM;
423     }
424     else if ((p_msg = (tNFA_EE_API_ADD_AID *) GKI_getbuf (size)) != NULL)
425     {
426         NFA_TRACE_DEBUG2 ("aid:<%02x%02x>", p_aid[0], p_aid[1]);
427         p_msg->hdr.event        = NFA_EE_API_ADD_AID_EVT;
428         p_msg->nfcee_id         = nfcee_id;
429         p_msg->p_cb             = p_cb;
430         p_msg->aid_len          = aid_len;
431         p_msg->power_state      = power_state;
432         p_msg->p_aid            = (UINT8 *)(p_msg + 1);
433         memcpy(p_msg->p_aid, p_aid, aid_len);
434 
435         nfa_sys_sendmsg (p_msg);
436 
437         status = NFA_STATUS_OK;
438     }
439 
440     return status;
441 }
442 
443 
444 /*******************************************************************************
445 **
446 ** Function         NFA_EeRemoveAidRouting
447 **
448 ** Description      This function is called to remove the given AID entry from the
449 **                  listen mode routing table. If the entry configures VS,
450 **                  it is also removed. The status of this operation is reported
451 **                  as the NFA_EE_REMOVE_AID_EVT.
452 **
453 ** Note:            If RF discovery is started, NFA_StopRfDiscovery()/NFA_RF_DISCOVERY_STOPPED_EVT
454 **                  should happen before calling this function
455 **
456 ** Note:            NFA_EeUpdateNow() should be called after last NFA-EE function
457 **                  to change the listen mode routing is called.
458 **
459 ** Returns          NFA_STATUS_OK if successfully initiated
460 **                  NFA_STATUS_FAILED otherwise
461 **                  NFA_STATUS_INVALID_PARAM If bad parameter
462 **
463 *******************************************************************************/
NFA_EeRemoveAidRouting(UINT8 aid_len,UINT8 * p_aid)464 tNFA_STATUS NFA_EeRemoveAidRouting(UINT8     aid_len,
465                                    UINT8    *p_aid)
466 {
467     tNFA_EE_API_REMOVE_AID *p_msg;
468     tNFA_STATUS status = NFA_STATUS_FAILED;
469     UINT16 size = sizeof(tNFA_EE_API_REMOVE_AID) + aid_len;
470 
471     NFA_TRACE_API0 ("NFA_EeRemoveAidRouting()");
472     if ((aid_len == 0) || (p_aid == NULL) || (aid_len > NFA_MAX_AID_LEN))
473     {
474         NFA_TRACE_ERROR0 ("Bad AID");
475         status = NFA_STATUS_INVALID_PARAM;
476     }
477     else if ((p_msg = (tNFA_EE_API_REMOVE_AID *) GKI_getbuf (size)) != NULL)
478     {
479         p_msg->hdr.event        = NFA_EE_API_REMOVE_AID_EVT;
480         p_msg->aid_len          = aid_len;
481         p_msg->p_aid            = (UINT8 *)(p_msg + 1);
482         memcpy(p_msg->p_aid, p_aid, aid_len);
483 
484         nfa_sys_sendmsg (p_msg);
485 
486         status = NFA_STATUS_OK;
487     }
488 
489     return status;
490 }
491 
492 /*******************************************************************************
493 **
494 ** Function         NFA_EeGetLmrtRemainingSize
495 **
496 ** Description      This function is called to get remaining size of the
497 **                  Listen Mode Routing Table.
498 **                  The remaining size is reported in NFA_EE_REMAINING_SIZE_EVT
499 **
500 ** Returns          NFA_STATUS_OK if successfully initiated
501 **                  NFA_STATUS_FAILED otherwise
502 **
503 *******************************************************************************/
NFA_EeGetLmrtRemainingSize(void)504 tNFA_STATUS NFA_EeGetLmrtRemainingSize (void)
505 {
506     tNFA_EE_API_LMRT_SIZE *p_msg;
507     tNFA_STATUS status = NFA_STATUS_FAILED;
508 
509     NFA_TRACE_API0 ("NFA_EeGetLmrtRemainingSize()");
510     if ((p_msg = (tNFA_EE_API_LMRT_SIZE *) GKI_getbuf (sizeof(tNFA_EE_API_LMRT_SIZE))) != NULL)
511     {
512         p_msg->event    = NFA_EE_API_LMRT_SIZE_EVT;
513         nfa_sys_sendmsg (p_msg);
514         status = NFA_STATUS_OK;
515     }
516 
517     return status;
518 }
519 
520 /******************************************************************************
521 **
522 ** Function         NFA_EeUpdateNow
523 **
524 ** Description      This function is called to send the current listen mode
525 **                  routing table and VS configuration to the NFCC (without waiting
526 **                  for NFA_EE_ROUT_TIMEOUT_VAL).
527 **
528 **                  The status of this operation is
529 **                  reported with the NFA_EE_UPDATED_EVT.
530 **
531 ** Returns          NFA_STATUS_OK if successfully initiated
532 **                  NFA_STATUS_SEMANTIC_ERROR is update is currently in progress
533 **                  NFA_STATUS_FAILED otherwise
534 **
535 *******************************************************************************/
NFA_EeUpdateNow(void)536 tNFA_STATUS NFA_EeUpdateNow(void)
537 {
538     BT_HDR *p_msg;
539     tNFA_STATUS status = NFA_STATUS_FAILED;
540 
541     NFA_TRACE_API0 ("NFA_EeUpdateNow()");
542     if (nfa_ee_cb.ee_wait_evt & NFA_EE_WAIT_UPDATE_ALL)
543     {
544         NFA_TRACE_ERROR0 ("update in progress");
545         status = NFA_STATUS_SEMANTIC_ERROR;
546     }
547     else if ((p_msg = (BT_HDR *) GKI_getbuf (BT_HDR_SIZE)) != NULL)
548     {
549         p_msg->event    = NFA_EE_API_UPDATE_NOW_EVT;
550 
551         nfa_sys_sendmsg (p_msg);
552 
553         status = NFA_STATUS_OK;
554     }
555 
556     return status;
557 }
558 
559 
560 /*******************************************************************************
561 **
562 ** Function         NFA_EeConnect
563 **
564 ** Description      Open connection to an NFCEE attached to the NFCC
565 **
566 **                  The status of this operation is
567 **                  reported with the NFA_EE_CONNECT_EVT.
568 **
569 ** Returns          NFA_STATUS_OK if successfully initiated
570 **                  NFA_STATUS_FAILED otherwise
571 **                  NFA_STATUS_INVALID_PARAM If bad parameter
572 **
573 *******************************************************************************/
NFA_EeConnect(tNFA_HANDLE ee_handle,UINT8 ee_interface,tNFA_EE_CBACK * p_cback)574 tNFA_STATUS NFA_EeConnect(tNFA_HANDLE    ee_handle,
575                           UINT8          ee_interface,
576                           tNFA_EE_CBACK *p_cback)
577 {
578     tNFA_EE_API_CONNECT *p_msg;
579     tNFA_STATUS status = NFA_STATUS_FAILED;
580     UINT8       nfcee_id = (UINT8)(ee_handle & 0xFF);
581     tNFA_EE_ECB *p_cb;
582 
583     NFA_TRACE_API2 ("NFA_EeConnect(): handle:<0x%x> ee_interface:0x%x", ee_handle, ee_interface);
584     p_cb = nfa_ee_find_ecb (nfcee_id);
585 
586     if ((p_cb == NULL) || (p_cback == NULL))
587     {
588         NFA_TRACE_ERROR0 ("Bad ee_handle or NULL callback function");
589         status = NFA_STATUS_INVALID_PARAM;
590     }
591     else if ((p_msg = (tNFA_EE_API_CONNECT *) GKI_getbuf (sizeof(tNFA_EE_API_CONNECT))) != NULL)
592     {
593         p_msg->hdr.event        = NFA_EE_API_CONNECT_EVT;
594         p_msg->nfcee_id         = nfcee_id;
595         p_msg->p_cb             = p_cb;
596         p_msg->ee_interface     = ee_interface;
597         p_msg->p_cback          = p_cback;
598 
599         nfa_sys_sendmsg (p_msg);
600 
601         status = NFA_STATUS_OK;
602     }
603 
604     return status;
605 }
606 
607 /*******************************************************************************
608 **
609 ** Function         NFA_EeSendData
610 **
611 ** Description      Send data to the given NFCEE.
612 **                  This function shall be called after NFA_EE_CONNECT_EVT is reported
613 **                  and before NFA_EeDisconnect is called on the given ee_handle.
614 **
615 ** Returns          NFA_STATUS_OK if successfully initiated
616 **                  NFA_STATUS_FAILED otherwise
617 **                  NFA_STATUS_INVALID_PARAM If bad parameter
618 **
619 *******************************************************************************/
NFA_EeSendData(tNFA_HANDLE ee_handle,UINT16 data_len,UINT8 * p_data)620 tNFA_STATUS NFA_EeSendData (tNFA_HANDLE  ee_handle,
621                             UINT16       data_len,
622                             UINT8       *p_data)
623 {
624     tNFA_EE_API_SEND_DATA *p_msg;
625     tNFA_STATUS status = NFA_STATUS_FAILED;
626     UINT8       nfcee_id = (UINT8)(ee_handle & 0xFF);
627     tNFA_EE_ECB *p_cb;
628 
629     NFA_TRACE_API1 ("NFA_EeSendData(): handle:<0x%x>", ee_handle);
630 
631     p_cb = nfa_ee_find_ecb (nfcee_id);
632 
633     if ((p_cb == NULL) || (p_cb->conn_st != NFA_EE_CONN_ST_CONN) || (p_data == NULL))
634     {
635         NFA_TRACE_ERROR0 ("Bad ee_handle or NULL data");
636         status = NFA_STATUS_INVALID_PARAM;
637     }
638     else if ((p_msg = (tNFA_EE_API_SEND_DATA *) GKI_getbuf ((UINT16)(sizeof(tNFA_EE_API_SEND_DATA) + data_len))) != NULL)
639     {
640         p_msg->hdr.event        = NFA_EE_API_SEND_DATA_EVT;
641         p_msg->nfcee_id         = nfcee_id;
642         p_msg->p_cb             = p_cb;
643         p_msg->data_len         = data_len;
644         p_msg->p_data           = (UINT8 *)(p_msg + 1);
645         memcpy(p_msg->p_data, p_data, data_len);
646 
647         nfa_sys_sendmsg (p_msg);
648 
649         status = NFA_STATUS_OK;
650     }
651 
652     return status;
653 }
654 
655 /*******************************************************************************
656 **
657 ** Function         NFA_EeDisconnect
658 **
659 ** Description      Disconnect (if a connection is currently open) from an
660 **                  NFCEE interface. The result of this operation is reported
661 **                  with the NFA_EE_DISCONNECT_EVT.
662 **
663 ** Returns          NFA_STATUS_OK if successfully initiated
664 **                  NFA_STATUS_FAILED otherwise
665 **                  NFA_STATUS_INVALID_PARAM If bad parameter
666 **
667 *******************************************************************************/
NFA_EeDisconnect(tNFA_HANDLE ee_handle)668 tNFA_STATUS NFA_EeDisconnect(tNFA_HANDLE ee_handle)
669 {
670     tNFA_EE_API_DISCONNECT *p_msg;
671     tNFA_STATUS status = NFA_STATUS_FAILED;
672     UINT8       nfcee_id = (UINT8)(ee_handle & 0xFF);
673     tNFA_EE_ECB *p_cb;
674 
675     NFA_TRACE_API1 ("NFA_EeDisconnect(): handle:<0x%x>", ee_handle);
676     p_cb = nfa_ee_find_ecb (nfcee_id);
677 
678     if ((p_cb == NULL) || (p_cb->conn_st != NFA_EE_CONN_ST_CONN))
679     {
680         NFA_TRACE_ERROR0 ("NFA_EeDisconnect() Bad ee_handle");
681         status = NFA_STATUS_INVALID_PARAM;
682     }
683     else if ((p_msg = (tNFA_EE_API_DISCONNECT *) GKI_getbuf (sizeof(tNFA_EE_API_DISCONNECT))) != NULL)
684     {
685         p_msg->hdr.event        = NFA_EE_API_DISCONNECT_EVT;
686         p_msg->nfcee_id         = nfcee_id;
687         p_msg->p_cb             = p_cb;
688 
689         nfa_sys_sendmsg (p_msg);
690 
691         status = NFA_STATUS_OK;
692     }
693 
694     return status;
695 }
696