Home | History | Annotate | Download | only in dm
      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 for device management
     23  *
     24  ******************************************************************************/
     25 #include <string.h>
     26 #include "nfa_api.h"
     27 #include "nfa_sys.h"
     28 #include "nfa_dm_int.h"
     29 #include "nfa_ce_int.h"
     30 #include "nfa_sys_int.h"
     31 #include "ndef_utils.h"
     32 
     33 /*****************************************************************************
     34 **  Constants
     35 *****************************************************************************/
     36 
     37 /*****************************************************************************
     38 **  APIs
     39 *****************************************************************************/
     40 /*******************************************************************************
     41 **
     42 ** Function         NFA_Init
     43 **
     44 ** Description      This function initializes control blocks for NFA
     45 **
     46 **                  p_hal_entry_tbl points to a table of HAL entry points
     47 **
     48 **                  NOTE: the buffer that p_hal_entry_tbl points must be
     49 **                  persistent until NFA is disabled.
     50 **
     51 ** Returns          none
     52 **
     53 *******************************************************************************/
     54 void NFA_Init(tHAL_NFC_ENTRY *p_hal_entry_tbl)
     55 {
     56     NFA_TRACE_API0 ("NFA_Init ()");
     57     nfa_sys_init();
     58     nfa_dm_init();
     59     nfa_p2p_init();
     60     nfa_cho_init();
     61     nfa_snep_init(FALSE);
     62     nfa_rw_init();
     63     nfa_ce_init();
     64     nfa_ee_init();
     65     if (nfa_ee_max_ee_cfg != 0)
     66     {
     67         nfa_dm_cb.get_max_ee    = p_hal_entry_tbl->get_max_ee;
     68         nfa_hci_init();
     69     }
     70 
     71 
     72     /* Initialize NFC module */
     73     NFC_Init (p_hal_entry_tbl);
     74 }
     75 
     76 /*******************************************************************************
     77 **
     78 ** Function         NFA_Enable
     79 **
     80 ** Description      This function enables NFC. Prior to calling NFA_Enable,
     81 **                  the NFCC must be powered up, and ready to receive commands.
     82 **                  This function enables the tasks needed by NFC, opens the NCI
     83 **                  transport, resets the NFC controller, downloads patches to
     84 **                  the NFCC (if necessary), and initializes the NFC subsystems.
     85 **
     86 **                  This function should only be called once - typically when NFC
     87 **                  is enabled during boot-up, or when NFC is enabled from a
     88 **                  settings UI. Subsequent calls to NFA_Enable while NFA is
     89 **                  enabling or enabled will be ignored. When the NFC startup
     90 **                  procedure is completed, an NFA_DM_ENABLE_EVT is returned to the
     91 **                  application using the tNFA_DM_CBACK.
     92 **
     93 ** Returns          NFA_STATUS_OK if successfully initiated
     94 **                  NFA_STATUS_FAILED otherwise
     95 **
     96 *******************************************************************************/
     97 tNFA_STATUS NFA_Enable (tNFA_DM_CBACK        *p_dm_cback,
     98                         tNFA_CONN_CBACK      *p_conn_cback)
     99 {
    100     tNFA_DM_API_ENABLE *p_msg;
    101 
    102     NFA_TRACE_API0 ("NFA_Enable ()");
    103 
    104     /* Validate parameters */
    105     if ((!p_dm_cback) || (!p_conn_cback))
    106     {
    107         NFA_TRACE_ERROR0 ("NFA_Enable (): error null callback");
    108         return (NFA_STATUS_FAILED);
    109     }
    110 
    111     if ((p_msg = (tNFA_DM_API_ENABLE *) GKI_getbuf (sizeof (tNFA_DM_API_ENABLE))) != NULL)
    112     {
    113         p_msg->hdr.event    = NFA_DM_API_ENABLE_EVT;
    114         p_msg->p_dm_cback   = p_dm_cback;
    115         p_msg->p_conn_cback = p_conn_cback;
    116 
    117         nfa_sys_sendmsg (p_msg);
    118 
    119         return (NFA_STATUS_OK);
    120     }
    121 
    122     return (NFA_STATUS_FAILED);
    123 }
    124 
    125 /*******************************************************************************
    126 **
    127 ** Function         NFA_Disable
    128 **
    129 ** Description      This function is called to shutdown NFC. The tasks for NFC
    130 **                  are terminated, and clean up routines are performed. This
    131 **                  function is typically called during platform shut-down, or
    132 **                  when NFC is disabled from a settings UI. When the NFC
    133 **                  shutdown procedure is completed, an NFA_DM_DISABLE_EVT is
    134 **                  returned to the application using the tNFA_DM_CBACK.
    135 **
    136 **                  The platform should wait until the NFC_DISABLE_REVT is
    137 **                  received before powering down the NFC chip and NCI transport.
    138 **                  This is required to so that NFA can gracefully shut down any
    139 **                  open connections.
    140 **
    141 ** Returns          NFA_STATUS_OK if successfully initiated
    142 **                  NFA_STATUS_FAILED otherwise
    143 **
    144 *******************************************************************************/
    145 tNFA_STATUS NFA_Disable (BOOLEAN graceful)
    146 {
    147     tNFA_DM_API_DISABLE *p_msg;
    148 
    149     NFA_TRACE_API1 ("NFA_Disable (graceful=%i)", graceful);
    150 
    151     if ((p_msg = (tNFA_DM_API_DISABLE *) GKI_getbuf (sizeof (tNFA_DM_API_DISABLE))) != NULL)
    152     {
    153         p_msg->hdr.event = NFA_DM_API_DISABLE_EVT;
    154         p_msg->graceful  = graceful;
    155 
    156         nfa_sys_sendmsg (p_msg);
    157 
    158         return (NFA_STATUS_OK);
    159     }
    160 
    161     return (NFA_STATUS_FAILED);
    162 }
    163 
    164 /*******************************************************************************
    165 **
    166 ** Function         NFA_SetConfig
    167 **
    168 ** Description      Set the configuration parameters to NFCC. The result is
    169 **                  reported with an NFA_DM_SET_CONFIG_EVT in the tNFA_DM_CBACK
    170 **                  callback.
    171 **
    172 ** Note:            If RF discovery is started, NFA_StopRfDiscovery()/NFA_RF_DISCOVERY_STOPPED_EVT
    173 **                  should happen before calling this function. Most Configuration
    174 **                  parameters are related to RF discovery.
    175 **
    176 ** Returns          NFA_STATUS_OK if successfully initiated
    177 **                  NFA_STATUS_BUSY if previous setting is on-going
    178 **                  NFA_STATUS_FAILED otherwise
    179 **
    180 *******************************************************************************/
    181 tNFA_STATUS NFA_SetConfig (tNFA_PMID param_id,
    182                            UINT8     length,
    183                            UINT8    *p_data)
    184 {
    185     tNFA_DM_API_SET_CONFIG *p_msg;
    186 
    187     NFA_TRACE_API1 ("NFA_SetConfig (): param_id:0x%X", param_id);
    188 
    189     if ((p_msg = (tNFA_DM_API_SET_CONFIG *) GKI_getbuf ((UINT16) (sizeof (tNFA_DM_API_SET_CONFIG) + length))) != NULL)
    190     {
    191         p_msg->hdr.event = NFA_DM_API_SET_CONFIG_EVT;
    192 
    193         p_msg->param_id = param_id;
    194         p_msg->length   = length;
    195         p_msg->p_data   = (UINT8 *) (p_msg + 1);
    196 
    197         /* Copy parameter data */
    198         memcpy (p_msg->p_data, p_data, length);
    199 
    200         nfa_sys_sendmsg (p_msg);
    201 
    202         return (NFA_STATUS_OK);
    203     }
    204 
    205     return (NFA_STATUS_FAILED);
    206 }
    207 
    208 /*******************************************************************************
    209 **
    210 ** Function         NFA_GetConfig
    211 **
    212 ** Description      Get the configuration parameters from NFCC. The result is
    213 **                  reported with an NFA_DM_GET_CONFIG_EVT in the tNFA_DM_CBACK
    214 **                  callback.
    215 **
    216 ** Returns          NFA_STATUS_OK if successfully initiated
    217 **                  NFA_STATUS_FAILED otherwise
    218 **
    219 *******************************************************************************/
    220 tNFA_STATUS NFA_GetConfig (UINT8 num_ids,
    221                            tNFA_PMID *p_param_ids)
    222 {
    223     tNFA_DM_API_GET_CONFIG *p_msg;
    224 
    225     NFA_TRACE_API1 ("NFA_GetConfig (): num_ids: %i", num_ids);
    226 
    227 
    228     if ((p_msg = (tNFA_DM_API_GET_CONFIG *) GKI_getbuf ((UINT16) (sizeof (tNFA_DM_API_GET_CONFIG) + num_ids))) != NULL)
    229     {
    230         p_msg->hdr.event = NFA_DM_API_GET_CONFIG_EVT;
    231 
    232         p_msg->num_ids = num_ids;
    233         p_msg->p_pmids = (tNFA_PMID *) (p_msg+1);
    234 
    235         /* Copy the param IDs */
    236         memcpy (p_msg->p_pmids, p_param_ids, num_ids);
    237 
    238         nfa_sys_sendmsg (p_msg);
    239 
    240         return (NFA_STATUS_OK);
    241     }
    242 
    243     return (NFA_STATUS_FAILED);
    244 }
    245 
    246 /*******************************************************************************
    247 **
    248 ** Function         NFA_RequestExclusiveRfControl
    249 **
    250 ** Description      Request exclusive control of NFC.
    251 **                  - Previous behavior (polling/tag reading, DH card emulation)
    252 **                    will be suspended .
    253 **                  - Polling and listening will be done based on the specified
    254 **                    params
    255 **
    256 **                  The NFA_EXCLUSIVE_RF_CONTROL_STARTED_EVT event of
    257 **                  tNFA_CONN_CBACK indicates the status of the operation.
    258 **
    259 **                  NFA_ACTIVATED_EVT and NFA_DEACTIVATED_EVT indicates link
    260 **                  activation/deactivation.
    261 **
    262 **                  NFA_SendRawFrame is used to send data to the peer. NFA_DATA_EVT
    263 **                  indicates data from the peer.
    264 **
    265 **                  If a tag is activated, then the NFA_RW APIs may be used to
    266 **                  send commands to the tag. Incoming NDEF messages are sent to
    267 **                  the NDEF callback.
    268 **
    269 **                  Once exclusive RF control has started, NFA will not activate
    270 **                  LLCP internally. The application has exclusive control of
    271 **                  the link.
    272 **
    273 ** Note:            If RF discovery is started, NFA_StopRfDiscovery()/NFA_RF_DISCOVERY_STOPPED_EVT
    274 **                  should happen before calling this function
    275 **
    276 ** Returns          NFA_STATUS_OK if successfully initiated
    277 **                  NFA_STATUS_FAILED otherwise
    278 **
    279 *******************************************************************************/
    280 tNFA_STATUS NFA_RequestExclusiveRfControl  (tNFA_TECHNOLOGY_MASK poll_mask,
    281                                             tNFA_LISTEN_CFG      *p_listen_cfg,
    282                                             tNFA_CONN_CBACK      *p_conn_cback,
    283                                             tNFA_NDEF_CBACK      *p_ndef_cback)
    284 {
    285     tNFA_DM_API_REQ_EXCL_RF_CTRL *p_msg;
    286 
    287     NFA_TRACE_API1 ("NFA_RequestExclusiveRfControl () poll_mask=0x%x", poll_mask);
    288 
    289     if (!p_conn_cback)
    290     {
    291         NFA_TRACE_ERROR0 ("NFA_RequestExclusiveRfControl (): error null callback");
    292         return (NFA_STATUS_FAILED);
    293     }
    294 
    295     if ((p_msg = (tNFA_DM_API_REQ_EXCL_RF_CTRL *) GKI_getbuf (sizeof (tNFA_DM_API_REQ_EXCL_RF_CTRL))) != NULL)
    296     {
    297         p_msg->hdr.event = NFA_DM_API_REQUEST_EXCL_RF_CTRL_EVT;
    298         p_msg->poll_mask    = poll_mask;
    299         p_msg->p_conn_cback = p_conn_cback;
    300         p_msg->p_ndef_cback = p_ndef_cback;
    301 
    302         if (p_listen_cfg)
    303             memcpy (&p_msg->listen_cfg, p_listen_cfg, sizeof (tNFA_LISTEN_CFG));
    304         else
    305             memset (&p_msg->listen_cfg, 0x00, sizeof (tNFA_LISTEN_CFG));
    306 
    307         nfa_sys_sendmsg (p_msg);
    308 
    309         return (NFA_STATUS_OK);
    310     }
    311 
    312     return (NFA_STATUS_FAILED);
    313 }
    314 
    315 /*******************************************************************************
    316 **
    317 ** Function         NFA_ReleaseExclusiveRfControl
    318 **
    319 ** Description      Release exclusive control of NFC. Once released, behavior
    320 **                  prior to obtaining exclusive RF control will resume.
    321 **
    322 ** Returns          NFA_STATUS_OK if successfully initiated
    323 **                  NFA_STATUS_FAILED otherwise
    324 **
    325 *******************************************************************************/
    326 tNFA_STATUS NFA_ReleaseExclusiveRfControl (void)
    327 {
    328     BT_HDR *p_msg;
    329 
    330     NFA_TRACE_API0 ("NFA_ReleaseExclusiveRfControl ()");
    331 
    332     if (!nfa_dm_cb.p_excl_conn_cback)
    333     {
    334         NFA_TRACE_ERROR0 ("NFA_ReleaseExclusiveRfControl (): Exclusive rf control is not in progress");
    335         return (NFA_STATUS_FAILED);
    336     }
    337 
    338     if ((p_msg = (BT_HDR *) GKI_getbuf (sizeof (BT_HDR))) != NULL)
    339     {
    340         p_msg->event = NFA_DM_API_RELEASE_EXCL_RF_CTRL_EVT;
    341         nfa_sys_sendmsg (p_msg);
    342         return (NFA_STATUS_OK);
    343     }
    344 
    345     return (NFA_STATUS_FAILED);
    346 }
    347 
    348 
    349 /*******************************************************************************
    350 **
    351 ** Function         NFA_EnablePolling
    352 **
    353 ** Description      Enable polling for technologies specified by poll_mask.
    354 **
    355 **                  The following events (notified using the connection
    356 **                  callback registered with NFA_Enable) are generated during
    357 **                  polling:
    358 **
    359 **                  - NFA_POLL_ENABLED_EVT indicates whether or not polling
    360 **                    successfully enabled.
    361 **                  - NFA_DISC_RESULT_EVT indicates there are more than one devices,
    362 **                    so application must select one of tags by calling NFA_Select().
    363 **                  - NFA_SELECT_RESULT_EVT indicates whether previous selection was
    364 **                    successful or not. If it was failed then application must select
    365 **                    again or deactivate by calling NFA_Deactivate().
    366 **                  - NFA_ACTIVATED_EVT is generated when an NFC link is activated.
    367 **                  - NFA_NDEF_DETECT_EVT is generated if tag is activated
    368 **                  - NFA_LLCP_ACTIVATED_EVT/NFA_LLCP_DEACTIVATED_EVT is generated
    369 **                    if NFC-DEP is activated
    370 **                  - NFA_DEACTIVATED_EVT will be returned after deactivating NFC link.
    371 **
    372 ** Note:            If RF discovery is started, NFA_StopRfDiscovery()/NFA_RF_DISCOVERY_STOPPED_EVT
    373 **                  should happen before calling this function
    374 **
    375 ** Returns          NFA_STATUS_OK if successfully initiated
    376 **                  NFA_STATUS_FAILED otherwise
    377 **
    378 *******************************************************************************/
    379 tNFA_STATUS NFA_EnablePolling (tNFA_TECHNOLOGY_MASK poll_mask)
    380 {
    381     tNFA_DM_API_ENABLE_POLL *p_msg;
    382 
    383     NFA_TRACE_API1 ("NFA_EnablePolling () 0x%X", poll_mask);
    384 
    385     if ((p_msg = (tNFA_DM_API_ENABLE_POLL *) GKI_getbuf (sizeof (tNFA_DM_API_ENABLE_POLL))) != NULL)
    386     {
    387         p_msg->hdr.event = NFA_DM_API_ENABLE_POLLING_EVT;
    388         p_msg->poll_mask = poll_mask;
    389 
    390         nfa_sys_sendmsg (p_msg);
    391 
    392         return (NFA_STATUS_OK);
    393     }
    394 
    395     return (NFA_STATUS_FAILED);
    396 }
    397 
    398 /*******************************************************************************
    399 **
    400 ** Function         NFA_DisablePolling
    401 **
    402 ** Description      Disable polling
    403 **                  NFA_POLL_DISABLED_EVT will be returned after stopping polling.
    404 **
    405 ** Note:            If RF discovery is started, NFA_StopRfDiscovery()/NFA_RF_DISCOVERY_STOPPED_EVT
    406 **                  should happen before calling this function
    407 **
    408 ** Returns          NFA_STATUS_OK if successfully initiated
    409 **                  NFA_STATUS_FAILED otherwise
    410 **
    411 *******************************************************************************/
    412 tNFA_STATUS NFA_DisablePolling (void)
    413 {
    414     BT_HDR *p_msg;
    415 
    416     NFA_TRACE_API0 ("NFA_DisablePolling ()");
    417 
    418     if ((p_msg = (BT_HDR *) GKI_getbuf (sizeof (BT_HDR))) != NULL)
    419     {
    420         p_msg->event = NFA_DM_API_DISABLE_POLLING_EVT;
    421 
    422         nfa_sys_sendmsg (p_msg);
    423 
    424         return (NFA_STATUS_OK);
    425     }
    426 
    427     return (NFA_STATUS_FAILED);
    428 }
    429 
    430 /*******************************************************************************
    431 **
    432 ** Function         NFA_EnableListening
    433 **
    434 ** Description      Enable listening.
    435 **                  NFA_LISTEN_ENABLED_EVT will be returned after listening is allowed.
    436 **
    437 **                  The actual listening technologies are specified by other NFA
    438 **                  API functions. Such functions include (but not limited to)
    439 **                  NFA_CeConfigureUiccListenTech.
    440 **                  If NFA_DisableListening () is called to ignore the listening technologies,
    441 **                  NFA_EnableListening () is called to restore the listening technologies
    442 **                  set by these functions.
    443 **
    444 ** Note:            If RF discovery is started, NFA_StopRfDiscovery()/NFA_RF_DISCOVERY_STOPPED_EVT
    445 **                  should happen before calling this function
    446 **
    447 ** Returns          NFA_STATUS_OK if successfully initiated
    448 **                  NFA_STATUS_FAILED otherwise
    449 **
    450 *******************************************************************************/
    451 tNFA_STATUS NFA_EnableListening (void)
    452 {
    453     BT_HDR *p_msg;
    454 
    455     NFA_TRACE_API0 ("NFA_EnableListening ()");
    456 
    457     if ((p_msg = (BT_HDR *) GKI_getbuf (sizeof (BT_HDR))) != NULL)
    458     {
    459         p_msg->event = NFA_DM_API_ENABLE_LISTENING_EVT;
    460 
    461         nfa_sys_sendmsg (p_msg);
    462 
    463         return (NFA_STATUS_OK);
    464     }
    465 
    466     return (NFA_STATUS_FAILED);
    467 }
    468 
    469 /*******************************************************************************
    470 **
    471 ** Function         NFA_DisableListening
    472 **
    473 ** Description      Disable listening
    474 **                  NFA_LISTEN_DISABLED_EVT will be returned after stopping listening.
    475 **                  This function is called to exclude listen at RF discovery.
    476 **
    477 ** Note:            If RF discovery is started, NFA_StopRfDiscovery()/NFA_RF_DISCOVERY_STOPPED_EVT
    478 **                  should happen before calling this function
    479 **
    480 ** Returns          NFA_STATUS_OK if successfully initiated
    481 **                  NFA_STATUS_FAILED otherwise
    482 **
    483 *******************************************************************************/
    484 tNFA_STATUS NFA_DisableListening (void)
    485 {
    486     BT_HDR *p_msg;
    487 
    488     NFA_TRACE_API0 ("NFA_DisableListening ()");
    489 
    490     if ((p_msg = (BT_HDR *) GKI_getbuf (sizeof (BT_HDR))) != NULL)
    491     {
    492         p_msg->event = NFA_DM_API_DISABLE_LISTENING_EVT;
    493 
    494         nfa_sys_sendmsg (p_msg);
    495 
    496         return (NFA_STATUS_OK);
    497     }
    498 
    499     return (NFA_STATUS_FAILED);
    500 }
    501 
    502 /*******************************************************************************
    503 **
    504 ** Function         NFA_PauseP2p
    505 **
    506 ** Description      Pause P2P services.
    507 **                  NFA_P2P_PAUSED_EVT will be returned after P2P services are
    508 **                  disabled.
    509 **
    510 **                  The P2P services enabled by NFA_P2p* API functions are not
    511 **                  available. NFA_ResumeP2p() is called to resume the P2P
    512 **                  services.
    513 **
    514 ** Note:            If RF discovery is started, NFA_StopRfDiscovery()/NFA_RF_DISCOVERY_STOPPED_EVT
    515 **                  should happen before calling this function
    516 **
    517 ** Returns          NFA_STATUS_OK if successfully initiated
    518 **                  NFA_STATUS_FAILED otherwise
    519 **
    520 *******************************************************************************/
    521 tNFA_STATUS NFA_PauseP2p (void)
    522 {
    523     BT_HDR *p_msg;
    524 
    525     NFA_TRACE_API0 ("NFA_PauseP2p ()");
    526 
    527     if ((p_msg = (BT_HDR *) GKI_getbuf (sizeof (BT_HDR))) != NULL)
    528     {
    529         p_msg->event = NFA_DM_API_PAUSE_P2P_EVT;
    530 
    531         nfa_sys_sendmsg (p_msg);
    532 
    533         return (NFA_STATUS_OK);
    534     }
    535 
    536     return (NFA_STATUS_FAILED);
    537 }
    538 
    539 /*******************************************************************************
    540 **
    541 ** Function         NFA_ResumeP2p
    542 **
    543 ** Description      Resume P2P services.
    544 **                  NFA_P2P_RESUMED_EVT will be returned after P2P services are.
    545 **                  enables again.
    546 **
    547 ** Note:            If RF discovery is started, NFA_StopRfDiscovery()/NFA_RF_DISCOVERY_STOPPED_EVT
    548 **                  should happen before calling this function
    549 **
    550 ** Returns          NFA_STATUS_OK if successfully initiated
    551 **                  NFA_STATUS_FAILED otherwise
    552 **
    553 *******************************************************************************/
    554 tNFA_STATUS NFA_ResumeP2p (void)
    555 {
    556     BT_HDR *p_msg;
    557 
    558     NFA_TRACE_API0 ("NFA_ResumeP2p ()");
    559 
    560     if ((p_msg = (BT_HDR *) GKI_getbuf (sizeof (BT_HDR))) != NULL)
    561     {
    562         p_msg->event = NFA_DM_API_RESUME_P2P_EVT;
    563 
    564         nfa_sys_sendmsg (p_msg);
    565 
    566         return (NFA_STATUS_OK);
    567     }
    568 
    569     return (NFA_STATUS_FAILED);
    570 }
    571 
    572 /*******************************************************************************
    573 **
    574 ** Function         NFA_SetP2pListenTech
    575 **
    576 ** Description      This function is called to set listen technology for NFC-DEP.
    577 **                  This funtion may be called before or after starting any server
    578 **                  on NFA P2P/CHO/SNEP.
    579 **                  If there is no technology for NFC-DEP, P2P listening will be
    580 **                  stopped.
    581 **
    582 **                  NFA_SET_P2P_LISTEN_TECH_EVT without data will be returned.
    583 **
    584 ** Note:            If RF discovery is started, NFA_StopRfDiscovery()/NFA_RF_DISCOVERY_STOPPED_EVT
    585 **                  should happen before calling this function
    586 **
    587 ** Returns          NFA_STATUS_OK if successfully initiated
    588 **                  NFA_STATUS_FAILED otherwise
    589 **
    590 *******************************************************************************/
    591 tNFA_STATUS NFA_SetP2pListenTech (tNFA_TECHNOLOGY_MASK tech_mask)
    592 {
    593     tNFA_DM_API_SET_P2P_LISTEN_TECH *p_msg;
    594 
    595     NFA_TRACE_API1 ("NFA_P2pSetListenTech (): tech_mask:0x%X", tech_mask);
    596 
    597     if ((p_msg = (tNFA_DM_API_SET_P2P_LISTEN_TECH *) GKI_getbuf (sizeof (tNFA_DM_API_SET_P2P_LISTEN_TECH))) != NULL)
    598     {
    599         p_msg->hdr.event = NFA_DM_API_SET_P2P_LISTEN_TECH_EVT;
    600         p_msg->tech_mask = tech_mask;
    601 
    602         nfa_sys_sendmsg (p_msg);
    603 
    604         return (NFA_STATUS_OK);
    605     }
    606 
    607     return (NFA_STATUS_FAILED);
    608 }
    609 
    610 /*******************************************************************************
    611 **
    612 ** Function         NFA_StartRfDiscovery
    613 **
    614 ** Description      Start RF discovery
    615 **                  RF discovery parameters shall be set by other APIs.
    616 **
    617 **                  An NFA_RF_DISCOVERY_STARTED_EVT indicates whether starting was successful or not.
    618 **
    619 ** Returns          NFA_STATUS_OK if successfully initiated
    620 **                  NFA_STATUS_FAILED otherwise
    621 **
    622 *******************************************************************************/
    623 tNFA_STATUS NFA_StartRfDiscovery (void)
    624 {
    625     BT_HDR *p_msg;
    626 
    627     NFA_TRACE_API0 ("NFA_StartRfDiscovery ()");
    628 
    629     if ((p_msg = (BT_HDR *) GKI_getbuf (sizeof (BT_HDR))) != NULL)
    630     {
    631         p_msg->event = NFA_DM_API_START_RF_DISCOVERY_EVT;
    632 
    633         nfa_sys_sendmsg (p_msg);
    634 
    635         return (NFA_STATUS_OK);
    636     }
    637 
    638     return (NFA_STATUS_FAILED);
    639 }
    640 
    641 /*******************************************************************************
    642 **
    643 ** Function         NFA_StopRfDiscovery
    644 **
    645 ** Description      Stop RF discovery
    646 **
    647 **                  An NFA_RF_DISCOVERY_STOPPED_EVT indicates whether stopping was successful or not.
    648 **
    649 ** Returns          NFA_STATUS_OK if successfully initiated
    650 **                  NFA_STATUS_FAILED otherwise
    651 **
    652 *******************************************************************************/
    653 tNFA_STATUS NFA_StopRfDiscovery (void)
    654 {
    655     BT_HDR *p_msg;
    656 
    657     NFA_TRACE_API0 ("NFA_StopRfDiscovery ()");
    658 
    659     if ((p_msg = (BT_HDR *) GKI_getbuf (sizeof (BT_HDR))) != NULL)
    660     {
    661         p_msg->event = NFA_DM_API_STOP_RF_DISCOVERY_EVT;
    662 
    663         nfa_sys_sendmsg (p_msg);
    664 
    665         return (NFA_STATUS_OK);
    666     }
    667 
    668     return (NFA_STATUS_FAILED);
    669 }
    670 
    671 /*******************************************************************************
    672 **
    673 ** Function         NFA_SetRfDiscoveryDuration
    674 **
    675 ** Description      Set the duration of the single discovery period in [ms].
    676 **                  Allowable range: 0 ms to 0xFFFF ms.
    677 **
    678 **                  If discovery is already started, the application should
    679 **                  call NFA_StopRfDiscovery prior to calling
    680 **                  NFA_SetRfDiscoveryDuration, and then call
    681 **                  NFA_StartRfDiscovery afterwards to restart discovery using
    682 **                  the new duration.
    683 **
    684 ** Note:            If RF discovery is started, NFA_StopRfDiscovery()/NFA_RF_DISCOVERY_STOPPED_EVT
    685 **                  should happen before calling this function
    686 **
    687 ** Returns:
    688 **                  NFA_STATUS_OK, if command accepted
    689 **                  NFA_STATUS_FAILED: otherwise
    690 **
    691 *******************************************************************************/
    692 tNFA_STATUS NFA_SetRfDiscoveryDuration (UINT16 discovery_period_ms)
    693 {
    694     tNFA_DM_API_SET_RF_DISC_DUR *p_msg;
    695 
    696     NFA_TRACE_API0 ("NFA_SetRfDiscoveryDuration ()");
    697 
    698     /* Post the API message */
    699     if ((p_msg = (tNFA_DM_API_SET_RF_DISC_DUR *) GKI_getbuf (sizeof (BT_HDR))) != NULL)
    700     {
    701         p_msg->hdr.event = NFA_DM_API_SET_RF_DISC_DURATION_EVT;
    702 
    703         /* Set discovery duration */
    704         p_msg->rf_disc_dur_ms = discovery_period_ms;
    705 
    706         nfa_sys_sendmsg (p_msg);
    707 
    708         return (NFA_STATUS_OK);
    709     }
    710 
    711     return (NFA_STATUS_FAILED);
    712 }
    713 
    714 /*******************************************************************************
    715 **
    716 ** Function         NFA_Select
    717 **
    718 ** Description      Select one from detected devices during discovery
    719 **                  (from NFA_DISC_RESULT_EVTs). The application should wait for
    720 **                  the final NFA_DISC_RESULT_EVT before selecting.
    721 **
    722 **                  An NFA_SELECT_RESULT_EVT indicates whether selection was successful or not.
    723 **                  If failed then application must select again or deactivate by NFA_Deactivate().
    724 **
    725 ** Returns          NFA_STATUS_OK if successfully initiated
    726 **                  NFA_STATUS_INVALID_PARAM if RF interface is not matched protocol
    727 **                  NFA_STATUS_FAILED otherwise
    728 **
    729 *******************************************************************************/
    730 tNFA_STATUS NFA_Select (UINT8             rf_disc_id,
    731                         tNFA_NFC_PROTOCOL protocol,
    732                         tNFA_INTF_TYPE    rf_interface)
    733 {
    734     tNFA_DM_API_SELECT *p_msg;
    735 
    736     NFA_TRACE_API3 ("NFA_Select (): rf_disc_id:0x%X, protocol:0x%X, rf_interface:0x%X",
    737                     rf_disc_id, protocol, rf_interface);
    738 
    739     if (  ((rf_interface == NFA_INTERFACE_ISO_DEP) && (protocol != NFA_PROTOCOL_ISO_DEP))
    740         ||((rf_interface == NFA_INTERFACE_NFC_DEP) && (protocol != NFA_PROTOCOL_NFC_DEP))  )
    741     {
    742         NFA_TRACE_ERROR0 ("NFA_Select (): RF interface is not matched protocol");
    743         return (NFA_STATUS_INVALID_PARAM);
    744     }
    745 
    746     if ((p_msg = (tNFA_DM_API_SELECT *) GKI_getbuf ((UINT16) (sizeof (tNFA_DM_API_SELECT)))) != NULL)
    747     {
    748         p_msg->hdr.event     = NFA_DM_API_SELECT_EVT;
    749         p_msg->rf_disc_id    = rf_disc_id;
    750         p_msg->protocol      = protocol;
    751         p_msg->rf_interface  = rf_interface;
    752 
    753         nfa_sys_sendmsg (p_msg);
    754 
    755         return (NFA_STATUS_OK);
    756     }
    757 
    758     return (NFA_STATUS_FAILED);
    759 }
    760 
    761 /*******************************************************************************
    762 **
    763 ** Function         NFA_UpdateRFCommParams
    764 **
    765 ** Description      This function is called to update RF Communication parameters
    766 **                  once the Frame RF Interface has been activated.
    767 **
    768 **                  An NFA_UPDATE_RF_PARAM_RESULT_EVT indicates whether updating
    769 **                  was successful or not.
    770 **
    771 ** Returns          NFA_STATUS_OK if successfully initiated
    772 **                  NFA_STATUS_FAILED otherwise
    773 **
    774 *******************************************************************************/
    775 tNFA_STATUS NFA_UpdateRFCommParams (tNFA_RF_COMM_PARAMS *p_params)
    776 {
    777     tNFA_DM_API_UPDATE_RF_PARAMS *p_msg;
    778 
    779     NFA_TRACE_API0 ("NFA_UpdateRFCommParams ()");
    780 
    781     if ((p_msg = (tNFA_DM_API_UPDATE_RF_PARAMS *) GKI_getbuf ((UINT16) (sizeof (tNFA_DM_API_UPDATE_RF_PARAMS)))) != NULL)
    782     {
    783         p_msg->hdr.event     = NFA_DM_API_UPDATE_RF_PARAMS_EVT;
    784         memcpy (&p_msg->params, p_params, sizeof (tNFA_RF_COMM_PARAMS));
    785 
    786         nfa_sys_sendmsg (p_msg);
    787 
    788         return (NFA_STATUS_OK);
    789     }
    790 
    791     return (NFA_STATUS_FAILED);
    792 }
    793 
    794 /*******************************************************************************
    795 **
    796 ** Function         NFA_Deactivate
    797 **
    798 ** Description
    799 **                  If sleep_mode=TRUE:
    800 **                      Deselect the activated device by deactivating into sleep mode.
    801 **
    802 **                      An NFA_DEACTIVATE_FAIL_EVT indicates that selection was not successful.
    803 **                      Application can select another discovered device or deactivate by NFA_Deactivate ()
    804 **                      after receiving NFA_DEACTIVATED_EVT.
    805 **
    806 **                      Deactivating to sleep mode is not allowed when NFCC is in wait-for-host-select
    807 **                      mode, or in listen-sleep states; NFA will deactivate to idle or discovery state
    808 **                      for these cases respectively.
    809 **
    810 **
    811 **                  If sleep_mode=FALSE:
    812 **                      Deactivate the connection (e.g. as a result of presence check failure)
    813 **                      NFA_DEACTIVATED_EVT will indicate that link is deactivated.
    814 **                      Polling/listening will resume (unless the nfcc is in wait_for-all-discoveries state)
    815 **
    816 **
    817 ** Returns          NFA_STATUS_OK if successfully initiated
    818 **                  NFA_STATUS_FAILED otherwise
    819 **
    820 *******************************************************************************/
    821 NFC_API extern tNFA_STATUS NFA_Deactivate (BOOLEAN sleep_mode)
    822 {
    823     tNFA_DM_API_DEACTIVATE *p_msg;
    824 
    825     NFA_TRACE_API1 ("NFA_Deactivate (): sleep_mode:%i", sleep_mode);
    826 
    827     if ((p_msg = (tNFA_DM_API_DEACTIVATE *) GKI_getbuf ((UINT16) (sizeof (tNFA_DM_API_DEACTIVATE)))) != NULL)
    828     {
    829         p_msg->hdr.event    = NFA_DM_API_DEACTIVATE_EVT;
    830         p_msg->sleep_mode   = sleep_mode;
    831 
    832         nfa_sys_sendmsg (p_msg);
    833 
    834         return (NFA_STATUS_OK);
    835     }
    836 
    837     return (NFA_STATUS_FAILED);
    838 }
    839 
    840 /*******************************************************************************
    841 **
    842 ** Function         NFA_SendRawFrame
    843 **
    844 ** Description      Send a raw frame over the activated interface with the NFCC.
    845 **                  This function can only be called after NFC link is activated.
    846 **
    847 **                  If the activated interface is a tag and auto-presence check is
    848 **                  enabled then presence_check_start_delay can be used to indicate
    849 **                  the delay in msec after which the next auto presence check
    850 **                  command can be sent. NFA_DM_DEFAULT_PRESENCE_CHECK_START_DELAY
    851 **                  can be used as the default value for the delay.
    852 **
    853 ** Returns          NFA_STATUS_OK if successfully initiated
    854 **                  NFA_STATUS_FAILED otherwise
    855 **
    856 *******************************************************************************/
    857 tNFA_STATUS NFA_SendRawFrame (UINT8  *p_raw_data,
    858                               UINT16  data_len,
    859                               UINT16  presence_check_start_delay)
    860 {
    861     BT_HDR *p_msg;
    862     UINT16  size;
    863     UINT8  *p;
    864 
    865     NFA_TRACE_API1 ("NFA_SendRawFrame () data_len:%d", data_len);
    866 
    867     /* Validate parameters */
    868     if ((data_len == 0) || (p_raw_data == NULL))
    869         return (NFA_STATUS_INVALID_PARAM);
    870 
    871     size = BT_HDR_SIZE + NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE + data_len;
    872     if ((p_msg = (BT_HDR *) GKI_getbuf (size)) != NULL)
    873     {
    874         p_msg->event  = NFA_DM_API_RAW_FRAME_EVT;
    875         p_msg->layer_specific = presence_check_start_delay;
    876         p_msg->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE;
    877         p_msg->len    = data_len;
    878 
    879         p = (UINT8 *) (p_msg + 1) + p_msg->offset;
    880         memcpy (p, p_raw_data, data_len);
    881 
    882         nfa_sys_sendmsg (p_msg);
    883 
    884         return (NFA_STATUS_OK);
    885     }
    886 
    887     return (NFA_STATUS_FAILED);
    888 }
    889 
    890 /*******************************************************************************
    891 ** NDEF Handler APIs
    892 *******************************************************************************/
    893 
    894 /*******************************************************************************
    895 **
    896 ** Function         NFA_RegisterNDefTypeHandler
    897 **
    898 ** Description      This function allows the applications to register for
    899 **                  specific types of NDEF records. When NDEF records are
    900 **                  received, NFA will parse the record-type field, and pass
    901 **                  the record to the registered tNFA_NDEF_CBACK.
    902 **
    903 **                  For records types which were not registered, the record will
    904 **                  be sent to the default handler. A default type-handler may
    905 **                  be registered by calling this NFA_RegisterNDefTypeHandler
    906 **                  with tnf=NFA_TNF_DEFAULT. In this case, all un-registered
    907 **                  record types will be sent to the callback. Only one default
    908 **                  handler may be registered at a time.
    909 **
    910 **                  An NFA_NDEF_REGISTER_EVT will be sent to the tNFA_NDEF_CBACK
    911 **                  to indicate that registration was successful, and provide a
    912 **                  handle for this record type.
    913 **
    914 ** Returns          NFA_STATUS_OK if successfully initiated
    915 **                  NFA_STATUS_FAILED otherwise
    916 **
    917 *******************************************************************************/
    918 tNFA_STATUS NFA_RegisterNDefTypeHandler (BOOLEAN         handle_whole_message,
    919                                          tNFA_TNF        tnf,
    920                                          UINT8           *p_type_name,
    921                                          UINT8           type_name_len,
    922                                          tNFA_NDEF_CBACK *p_ndef_cback)
    923 {
    924     tNFA_DM_API_REG_NDEF_HDLR *p_msg;
    925 
    926     NFA_TRACE_API2 ("NFA_RegisterNDefTypeHandler (): handle whole ndef message: %i, tnf=0x%02x", handle_whole_message, tnf);
    927 
    928     /* Check for NULL callback */
    929     if (!p_ndef_cback)
    930     {
    931         NFA_TRACE_ERROR0 ("NFA_RegisterNDefTypeHandler (): error - null callback");
    932         return (NFA_STATUS_INVALID_PARAM);
    933     }
    934 
    935 
    936     if ((p_msg = (tNFA_DM_API_REG_NDEF_HDLR *) GKI_getbuf ((UINT16) (sizeof (tNFA_DM_API_REG_NDEF_HDLR) + type_name_len))) != NULL)
    937     {
    938         p_msg->hdr.event = NFA_DM_API_REG_NDEF_HDLR_EVT;
    939 
    940         p_msg->flags = (handle_whole_message ? NFA_NDEF_FLAGS_HANDLE_WHOLE_MESSAGE : 0);
    941         p_msg->tnf = tnf;
    942         p_msg->name_len = type_name_len;
    943         p_msg->p_ndef_cback = p_ndef_cback;
    944         memcpy (p_msg->name, p_type_name, type_name_len);
    945 
    946         nfa_sys_sendmsg (p_msg);
    947 
    948         return (NFA_STATUS_OK);
    949     }
    950 
    951     return (NFA_STATUS_FAILED);
    952 }
    953 
    954 /*******************************************************************************
    955 **
    956 ** Function         NFA_RegisterNDefUriHandler
    957 **
    958 ** Description      This API is a special-case of NFA_RegisterNDefTypeHandler
    959 **                  with TNF=NFA_TNF_WKT, and type_name='U' (URI record); and allows
    960 **                  registering for specific URI types (e.g. 'tel:' or 'mailto:').
    961 **
    962 **                  An NFA_NDEF_REGISTER_EVT will be sent to the tNFA_NDEF_CBACK
    963 **                  to indicate that registration was successful, and provide a
    964 **                  handle for this registration.
    965 **
    966 **                  If uri_id=NFA_NDEF_URI_ID_ABSOLUTE, then p_abs_uri contains the
    967 **                  unabridged URI. For all other uri_id values, the p_abs_uri
    968 **                  parameter is ignored (i.e the URI prefix is implied by uri_id).
    969 **                  See [NFC RTD URI] for more information.
    970 **
    971 ** Returns          NFA_STATUS_OK if successfully initiated
    972 **                  NFA_STATUS_FAILED otherwise
    973 **
    974 *******************************************************************************/
    975 NFC_API extern tNFA_STATUS NFA_RegisterNDefUriHandler (BOOLEAN          handle_whole_message,
    976                                                        tNFA_NDEF_URI_ID uri_id,
    977                                                        UINT8            *p_abs_uri,
    978                                                        UINT8            uri_id_len,
    979                                                        tNFA_NDEF_CBACK  *p_ndef_cback)
    980 {
    981     tNFA_DM_API_REG_NDEF_HDLR *p_msg;
    982 
    983     NFA_TRACE_API2 ("NFA_RegisterNDefUriHandler (): handle whole ndef message: %i, uri_id=0x%02x", handle_whole_message, uri_id);
    984 
    985     /* Check for NULL callback */
    986     if (!p_ndef_cback)
    987     {
    988         NFA_TRACE_ERROR0 ("NFA_RegisterNDefUriHandler (): error - null callback");
    989         return (NFA_STATUS_INVALID_PARAM);
    990     }
    991 
    992 
    993     if ((p_msg = (tNFA_DM_API_REG_NDEF_HDLR *) GKI_getbuf ((UINT16) (sizeof (tNFA_DM_API_REG_NDEF_HDLR) + uri_id_len))) != NULL)
    994     {
    995         p_msg->hdr.event = NFA_DM_API_REG_NDEF_HDLR_EVT;
    996 
    997         p_msg->flags = NFA_NDEF_FLAGS_WKT_URI;
    998 
    999         if (handle_whole_message)
   1000         {
   1001             p_msg->flags |= NFA_NDEF_FLAGS_HANDLE_WHOLE_MESSAGE;
   1002         }
   1003 
   1004         /* abs_uri is only valid fir uri_id=NFA_NDEF_URI_ID_ABSOLUTE */
   1005         if (uri_id != NFA_NDEF_URI_ID_ABSOLUTE)
   1006         {
   1007             uri_id_len = 0;
   1008         }
   1009 
   1010         p_msg->tnf = NFA_TNF_WKT;
   1011         p_msg->uri_id = uri_id;
   1012         p_msg->name_len = uri_id_len;
   1013         p_msg->p_ndef_cback = p_ndef_cback;
   1014         memcpy (p_msg->name, p_abs_uri, uri_id_len);
   1015 
   1016         nfa_sys_sendmsg (p_msg);
   1017 
   1018         return (NFA_STATUS_OK);
   1019     }
   1020 
   1021     return (NFA_STATUS_FAILED);
   1022 }
   1023 
   1024 /*******************************************************************************
   1025 **
   1026 ** Function         NFA_DeregisterNDefTypeHandler
   1027 **
   1028 ** Description      Deregister NDEF record type handler.
   1029 **
   1030 ** Returns          NFA_STATUS_OK if successfully initiated
   1031 **                  NFA_STATUS_FAILED otherwise
   1032 **
   1033 *******************************************************************************/
   1034 NFC_API extern tNFA_STATUS NFA_DeregisterNDefTypeHandler (tNFA_HANDLE ndef_type_handle)
   1035 {
   1036     tNFA_DM_API_DEREG_NDEF_HDLR *p_msg;
   1037 
   1038     NFA_TRACE_API1 ("NFA_DeregisterNDefHandler (): handle 0x%08x", ndef_type_handle);
   1039 
   1040 
   1041     if ((p_msg = (tNFA_DM_API_DEREG_NDEF_HDLR *) GKI_getbuf ((UINT16) (sizeof (tNFA_DM_API_DEREG_NDEF_HDLR)))) != NULL)
   1042     {
   1043         p_msg->hdr.event = NFA_DM_API_DEREG_NDEF_HDLR_EVT;
   1044         p_msg->ndef_type_handle = ndef_type_handle;
   1045 
   1046         nfa_sys_sendmsg (p_msg);
   1047 
   1048         return (NFA_STATUS_OK);
   1049     }
   1050 
   1051     return (NFA_STATUS_FAILED);
   1052 }
   1053 
   1054 /*******************************************************************************
   1055 **
   1056 ** Function         NFA_PowerOffSleepMode
   1057 **
   1058 ** Description      This function is called to enter or leave NFCC Power Off Sleep mode
   1059 **                  NFA_DM_PWR_MODE_CHANGE_EVT will be sent to indicate status.
   1060 **
   1061 **                  start_stop : TRUE if entering Power Off Sleep mode
   1062 **                               FALSE if leaving Power Off Sleep mode
   1063 **
   1064 ** Returns          NFA_STATUS_OK if successfully initiated
   1065 **                  NFA_STATUS_FAILED otherwise
   1066 **
   1067 *******************************************************************************/
   1068 tNFA_STATUS NFA_PowerOffSleepMode (BOOLEAN start_stop)
   1069 {
   1070     BT_HDR *p_msg;
   1071 
   1072     NFA_TRACE_API1 ("NFA_PowerOffSleepState () start_stop=%d", start_stop);
   1073 
   1074     if (nfa_dm_cb.flags & NFA_DM_FLAGS_SETTING_PWR_MODE)
   1075     {
   1076         NFA_TRACE_ERROR0 ("NFA_PowerOffSleepState (): NFA DM is busy to update power mode");
   1077         return (NFA_STATUS_FAILED);
   1078     }
   1079     else
   1080     {
   1081         nfa_dm_cb.flags |= NFA_DM_FLAGS_SETTING_PWR_MODE;
   1082     }
   1083 
   1084     if ((p_msg = (BT_HDR *) GKI_getbuf (sizeof (BT_HDR))) != NULL)
   1085     {
   1086         p_msg->event          = NFA_DM_API_POWER_OFF_SLEEP_EVT;
   1087         p_msg->layer_specific = start_stop;
   1088 
   1089         nfa_sys_sendmsg (p_msg);
   1090 
   1091         return (NFA_STATUS_OK);
   1092     }
   1093 
   1094     return (NFA_STATUS_FAILED);
   1095 }
   1096 
   1097 /*******************************************************************************
   1098 **
   1099 ** Function         NFA_RegVSCback
   1100 **
   1101 ** Description      This function is called to register or de-register a callback
   1102 **                  function to receive Proprietary NCI response and notification
   1103 **                  events.
   1104 **                  The maximum number of callback functions allowed is NFC_NUM_VS_CBACKS
   1105 **
   1106 ** Returns          tNFC_STATUS
   1107 **
   1108 *******************************************************************************/
   1109 tNFC_STATUS NFA_RegVSCback (BOOLEAN          is_register,
   1110                             tNFA_VSC_CBACK   *p_cback)
   1111 {
   1112     tNFA_DM_API_REG_VSC *p_msg;
   1113 
   1114     NFA_TRACE_API1 ("NFA_RegVSCback() is_register=%d", is_register);
   1115 
   1116     if (p_cback == NULL)
   1117     {
   1118         NFA_TRACE_ERROR0 ("NFA_RegVSCback() requires a valid callback function");
   1119         return (NFA_STATUS_FAILED);
   1120     }
   1121 
   1122     if ((p_msg = (tNFA_DM_API_REG_VSC *) GKI_getbuf (sizeof(tNFA_DM_API_REG_VSC))) != NULL)
   1123     {
   1124         p_msg->hdr.event        = NFA_DM_API_REG_VSC_EVT;
   1125         p_msg->is_register      = is_register;
   1126         p_msg->p_cback          = p_cback;
   1127 
   1128         nfa_sys_sendmsg (p_msg);
   1129 
   1130         return (NFA_STATUS_OK);
   1131     }
   1132 
   1133     return (NFA_STATUS_FAILED);
   1134 }
   1135 
   1136 /*******************************************************************************
   1137 **
   1138 ** Function         NFA_SendVsCommand
   1139 **
   1140 ** Description      This function is called to send an NCI Vendor Specific
   1141 **                  command to NFCC.
   1142 **
   1143 **                  oid             - The opcode of the VS command.
   1144 **                  cmd_params_len  - The command parameter len
   1145 **                  p_cmd_params    - The command parameter
   1146 **                  p_cback         - The callback function to receive the command
   1147 **                                    status
   1148 **
   1149 ** Returns          NFA_STATUS_OK if successfully initiated
   1150 **                  NFA_STATUS_FAILED otherwise
   1151 **
   1152 *******************************************************************************/
   1153 tNFA_STATUS NFA_SendVsCommand (UINT8            oid,
   1154                                UINT8            cmd_params_len,
   1155                                UINT8            *p_cmd_params,
   1156                                tNFA_VSC_CBACK    *p_cback)
   1157 {
   1158     tNFA_DM_API_SEND_VSC *p_msg;
   1159     UINT16  size = sizeof(tNFA_DM_API_SEND_VSC) + cmd_params_len;
   1160 
   1161     NFA_TRACE_API1 ("NFA_SendVsCommand() oid=0x%x", oid);
   1162 
   1163     if ((p_msg = (tNFA_DM_API_SEND_VSC *) GKI_getbuf (size)) != NULL)
   1164     {
   1165         p_msg->hdr.event        = NFA_DM_API_SEND_VSC_EVT;
   1166         p_msg->oid              = oid;
   1167         p_msg->p_cback          = p_cback;
   1168         if (cmd_params_len && p_cmd_params)
   1169         {
   1170             p_msg->cmd_params_len   = cmd_params_len;
   1171             p_msg->p_cmd_params     = (UINT8 *)(p_msg + 1);
   1172             memcpy (p_msg->p_cmd_params, p_cmd_params, cmd_params_len);
   1173         }
   1174         else
   1175         {
   1176             p_msg->cmd_params_len   = 0;
   1177             p_msg->p_cmd_params     = NULL;
   1178         }
   1179 
   1180         nfa_sys_sendmsg (p_msg);
   1181 
   1182         return (NFA_STATUS_OK);
   1183     }
   1184 
   1185     return (NFA_STATUS_FAILED);
   1186 }
   1187 
   1188 /*******************************************************************************
   1189 **
   1190 ** Function         NFA_SetTraceLevel
   1191 **
   1192 ** Description      This function sets the trace level for NFA.  If called with
   1193 **                  a value of 0xFF, it simply returns the current trace level.
   1194 **
   1195 ** Returns          The new or current trace level
   1196 **
   1197 *******************************************************************************/
   1198 UINT8 NFA_SetTraceLevel (UINT8 new_level)
   1199 {
   1200     if (new_level != 0xFF)
   1201         nfa_sys_set_trace_level (new_level);
   1202 
   1203     return (nfa_sys_cb.trace_level);
   1204 }
   1205 
   1206