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*******************************************************************************/
44UINT8 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*******************************************************************************/
76UINT8 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*******************************************************************************/
107UINT8 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*******************************************************************************/
140UINT8 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*******************************************************************************/
193UINT8 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*******************************************************************************/
232UINT8 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*******************************************************************************/
268UINT8 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*******************************************************************************/
301UINT8 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*******************************************************************************/
336UINT8 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*******************************************************************************/
380UINT8 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*******************************************************************************/
415UINT8 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*******************************************************************************/
450UINT8 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*******************************************************************************/
494UINT8 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*******************************************************************************/
529UINT8 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*******************************************************************************/
585UINT8 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*******************************************************************************/
635UINT8 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