• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /******************************************************************************
2  *
3  *  Copyright (C) 2010-2013 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 *******************************************************************************/
nci_snd_core_reset(UINT8 reset_type)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 *******************************************************************************/
nci_snd_core_init(void)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 *******************************************************************************/
nci_snd_core_get_config(UINT8 * param_ids,UINT8 num_ids)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 *******************************************************************************/
nci_snd_core_set_config(UINT8 * p_param_tlvs,UINT8 tlv_size)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 *******************************************************************************/
nci_snd_core_conn_create(UINT8 dest_type,UINT8 num_tlv,UINT8 tlv_size,UINT8 * p_param_tlvs)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 *******************************************************************************/
nci_snd_core_conn_close(UINT8 conn_id)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 *******************************************************************************/
nci_snd_nfcee_discover(UINT8 discover_action)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 *******************************************************************************/
nci_snd_nfcee_mode_set(UINT8 nfcee_id,UINT8 nfcee_mode)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 *******************************************************************************/
nci_snd_discover_cmd(UINT8 num,tNCI_DISCOVER_PARAMS * p_param)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 *******************************************************************************/
nci_snd_discover_select_cmd(UINT8 rf_disc_id,UINT8 protocol,UINT8 rf_interface)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 *******************************************************************************/
nci_snd_deactivate_cmd(UINT8 de_act_type)415 UINT8 nci_snd_deactivate_cmd (UINT8 de_act_type )
416 {
417     BT_HDR *p;
418     UINT8 *pp;
419 
420     if ((p = NCI_GET_CMD_BUF (NCI_DISCOVER_PARAM_SIZE_DEACT)) == NULL)
421         return (NCI_STATUS_FAILED);
422 
423     p->event            = BT_EVT_TO_NFC_NCI;
424     p->len              = NCI_MSG_HDR_SIZE + NCI_DISCOVER_PARAM_SIZE_DEACT;
425     p->offset           = NCI_MSG_OFFSET_SIZE;
426     p->layer_specific   = 0;
427     pp                  = (UINT8 *) (p + 1) + p->offset;
428 
429     NCI_MSG_BLD_HDR0 (pp, NCI_MT_CMD, NCI_GID_RF_MANAGE);
430     NCI_MSG_BLD_HDR1 (pp, NCI_MSG_RF_DEACTIVATE);
431     UINT8_TO_STREAM (pp, NCI_DISCOVER_PARAM_SIZE_DEACT);
432     UINT8_TO_STREAM (pp, de_act_type);
433 
434     nfc_ncif_send_cmd (p);
435     return (NCI_STATUS_OK);
436 }
437 
438 /*******************************************************************************
439 **
440 ** Function         nci_snd_discover_map_cmd
441 **
442 ** Description      compose and send RF Management DISCOVER MAP command
443 **                  to command queue
444 **
445 ** Returns          status
446 **
447 *******************************************************************************/
nci_snd_discover_map_cmd(UINT8 num,tNCI_DISCOVER_MAPS * p_maps)448 UINT8 nci_snd_discover_map_cmd (UINT8 num, tNCI_DISCOVER_MAPS *p_maps)
449 {
450     BT_HDR *p;
451     UINT8 *pp, *p_size, *p_start;
452     int xx;
453     int size;
454 
455     size = num * sizeof (tNCI_DISCOVER_MAPS) + 1;
456 
457     if ((p = NCI_GET_CMD_BUF (size)) == NULL)
458         return (NCI_STATUS_FAILED);
459 
460     p->event            = BT_EVT_TO_NFC_NCI;
461     p->offset           = NCI_MSG_OFFSET_SIZE;
462     p->layer_specific   = 0;
463     pp                  = (UINT8 *) (p + 1) + p->offset;
464 
465     NCI_MSG_BLD_HDR0 (pp, NCI_MT_CMD, NCI_GID_RF_MANAGE);
466     NCI_MSG_BLD_HDR1 (pp, NCI_MSG_RF_DISCOVER_MAP);
467     p_size  = pp;
468     pp++;
469     p_start = pp;
470     UINT8_TO_STREAM (pp, num);
471     for (xx = 0; xx < num; xx++)
472     {
473         UINT8_TO_STREAM (pp, p_maps[xx].protocol);
474         UINT8_TO_STREAM (pp, p_maps[xx].mode);
475         UINT8_TO_STREAM (pp, p_maps[xx].intf_type);
476     }
477     *p_size = (UINT8) (pp - p_start);
478     p->len  = NCI_MSG_HDR_SIZE + *p_size;
479     nfc_ncif_send_cmd (p);
480     return (NCI_STATUS_OK);
481 }
482 /*******************************************************************************
483 **
484 ** Function         nci_snd_t3t_polling
485 **
486 ** Description      compose and send RF Management T3T POLLING command
487 **                  to command queue
488 **
489 ** Returns          status
490 **
491 *******************************************************************************/
nci_snd_t3t_polling(UINT16 system_code,UINT8 rc,UINT8 tsn)492 UINT8 nci_snd_t3t_polling (UINT16 system_code, UINT8 rc, UINT8 tsn)
493 {
494     BT_HDR *p;
495     UINT8 *pp;
496 
497     if ((p = NCI_GET_CMD_BUF (NCI_RF_PARAM_SIZE_T3T_POLLING)) == NULL)
498         return (NCI_STATUS_FAILED);
499 
500     p->event            = BT_EVT_TO_NFC_NCI;
501     p->len              = NCI_MSG_HDR_SIZE + NCI_RF_PARAM_SIZE_T3T_POLLING;
502     p->offset           = NCI_MSG_OFFSET_SIZE;
503     p->layer_specific   = 0;
504     pp                  = (UINT8 *) (p + 1) + p->offset;
505 
506     NCI_MSG_BLD_HDR0 (pp, NCI_MT_CMD, NCI_GID_RF_MANAGE);
507     NCI_MSG_BLD_HDR1 (pp, NCI_MSG_RF_T3T_POLLING);
508     UINT8_TO_STREAM (pp, NCI_RF_PARAM_SIZE_T3T_POLLING);
509     UINT16_TO_BE_STREAM (pp, system_code);
510     UINT8_TO_STREAM (pp, rc);
511     UINT8_TO_STREAM (pp, tsn);
512 
513     nfc_ncif_send_cmd (p);
514     return (NCI_STATUS_OK);
515 }
516 
517 /*******************************************************************************
518 **
519 ** Function         nci_snd_parameter_update_cmd
520 **
521 ** Description      compose and send RF Management RF Communication Parameter
522 **                  Update commandto command queue
523 **
524 ** Returns          status
525 **
526 *******************************************************************************/
nci_snd_parameter_update_cmd(UINT8 * p_param_tlvs,UINT8 tlv_size)527 UINT8 nci_snd_parameter_update_cmd (UINT8 *p_param_tlvs, UINT8 tlv_size)
528 {
529     BT_HDR *p;
530     UINT8 *pp;
531     UINT8  num = 0, ulen, len, *pt;
532 
533     if ((p = NCI_GET_CMD_BUF (tlv_size + 1)) == NULL)
534         return (NCI_STATUS_FAILED);
535 
536     p->event    = BT_EVT_TO_NFC_NCI;
537     p->len      = NCI_MSG_HDR_SIZE + tlv_size + 1;
538     p->offset   = NCI_MSG_OFFSET_SIZE;
539     pp          = (UINT8 *) (p + 1) + p->offset;
540 
541     NCI_MSG_BLD_HDR0 (pp, NCI_MT_CMD, NCI_GID_RF_MANAGE);
542     NCI_MSG_BLD_HDR1 (pp, NCI_MSG_RF_PARAMETER_UPDATE);
543     UINT8_TO_STREAM (pp, (UINT8) (tlv_size + 1));
544     len         = tlv_size;
545     pt          = p_param_tlvs;
546     while (len > 1)
547     {
548         len     -= 2;
549         pt++;
550         num++;
551         ulen     = *pt++;
552         pt      += ulen;
553         if (len >= ulen)
554         {
555             len -= ulen;
556         }
557         else
558         {
559             GKI_freebuf (p);
560             return NCI_STATUS_FAILED;
561         }
562     }
563 
564     UINT8_TO_STREAM (pp, num);
565     ARRAY_TO_STREAM (pp, p_param_tlvs, tlv_size);
566     nfc_ncif_send_cmd (p);
567 
568     return (NCI_STATUS_OK);
569 }
570 
571 #if (NFC_NFCEE_INCLUDED == TRUE)
572 #if (NFC_RW_ONLY == FALSE)
573 /*******************************************************************************
574 **
575 ** Function         nci_snd_set_routing_cmd
576 **
577 ** Description      compose and send RF Management SET_LISTEN_MODE_ROUTING command
578 **                  to command queue
579 **
580 ** Returns          status
581 **
582 *******************************************************************************/
nci_snd_set_routing_cmd(BOOLEAN more,UINT8 target_handle,UINT8 num_tlv,UINT8 tlv_size,UINT8 * p_param_tlvs)583 UINT8 nci_snd_set_routing_cmd (BOOLEAN more, UINT8 target_handle, UINT8 num_tlv, UINT8 tlv_size, UINT8 *p_param_tlvs)
584 {
585     BT_HDR *p;
586     UINT8 *pp;
587     UINT8 size = tlv_size + 2;
588 
589     if (tlv_size == 0)
590     {
591         /* just to terminate routing table
592          * 2 bytes (more=FALSE and num routing entries=0) */
593         size = 2;
594     }
595 
596     if ((p = NCI_GET_CMD_BUF(size)) == NULL)
597         return (NCI_STATUS_FAILED);
598 
599     p->event            = BT_EVT_TO_NFC_NCI;
600     p->offset           = NCI_MSG_OFFSET_SIZE;
601     p->len              = NCI_MSG_HDR_SIZE + size;
602     p->layer_specific   = 0;
603     pp                  = (UINT8 *) (p + 1) + p->offset;
604 
605     NCI_MSG_BLD_HDR0 (pp, NCI_MT_CMD, NCI_GID_RF_MANAGE);
606     NCI_MSG_BLD_HDR1 (pp, NCI_MSG_RF_SET_ROUTING);
607     UINT8_TO_STREAM (pp, size);
608     UINT8_TO_STREAM (pp, more);
609     if (size == 2)
610     {
611         UINT8_TO_STREAM (pp, 0);
612     }
613     else
614     {
615         UINT8_TO_STREAM (pp, num_tlv);
616         ARRAY_TO_STREAM (pp, p_param_tlvs, tlv_size);
617     }
618     nfc_ncif_send_cmd (p);
619 
620     return (NCI_STATUS_OK);
621 }
622 
623 /*******************************************************************************
624 **
625 ** Function         nci_snd_get_routing_cmd
626 **
627 ** Description      compose and send RF Management GET_LISTEN_MODE_ROUTING command
628 **                  to command queue
629 **
630 ** Returns          status
631 **
632 *******************************************************************************/
nci_snd_get_routing_cmd(void)633 UINT8 nci_snd_get_routing_cmd (void)
634 {
635     BT_HDR *p;
636     UINT8 *pp;
637     UINT8   param_size = 0;
638 
639     if ((p = NCI_GET_CMD_BUF (param_size)) == NULL)
640         return (NCI_STATUS_FAILED);
641 
642     p->event            = BT_EVT_TO_NFC_NCI;
643     p->len              = NCI_MSG_HDR_SIZE + param_size;
644     p->offset           = NCI_MSG_OFFSET_SIZE;
645     p->layer_specific   = 0;
646     pp                  = (UINT8 *) (p + 1) + p->offset;
647 
648     NCI_MSG_BLD_HDR0 (pp, NCI_MT_CMD, NCI_GID_RF_MANAGE);
649     NCI_MSG_BLD_HDR1 (pp, NCI_MSG_RF_GET_ROUTING);
650     UINT8_TO_STREAM (pp, param_size);
651 
652     nfc_ncif_send_cmd (p);
653     return (NCI_STATUS_OK);
654 }
655 #endif
656 #endif
657 
658 
659 #endif /* NFC_INCLUDED == TRUE*/
660