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