• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 *******************************************************************************/
nci_snd_core_reset(UINT8 reset_type)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 *******************************************************************************/
nci_snd_core_init(void)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 *******************************************************************************/
nci_snd_core_get_config(UINT8 * param_ids,UINT8 num_ids)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 *******************************************************************************/
nci_snd_core_set_config(UINT8 * p_param_tlvs,UINT8 tlv_size)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 *******************************************************************************/
nci_snd_core_conn_create(UINT8 dest_type,UINT8 num_tlv,UINT8 tlv_size,UINT8 * p_param_tlvs)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 *******************************************************************************/
nci_snd_core_conn_close(UINT8 conn_id)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 *******************************************************************************/
nci_snd_nfcee_discover(UINT8 discover_action)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 *******************************************************************************/
nci_snd_nfcee_mode_set(UINT8 nfcee_id,UINT8 nfcee_mode)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 *******************************************************************************/
nci_snd_discover_cmd(UINT8 num,tNCI_DISCOVER_PARAMS * p_param)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 *******************************************************************************/
nci_snd_discover_select_cmd(UINT8 rf_disc_id,UINT8 protocol,UINT8 rf_interface)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 *******************************************************************************/
nci_snd_deactivate_cmd(UINT8 de_act_type)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 *******************************************************************************/
nci_snd_discover_map_cmd(UINT8 num,tNCI_DISCOVER_MAPS * p_maps)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 *******************************************************************************/
nci_snd_t3t_polling(UINT16 system_code,UINT8 rc,UINT8 tsn)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 *******************************************************************************/
nci_snd_parameter_update_cmd(UINT8 * p_param_tlvs,UINT8 tlv_size)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 *******************************************************************************/
nci_snd_set_routing_cmd(BOOLEAN more,UINT8 target_handle,UINT8 num_tlv,UINT8 tlv_size,UINT8 * p_param_tlvs)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 *******************************************************************************/
nci_snd_get_routing_cmd(void)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