Home | History | Annotate | Download | only in nci
      1 /******************************************************************************
      2  *
      3  *  Copyright (C) 2010-2014 Broadcom Corporation
      4  *
      5  *  Licensed under the Apache License, Version 2.0 (the "License");
      6  *  you may not use this file except in compliance with the License.
      7  *  You may obtain a copy of the License at:
      8  *
      9  *  http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  *  Unless required by applicable law or agreed to in writing, software
     12  *  distributed under the License is distributed on an "AS IS" BASIS,
     13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  *  See the License for the specific language governing permissions and
     15  *  limitations under the License.
     16  *
     17  ******************************************************************************/
     18 
     19 
     20 /******************************************************************************
     21  *
     22  *  This file contains function of the NCI unit to format and send NCI
     23  *  commands (for DH).
     24  *
     25  ******************************************************************************/
     26 #include <string.h>
     27 #include "nfc_target.h"
     28 
     29 #if NFC_INCLUDED == TRUE
     30 #include "nci_defs.h"
     31 #include "nci_hmsgs.h"
     32 #include "nfc_api.h"
     33 #include "nfc_int.h"
     34 
     35 /*******************************************************************************
     36 **
     37 ** Function         nci_snd_core_reset
     38 **
     39 ** Description      compose and send CORE RESET command to command queue
     40 **
     41 ** Returns          status
     42 **
     43 *******************************************************************************/
     44 UINT8 nci_snd_core_reset (UINT8 reset_type)
     45 {
     46     BT_HDR *p;
     47     UINT8 *pp;
     48 
     49     if ((p = NCI_GET_CMD_BUF (NCI_CORE_PARAM_SIZE_RESET)) == NULL)
     50         return (NCI_STATUS_FAILED);
     51 
     52     p->event            = BT_EVT_TO_NFC_NCI;
     53     p->len              = NCI_MSG_HDR_SIZE + NCI_CORE_PARAM_SIZE_RESET;
     54     p->offset           = NCI_MSG_OFFSET_SIZE;
     55     p->layer_specific   = 0;
     56     pp                  = (UINT8 *) (p + 1) + p->offset;
     57 
     58     NCI_MSG_BLD_HDR0 (pp, NCI_MT_CMD, NCI_GID_CORE);
     59     NCI_MSG_BLD_HDR1 (pp, NCI_MSG_CORE_RESET);
     60     UINT8_TO_STREAM (pp, NCI_CORE_PARAM_SIZE_RESET);
     61     UINT8_TO_STREAM (pp, reset_type);
     62 
     63     nfc_ncif_send_cmd (p);
     64     return (NCI_STATUS_OK);
     65 }
     66 
     67 /*******************************************************************************
     68 **
     69 ** Function         nci_snd_core_init
     70 **
     71 ** Description      compose and send CORE INIT command to command queue
     72 **
     73 ** Returns          status
     74 **
     75 *******************************************************************************/
     76 UINT8 nci_snd_core_init (void)
     77 {
     78     BT_HDR *p;
     79     UINT8 *pp;
     80 
     81     if ((p = NCI_GET_CMD_BUF (NCI_CORE_PARAM_SIZE_INIT)) == NULL)
     82         return (NCI_STATUS_FAILED);
     83 
     84     p->event            = BT_EVT_TO_NFC_NCI;
     85     p->len              = NCI_MSG_HDR_SIZE + NCI_CORE_PARAM_SIZE_INIT;
     86     p->offset           = NCI_MSG_OFFSET_SIZE;
     87     p->layer_specific   = 0;
     88     pp                  = (UINT8 *) (p + 1) + p->offset;
     89 
     90     NCI_MSG_BLD_HDR0 (pp, NCI_MT_CMD, NCI_GID_CORE);
     91     NCI_MSG_BLD_HDR1 (pp, NCI_MSG_CORE_INIT);
     92     UINT8_TO_STREAM (pp, NCI_CORE_PARAM_SIZE_INIT);
     93 
     94     nfc_ncif_send_cmd (p);
     95     return (NCI_STATUS_OK);
     96 }
     97 
     98 /*******************************************************************************
     99 **
    100 ** Function         nci_snd_core_get_config
    101 **
    102 ** Description      compose and send CORE GET_CONFIG command to command queue
    103 **
    104 ** Returns          status
    105 **
    106 *******************************************************************************/
    107 UINT8 nci_snd_core_get_config (UINT8 *param_ids, UINT8 num_ids)
    108 {
    109     BT_HDR *p;
    110     UINT8 *pp;
    111 
    112     if ((p = NCI_GET_CMD_BUF (num_ids)) == NULL)
    113         return (NCI_STATUS_FAILED);
    114 
    115     p->event            = BT_EVT_TO_NFC_NCI;
    116     p->len              = NCI_MSG_HDR_SIZE + num_ids + 1;
    117     p->offset           = NCI_MSG_OFFSET_SIZE;
    118     p->layer_specific   = 0;
    119     pp                  = (UINT8 *) (p + 1) + p->offset;
    120 
    121     NCI_MSG_BLD_HDR0 (pp, NCI_MT_CMD, NCI_GID_CORE);
    122     NCI_MSG_BLD_HDR1 (pp, NCI_MSG_CORE_GET_CONFIG);
    123     UINT8_TO_STREAM (pp, (UINT8) (num_ids + 1));
    124     UINT8_TO_STREAM (pp, num_ids);
    125     ARRAY_TO_STREAM (pp, param_ids, num_ids);
    126 
    127     nfc_ncif_send_cmd (p);
    128     return (NCI_STATUS_OK);
    129 }
    130 
    131 /*******************************************************************************
    132 **
    133 ** Function         nci_snd_core_set_config
    134 **
    135 ** Description      compose and send CORE SET_CONFIG command to command queue
    136 **
    137 ** Returns          status
    138 **
    139 *******************************************************************************/
    140 UINT8 nci_snd_core_set_config (UINT8 *p_param_tlvs, UINT8 tlv_size)
    141 {
    142     BT_HDR *p;
    143     UINT8 *pp;
    144     UINT8  num = 0, ulen, len, *pt;
    145 
    146     if ((p = NCI_GET_CMD_BUF (tlv_size + 1)) == NULL)
    147         return (NCI_STATUS_FAILED);
    148 
    149     p->event    = BT_EVT_TO_NFC_NCI;
    150     p->len      = NCI_MSG_HDR_SIZE + tlv_size + 1;
    151     p->offset   = NCI_MSG_OFFSET_SIZE;
    152     pp          = (UINT8 *) (p + 1) + p->offset;
    153 
    154     NCI_MSG_BLD_HDR0 (pp, NCI_MT_CMD, NCI_GID_CORE);
    155     NCI_MSG_BLD_HDR1 (pp, NCI_MSG_CORE_SET_CONFIG);
    156     UINT8_TO_STREAM (pp, (UINT8) (tlv_size + 1));
    157     len         = tlv_size;
    158     pt          = p_param_tlvs;
    159     while (len > 1)
    160     {
    161         len     -= 2;
    162         pt++;
    163         num++;
    164         ulen     = *pt++;
    165         pt      += ulen;
    166         if (len >= ulen)
    167         {
    168             len -= ulen;
    169         }
    170         else
    171         {
    172             GKI_freebuf (p);
    173             return NCI_STATUS_FAILED;
    174         }
    175     }
    176 
    177     UINT8_TO_STREAM (pp, num);
    178     ARRAY_TO_STREAM (pp, p_param_tlvs, tlv_size);
    179     nfc_ncif_send_cmd (p);
    180 
    181     return (NCI_STATUS_OK);
    182 }
    183 
    184 /*******************************************************************************
    185 **
    186 ** Function         nci_snd_core_conn_create
    187 **
    188 ** Description      compose and send CORE CONN_CREATE command to command queue
    189 **
    190 ** Returns          status
    191 **
    192 *******************************************************************************/
    193 UINT8 nci_snd_core_conn_create (UINT8 dest_type, UINT8 num_tlv, UINT8 tlv_size, UINT8 *p_param_tlvs)
    194 {
    195     BT_HDR *p;
    196     UINT8 *pp;
    197     UINT8 size = NCI_CORE_PARAM_SIZE_CON_CREATE+tlv_size;
    198 
    199     if ((p = NCI_GET_CMD_BUF (size)) == NULL)
    200         return (NCI_STATUS_FAILED);
    201 
    202     p->event            = BT_EVT_TO_NFC_NCI;
    203     p->len              = NCI_MSG_HDR_SIZE + NCI_CORE_PARAM_SIZE_CON_CREATE;
    204     p->offset           = NCI_MSG_OFFSET_SIZE;
    205     p->layer_specific   = 0;
    206     pp                  = (UINT8 *) (p + 1) + p->offset;
    207 
    208     NCI_MSG_BLD_HDR0 (pp, NCI_MT_CMD, NCI_GID_CORE);
    209     NCI_MSG_BLD_HDR1 (pp, NCI_MSG_CORE_CONN_CREATE);
    210     UINT8_TO_STREAM (pp, size);
    211     UINT8_TO_STREAM (pp, dest_type);
    212     UINT8_TO_STREAM (pp, num_tlv);
    213     if (tlv_size)
    214     {
    215         ARRAY_TO_STREAM (pp, p_param_tlvs, tlv_size);
    216         p->len         += tlv_size;
    217     }
    218 
    219     nfc_ncif_send_cmd (p);
    220     return (NCI_STATUS_OK);
    221 }
    222 
    223 /*******************************************************************************
    224 **
    225 ** Function         nci_snd_core_conn_close
    226 **
    227 ** Description      compose and send CORE CONN_CLOSE command to command queue
    228 **
    229 ** Returns          status
    230 **
    231 *******************************************************************************/
    232 UINT8 nci_snd_core_conn_close (UINT8 conn_id)
    233 {
    234     BT_HDR *p;
    235     UINT8 *pp;
    236 
    237     if ((p = NCI_GET_CMD_BUF (NCI_CORE_PARAM_SIZE_CON_CLOSE)) == NULL)
    238         return (NCI_STATUS_FAILED);
    239 
    240     p->event            = BT_EVT_TO_NFC_NCI;
    241     p->len              = NCI_MSG_HDR_SIZE + NCI_CORE_PARAM_SIZE_CON_CLOSE;
    242     p->offset           = NCI_MSG_OFFSET_SIZE;
    243     p->layer_specific   = 0;
    244     pp                  = (UINT8 *) (p + 1) + p->offset;
    245 
    246     NCI_MSG_BLD_HDR0 (pp, NCI_MT_CMD, NCI_GID_CORE);
    247     NCI_MSG_BLD_HDR1 (pp, NCI_MSG_CORE_CONN_CLOSE);
    248     UINT8_TO_STREAM (pp, NCI_CORE_PARAM_SIZE_CON_CLOSE);
    249     UINT8_TO_STREAM (pp, conn_id);
    250 
    251     nfc_ncif_send_cmd (p);
    252     return (NCI_STATUS_OK);
    253 }
    254 
    255 
    256 #if (NFC_NFCEE_INCLUDED == TRUE)
    257 #if (NFC_RW_ONLY == FALSE)
    258 /*******************************************************************************
    259 **
    260 ** Function         nci_snd_nfcee_discover
    261 **
    262 ** Description      compose and send NFCEE Management NFCEE_DISCOVER command
    263 **                  to command queue
    264 **
    265 ** Returns          status
    266 **
    267 *******************************************************************************/
    268 UINT8 nci_snd_nfcee_discover (UINT8 discover_action)
    269 {
    270     BT_HDR *p;
    271     UINT8 *pp;
    272 
    273     if ((p = NCI_GET_CMD_BUF (NCI_PARAM_SIZE_DISCOVER_NFCEE)) == NULL)
    274         return (NCI_STATUS_FAILED);
    275 
    276     p->event            = BT_EVT_TO_NFC_NCI;
    277     p->len              = NCI_MSG_HDR_SIZE + NCI_PARAM_SIZE_DISCOVER_NFCEE;
    278     p->offset           = NCI_MSG_OFFSET_SIZE;
    279     p->layer_specific   = 0;
    280     pp                  = (UINT8 *) (p + 1) + p->offset;
    281 
    282     NCI_MSG_BLD_HDR0 (pp, NCI_MT_CMD, NCI_GID_EE_MANAGE);
    283     NCI_MSG_BLD_HDR1 (pp, NCI_MSG_NFCEE_DISCOVER);
    284     UINT8_TO_STREAM (pp, NCI_PARAM_SIZE_DISCOVER_NFCEE);
    285     UINT8_TO_STREAM (pp, discover_action);
    286 
    287     nfc_ncif_send_cmd (p);
    288     return (NCI_STATUS_OK);
    289 }
    290 
    291 /*******************************************************************************
    292 **
    293 ** Function         nci_snd_nfcee_mode_set
    294 **
    295 ** Description      compose and send NFCEE Management NFCEE MODE SET command
    296 **                  to command queue
    297 **
    298 ** Returns          status
    299 **
    300 *******************************************************************************/
    301 UINT8 nci_snd_nfcee_mode_set (UINT8 nfcee_id, UINT8 nfcee_mode)
    302 {
    303     BT_HDR *p;
    304     UINT8 *pp;
    305 
    306     if ((p = NCI_GET_CMD_BUF (NCI_CORE_PARAM_SIZE_NFCEE_MODE_SET)) == NULL)
    307         return (NCI_STATUS_FAILED);
    308 
    309     p->event            = BT_EVT_TO_NFC_NCI;
    310     p->len              = NCI_MSG_HDR_SIZE + NCI_CORE_PARAM_SIZE_NFCEE_MODE_SET;
    311     p->offset           = NCI_MSG_OFFSET_SIZE;
    312     p->layer_specific   = 0;
    313     pp                  = (UINT8 *) (p + 1) + p->offset;
    314 
    315     NCI_MSG_BLD_HDR0 (pp, NCI_MT_CMD, NCI_GID_EE_MANAGE);
    316     NCI_MSG_BLD_HDR1 (pp, NCI_MSG_NFCEE_MODE_SET);
    317     UINT8_TO_STREAM (pp, NCI_CORE_PARAM_SIZE_NFCEE_MODE_SET);
    318     UINT8_TO_STREAM (pp, nfcee_id);
    319     UINT8_TO_STREAM (pp, nfcee_mode);
    320 
    321     nfc_ncif_send_cmd (p);
    322     return (NCI_STATUS_OK);
    323 }
    324 #endif
    325 #endif
    326 
    327 /*******************************************************************************
    328 **
    329 ** Function         nci_snd_discover_cmd
    330 **
    331 ** Description      compose and send RF Management DISCOVER command to command queue
    332 **
    333 ** Returns          status
    334 **
    335 *******************************************************************************/
    336 UINT8 nci_snd_discover_cmd (UINT8 num, tNCI_DISCOVER_PARAMS *p_param)
    337 {
    338     BT_HDR *p;
    339     UINT8 *pp, *p_size, *p_start;
    340     int xx;
    341     int size;
    342 
    343     size   = num * sizeof (tNCI_DISCOVER_PARAMS) + 1;
    344     if ((p = NCI_GET_CMD_BUF (size)) == NULL)
    345         return (NCI_STATUS_FAILED);
    346 
    347     p->event            = BT_EVT_TO_NFC_NCI;
    348     p->offset           = NCI_MSG_OFFSET_SIZE;
    349     p->layer_specific   = 0;
    350     pp                  = (UINT8 *) (p + 1) + p->offset;
    351 
    352     NCI_MSG_BLD_HDR0 (pp, NCI_MT_CMD, NCI_GID_RF_MANAGE);
    353     NCI_MSG_BLD_HDR1 (pp, NCI_MSG_RF_DISCOVER);
    354     p_size  = pp;
    355     pp++;
    356     p_start = pp;
    357     UINT8_TO_STREAM (pp, num);
    358     for (xx=0; xx<num; xx++)
    359     {
    360         UINT8_TO_STREAM (pp, p_param[xx].type);
    361         UINT8_TO_STREAM (pp, p_param[xx].frequency);
    362     }
    363     *p_size = (UINT8) (pp - p_start);
    364     p->len  = NCI_MSG_HDR_SIZE + *p_size;
    365 
    366     nfc_ncif_send_cmd (p);
    367     return (NCI_STATUS_OK);
    368 }
    369 
    370 /*******************************************************************************
    371 **
    372 ** Function         nci_snd_discover_select_cmd
    373 **
    374 ** Description      compose and send RF Management DISCOVER SELECT command
    375 **                  to command queue
    376 **
    377 ** Returns          status
    378 **
    379 *******************************************************************************/
    380 UINT8 nci_snd_discover_select_cmd (UINT8 rf_disc_id, UINT8 protocol, UINT8 rf_interface)
    381 {
    382     BT_HDR *p;
    383     UINT8 *pp;
    384 
    385     if ((p = NCI_GET_CMD_BUF (NCI_DISCOVER_PARAM_SIZE_SELECT)) == NULL)
    386         return (NCI_STATUS_FAILED);
    387 
    388     p->event            = BT_EVT_TO_NFC_NCI;
    389     p->len              = NCI_MSG_HDR_SIZE + NCI_DISCOVER_PARAM_SIZE_SELECT;
    390     p->offset           = NCI_MSG_OFFSET_SIZE;
    391     p->layer_specific   = 0;
    392     pp                  = (UINT8 *) (p + 1) + p->offset;
    393 
    394     NCI_MSG_BLD_HDR0 (pp, NCI_MT_CMD, NCI_GID_RF_MANAGE);
    395     NCI_MSG_BLD_HDR1 (pp, NCI_MSG_RF_DISCOVER_SELECT);
    396     UINT8_TO_STREAM (pp, NCI_DISCOVER_PARAM_SIZE_SELECT);
    397     UINT8_TO_STREAM (pp, rf_disc_id);
    398     UINT8_TO_STREAM (pp, protocol);
    399     UINT8_TO_STREAM (pp, rf_interface);
    400 
    401     nfc_ncif_send_cmd (p);
    402     return (NCI_STATUS_OK);
    403 }
    404 
    405 /*******************************************************************************
    406 **
    407 ** Function         nci_snd_deactivate_cmd
    408 **
    409 ** Description      compose and send RF Management DEACTIVATE command
    410 **                  to command queue
    411 **
    412 ** Returns          status
    413 **
    414 *******************************************************************************/
    415 UINT8 nci_snd_deactivate_cmd (UINT8 de_act_type )
    416 {
    417     BT_HDR *p;
    418     UINT8 *pp;
    419 
    420     nfc_cb.reassembly = TRUE;
    421 
    422     if ((p = NCI_GET_CMD_BUF (NCI_DISCOVER_PARAM_SIZE_DEACT)) == NULL)
    423         return (NCI_STATUS_FAILED);
    424 
    425     p->event            = BT_EVT_TO_NFC_NCI;
    426     p->len              = NCI_MSG_HDR_SIZE + NCI_DISCOVER_PARAM_SIZE_DEACT;
    427     p->offset           = NCI_MSG_OFFSET_SIZE;
    428     p->layer_specific   = 0;
    429     pp                  = (UINT8 *) (p + 1) + p->offset;
    430 
    431     NCI_MSG_BLD_HDR0 (pp, NCI_MT_CMD, NCI_GID_RF_MANAGE);
    432     NCI_MSG_BLD_HDR1 (pp, NCI_MSG_RF_DEACTIVATE);
    433     UINT8_TO_STREAM (pp, NCI_DISCOVER_PARAM_SIZE_DEACT);
    434     UINT8_TO_STREAM (pp, de_act_type);
    435 
    436     nfc_ncif_send_cmd (p);
    437     return (NCI_STATUS_OK);
    438 }
    439 
    440 /*******************************************************************************
    441 **
    442 ** Function         nci_snd_discover_map_cmd
    443 **
    444 ** Description      compose and send RF Management DISCOVER MAP command
    445 **                  to command queue
    446 **
    447 ** Returns          status
    448 **
    449 *******************************************************************************/
    450 UINT8 nci_snd_discover_map_cmd (UINT8 num, tNCI_DISCOVER_MAPS *p_maps)
    451 {
    452     BT_HDR *p;
    453     UINT8 *pp, *p_size, *p_start;
    454     int xx;
    455     int size;
    456 
    457     size = num * sizeof (tNCI_DISCOVER_MAPS) + 1;
    458 
    459     if ((p = NCI_GET_CMD_BUF (size)) == NULL)
    460         return (NCI_STATUS_FAILED);
    461 
    462     p->event            = BT_EVT_TO_NFC_NCI;
    463     p->offset           = NCI_MSG_OFFSET_SIZE;
    464     p->layer_specific   = 0;
    465     pp                  = (UINT8 *) (p + 1) + p->offset;
    466 
    467     NCI_MSG_BLD_HDR0 (pp, NCI_MT_CMD, NCI_GID_RF_MANAGE);
    468     NCI_MSG_BLD_HDR1 (pp, NCI_MSG_RF_DISCOVER_MAP);
    469     p_size  = pp;
    470     pp++;
    471     p_start = pp;
    472     UINT8_TO_STREAM (pp, num);
    473     for (xx = 0; xx < num; xx++)
    474     {
    475         UINT8_TO_STREAM (pp, p_maps[xx].protocol);
    476         UINT8_TO_STREAM (pp, p_maps[xx].mode);
    477         UINT8_TO_STREAM (pp, p_maps[xx].intf_type);
    478     }
    479     *p_size = (UINT8) (pp - p_start);
    480     p->len  = NCI_MSG_HDR_SIZE + *p_size;
    481     nfc_ncif_send_cmd (p);
    482     return (NCI_STATUS_OK);
    483 }
    484 /*******************************************************************************
    485 **
    486 ** Function         nci_snd_t3t_polling
    487 **
    488 ** Description      compose and send RF Management T3T POLLING command
    489 **                  to command queue
    490 **
    491 ** Returns          status
    492 **
    493 *******************************************************************************/
    494 UINT8 nci_snd_t3t_polling (UINT16 system_code, UINT8 rc, UINT8 tsn)
    495 {
    496     BT_HDR *p;
    497     UINT8 *pp;
    498 
    499     if ((p = NCI_GET_CMD_BUF (NCI_RF_PARAM_SIZE_T3T_POLLING)) == NULL)
    500         return (NCI_STATUS_FAILED);
    501 
    502     p->event            = BT_EVT_TO_NFC_NCI;
    503     p->len              = NCI_MSG_HDR_SIZE + NCI_RF_PARAM_SIZE_T3T_POLLING;
    504     p->offset           = NCI_MSG_OFFSET_SIZE;
    505     p->layer_specific   = 0;
    506     pp                  = (UINT8 *) (p + 1) + p->offset;
    507 
    508     NCI_MSG_BLD_HDR0 (pp, NCI_MT_CMD, NCI_GID_RF_MANAGE);
    509     NCI_MSG_BLD_HDR1 (pp, NCI_MSG_RF_T3T_POLLING);
    510     UINT8_TO_STREAM (pp, NCI_RF_PARAM_SIZE_T3T_POLLING);
    511     UINT16_TO_BE_STREAM (pp, system_code);
    512     UINT8_TO_STREAM (pp, rc);
    513     UINT8_TO_STREAM (pp, tsn);
    514 
    515     nfc_ncif_send_cmd (p);
    516     return (NCI_STATUS_OK);
    517 }
    518 
    519 /*******************************************************************************
    520 **
    521 ** Function         nci_snd_parameter_update_cmd
    522 **
    523 ** Description      compose and send RF Management RF Communication Parameter
    524 **                  Update commandto command queue
    525 **
    526 ** Returns          status
    527 **
    528 *******************************************************************************/
    529 UINT8 nci_snd_parameter_update_cmd (UINT8 *p_param_tlvs, UINT8 tlv_size)
    530 {
    531     BT_HDR *p;
    532     UINT8 *pp;
    533     UINT8  num = 0, ulen, len, *pt;
    534 
    535     if ((p = NCI_GET_CMD_BUF (tlv_size + 1)) == NULL)
    536         return (NCI_STATUS_FAILED);
    537 
    538     p->event    = BT_EVT_TO_NFC_NCI;
    539     p->len      = NCI_MSG_HDR_SIZE + tlv_size + 1;
    540     p->offset   = NCI_MSG_OFFSET_SIZE;
    541     pp          = (UINT8 *) (p + 1) + p->offset;
    542 
    543     NCI_MSG_BLD_HDR0 (pp, NCI_MT_CMD, NCI_GID_RF_MANAGE);
    544     NCI_MSG_BLD_HDR1 (pp, NCI_MSG_RF_PARAMETER_UPDATE);
    545     UINT8_TO_STREAM (pp, (UINT8) (tlv_size + 1));
    546     len         = tlv_size;
    547     pt          = p_param_tlvs;
    548     while (len > 1)
    549     {
    550         len     -= 2;
    551         pt++;
    552         num++;
    553         ulen     = *pt++;
    554         pt      += ulen;
    555         if (len >= ulen)
    556         {
    557             len -= ulen;
    558         }
    559         else
    560         {
    561             GKI_freebuf (p);
    562             return NCI_STATUS_FAILED;
    563         }
    564     }
    565 
    566     UINT8_TO_STREAM (pp, num);
    567     ARRAY_TO_STREAM (pp, p_param_tlvs, tlv_size);
    568     nfc_ncif_send_cmd (p);
    569 
    570     return (NCI_STATUS_OK);
    571 }
    572 
    573 #if (NFC_NFCEE_INCLUDED == TRUE)
    574 #if (NFC_RW_ONLY == FALSE)
    575 /*******************************************************************************
    576 **
    577 ** Function         nci_snd_set_routing_cmd
    578 **
    579 ** Description      compose and send RF Management SET_LISTEN_MODE_ROUTING command
    580 **                  to command queue
    581 **
    582 ** Returns          status
    583 **
    584 *******************************************************************************/
    585 UINT8 nci_snd_set_routing_cmd (BOOLEAN more, UINT8 num_tlv, UINT8 tlv_size, UINT8 *p_param_tlvs)
    586 {
    587     BT_HDR *p;
    588     UINT8 *pp;
    589     UINT8 size = tlv_size + 2;
    590 
    591     if (tlv_size == 0)
    592     {
    593         /* just to terminate routing table
    594          * 2 bytes (more=FALSE and num routing entries=0) */
    595         size = 2;
    596     }
    597 
    598     if ((p = NCI_GET_CMD_BUF(size)) == NULL)
    599         return (NCI_STATUS_FAILED);
    600 
    601     p->event            = BT_EVT_TO_NFC_NCI;
    602     p->offset           = NCI_MSG_OFFSET_SIZE;
    603     p->len              = NCI_MSG_HDR_SIZE + size;
    604     p->layer_specific   = 0;
    605     pp                  = (UINT8 *) (p + 1) + p->offset;
    606 
    607     NCI_MSG_BLD_HDR0 (pp, NCI_MT_CMD, NCI_GID_RF_MANAGE);
    608     NCI_MSG_BLD_HDR1 (pp, NCI_MSG_RF_SET_ROUTING);
    609     UINT8_TO_STREAM (pp, size);
    610     UINT8_TO_STREAM (pp, more);
    611     if (size == 2)
    612     {
    613         UINT8_TO_STREAM (pp, 0);
    614     }
    615     else
    616     {
    617         UINT8_TO_STREAM (pp, num_tlv);
    618         ARRAY_TO_STREAM (pp, p_param_tlvs, tlv_size);
    619     }
    620     nfc_ncif_send_cmd (p);
    621 
    622     return (NCI_STATUS_OK);
    623 }
    624 
    625 /*******************************************************************************
    626 **
    627 ** Function         nci_snd_get_routing_cmd
    628 **
    629 ** Description      compose and send RF Management GET_LISTEN_MODE_ROUTING command
    630 **                  to command queue
    631 **
    632 ** Returns          status
    633 **
    634 *******************************************************************************/
    635 UINT8 nci_snd_get_routing_cmd (void)
    636 {
    637     BT_HDR *p;
    638     UINT8 *pp;
    639     UINT8   param_size = 0;
    640 
    641     if ((p = NCI_GET_CMD_BUF (param_size)) == NULL)
    642         return (NCI_STATUS_FAILED);
    643 
    644     p->event            = BT_EVT_TO_NFC_NCI;
    645     p->len              = NCI_MSG_HDR_SIZE + param_size;
    646     p->offset           = NCI_MSG_OFFSET_SIZE;
    647     p->layer_specific   = 0;
    648     pp                  = (UINT8 *) (p + 1) + p->offset;
    649 
    650     NCI_MSG_BLD_HDR0 (pp, NCI_MT_CMD, NCI_GID_RF_MANAGE);
    651     NCI_MSG_BLD_HDR1 (pp, NCI_MSG_RF_GET_ROUTING);
    652     UINT8_TO_STREAM (pp, param_size);
    653 
    654     nfc_ncif_send_cmd (p);
    655     return (NCI_STATUS_OK);
    656 }
    657 #endif
    658 #endif
    659 
    660 
    661 #endif /* NFC_INCLUDED == TRUE*/
    662