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