hcicmds.c revision cccf02fadb2dd4dceb22f2d58ed5840b0ef1860e
15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************
25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Copyright (C) 1999-2012 Broadcom Corporation
45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Licensed under the Apache License, Version 2.0 (the "License");
65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  you may not use this file except in compliance with the License.
75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  You may obtain a copy of the License at:
85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  http://www.apache.org/licenses/LICENSE-2.0
105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  See the License for the specific language governing permissions and
155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  limitations under the License.
165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/
185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************
205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  This file contains function of the HCIC unit to format and send HCI
225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  commands.
235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/
255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_target.h"
27cccf02fadb2dd4dceb22f2d58ed5840b0ef1860eChris Manton#include "counter.h"
285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "gki.h"
295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "hcidefs.h"
305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "hcimsgs.h"
315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "hcidefs.h"
325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btu.h"
335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <stddef.h>
355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h>
365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_int.h"    /* Included for UIPC_* macro definitions */
385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btsnd_hcic_inquiry(const LAP inq_lap, UINT8 duration, UINT8 response_cnt)
405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p;
425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *pp;
435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_INQUIRY)) == NULL)
455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pp = (UINT8 *)(p + 1);
485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_INQUIRY;
505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->offset = 0;
515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, HCI_INQUIRY);
535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_INQUIRY);
545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    LAP_TO_STREAM   (pp, inq_lap);
565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_STREAM (pp, duration);
575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_STREAM (pp, response_cnt);
585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (TRUE);
615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btsnd_hcic_inq_cancel(void)
645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p;
665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *pp;
675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_INQ_CANCEL)) == NULL)
695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pp = (UINT8 *)(p + 1);
725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_INQ_CANCEL;
745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->offset = 0;
755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, HCI_INQUIRY_CANCEL);
765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_INQ_CANCEL);
775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (TRUE);
805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btsnd_hcic_per_inq_mode (UINT16 max_period, UINT16 min_period,
835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                 const LAP inq_lap, UINT8 duration, UINT8 response_cnt)
845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p;
865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *pp;
875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_PER_INQ_MODE)) == NULL)
895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pp = (UINT8 *)(p + 1);
925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_PER_INQ_MODE;
945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->offset = 0;
955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, HCI_PERIODIC_INQUIRY_MODE);
975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_PER_INQ_MODE);
985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, max_period);
1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, min_period);
1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    LAP_TO_STREAM    (pp, inq_lap);
1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_STREAM  (pp, duration);
1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_STREAM  (pp, response_cnt);
1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (TRUE);
1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btsnd_hcic_exit_per_inq (void)
1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p;
1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *pp;
1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_EXIT_PER_INQ)) == NULL)
1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pp = (UINT8 *)(p + 1);
1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_EXIT_PER_INQ;
1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->offset = 0;
1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, HCI_EXIT_PERIODIC_INQUIRY_MODE);
1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_EXIT_PER_INQ);
1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (TRUE);
1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btsnd_hcic_create_conn(BD_ADDR dest, UINT16 packet_types,
1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                               UINT8 page_scan_rep_mode, UINT8 page_scan_mode,
1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                               UINT16 clock_offset, UINT8 allow_switch)
1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p;
1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *pp;
1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CREATE_CONN)) == NULL)
1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pp = (UINT8 *)(p + 1);
1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifndef BT_10A
1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CREATE_CONN;
1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CREATE_CONN - 1;
1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->offset = 0;
1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, HCI_CREATE_CONNECTION);
1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifndef BT_10A
1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_CREATE_CONN);
1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_STREAM  (pp, (HCIC_PARAM_SIZE_CREATE_CONN - 1));
1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BDADDR_TO_STREAM (pp, dest);
1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, packet_types);
1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_STREAM  (pp, page_scan_rep_mode);
1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_STREAM  (pp, page_scan_mode);
1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, clock_offset);
1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if !defined (BT_10A)
1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_STREAM  (pp, allow_switch);
1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_acl_paging (p, dest);
1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (TRUE);
1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btsnd_hcic_disconnect (UINT16 handle, UINT8 reason)
1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p;
1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *pp;
1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_DISCONNECT)) == NULL)
1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pp = (UINT8 *)(p + 1);
1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_DISCONNECT;
1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->offset = 0;
1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, HCI_DISCONNECT);
1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_DISCONNECT);
1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, handle);
1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_STREAM  (pp, reason);
1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (TRUE);
1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_SCO_INCLUDED == TRUE
1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btsnd_hcic_add_SCO_conn (UINT16 handle, UINT16 packet_types)
1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p;
1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *pp;
1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_ADD_SCO_CONN)) == NULL)
1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pp = (UINT8 *)(p + 1);
1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_ADD_SCO_CONN;
2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->offset = 0;
2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, HCI_ADD_SCO_CONNECTION);
2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_ADD_SCO_CONN);
2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, handle);
2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, packet_types);
2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (TRUE);
2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* BTM_SCO_INCLUDED */
2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btsnd_hcic_create_conn_cancel(BD_ADDR dest)
2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p;
2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *pp;
2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CREATE_CONN_CANCEL)) == NULL)
2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pp = (UINT8 *)(p + 1);
2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CREATE_CONN_CANCEL;
2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->offset = 0;
2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, HCI_CREATE_CONNECTION_CANCEL);
2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_CREATE_CONN_CANCEL);
2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BDADDR_TO_STREAM (pp, dest);
2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (TRUE);
2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btsnd_hcic_accept_conn (BD_ADDR dest, UINT8 role)
2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p;
2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *pp;
2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_ACCEPT_CONN)) == NULL)
2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pp = (UINT8 *)(p + 1);
2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_ACCEPT_CONN;
2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->offset = 0;
2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, HCI_ACCEPT_CONNECTION_REQUEST);
2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_ACCEPT_CONN);
2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BDADDR_TO_STREAM (pp, dest);
2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_STREAM  (pp, role);
2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
253cccf02fadb2dd4dceb22f2d58ed5840b0ef1860eChris Manton    counter_add("hci.conn.accept", 1);
254cccf02fadb2dd4dceb22f2d58ed5840b0ef1860eChris Manton
2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (TRUE);
2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btsnd_hcic_reject_conn (BD_ADDR dest, UINT8 reason)
2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p;
2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *pp;
2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_REJECT_CONN)) == NULL)
2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pp = (UINT8 *)(p + 1);
2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_REJECT_CONN;
2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->offset = 0;
2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, HCI_REJECT_CONNECTION_REQUEST);
2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_REJECT_CONN);
2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BDADDR_TO_STREAM (pp, dest);
2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_STREAM (pp, reason);
2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
278cccf02fadb2dd4dceb22f2d58ed5840b0ef1860eChris Manton    counter_add("hci.conn.reject", 1);
279cccf02fadb2dd4dceb22f2d58ed5840b0ef1860eChris Manton
2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (TRUE);
2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btsnd_hcic_link_key_req_reply (BD_ADDR bd_addr, LINK_KEY link_key)
2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p;
2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *pp;
2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_LINK_KEY_REQ_REPLY)) == NULL)
2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pp = (UINT8 *)(p + 1);
2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_LINK_KEY_REQ_REPLY;
2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->offset = 0;
2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM  (pp, HCI_LINK_KEY_REQUEST_REPLY);
2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_STREAM   (pp, HCIC_PARAM_SIZE_LINK_KEY_REQ_REPLY);
2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BDADDR_TO_STREAM  (pp, bd_addr);
3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ARRAY16_TO_STREAM (pp, link_key);
3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (TRUE);
3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btsnd_hcic_link_key_neg_reply (BD_ADDR bd_addr)
3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p;
3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *pp;
3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_LINK_KEY_NEG_REPLY)) == NULL)
3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pp = (UINT8 *)(p + 1);
3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_LINK_KEY_NEG_REPLY;
3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->offset = 0;
3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, HCI_LINK_KEY_REQUEST_NEG_REPLY);
3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_LINK_KEY_NEG_REPLY);
3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BDADDR_TO_STREAM (pp, bd_addr);
3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (TRUE);
3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btsnd_hcic_pin_code_req_reply (BD_ADDR bd_addr, UINT8 pin_code_len,
3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                    PIN_CODE pin_code)
3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p;
3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8  *pp;
3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int     i;
3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_PIN_CODE_REQ_REPLY)) == NULL)
3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pp = (UINT8 *)(p + 1);
3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_PIN_CODE_REQ_REPLY;
3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->offset = 0;
3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM  (pp, HCI_PIN_CODE_REQUEST_REPLY);
3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_STREAM   (pp, HCIC_PARAM_SIZE_PIN_CODE_REQ_REPLY);
3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BDADDR_TO_STREAM  (pp, bd_addr);
3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_STREAM   (pp, pin_code_len);
3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; i < pin_code_len; i++)
3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *pp++ = *pin_code++;
3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (; i < PIN_CODE_LEN; i++)
3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *pp++ = 0;
3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (TRUE);
3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btsnd_hcic_pin_code_neg_reply (BD_ADDR bd_addr)
3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p;
3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *pp;
3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_PIN_CODE_NEG_REPLY)) == NULL)
3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pp = (UINT8 *)(p + 1);
3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_PIN_CODE_NEG_REPLY;
3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->offset = 0;
3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, HCI_PIN_CODE_REQUEST_NEG_REPLY);
3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_PIN_CODE_NEG_REPLY);
3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BDADDR_TO_STREAM (pp, bd_addr);
3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (TRUE);
3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btsnd_hcic_change_conn_type (UINT16 handle, UINT16 packet_types)
3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p;
3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *pp;
3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CHANGE_CONN_TYPE)) == NULL)
3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pp = (UINT8 *)(p + 1);
3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CHANGE_CONN_TYPE;
3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->offset = 0;
3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, HCI_CHANGE_CONN_PACKET_TYPE);
3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_CHANGE_CONN_TYPE);
3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, handle);
4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, packet_types);
4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (TRUE);
4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btsnd_hcic_auth_request (UINT16 handle)
4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p;
4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *pp;
4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CMD_HANDLE)) == NULL)
4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pp = (UINT8 *)(p + 1);
4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CMD_HANDLE;
4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->offset = 0;
4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, HCI_AUTHENTICATION_REQUESTED);
4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_CMD_HANDLE);
4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, handle);
4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (TRUE);
4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btsnd_hcic_set_conn_encrypt (UINT16 handle, BOOLEAN enable)
4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p;
4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *pp;
4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_SET_CONN_ENCRYPT)) == NULL)
4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pp = (UINT8 *)(p + 1);
4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_SET_CONN_ENCRYPT;
4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->offset = 0;
4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, HCI_SET_CONN_ENCRYPTION);
4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_SET_CONN_ENCRYPT);
4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, handle);
4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_STREAM  (pp, enable);
4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (TRUE);
4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btsnd_hcic_master_link_key (BOOLEAN key_flag)
4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p;
4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *pp;
4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_MASTER_LINK_KEY)) == NULL)
4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pp = (UINT8 *)(p + 1);
4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_MASTER_LINK_KEY;
4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->offset = 0;
4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, HCI_MASTER_LINK_KEY);
4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_MASTER_LINK_KEY);
4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_STREAM  (pp, key_flag);
4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (TRUE);
4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btsnd_hcic_rmt_name_req (BD_ADDR bd_addr, UINT8 page_scan_rep_mode,
4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                 UINT8 page_scan_mode, UINT16 clock_offset)
4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p;
4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *pp;
4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_RMT_NAME_REQ)) == NULL)
4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pp = (UINT8 *)(p + 1);
4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_RMT_NAME_REQ;
4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->offset = 0;
4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, HCI_RMT_NAME_REQUEST);
4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_RMT_NAME_REQ);
4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BDADDR_TO_STREAM (pp, bd_addr);
4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_STREAM  (pp, page_scan_rep_mode);
4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_STREAM  (pp, page_scan_mode);
4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, clock_offset);
4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_acl_paging (p, bd_addr);
4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (TRUE);
4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btsnd_hcic_rmt_name_req_cancel (BD_ADDR bd_addr)
5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p;
5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *pp;
5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_RMT_NAME_REQ_CANCEL)) == NULL)
5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pp = (UINT8 *)(p + 1);
5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_RMT_NAME_REQ_CANCEL;
5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->offset = 0;
5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, HCI_RMT_NAME_REQUEST_CANCEL);
5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_RMT_NAME_REQ_CANCEL);
5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BDADDR_TO_STREAM (pp, bd_addr);
5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (TRUE);
5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btsnd_hcic_rmt_features_req (UINT16 handle)
5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p;
5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *pp;
5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CMD_HANDLE)) == NULL)
5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pp = (UINT8 *)(p + 1);
5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CMD_HANDLE;
5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->offset = 0;
5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, HCI_READ_RMT_FEATURES);
5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_CMD_HANDLE);
5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, handle);
5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (TRUE);
5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btsnd_hcic_rmt_ext_features (UINT16 handle, UINT8 page_num)
5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p;
5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *pp;
5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_RMT_EXT_FEATURES)) == NULL)
5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pp = (UINT8 *)(p + 1);
5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_RMT_EXT_FEATURES;
5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->offset = 0;
5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, HCI_READ_RMT_EXT_FEATURES);
5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_RMT_EXT_FEATURES);
5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, handle);
5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_STREAM (pp, page_num);
5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (TRUE);
5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btsnd_hcic_rmt_ver_req (UINT16 handle)
5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p;
5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *pp;
5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CMD_HANDLE)) == NULL)
5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pp = (UINT8 *)(p + 1);
5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CMD_HANDLE;
5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->offset = 0;
5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, HCI_READ_RMT_VERSION_INFO);
5805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_CMD_HANDLE);
5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, handle);
5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
5855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (TRUE);
5865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btsnd_hcic_read_rmt_clk_offset (UINT16 handle)
5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p;
5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *pp;
5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CMD_HANDLE)) == NULL)
5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pp = (UINT8 *)(p + 1);
5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CMD_HANDLE;
5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->offset = 0;
6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, HCI_READ_RMT_CLOCK_OFFSET);
6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_CMD_HANDLE);
6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, handle);
6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (TRUE);
6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btsnd_hcic_read_lmp_handle (UINT16 handle)
6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p;
6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *pp;
6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CMD_HANDLE)) == NULL)
6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pp = (UINT8 *)(p + 1);
6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CMD_HANDLE;
6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->offset = 0;
6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, HCI_READ_LMP_HANDLE);
6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_CMD_HANDLE);
6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, handle);
6275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
6295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (TRUE);
6305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btsnd_hcic_setup_esco_conn (UINT16 handle, UINT32 tx_bw,
6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                    UINT32 rx_bw, UINT16 max_latency, UINT16 voice,
6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                    UINT8 retrans_effort, UINT16 packet_types)
6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p;
6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *pp;
6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_SETUP_ESCO)) == NULL)
6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
6415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pp = (UINT8 *)(p + 1);
6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_SETUP_ESCO;
6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->offset = 0;
6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, HCI_SETUP_ESCO_CONNECTION);
6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_SETUP_ESCO);
6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, handle);
6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT32_TO_STREAM (pp, tx_bw);
6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT32_TO_STREAM (pp, rx_bw);
6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, max_latency);
6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, voice);
6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_STREAM  (pp, retrans_effort);
6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, packet_types);
6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (TRUE);
6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btsnd_hcic_accept_esco_conn (BD_ADDR bd_addr, UINT32 tx_bw,
6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                     UINT32 rx_bw, UINT16 max_latency,
6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                     UINT16 content_fmt, UINT8 retrans_effort,
6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                     UINT16 packet_types)
6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p;
6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *pp;
6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_ACCEPT_ESCO)) == NULL)
6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pp = (UINT8 *)(p + 1);
6745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_ACCEPT_ESCO;
6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->offset = 0;
6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, HCI_ACCEPT_ESCO_CONNECTION);
6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_ACCEPT_ESCO);
6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BDADDR_TO_STREAM (pp, bd_addr);
6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT32_TO_STREAM (pp, tx_bw);
6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT32_TO_STREAM (pp, rx_bw);
6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, max_latency);
6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, content_fmt);
6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_STREAM  (pp, retrans_effort);
6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, packet_types);
6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (TRUE);
6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btsnd_hcic_reject_esco_conn (BD_ADDR bd_addr, UINT8 reason)
6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p;
6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *pp;
6975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_REJECT_ESCO)) == NULL)
6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pp = (UINT8 *)(p + 1);
7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_REJECT_ESCO;
7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->offset = 0;
7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, HCI_REJECT_ESCO_CONNECTION);
7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_REJECT_ESCO);
7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BDADDR_TO_STREAM (pp, bd_addr);
7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_STREAM  (pp, reason);
7115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (TRUE);
7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btsnd_hcic_hold_mode (UINT16 handle, UINT16 max_hold_period,
7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                              UINT16 min_hold_period)
7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p;
7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *pp;
7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_HOLD_MODE)) == NULL)
7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pp = (UINT8 *)(p + 1);
7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_HOLD_MODE;
7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->offset = 0;
7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, HCI_HOLD_MODE);
7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_HOLD_MODE);
7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, handle);
7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, max_hold_period);
7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, min_hold_period);
7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (TRUE);
7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btsnd_hcic_sniff_mode (UINT16 handle, UINT16 max_sniff_period,
7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                               UINT16 min_sniff_period, UINT16 sniff_attempt,
7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                               UINT16 sniff_timeout)
7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p;
7465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *pp;
7475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_SNIFF_MODE)) == NULL)
7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pp = (UINT8 *)(p + 1);
7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_SNIFF_MODE;
7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->offset = 0;
7555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, HCI_SNIFF_MODE);
7575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_SNIFF_MODE);
7585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, handle);
7605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, max_sniff_period);
7615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, min_sniff_period);
7625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, sniff_attempt);
7635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, sniff_timeout);
7645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (TRUE);
7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btsnd_hcic_exit_sniff_mode (UINT16 handle)
7705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p;
7725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *pp;
7735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CMD_HANDLE)) == NULL)
7755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
7765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pp = (UINT8 *)(p + 1);
7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CMD_HANDLE;
7805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->offset = 0;
7815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, HCI_EXIT_SNIFF_MODE);
7835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_CMD_HANDLE);
7845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, handle);
7865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
7885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return TRUE;
7895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btsnd_hcic_park_mode (UINT16 handle, UINT16 beacon_max_interval,
7925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                              UINT16 beacon_min_interval)
7935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p;
7955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *pp;
7965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_PARK_MODE)) == NULL)
7985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
7995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pp = (UINT8 *)(p + 1);
8015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_PARK_MODE;
8035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->offset = 0;
8045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, HCI_PARK_MODE);
8065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_PARK_MODE);
8075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, handle);
8095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, beacon_max_interval);
8105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, beacon_min_interval);
8115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
8135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (TRUE);
8145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
8155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btsnd_hcic_exit_park_mode (UINT16 handle)
8175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
8185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p;
8195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *pp;
8205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CMD_HANDLE)) == NULL)
8225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
8235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pp = (UINT8 *)(p + 1);
8255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CMD_HANDLE;
8275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->offset = 0;
8285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, HCI_EXIT_PARK_MODE);
8305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_CMD_HANDLE);
8315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, handle);
8335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
8355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return TRUE;
8365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
8375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btsnd_hcic_qos_setup (UINT16 handle, UINT8 flags, UINT8 service_type,
8395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                              UINT32 token_rate, UINT32 peak, UINT32 latency,
8405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                              UINT32 delay_var)
8415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
8425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p;
8435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *pp;
8445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_QOS_SETUP)) == NULL)
8465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
8475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pp = (UINT8 *)(p + 1);
8495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_QOS_SETUP;
8515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->offset = 0;
8525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, HCI_QOS_SETUP);
8545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_QOS_SETUP);
8555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, handle);
8575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_STREAM  (pp, flags);
8585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_STREAM  (pp, service_type);
8595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT32_TO_STREAM (pp, token_rate);
8605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT32_TO_STREAM (pp, peak);
8615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT32_TO_STREAM (pp, latency);
8625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT32_TO_STREAM (pp, delay_var);
8635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
8655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (TRUE);
8665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
8675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btsnd_hcic_switch_role (BD_ADDR bd_addr, UINT8 role)
8695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
8705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p;
8715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *pp;
8725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_SWITCH_ROLE)) == NULL)
8745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
8755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pp = (UINT8 *)(p + 1);
8775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_SWITCH_ROLE;
8795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->offset = 0;
8805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, HCI_SWITCH_ROLE);
8825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_SWITCH_ROLE);
8835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BDADDR_TO_STREAM (pp, bd_addr);
8855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_STREAM  (pp, role);
8865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
8885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (TRUE);
8895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
8905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btsnd_hcic_read_policy_set (UINT16 handle)
8925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
8935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p;
8945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *pp;
8955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CMD_HANDLE)) == NULL)
8975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
8985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pp = (UINT8 *)(p + 1);
9005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CMD_HANDLE;
9025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->offset = 0;
9035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, HCI_READ_POLICY_SETTINGS);
9055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_CMD_HANDLE);
9065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, handle);
9085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
9105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (TRUE);
9115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
9125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btsnd_hcic_write_policy_set (UINT16 handle, UINT16 settings)
9145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
9155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p;
9165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *pp;
9175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_POLICY_SET)) == NULL)
9195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
9205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pp = (UINT8 *)(p + 1);
9225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_POLICY_SET;
9245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->offset = 0;
9255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, HCI_WRITE_POLICY_SETTINGS);
9265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_WRITE_POLICY_SET);
9275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, handle);
9295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, settings);
9305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
9325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (TRUE);
9335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
9345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btsnd_hcic_write_def_policy_set (UINT16 settings)
9365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
9375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p;
9385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *pp;
9395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_DEF_POLICY_SET)) == NULL)
9415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
9425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pp = (UINT8 *)(p + 1);
9445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_DEF_POLICY_SET;
9465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->offset = 0;
9475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, HCI_WRITE_DEF_POLICY_SETTINGS);
9485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_WRITE_DEF_POLICY_SET);
9495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, settings);
9515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
9535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (TRUE);
9545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
9555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btsnd_hcic_set_event_filter (UINT8 filt_type, UINT8 filt_cond_type,
9575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                     UINT8 *filt_cond, UINT8 filt_cond_len)
9585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
9595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p;
9605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *pp;
9615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Use buffer large enough to hold all sizes in this command */
9635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p = HCI_GET_CMD_BUF(2 + filt_cond_len)) == NULL)
9645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
9655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pp = (UINT8 *)(p + 1);
9675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->offset = 0;
9695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, HCI_SET_EVENT_FILTER);
9715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (filt_type)
9735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p->len = (UINT16)(HCIC_PREAMBLE_SIZE + 2 + filt_cond_len);
9755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT8_TO_STREAM (pp, (UINT8)(2 + filt_cond_len));
9765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT8_TO_STREAM (pp, filt_type);
9785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT8_TO_STREAM (pp, filt_cond_type);
9795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (filt_cond_type == HCI_FILTER_COND_DEVICE_CLASS)
9815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
9825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            DEVCLASS_TO_STREAM (pp, filt_cond);
9835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            filt_cond += DEV_CLASS_LEN;
9845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            DEVCLASS_TO_STREAM (pp, filt_cond);
9855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            filt_cond += DEV_CLASS_LEN;
9865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            filt_cond_len -= (2 * DEV_CLASS_LEN);
9885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
9895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if (filt_cond_type == HCI_FILTER_COND_BD_ADDR)
9905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
9915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BDADDR_TO_STREAM (pp, filt_cond);
9925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            filt_cond += BD_ADDR_LEN;
9935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            filt_cond_len -= BD_ADDR_LEN;
9955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
9965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (filt_cond_len)
9985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ARRAY_TO_STREAM (pp, filt_cond, filt_cond_len);
9995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
10015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
10025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p->len = (UINT16)(HCIC_PREAMBLE_SIZE + 1);
10035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT8_TO_STREAM (pp, 1);
10045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT8_TO_STREAM (pp, filt_type);
10065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
10095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (TRUE);
10105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
10115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btsnd_hcic_write_pin_type (UINT8 type)
10135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
10145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p;
10155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *pp;
10165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PARAM1)) == NULL)
10185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
10195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pp = (UINT8 *)(p + 1);
10215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PARAM1;
10235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->offset = 0;
10245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, HCI_WRITE_PIN_TYPE);
10265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_WRITE_PARAM1);
10275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_STREAM (pp, type);
10295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
10315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (TRUE);
10325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
10335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btsnd_hcic_read_stored_key (BD_ADDR bd_addr, BOOLEAN read_all_flag)
10355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
10365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p;
10375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *pp;
10385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_STORED_KEY)) == NULL)
10405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
10415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pp = (UINT8 *)(p + 1);
10435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_STORED_KEY;
10455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->offset = 0;
10465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, HCI_READ_STORED_LINK_KEY);
10485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_READ_STORED_KEY);
10495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BDADDR_TO_STREAM (pp, bd_addr);
10515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_STREAM  (pp, read_all_flag);
10525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
10545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (TRUE);
10555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
10565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btsnd_hcic_write_stored_key (UINT8 num_keys, BD_ADDR *bd_addr,
10585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                     LINK_KEY *link_key)
10595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
10605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p;
10615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *pp;
10625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int j;
10635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p = HCI_GET_CMD_BUF(1 + (num_keys * (BD_ADDR_LEN + LINK_KEY_LEN)))) == NULL)
10655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
10665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pp = (UINT8 *)(p + 1);
10685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->len    = HCIC_PREAMBLE_SIZE + 1 + (num_keys * (BD_ADDR_LEN + LINK_KEY_LEN));
10715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->offset = 0;
10725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, HCI_WRITE_STORED_LINK_KEY);
10745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_STREAM  (pp, p->len - HCIC_PREAMBLE_SIZE);
10755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(num_keys > HCI_MAX_NUM_OF_LINK_KEYS_PER_CMMD)
10775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        num_keys = HCI_MAX_NUM_OF_LINK_KEYS_PER_CMMD;
10785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_STREAM (pp, num_keys);
10805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (j = 0; j < num_keys; j++)
10825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
10835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BDADDR_TO_STREAM  (pp, bd_addr[j]);
10845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        ARRAY16_TO_STREAM (pp, link_key[j]);
10855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
10885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (TRUE);
10895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
10905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btsnd_hcic_delete_stored_key (BD_ADDR bd_addr, BOOLEAN delete_all_flag)
10925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
10935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p;
10945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *pp;
10955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_DELETE_STORED_KEY)) == NULL)
10975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
10985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pp = (UINT8 *)(p + 1);
11005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_DELETE_STORED_KEY;
11025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->offset = 0;
11035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, HCI_DELETE_STORED_LINK_KEY);
11055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_DELETE_STORED_KEY);
11065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BDADDR_TO_STREAM (pp, bd_addr);
11085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_STREAM  (pp, delete_all_flag);
11095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
11115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (TRUE);
11125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
11135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btsnd_hcic_change_name (BD_NAME name)
11155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
11165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p;
11175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *pp;
11185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16 len = strlen ((char *)name) + 1;
11195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CHANGE_NAME)) == NULL)
11215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
11225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pp = (UINT8 *)(p + 1);
1124e14a66a5fd4f05817dc7716ca9087678dd220edaSharvil Nanavati    memset(pp, 0, HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CHANGE_NAME);
11255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CHANGE_NAME;
11275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->offset = 0;
11285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, HCI_CHANGE_LOCAL_NAME);
11305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_CHANGE_NAME);
11315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1132ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if (len > HCIC_PARAM_SIZE_CHANGE_NAME)
1133ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        len = HCIC_PARAM_SIZE_CHANGE_NAME;
1134ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
11355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ARRAY_TO_STREAM (pp, name, len);
11365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
11385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (TRUE);
11395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
11405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btsnd_hcic_read_name (void)
11425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
11435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p;
11445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *pp;
11455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_CMD)) == NULL)
11475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
11485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pp = (UINT8 *)(p + 1);
11505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_CMD;
11525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->offset = 0;
11535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, HCI_READ_LOCAL_NAME);
11555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_STREAM  (pp,  HCIC_PARAM_SIZE_READ_CMD);
11565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
11585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (TRUE);
11595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
11605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1161a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach JohnsonBOOLEAN btsnd_hcic_write_page_tout (UINT16 timeout)
11625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
11635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p;
11645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *pp;
11655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PARAM2)) == NULL)
11675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
11685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pp = (UINT8 *)(p + 1);
11705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PARAM2;
11725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->offset = 0;
11735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1174a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT16_TO_STREAM (pp, HCI_WRITE_PAGE_TOUT);
11755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_WRITE_PARAM2);
11765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1177a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT16_TO_STREAM  (pp, timeout);
11785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1179a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
11805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (TRUE);
11815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
11825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1183a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach JohnsonBOOLEAN btsnd_hcic_write_scan_enable (UINT8 flag)
11845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
11855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p;
11865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *pp;
11875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1188a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PARAM1)) == NULL)
11895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
11905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pp = (UINT8 *)(p + 1);
11925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1193a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PARAM1;
11945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->offset = 0;
11955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1196a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT16_TO_STREAM (pp, HCI_WRITE_SCAN_ENABLE);
1197a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_WRITE_PARAM1);
1198a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson
1199a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT8_TO_STREAM  (pp, flag);
12005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
12025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (TRUE);
12035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
12045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1205a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach JohnsonBOOLEAN btsnd_hcic_write_pagescan_cfg(UINT16 interval, UINT16 window)
12065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
12075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p;
12085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *pp;
12095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1210a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PAGESCAN_CFG)) == NULL)
12115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
12125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pp = (UINT8 *)(p + 1);
12145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1215a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PAGESCAN_CFG;
12165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->offset = 0;
12175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1218a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT16_TO_STREAM (pp, HCI_WRITE_PAGESCAN_CFG);
1219a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_WRITE_PAGESCAN_CFG);
12205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1221a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT16_TO_STREAM (pp, interval);
1222a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT16_TO_STREAM (pp, window);
12235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
12255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (TRUE);
12265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
12275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1228a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach JohnsonBOOLEAN btsnd_hcic_write_inqscan_cfg(UINT16 interval, UINT16 window)
12295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
12305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p;
12315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *pp;
12325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1233a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_INQSCAN_CFG)) == NULL)
12345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
12355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pp = (UINT8 *)(p + 1);
12375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1238a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_INQSCAN_CFG;
12395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->offset = 0;
12405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1241a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT16_TO_STREAM (pp, HCI_WRITE_INQUIRYSCAN_CFG);
1242a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_WRITE_INQSCAN_CFG);
1243a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson
1244a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT16_TO_STREAM (pp, interval);
1245a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT16_TO_STREAM (pp, window);
12465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
12485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (TRUE);
12495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
12505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1251a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach JohnsonBOOLEAN btsnd_hcic_write_auth_enable (UINT8 flag)
12525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
12535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p;
12545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *pp;
12555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PARAM1)) == NULL)
12575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
12585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pp = (UINT8 *)(p + 1);
12605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PARAM1;
12625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->offset = 0;
12635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1264a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT16_TO_STREAM (pp, HCI_WRITE_AUTHENTICATION_ENABLE);
12655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_WRITE_PARAM1);
12665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1267a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT8_TO_STREAM (pp, flag);
12685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
12705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (TRUE);
12715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
12725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1273a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach JohnsonBOOLEAN btsnd_hcic_write_dev_class(DEV_CLASS dev_class)
12745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
12755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p;
12765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *pp;
12775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1278a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PARAM3)) == NULL)
12795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
12805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pp = (UINT8 *)(p + 1);
12825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1283a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PARAM3;
12845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->offset = 0;
12855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1286a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT16_TO_STREAM (pp, HCI_WRITE_CLASS_OF_DEVICE);
1287a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_WRITE_PARAM3);
1288a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson
1289a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    DEVCLASS_TO_STREAM (pp, dev_class);
12905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
12925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (TRUE);
12935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
12945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1295a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach JohnsonBOOLEAN btsnd_hcic_write_voice_settings(UINT16 flags)
12965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
12975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p;
12985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *pp;
12995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1300a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PARAM2)) == NULL)
13015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
13025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pp = (UINT8 *)(p + 1);
13045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1305a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PARAM2;
13065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->offset = 0;
13075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1308a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT16_TO_STREAM (pp, HCI_WRITE_VOICE_SETTINGS);
1309a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_WRITE_PARAM2);
13105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1311a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT16_TO_STREAM (pp, flags);
13125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
13145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (TRUE);
13155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
13165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1317a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach JohnsonBOOLEAN btsnd_hcic_write_auto_flush_tout (UINT16 handle, UINT16 tout)
13185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
13195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p;
13205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *pp;
13215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1322a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_AUTO_FLUSH_TOUT)) == NULL)
13235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
13245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pp = (UINT8 *)(p + 1);
13265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1327a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_AUTO_FLUSH_TOUT;
13285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->offset = 0;
13295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1330a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT16_TO_STREAM (pp, HCI_WRITE_AUTO_FLUSH_TOUT);
1331a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_WRITE_AUTO_FLUSH_TOUT);
1332a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson
1333a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT16_TO_STREAM (pp, handle);
1334a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT16_TO_STREAM (pp, tout);
13355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
13375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (TRUE);
13385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
13395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1340a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach JohnsonBOOLEAN btsnd_hcic_read_tx_power (UINT16 handle, UINT8 type)
13415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
13425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p;
13435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *pp;
13445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1345a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_TX_POWER)) == NULL)
13465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
13475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pp = (UINT8 *)(p + 1);
13495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1350a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_TX_POWER;
13515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->offset = 0;
13525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1353a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT16_TO_STREAM (pp, HCI_READ_TRANSMIT_POWER_LEVEL);
1354a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_READ_TX_POWER);
13555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1356a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT16_TO_STREAM (pp, handle);
1357a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT8_TO_STREAM  (pp, type);
13585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
13605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (TRUE);
13615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
13625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1363a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach JohnsonBOOLEAN btsnd_hcic_host_num_xmitted_pkts (UINT8 num_handles, UINT16 *handle,
1364a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson                                          UINT16 *num_pkts)
13655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
13665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p;
13675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *pp;
1368a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    int j;
13695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1370a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    if ((p = HCI_GET_CMD_BUF(1 + (num_handles * 4))) == NULL)
13715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
13725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pp = (UINT8 *)(p + 1);
13745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1375a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    p->len    = HCIC_PREAMBLE_SIZE + 1 + (num_handles * 4);
13765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->offset = 0;
13775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1378a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT16_TO_STREAM (pp, HCI_HOST_NUM_PACKETS_DONE);
1379a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT8_TO_STREAM  (pp, p->len - HCIC_PREAMBLE_SIZE);
1380a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson
1381a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT8_TO_STREAM (pp, num_handles);
1382a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson
1383a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    for (j = 0; j < num_handles; j++)
1384a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    {
1385a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson        UINT16_TO_STREAM (pp, handle[j]);
1386a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson        UINT16_TO_STREAM (pp, num_pkts[j]);
1387a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    }
13885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
13905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (TRUE);
13915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
13925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1393a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach JohnsonBOOLEAN btsnd_hcic_write_link_super_tout (UINT8 local_controller_id, UINT16 handle, UINT16 timeout)
13945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
13955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p;
13965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *pp;
13975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1398a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_LINK_SUPER_TOUT)) == NULL)
13995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
14005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pp = (UINT8 *)(p + 1);
14025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1403a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_LINK_SUPER_TOUT;
14045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->offset = 0;
14055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1406a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT16_TO_STREAM (pp, HCI_WRITE_LINK_SUPER_TOUT);
1407a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_WRITE_LINK_SUPER_TOUT);
14085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1409a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT16_TO_STREAM (pp, handle);
1410a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT16_TO_STREAM (pp, timeout);
14115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1412a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    btu_hcif_send_cmd (local_controller_id,  p);
14135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (TRUE);
14145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
14155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1416a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach JohnsonBOOLEAN btsnd_hcic_write_cur_iac_lap (UINT8 num_cur_iac, LAP * const iac_lap)
14175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
14185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p;
14195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *pp;
1420a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    int i;
14215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1422a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    if ((p = HCI_GET_CMD_BUF(1 + (LAP_LEN * num_cur_iac))) == NULL)
14235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
14245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pp = (UINT8 *)(p + 1);
14265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1427a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    p->len    = HCIC_PREAMBLE_SIZE + 1 + (LAP_LEN * num_cur_iac);
14285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->offset = 0;
14295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1430a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT16_TO_STREAM (pp, HCI_WRITE_CURRENT_IAC_LAP);
1431a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT8_TO_STREAM  (pp, p->len - HCIC_PREAMBLE_SIZE);
14325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1433a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT8_TO_STREAM (pp, num_cur_iac);
14345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1435a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    for (i = 0; i < num_cur_iac; i++)
1436a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson        LAP_TO_STREAM (pp, iac_lap[i]);
14375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
14395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (TRUE);
14405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
14415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1442a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson/******************************************
1443a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson**    Lisbon Features
1444a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson*******************************************/
1445a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson#if BTM_SSR_INCLUDED == TRUE
14465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1447a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach JohnsonBOOLEAN btsnd_hcic_sniff_sub_rate(UINT16 handle, UINT16 max_lat,
1448a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson                                  UINT16 min_remote_lat, UINT16 min_local_lat)
14495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
14505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p;
14515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *pp;
14525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1453a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_SNIFF_SUB_RATE)) == NULL)
14545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
14555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pp = (UINT8 *)(p + 1);
14575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1458a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_SNIFF_SUB_RATE;
14595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->offset = 0;
14605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1461a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT16_TO_STREAM (pp, HCI_SNIFF_SUB_RATE);
1462a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_SNIFF_SUB_RATE);
14635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1464a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT16_TO_STREAM  (pp, handle);
1465a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT16_TO_STREAM  (pp, max_lat);
1466a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT16_TO_STREAM  (pp, min_remote_lat);
1467a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT16_TO_STREAM  (pp, min_local_lat);
14685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
14705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (TRUE);
14715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1472a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson#endif /* BTM_SSR_INCLUDED */
14735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1474a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson#if (BTM_EIR_SERVER_INCLUDED == TRUE)
1475a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson/**** Extended Inquiry Response Commands ****/
1476a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnsonvoid btsnd_hcic_write_ext_inquiry_response (void *buffer, UINT8 fec_req)
14775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1478a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    BT_HDR *p = (BT_HDR *)buffer;
1479a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT8 *pp = (UINT8 *)(p + 1);
14805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1481a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_EXT_INQ_RESP;
14825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->offset = 0;
14835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1484a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT16_TO_STREAM (pp, HCI_WRITE_EXT_INQ_RESPONSE);
1485a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_EXT_INQ_RESP);
14865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1487a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT8_TO_STREAM (pp, fec_req);
14885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
14905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1491a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson#endif  /* BTM_EIR_SERVER_INCLUDED == TRUE */
14925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1493a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach JohnsonBOOLEAN btsnd_hcic_io_cap_req_reply (BD_ADDR bd_addr, UINT8 capability,
1494a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson                                UINT8 oob_present, UINT8 auth_req)
14955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
14965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p;
14975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *pp;
14985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1499a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_IO_CAP_RESP)) == NULL)
15005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
15015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pp = (UINT8 *)(p + 1);
15035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1504a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_IO_CAP_RESP;
15055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->offset = 0;
15065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1507a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT16_TO_STREAM (pp, HCI_IO_CAPABILITY_RESPONSE);
1508a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_IO_CAP_RESP);
1509a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson
1510a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    BDADDR_TO_STREAM (pp, bd_addr);
1511a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT8_TO_STREAM  (pp, capability);
1512a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT8_TO_STREAM  (pp, oob_present);
1513a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT8_TO_STREAM  (pp, auth_req);
15145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
15165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (TRUE);
15175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
15185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1519a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach JohnsonBOOLEAN btsnd_hcic_io_cap_req_neg_reply (BD_ADDR bd_addr, UINT8 err_code)
15205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
15215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p;
15225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *pp;
15235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1524a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_IO_CAP_NEG_REPLY)) == NULL)
15255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
15265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pp = (UINT8 *)(p + 1);
15285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1529a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_IO_CAP_NEG_REPLY;
15305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->offset = 0;
15315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1532a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT16_TO_STREAM (pp, HCI_IO_CAP_REQ_NEG_REPLY);
1533a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_IO_CAP_NEG_REPLY);
15345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1535a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    BDADDR_TO_STREAM (pp, bd_addr);
1536a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT8_TO_STREAM  (pp, err_code);
15375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1538a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
15395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (TRUE);
15405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
15415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1542a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach JohnsonBOOLEAN btsnd_hcic_read_local_oob_data (void)
15435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
15445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p;
15455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *pp;
15465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1547a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_R_LOCAL_OOB)) == NULL)
15485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
15495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pp = (UINT8 *)(p + 1);
15515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1552a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_R_LOCAL_OOB;
15535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->offset = 0;
15545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1555a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT16_TO_STREAM (pp, HCI_READ_LOCAL_OOB_DATA);
1556a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_R_LOCAL_OOB);
15575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1558a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
15595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (TRUE);
15605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
15615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1562a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach JohnsonBOOLEAN btsnd_hcic_user_conf_reply (BD_ADDR bd_addr, BOOLEAN is_yes)
15635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
15645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p;
15655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *pp;
15665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1567a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_UCONF_REPLY)) == NULL)
15685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
15695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pp = (UINT8 *)(p + 1);
15715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1572a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_UCONF_REPLY;
15735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->offset = 0;
15745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1575a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    if (!is_yes)
1576a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    {
1577a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson        /* Negative reply */
1578a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson        UINT16_TO_STREAM (pp, HCI_USER_CONF_VALUE_NEG_REPLY);
1579a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    }
1580a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    else
1581a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    {
1582a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson        /* Confirmation */
1583a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson        UINT16_TO_STREAM (pp, HCI_USER_CONF_REQUEST_REPLY);
1584a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    }
15855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1586a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_UCONF_REPLY);
1587a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson
1588a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    BDADDR_TO_STREAM (pp, bd_addr);
15895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
15915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (TRUE);
15925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
15935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1594a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach JohnsonBOOLEAN btsnd_hcic_user_passkey_reply (BD_ADDR bd_addr, UINT32 value)
15955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
15965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p;
15975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *pp;
15985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1599a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_U_PKEY_REPLY)) == NULL)
16005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
16015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pp = (UINT8 *)(p + 1);
16035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1604a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_U_PKEY_REPLY;
16055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->offset = 0;
16065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1607a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT16_TO_STREAM (pp, HCI_USER_PASSKEY_REQ_REPLY);
1608a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_U_PKEY_REPLY);
16095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1610a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    BDADDR_TO_STREAM (pp, bd_addr);
1611a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT32_TO_STREAM (pp, value);
16125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
16145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (TRUE);
16155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
16165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1617a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach JohnsonBOOLEAN btsnd_hcic_user_passkey_neg_reply (BD_ADDR bd_addr)
16185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
16195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p;
16205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *pp;
16215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1622a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_U_PKEY_NEG_REPLY)) == NULL)
16235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
16245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pp = (UINT8 *)(p + 1);
16265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1627a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_U_PKEY_NEG_REPLY;
16285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->offset = 0;
16295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1630a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT16_TO_STREAM (pp, HCI_USER_PASSKEY_REQ_NEG_REPLY);
1631a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_U_PKEY_NEG_REPLY);
1632a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson
1633a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    BDADDR_TO_STREAM (pp, bd_addr);
16345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
16365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (TRUE);
16375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
16385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1639a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach JohnsonBOOLEAN btsnd_hcic_rem_oob_reply (BD_ADDR bd_addr, UINT8 *p_c, UINT8 *p_r)
16405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
16415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p;
16425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *pp;
16435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1644a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_REM_OOB_REPLY)) == NULL)
16455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
16465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pp = (UINT8 *)(p + 1);
16485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1649a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_REM_OOB_REPLY;
16505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->offset = 0;
16515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1652a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT16_TO_STREAM (pp, HCI_REM_OOB_DATA_REQ_REPLY);
1653a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_REM_OOB_REPLY);
16545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1655a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    BDADDR_TO_STREAM (pp, bd_addr);
1656a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    ARRAY16_TO_STREAM (pp, p_c);
1657a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    ARRAY16_TO_STREAM (pp, p_r);
16585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
16605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (TRUE);
16615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
16625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1663a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach JohnsonBOOLEAN btsnd_hcic_rem_oob_neg_reply (BD_ADDR bd_addr)
16645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
16655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p;
16665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *pp;
16675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1668a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_REM_OOB_NEG_REPLY)) == NULL)
16695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
16705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pp = (UINT8 *)(p + 1);
16725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1673a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_REM_OOB_NEG_REPLY;
16745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->offset = 0;
16755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1676a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT16_TO_STREAM (pp, HCI_REM_OOB_DATA_REQ_NEG_REPLY);
1677a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_REM_OOB_NEG_REPLY);
1678a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson
1679a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    BDADDR_TO_STREAM (pp, bd_addr);
16805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
16825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (TRUE);
16835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
16845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1685a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson
1686a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach JohnsonBOOLEAN btsnd_hcic_read_inq_tx_power (void)
16875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
16885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p;
16895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *pp;
16905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1691a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_R_TX_POWER)) == NULL)
16925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
16935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pp = (UINT8 *)(p + 1);
16955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1696a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_R_TX_POWER;
16975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->offset = 0;
16985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1699a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT16_TO_STREAM (pp, HCI_READ_INQ_TX_POWER_LEVEL);
1700a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_R_TX_POWER);
17015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
17035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (TRUE);
17045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
17055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1706a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach JohnsonBOOLEAN btsnd_hcic_write_inq_tx_power (INT8 level)
17075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
17085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p;
17095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *pp;
17105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1711a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_W_TX_POWER)) == NULL)
17125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
17135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pp = (UINT8 *)(p + 1);
17155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1716a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_W_TX_POWER;
17175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->offset = 0;
17185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1719a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT16_TO_STREAM (pp, HCI_WRITE_INQ_TX_POWER_LEVEL);
1720a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_W_TX_POWER);
1721a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson
1722a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    INT8_TO_STREAM (pp, level);
17235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
17255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (TRUE);
17265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
17275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1728a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach JohnsonBOOLEAN btsnd_hcic_send_keypress_notif (BD_ADDR bd_addr, UINT8 notif)
17295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
17305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p;
1731a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT8 *pp;
17325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1733a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_SEND_KEYPRESS_NOTIF)) == NULL)
17345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
17355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pp = (UINT8 *)(p + 1);
17375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1738a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_SEND_KEYPRESS_NOTIF;
17395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->offset = 0;
17405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1741a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT16_TO_STREAM (pp, HCI_SEND_KEYPRESS_NOTIF);
1742a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_SEND_KEYPRESS_NOTIF);
17435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1744a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    BDADDR_TO_STREAM (pp, bd_addr);
1745a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT8_TO_STREAM (pp, notif);
17465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
17485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (TRUE);
17495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
17505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1751a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson/**** end of Simple Pairing Commands ****/
1752a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson
1753a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson#if L2CAP_NON_FLUSHABLE_PB_INCLUDED == TRUE
1754a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach JohnsonBOOLEAN btsnd_hcic_enhanced_flush (UINT16 handle, UINT8 packet_type)
17555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
17565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p;
17575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *pp;
17585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1759a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_ENHANCED_FLUSH)) == NULL)
17605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
17615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pp = (UINT8 *)(p + 1);
17635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1764a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_ENHANCED_FLUSH;
17655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->offset = 0;
1766a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT16_TO_STREAM (pp, HCI_ENHANCED_FLUSH);
1767a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_ENHANCED_FLUSH);
17685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1769a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT16_TO_STREAM (pp, handle);
1770a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT8_TO_STREAM  (pp, packet_type);
17715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
17735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (TRUE);
17745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1775a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson#endif
1776a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson
1777a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson/*************************
1778a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson** End of Lisbon Commands
1779a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson**************************/
17805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1781a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach JohnsonBOOLEAN btsnd_hcic_get_link_quality (UINT16 handle)
17825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
17835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p;
17845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *pp;
17855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CMD_HANDLE)) == NULL)
17875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
17885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pp = (UINT8 *)(p + 1);
17905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CMD_HANDLE;
17925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->offset = 0;
17935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1794a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT16_TO_STREAM (pp, HCI_GET_LINK_QUALITY);
17955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_CMD_HANDLE);
17965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, handle);
17985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
18005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (TRUE);
18015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
18025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1803a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach JohnsonBOOLEAN btsnd_hcic_read_rssi (UINT16 handle)
18045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
18055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p;
18065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *pp;
18075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1808a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CMD_HANDLE)) == NULL)
18095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
18105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pp = (UINT8 *)(p + 1);
18125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1813a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CMD_HANDLE;
18145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->offset = 0;
18155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1816a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT16_TO_STREAM (pp, HCI_READ_RSSI);
1817a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_CMD_HANDLE);
18185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, handle);
18205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
18225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (TRUE);
18235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
18245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1825a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach JohnsonBOOLEAN btsnd_hcic_enable_test_mode (void)
18265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
18275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p;
18285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *pp;
18295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_CMD)) == NULL)
18315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
18325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pp = (UINT8 *)(p + 1);
18345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_CMD;
18365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->offset = 0;
18375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1838a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT16_TO_STREAM (pp, HCI_ENABLE_DEV_UNDER_TEST_MODE);
18395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_STREAM  (pp,  HCIC_PARAM_SIZE_READ_CMD);
18405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
18425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (TRUE);
18435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
18445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1845a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach JohnsonBOOLEAN btsnd_hcic_write_afh_channel_assessment_mode (UINT8 mode)
18465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
18475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p;
18485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *pp;
18495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PARAM1)) == NULL)
18515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
18525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pp = (UINT8 *)(p + 1);
18545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PARAM1;
18565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->offset = 0;
18575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1858a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT16_TO_STREAM (pp, HCI_WRITE_AFH_ASSESSMENT_MODE);
18595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_WRITE_PARAM1);
18605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1861a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT8_TO_STREAM  (pp, mode);
18625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
18645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (TRUE);
18655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
18665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1867a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach JohnsonBOOLEAN btsnd_hcic_set_afh_channels (UINT8 first, UINT8 last)
18685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
18695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p;
1870a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT8  *pp;
1871a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT8  channels[10] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F};
1872a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    int    i;
18735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1874a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_SET_AFH_CHANNELS)) == NULL)
18755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
18765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pp = (UINT8 *)(p + 1);
18785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1879a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_SET_AFH_CHANNELS;
18805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->offset = 0;
18815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1882a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT16_TO_STREAM (pp, HCI_SET_AFH_CHANNELS);
1883a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_SET_AFH_CHANNELS);
1884a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson
1885a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    /* Just make sure that caller did not exceed 79 Bluetooth channels */
1886a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    if ((first <= last) && (last <= 78))
1887a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    {
1888a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson        for (i = first; i <= last; i++)
1889a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson        {
1890a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson            int byte_offset = i / 8;
1891a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson            int bit_offset  = i % 8;
1892a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson            channels[byte_offset] &= ~(1 << bit_offset);
1893a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson        }
1894a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    }
1895a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    for (i = 0; i < 10; i++)
1896a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson        *pp++ = channels[i];
18975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
18995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (TRUE);
19005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
19015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1902a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach JohnsonBOOLEAN btsnd_hcic_write_inqscan_type (UINT8 type)
19035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
19045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p;
19055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *pp;
19065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PARAM1)) == NULL)
19085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
19095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pp = (UINT8 *)(p + 1);
19115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PARAM1;
19135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->offset = 0;
19145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1915a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT16_TO_STREAM (pp, HCI_WRITE_INQSCAN_TYPE);
19165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_WRITE_PARAM1);
19175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1918a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT8_TO_STREAM  (pp, type);
19195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
19215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (TRUE);
19225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
19235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1924a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach JohnsonBOOLEAN btsnd_hcic_write_inquiry_mode (UINT8 mode)
19255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
19265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p;
19275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *pp;
19285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1929a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PARAM1)) == NULL)
19305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
19315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pp = (UINT8 *)(p + 1);
19335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1934a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PARAM1;
19355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->offset = 0;
19365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1937a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT16_TO_STREAM (pp, HCI_WRITE_INQUIRY_MODE);
1938a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_WRITE_PARAM1);
1939a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson
1940a952e80711c1d87c9e30a0e5c76a22b0aab7ed7fZach Johnson    UINT8_TO_STREAM  (pp, mode);
19415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
19435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (TRUE);
19445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
19455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btsnd_hcic_write_pagescan_type (UINT8 type)
19475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
19485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p;
19495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *pp;
19505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PARAM1)) == NULL)
19525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
19535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pp = (UINT8 *)(p + 1);
19555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PARAM1;
19575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->offset = 0;
19585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, HCI_WRITE_PAGESCAN_TYPE);
19605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_WRITE_PARAM1);
19615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_STREAM  (pp, type);
19635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
19655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (TRUE);
19665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
19675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* Must have room to store BT_HDR + max VSC length + callback pointer */
19698fc656cc6aef76574f55c334f0dd71d62b23e896Zach Johnson#if (HCI_CMD_POOL_BUF_SIZE < 268)
19705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#error "HCI_CMD_POOL_BUF_SIZE must be larger than 268"
19715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
19725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btsnd_hcic_vendor_spec_cmd (void *buffer, UINT16 opcode, UINT8 len,
19745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                 UINT8 *p_data, void *p_cmd_cplt_cback)
19755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
19765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p = (BT_HDR *)buffer;
19775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *pp = (UINT8 *)(p + 1);
19785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->len    = HCIC_PREAMBLE_SIZE + len;
19805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->offset = sizeof(void *);
19815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    *((void **)pp) = p_cmd_cplt_cback;  /* Store command complete callback in buffer */
19835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pp += sizeof(void *);               /* Skip over callback pointer */
19845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM (pp, HCI_GRP_VENDOR_SPECIFIC | opcode);
19865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_STREAM  (pp, len);
19875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ARRAY_TO_STREAM  (pp, p_data, len);
19885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
19905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1991