Home | History | Annotate | Download | only in hcic
      1 /******************************************************************************
      2  *
      3  *  Copyright (C) 1999-2012 Broadcom Corporation
      4  *
      5  *  Licensed under the Apache License, Version 2.0 (the "License");
      6  *  you may not use this file except in compliance with the License.
      7  *  You may obtain a copy of the License at:
      8  *
      9  *  http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  *  Unless required by applicable law or agreed to in writing, software
     12  *  distributed under the License is distributed on an "AS IS" BASIS,
     13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  *  See the License for the specific language governing permissions and
     15  *  limitations under the License.
     16  *
     17  ******************************************************************************/
     18 
     19 /******************************************************************************
     20  *
     21  *  This file contains function of the HCIC unit to format and send HCI
     22  *  commands.
     23  *
     24  ******************************************************************************/
     25 
     26 #include "bt_target.h"
     27 #include "btcore/include/counter.h"
     28 #include "gki.h"
     29 #include "hcidefs.h"
     30 #include "hcimsgs.h"
     31 #include "hcidefs.h"
     32 #include "btu.h"
     33 
     34 #include <stddef.h>
     35 #include <string.h>
     36 
     37 #include "btm_int.h"    /* Included for UIPC_* macro definitions */
     38 
     39 BOOLEAN btsnd_hcic_inquiry(const LAP inq_lap, UINT8 duration, UINT8 response_cnt)
     40 {
     41     BT_HDR *p;
     42     UINT8 *pp;
     43 
     44     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_INQUIRY)) == NULL)
     45         return (FALSE);
     46 
     47     pp = (UINT8 *)(p + 1);
     48 
     49     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_INQUIRY;
     50     p->offset = 0;
     51 
     52     UINT16_TO_STREAM (pp, HCI_INQUIRY);
     53     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_INQUIRY);
     54 
     55     LAP_TO_STREAM   (pp, inq_lap);
     56     UINT8_TO_STREAM (pp, duration);
     57     UINT8_TO_STREAM (pp, response_cnt);
     58 
     59     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
     60     return (TRUE);
     61 }
     62 
     63 BOOLEAN btsnd_hcic_inq_cancel(void)
     64 {
     65     BT_HDR *p;
     66     UINT8 *pp;
     67 
     68     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_INQ_CANCEL)) == NULL)
     69         return (FALSE);
     70 
     71     pp = (UINT8 *)(p + 1);
     72 
     73     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_INQ_CANCEL;
     74     p->offset = 0;
     75     UINT16_TO_STREAM (pp, HCI_INQUIRY_CANCEL);
     76     UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_INQ_CANCEL);
     77 
     78     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
     79     return (TRUE);
     80 }
     81 
     82 BOOLEAN btsnd_hcic_per_inq_mode (UINT16 max_period, UINT16 min_period,
     83                                  const LAP inq_lap, UINT8 duration, UINT8 response_cnt)
     84 {
     85     BT_HDR *p;
     86     UINT8 *pp;
     87 
     88     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_PER_INQ_MODE)) == NULL)
     89         return (FALSE);
     90 
     91     pp = (UINT8 *)(p + 1);
     92 
     93     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_PER_INQ_MODE;
     94     p->offset = 0;
     95 
     96     UINT16_TO_STREAM (pp, HCI_PERIODIC_INQUIRY_MODE);
     97     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_PER_INQ_MODE);
     98 
     99     UINT16_TO_STREAM (pp, max_period);
    100     UINT16_TO_STREAM (pp, min_period);
    101     LAP_TO_STREAM    (pp, inq_lap);
    102     UINT8_TO_STREAM  (pp, duration);
    103     UINT8_TO_STREAM  (pp, response_cnt);
    104 
    105     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
    106     return (TRUE);
    107 }
    108 
    109 BOOLEAN btsnd_hcic_exit_per_inq (void)
    110 {
    111     BT_HDR *p;
    112     UINT8 *pp;
    113 
    114     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_EXIT_PER_INQ)) == NULL)
    115         return (FALSE);
    116 
    117     pp = (UINT8 *)(p + 1);
    118 
    119     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_EXIT_PER_INQ;
    120     p->offset = 0;
    121     UINT16_TO_STREAM (pp, HCI_EXIT_PERIODIC_INQUIRY_MODE);
    122     UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_EXIT_PER_INQ);
    123 
    124     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
    125     return (TRUE);
    126 }
    127 
    128 
    129 BOOLEAN btsnd_hcic_create_conn(BD_ADDR dest, UINT16 packet_types,
    130                                UINT8 page_scan_rep_mode, UINT8 page_scan_mode,
    131                                UINT16 clock_offset, UINT8 allow_switch)
    132 {
    133     BT_HDR *p;
    134     UINT8 *pp;
    135 
    136     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CREATE_CONN)) == NULL)
    137         return (FALSE);
    138 
    139     pp = (UINT8 *)(p + 1);
    140 
    141 #ifndef BT_10A
    142     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CREATE_CONN;
    143 #else
    144     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CREATE_CONN - 1;
    145 #endif
    146     p->offset = 0;
    147 
    148     UINT16_TO_STREAM (pp, HCI_CREATE_CONNECTION);
    149 #ifndef BT_10A
    150     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_CREATE_CONN);
    151 #else
    152     UINT8_TO_STREAM  (pp, (HCIC_PARAM_SIZE_CREATE_CONN - 1));
    153 #endif
    154     BDADDR_TO_STREAM (pp, dest);
    155     UINT16_TO_STREAM (pp, packet_types);
    156     UINT8_TO_STREAM  (pp, page_scan_rep_mode);
    157     UINT8_TO_STREAM  (pp, page_scan_mode);
    158     UINT16_TO_STREAM (pp, clock_offset);
    159 #if !defined (BT_10A)
    160     UINT8_TO_STREAM  (pp, allow_switch);
    161 #endif
    162     btm_acl_paging (p, dest);
    163     return (TRUE);
    164 }
    165 
    166 BOOLEAN btsnd_hcic_disconnect (UINT16 handle, UINT8 reason)
    167 {
    168     BT_HDR *p;
    169     UINT8 *pp;
    170 
    171     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_DISCONNECT)) == NULL)
    172         return (FALSE);
    173 
    174     pp = (UINT8 *)(p + 1);
    175 
    176     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_DISCONNECT;
    177     p->offset = 0;
    178 
    179     UINT16_TO_STREAM (pp, HCI_DISCONNECT);
    180     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_DISCONNECT);
    181     UINT16_TO_STREAM (pp, handle);
    182     UINT8_TO_STREAM  (pp, reason);
    183 
    184     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
    185     return (TRUE);
    186 }
    187 
    188 #if BTM_SCO_INCLUDED == TRUE
    189 BOOLEAN btsnd_hcic_add_SCO_conn (UINT16 handle, UINT16 packet_types)
    190 {
    191     BT_HDR *p;
    192     UINT8 *pp;
    193 
    194     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_ADD_SCO_CONN)) == NULL)
    195         return (FALSE);
    196 
    197     pp = (UINT8 *)(p + 1);
    198 
    199     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_ADD_SCO_CONN;
    200     p->offset = 0;
    201 
    202     UINT16_TO_STREAM (pp, HCI_ADD_SCO_CONNECTION);
    203     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_ADD_SCO_CONN);
    204 
    205     UINT16_TO_STREAM (pp, handle);
    206     UINT16_TO_STREAM (pp, packet_types);
    207 
    208     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
    209     return (TRUE);
    210 }
    211 #endif /* BTM_SCO_INCLUDED */
    212 
    213 BOOLEAN btsnd_hcic_create_conn_cancel(BD_ADDR dest)
    214 {
    215     BT_HDR *p;
    216     UINT8 *pp;
    217 
    218     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CREATE_CONN_CANCEL)) == NULL)
    219         return (FALSE);
    220 
    221     pp = (UINT8 *)(p + 1);
    222 
    223     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CREATE_CONN_CANCEL;
    224     p->offset = 0;
    225 
    226     UINT16_TO_STREAM (pp, HCI_CREATE_CONNECTION_CANCEL);
    227     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_CREATE_CONN_CANCEL);
    228 
    229     BDADDR_TO_STREAM (pp, dest);
    230 
    231     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
    232     return (TRUE);
    233 }
    234 
    235 BOOLEAN btsnd_hcic_accept_conn (BD_ADDR dest, UINT8 role)
    236 {
    237     BT_HDR *p;
    238     UINT8 *pp;
    239 
    240     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_ACCEPT_CONN)) == NULL)
    241         return (FALSE);
    242 
    243     pp = (UINT8 *)(p + 1);
    244 
    245     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_ACCEPT_CONN;
    246     p->offset = 0;
    247 
    248     UINT16_TO_STREAM (pp, HCI_ACCEPT_CONNECTION_REQUEST);
    249     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_ACCEPT_CONN);
    250     BDADDR_TO_STREAM (pp, dest);
    251     UINT8_TO_STREAM  (pp, role);
    252 
    253     counter_add("hci.conn.accept", 1);
    254 
    255     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
    256     return (TRUE);
    257 }
    258 
    259 BOOLEAN btsnd_hcic_reject_conn (BD_ADDR dest, UINT8 reason)
    260 {
    261     BT_HDR *p;
    262     UINT8 *pp;
    263 
    264     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_REJECT_CONN)) == NULL)
    265         return (FALSE);
    266 
    267     pp = (UINT8 *)(p + 1);
    268 
    269     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_REJECT_CONN;
    270     p->offset = 0;
    271 
    272     UINT16_TO_STREAM (pp, HCI_REJECT_CONNECTION_REQUEST);
    273     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_REJECT_CONN);
    274 
    275     BDADDR_TO_STREAM (pp, dest);
    276     UINT8_TO_STREAM (pp, reason);
    277 
    278     counter_add("hci.conn.reject", 1);
    279 
    280     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
    281     return (TRUE);
    282 }
    283 
    284 BOOLEAN btsnd_hcic_link_key_req_reply (BD_ADDR bd_addr, LINK_KEY link_key)
    285 {
    286     BT_HDR *p;
    287     UINT8 *pp;
    288 
    289     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_LINK_KEY_REQ_REPLY)) == NULL)
    290         return (FALSE);
    291 
    292     pp = (UINT8 *)(p + 1);
    293 
    294     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_LINK_KEY_REQ_REPLY;
    295     p->offset = 0;
    296 
    297     UINT16_TO_STREAM  (pp, HCI_LINK_KEY_REQUEST_REPLY);
    298     UINT8_TO_STREAM   (pp, HCIC_PARAM_SIZE_LINK_KEY_REQ_REPLY);
    299 
    300     BDADDR_TO_STREAM  (pp, bd_addr);
    301     ARRAY16_TO_STREAM (pp, link_key);
    302 
    303     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
    304     return (TRUE);
    305 }
    306 
    307 BOOLEAN btsnd_hcic_link_key_neg_reply (BD_ADDR bd_addr)
    308 {
    309     BT_HDR *p;
    310     UINT8 *pp;
    311 
    312     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_LINK_KEY_NEG_REPLY)) == NULL)
    313         return (FALSE);
    314 
    315     pp = (UINT8 *)(p + 1);
    316 
    317     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_LINK_KEY_NEG_REPLY;
    318     p->offset = 0;
    319 
    320     UINT16_TO_STREAM (pp, HCI_LINK_KEY_REQUEST_NEG_REPLY);
    321     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_LINK_KEY_NEG_REPLY);
    322 
    323     BDADDR_TO_STREAM (pp, bd_addr);
    324 
    325     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
    326     return (TRUE);
    327 }
    328 
    329 BOOLEAN btsnd_hcic_pin_code_req_reply (BD_ADDR bd_addr, UINT8 pin_code_len,
    330                                     PIN_CODE pin_code)
    331 {
    332     BT_HDR *p;
    333     UINT8  *pp;
    334     int     i;
    335 
    336     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_PIN_CODE_REQ_REPLY)) == NULL)
    337         return (FALSE);
    338 
    339     pp = (UINT8 *)(p + 1);
    340 
    341     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_PIN_CODE_REQ_REPLY;
    342     p->offset = 0;
    343 
    344     UINT16_TO_STREAM  (pp, HCI_PIN_CODE_REQUEST_REPLY);
    345     UINT8_TO_STREAM   (pp, HCIC_PARAM_SIZE_PIN_CODE_REQ_REPLY);
    346 
    347     BDADDR_TO_STREAM  (pp, bd_addr);
    348     UINT8_TO_STREAM   (pp, pin_code_len);
    349 
    350     for (i = 0; i < pin_code_len; i++)
    351         *pp++ = *pin_code++;
    352 
    353     for (; i < PIN_CODE_LEN; i++)
    354         *pp++ = 0;
    355 
    356 
    357     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
    358     return (TRUE);
    359 }
    360 
    361 BOOLEAN btsnd_hcic_pin_code_neg_reply (BD_ADDR bd_addr)
    362 {
    363     BT_HDR *p;
    364     UINT8 *pp;
    365 
    366     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_PIN_CODE_NEG_REPLY)) == NULL)
    367         return (FALSE);
    368 
    369     pp = (UINT8 *)(p + 1);
    370 
    371     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_PIN_CODE_NEG_REPLY;
    372     p->offset = 0;
    373 
    374     UINT16_TO_STREAM (pp, HCI_PIN_CODE_REQUEST_NEG_REPLY);
    375     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_PIN_CODE_NEG_REPLY);
    376 
    377     BDADDR_TO_STREAM (pp, bd_addr);
    378 
    379     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
    380     return (TRUE);
    381 }
    382 
    383 BOOLEAN btsnd_hcic_change_conn_type (UINT16 handle, UINT16 packet_types)
    384 {
    385     BT_HDR *p;
    386     UINT8 *pp;
    387 
    388     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CHANGE_CONN_TYPE)) == NULL)
    389         return (FALSE);
    390 
    391     pp = (UINT8 *)(p + 1);
    392 
    393     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CHANGE_CONN_TYPE;
    394     p->offset = 0;
    395 
    396     UINT16_TO_STREAM (pp, HCI_CHANGE_CONN_PACKET_TYPE);
    397     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_CHANGE_CONN_TYPE);
    398 
    399     UINT16_TO_STREAM (pp, handle);
    400     UINT16_TO_STREAM (pp, packet_types);
    401 
    402     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
    403     return (TRUE);
    404 }
    405 
    406 BOOLEAN btsnd_hcic_auth_request (UINT16 handle)
    407 {
    408     BT_HDR *p;
    409     UINT8 *pp;
    410 
    411     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CMD_HANDLE)) == NULL)
    412         return (FALSE);
    413 
    414     pp = (UINT8 *)(p + 1);
    415 
    416     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CMD_HANDLE;
    417     p->offset = 0;
    418 
    419     UINT16_TO_STREAM (pp, HCI_AUTHENTICATION_REQUESTED);
    420     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_CMD_HANDLE);
    421 
    422     UINT16_TO_STREAM (pp, handle);
    423 
    424     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
    425     return (TRUE);
    426 }
    427 
    428 BOOLEAN btsnd_hcic_set_conn_encrypt (UINT16 handle, BOOLEAN enable)
    429 {
    430     BT_HDR *p;
    431     UINT8 *pp;
    432 
    433     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_SET_CONN_ENCRYPT)) == NULL)
    434         return (FALSE);
    435 
    436     pp = (UINT8 *)(p + 1);
    437 
    438     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_SET_CONN_ENCRYPT;
    439     p->offset = 0;
    440 
    441     UINT16_TO_STREAM (pp, HCI_SET_CONN_ENCRYPTION);
    442     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_SET_CONN_ENCRYPT);
    443 
    444     UINT16_TO_STREAM (pp, handle);
    445     UINT8_TO_STREAM  (pp, enable);
    446 
    447     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
    448     return (TRUE);
    449 }
    450 
    451 BOOLEAN btsnd_hcic_rmt_name_req (BD_ADDR bd_addr, UINT8 page_scan_rep_mode,
    452                                  UINT8 page_scan_mode, UINT16 clock_offset)
    453 {
    454     BT_HDR *p;
    455     UINT8 *pp;
    456 
    457     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_RMT_NAME_REQ)) == NULL)
    458         return (FALSE);
    459 
    460     pp = (UINT8 *)(p + 1);
    461 
    462     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_RMT_NAME_REQ;
    463     p->offset = 0;
    464 
    465     UINT16_TO_STREAM (pp, HCI_RMT_NAME_REQUEST);
    466     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_RMT_NAME_REQ);
    467 
    468     BDADDR_TO_STREAM (pp, bd_addr);
    469     UINT8_TO_STREAM  (pp, page_scan_rep_mode);
    470     UINT8_TO_STREAM  (pp, page_scan_mode);
    471     UINT16_TO_STREAM (pp, clock_offset);
    472 
    473     btm_acl_paging (p, bd_addr);
    474     return (TRUE);
    475 }
    476 
    477 BOOLEAN btsnd_hcic_rmt_name_req_cancel (BD_ADDR bd_addr)
    478 {
    479     BT_HDR *p;
    480     UINT8 *pp;
    481 
    482     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_RMT_NAME_REQ_CANCEL)) == NULL)
    483         return (FALSE);
    484 
    485     pp = (UINT8 *)(p + 1);
    486 
    487     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_RMT_NAME_REQ_CANCEL;
    488     p->offset = 0;
    489 
    490     UINT16_TO_STREAM (pp, HCI_RMT_NAME_REQUEST_CANCEL);
    491     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_RMT_NAME_REQ_CANCEL);
    492 
    493     BDADDR_TO_STREAM (pp, bd_addr);
    494 
    495     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
    496     return (TRUE);
    497 }
    498 
    499 BOOLEAN btsnd_hcic_rmt_features_req (UINT16 handle)
    500 {
    501     BT_HDR *p;
    502     UINT8 *pp;
    503 
    504     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CMD_HANDLE)) == NULL)
    505         return (FALSE);
    506 
    507     pp = (UINT8 *)(p + 1);
    508 
    509     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CMD_HANDLE;
    510     p->offset = 0;
    511 
    512     UINT16_TO_STREAM (pp, HCI_READ_RMT_FEATURES);
    513     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_CMD_HANDLE);
    514 
    515     UINT16_TO_STREAM (pp, handle);
    516 
    517     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
    518     return (TRUE);
    519 }
    520 
    521 BOOLEAN btsnd_hcic_rmt_ext_features (UINT16 handle, UINT8 page_num)
    522 {
    523     BT_HDR *p;
    524     UINT8 *pp;
    525 
    526     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_RMT_EXT_FEATURES)) == NULL)
    527         return (FALSE);
    528 
    529     pp = (UINT8 *)(p + 1);
    530 
    531     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_RMT_EXT_FEATURES;
    532     p->offset = 0;
    533 
    534     UINT16_TO_STREAM (pp, HCI_READ_RMT_EXT_FEATURES);
    535     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_RMT_EXT_FEATURES);
    536 
    537     UINT16_TO_STREAM (pp, handle);
    538     UINT8_TO_STREAM (pp, page_num);
    539 
    540     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
    541     return (TRUE);
    542 }
    543 
    544 BOOLEAN btsnd_hcic_rmt_ver_req (UINT16 handle)
    545 {
    546     BT_HDR *p;
    547     UINT8 *pp;
    548 
    549     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CMD_HANDLE)) == NULL)
    550         return (FALSE);
    551 
    552     pp = (UINT8 *)(p + 1);
    553 
    554     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CMD_HANDLE;
    555     p->offset = 0;
    556 
    557     UINT16_TO_STREAM (pp, HCI_READ_RMT_VERSION_INFO);
    558     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_CMD_HANDLE);
    559 
    560     UINT16_TO_STREAM (pp, handle);
    561 
    562     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
    563     return (TRUE);
    564 }
    565 
    566 BOOLEAN btsnd_hcic_read_rmt_clk_offset (UINT16 handle)
    567 {
    568     BT_HDR *p;
    569     UINT8 *pp;
    570 
    571     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CMD_HANDLE)) == NULL)
    572         return (FALSE);
    573 
    574     pp = (UINT8 *)(p + 1);
    575 
    576     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CMD_HANDLE;
    577     p->offset = 0;
    578 
    579     UINT16_TO_STREAM (pp, HCI_READ_RMT_CLOCK_OFFSET);
    580     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_CMD_HANDLE);
    581 
    582     UINT16_TO_STREAM (pp, handle);
    583 
    584     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
    585     return (TRUE);
    586 }
    587 
    588 BOOLEAN btsnd_hcic_read_lmp_handle (UINT16 handle)
    589 {
    590     BT_HDR *p;
    591     UINT8 *pp;
    592 
    593     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CMD_HANDLE)) == NULL)
    594         return (FALSE);
    595 
    596     pp = (UINT8 *)(p + 1);
    597 
    598     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CMD_HANDLE;
    599     p->offset = 0;
    600 
    601     UINT16_TO_STREAM (pp, HCI_READ_LMP_HANDLE);
    602     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_CMD_HANDLE);
    603 
    604     UINT16_TO_STREAM (pp, handle);
    605 
    606     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
    607     return (TRUE);
    608 }
    609 
    610 BOOLEAN btsnd_hcic_setup_esco_conn (UINT16 handle, UINT32 tx_bw,
    611                                     UINT32 rx_bw, UINT16 max_latency, UINT16 voice,
    612                                     UINT8 retrans_effort, UINT16 packet_types)
    613 {
    614     BT_HDR *p;
    615     UINT8 *pp;
    616 
    617     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_SETUP_ESCO)) == NULL)
    618         return (FALSE);
    619 
    620     pp = (UINT8 *)(p + 1);
    621 
    622     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_SETUP_ESCO;
    623     p->offset = 0;
    624 
    625     UINT16_TO_STREAM (pp, HCI_SETUP_ESCO_CONNECTION);
    626     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_SETUP_ESCO);
    627 
    628     UINT16_TO_STREAM (pp, handle);
    629     UINT32_TO_STREAM (pp, tx_bw);
    630     UINT32_TO_STREAM (pp, rx_bw);
    631     UINT16_TO_STREAM (pp, max_latency);
    632     UINT16_TO_STREAM (pp, voice);
    633     UINT8_TO_STREAM  (pp, retrans_effort);
    634     UINT16_TO_STREAM (pp, packet_types);
    635 
    636     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
    637     return (TRUE);
    638 }
    639 
    640 BOOLEAN btsnd_hcic_accept_esco_conn (BD_ADDR bd_addr, UINT32 tx_bw,
    641                                      UINT32 rx_bw, UINT16 max_latency,
    642                                      UINT16 content_fmt, UINT8 retrans_effort,
    643                                      UINT16 packet_types)
    644 {
    645     BT_HDR *p;
    646     UINT8 *pp;
    647 
    648     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_ACCEPT_ESCO)) == NULL)
    649         return (FALSE);
    650 
    651     pp = (UINT8 *)(p + 1);
    652 
    653     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_ACCEPT_ESCO;
    654     p->offset = 0;
    655 
    656     UINT16_TO_STREAM (pp, HCI_ACCEPT_ESCO_CONNECTION);
    657     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_ACCEPT_ESCO);
    658 
    659     BDADDR_TO_STREAM (pp, bd_addr);
    660     UINT32_TO_STREAM (pp, tx_bw);
    661     UINT32_TO_STREAM (pp, rx_bw);
    662     UINT16_TO_STREAM (pp, max_latency);
    663     UINT16_TO_STREAM (pp, content_fmt);
    664     UINT8_TO_STREAM  (pp, retrans_effort);
    665     UINT16_TO_STREAM (pp, packet_types);
    666 
    667     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
    668     return (TRUE);
    669 }
    670 
    671 BOOLEAN btsnd_hcic_reject_esco_conn (BD_ADDR bd_addr, UINT8 reason)
    672 {
    673     BT_HDR *p;
    674     UINT8 *pp;
    675 
    676     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_REJECT_ESCO)) == NULL)
    677         return (FALSE);
    678 
    679     pp = (UINT8 *)(p + 1);
    680 
    681     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_REJECT_ESCO;
    682     p->offset = 0;
    683 
    684     UINT16_TO_STREAM (pp, HCI_REJECT_ESCO_CONNECTION);
    685     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_REJECT_ESCO);
    686 
    687     BDADDR_TO_STREAM (pp, bd_addr);
    688     UINT8_TO_STREAM  (pp, reason);
    689 
    690     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
    691     return (TRUE);
    692 }
    693 
    694 BOOLEAN btsnd_hcic_hold_mode (UINT16 handle, UINT16 max_hold_period,
    695                               UINT16 min_hold_period)
    696 {
    697     BT_HDR *p;
    698     UINT8 *pp;
    699 
    700     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_HOLD_MODE)) == NULL)
    701         return (FALSE);
    702 
    703     pp = (UINT8 *)(p + 1);
    704 
    705     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_HOLD_MODE;
    706     p->offset = 0;
    707 
    708     UINT16_TO_STREAM (pp, HCI_HOLD_MODE);
    709     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_HOLD_MODE);
    710 
    711     UINT16_TO_STREAM (pp, handle);
    712     UINT16_TO_STREAM (pp, max_hold_period);
    713     UINT16_TO_STREAM (pp, min_hold_period);
    714 
    715     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
    716     return (TRUE);
    717 }
    718 
    719 BOOLEAN btsnd_hcic_sniff_mode (UINT16 handle, UINT16 max_sniff_period,
    720                                UINT16 min_sniff_period, UINT16 sniff_attempt,
    721                                UINT16 sniff_timeout)
    722 {
    723     BT_HDR *p;
    724     UINT8 *pp;
    725 
    726     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_SNIFF_MODE)) == NULL)
    727         return (FALSE);
    728 
    729     pp = (UINT8 *)(p + 1);
    730 
    731     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_SNIFF_MODE;
    732     p->offset = 0;
    733 
    734     UINT16_TO_STREAM (pp, HCI_SNIFF_MODE);
    735     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_SNIFF_MODE);
    736 
    737     UINT16_TO_STREAM (pp, handle);
    738     UINT16_TO_STREAM (pp, max_sniff_period);
    739     UINT16_TO_STREAM (pp, min_sniff_period);
    740     UINT16_TO_STREAM (pp, sniff_attempt);
    741     UINT16_TO_STREAM (pp, sniff_timeout);
    742 
    743     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
    744     return (TRUE);
    745 }
    746 
    747 BOOLEAN btsnd_hcic_exit_sniff_mode (UINT16 handle)
    748 {
    749     BT_HDR *p;
    750     UINT8 *pp;
    751 
    752     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CMD_HANDLE)) == NULL)
    753         return (FALSE);
    754 
    755     pp = (UINT8 *)(p + 1);
    756 
    757     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CMD_HANDLE;
    758     p->offset = 0;
    759 
    760     UINT16_TO_STREAM (pp, HCI_EXIT_SNIFF_MODE);
    761     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_CMD_HANDLE);
    762 
    763     UINT16_TO_STREAM (pp, handle);
    764 
    765     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
    766     return TRUE;
    767 }
    768 
    769 BOOLEAN btsnd_hcic_park_mode (UINT16 handle, UINT16 beacon_max_interval,
    770                               UINT16 beacon_min_interval)
    771 {
    772     BT_HDR *p;
    773     UINT8 *pp;
    774 
    775     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_PARK_MODE)) == NULL)
    776         return (FALSE);
    777 
    778     pp = (UINT8 *)(p + 1);
    779 
    780     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_PARK_MODE;
    781     p->offset = 0;
    782 
    783     UINT16_TO_STREAM (pp, HCI_PARK_MODE);
    784     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_PARK_MODE);
    785 
    786     UINT16_TO_STREAM (pp, handle);
    787     UINT16_TO_STREAM (pp, beacon_max_interval);
    788     UINT16_TO_STREAM (pp, beacon_min_interval);
    789 
    790     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
    791     return (TRUE);
    792 }
    793 
    794 BOOLEAN btsnd_hcic_exit_park_mode (UINT16 handle)
    795 {
    796     BT_HDR *p;
    797     UINT8 *pp;
    798 
    799     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CMD_HANDLE)) == NULL)
    800         return (FALSE);
    801 
    802     pp = (UINT8 *)(p + 1);
    803 
    804     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CMD_HANDLE;
    805     p->offset = 0;
    806 
    807     UINT16_TO_STREAM (pp, HCI_EXIT_PARK_MODE);
    808     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_CMD_HANDLE);
    809 
    810     UINT16_TO_STREAM (pp, handle);
    811 
    812     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
    813     return TRUE;
    814 }
    815 
    816 BOOLEAN btsnd_hcic_qos_setup (UINT16 handle, UINT8 flags, UINT8 service_type,
    817                               UINT32 token_rate, UINT32 peak, UINT32 latency,
    818                               UINT32 delay_var)
    819 {
    820     BT_HDR *p;
    821     UINT8 *pp;
    822 
    823     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_QOS_SETUP)) == NULL)
    824         return (FALSE);
    825 
    826     pp = (UINT8 *)(p + 1);
    827 
    828     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_QOS_SETUP;
    829     p->offset = 0;
    830 
    831     UINT16_TO_STREAM (pp, HCI_QOS_SETUP);
    832     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_QOS_SETUP);
    833 
    834     UINT16_TO_STREAM (pp, handle);
    835     UINT8_TO_STREAM  (pp, flags);
    836     UINT8_TO_STREAM  (pp, service_type);
    837     UINT32_TO_STREAM (pp, token_rate);
    838     UINT32_TO_STREAM (pp, peak);
    839     UINT32_TO_STREAM (pp, latency);
    840     UINT32_TO_STREAM (pp, delay_var);
    841 
    842     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
    843     return (TRUE);
    844 }
    845 
    846 BOOLEAN btsnd_hcic_switch_role (BD_ADDR bd_addr, UINT8 role)
    847 {
    848     BT_HDR *p;
    849     UINT8 *pp;
    850 
    851     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_SWITCH_ROLE)) == NULL)
    852         return (FALSE);
    853 
    854     pp = (UINT8 *)(p + 1);
    855 
    856     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_SWITCH_ROLE;
    857     p->offset = 0;
    858 
    859     UINT16_TO_STREAM (pp, HCI_SWITCH_ROLE);
    860     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_SWITCH_ROLE);
    861 
    862     BDADDR_TO_STREAM (pp, bd_addr);
    863     UINT8_TO_STREAM  (pp, role);
    864 
    865     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
    866     return (TRUE);
    867 }
    868 
    869 BOOLEAN btsnd_hcic_write_policy_set (UINT16 handle, UINT16 settings)
    870 {
    871     BT_HDR *p;
    872     UINT8 *pp;
    873 
    874     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_POLICY_SET)) == NULL)
    875         return (FALSE);
    876 
    877     pp = (UINT8 *)(p + 1);
    878 
    879     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_POLICY_SET;
    880     p->offset = 0;
    881     UINT16_TO_STREAM (pp, HCI_WRITE_POLICY_SETTINGS);
    882     UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_WRITE_POLICY_SET);
    883 
    884     UINT16_TO_STREAM (pp, handle);
    885     UINT16_TO_STREAM (pp, settings);
    886 
    887     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
    888     return (TRUE);
    889 }
    890 
    891 BOOLEAN btsnd_hcic_write_def_policy_set (UINT16 settings)
    892 {
    893     BT_HDR *p;
    894     UINT8 *pp;
    895 
    896     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_DEF_POLICY_SET)) == NULL)
    897         return (FALSE);
    898 
    899     pp = (UINT8 *)(p + 1);
    900 
    901     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_DEF_POLICY_SET;
    902     p->offset = 0;
    903     UINT16_TO_STREAM (pp, HCI_WRITE_DEF_POLICY_SETTINGS);
    904     UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_WRITE_DEF_POLICY_SET);
    905 
    906     UINT16_TO_STREAM (pp, settings);
    907 
    908     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
    909     return (TRUE);
    910 }
    911 
    912 BOOLEAN btsnd_hcic_set_event_filter (UINT8 filt_type, UINT8 filt_cond_type,
    913                                      UINT8 *filt_cond, UINT8 filt_cond_len)
    914 {
    915     BT_HDR *p;
    916     UINT8 *pp;
    917 
    918     /* Use buffer large enough to hold all sizes in this command */
    919     if ((p = HCI_GET_CMD_BUF(2 + filt_cond_len)) == NULL)
    920         return (FALSE);
    921 
    922     pp = (UINT8 *)(p + 1);
    923 
    924     p->offset = 0;
    925 
    926     UINT16_TO_STREAM (pp, HCI_SET_EVENT_FILTER);
    927 
    928     if (filt_type)
    929     {
    930         p->len = (UINT16)(HCIC_PREAMBLE_SIZE + 2 + filt_cond_len);
    931         UINT8_TO_STREAM (pp, (UINT8)(2 + filt_cond_len));
    932 
    933         UINT8_TO_STREAM (pp, filt_type);
    934         UINT8_TO_STREAM (pp, filt_cond_type);
    935 
    936         if (filt_cond_type == HCI_FILTER_COND_DEVICE_CLASS)
    937         {
    938             DEVCLASS_TO_STREAM (pp, filt_cond);
    939             filt_cond += DEV_CLASS_LEN;
    940             DEVCLASS_TO_STREAM (pp, filt_cond);
    941             filt_cond += DEV_CLASS_LEN;
    942 
    943             filt_cond_len -= (2 * DEV_CLASS_LEN);
    944         }
    945         else if (filt_cond_type == HCI_FILTER_COND_BD_ADDR)
    946         {
    947             BDADDR_TO_STREAM (pp, filt_cond);
    948             filt_cond += BD_ADDR_LEN;
    949 
    950             filt_cond_len -= BD_ADDR_LEN;
    951         }
    952 
    953         if (filt_cond_len)
    954             ARRAY_TO_STREAM (pp, filt_cond, filt_cond_len);
    955     }
    956     else
    957     {
    958         p->len = (UINT16)(HCIC_PREAMBLE_SIZE + 1);
    959         UINT8_TO_STREAM (pp, 1);
    960 
    961         UINT8_TO_STREAM (pp, filt_type);
    962     }
    963 
    964     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
    965     return (TRUE);
    966 }
    967 
    968 BOOLEAN btsnd_hcic_write_pin_type (UINT8 type)
    969 {
    970     BT_HDR *p;
    971     UINT8 *pp;
    972 
    973     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PARAM1)) == NULL)
    974         return (FALSE);
    975 
    976     pp = (UINT8 *)(p + 1);
    977 
    978     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PARAM1;
    979     p->offset = 0;
    980 
    981     UINT16_TO_STREAM (pp, HCI_WRITE_PIN_TYPE);
    982     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_WRITE_PARAM1);
    983 
    984     UINT8_TO_STREAM (pp, type);
    985 
    986     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
    987     return (TRUE);
    988 }
    989 
    990 BOOLEAN btsnd_hcic_delete_stored_key (BD_ADDR bd_addr, BOOLEAN delete_all_flag)
    991 {
    992     BT_HDR *p;
    993     UINT8 *pp;
    994 
    995     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_DELETE_STORED_KEY)) == NULL)
    996         return (FALSE);
    997 
    998     pp = (UINT8 *)(p + 1);
    999 
   1000     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_DELETE_STORED_KEY;
   1001     p->offset = 0;
   1002 
   1003     UINT16_TO_STREAM (pp, HCI_DELETE_STORED_LINK_KEY);
   1004     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_DELETE_STORED_KEY);
   1005 
   1006     BDADDR_TO_STREAM (pp, bd_addr);
   1007     UINT8_TO_STREAM  (pp, delete_all_flag);
   1008 
   1009     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
   1010     return (TRUE);
   1011 }
   1012 
   1013 BOOLEAN btsnd_hcic_change_name (BD_NAME name)
   1014 {
   1015     BT_HDR *p;
   1016     UINT8 *pp;
   1017     UINT16 len = strlen ((char *)name) + 1;
   1018 
   1019     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CHANGE_NAME)) == NULL)
   1020         return (FALSE);
   1021 
   1022     pp = (UINT8 *)(p + 1);
   1023     memset(pp, 0, HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CHANGE_NAME);
   1024 
   1025     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CHANGE_NAME;
   1026     p->offset = 0;
   1027 
   1028     UINT16_TO_STREAM (pp, HCI_CHANGE_LOCAL_NAME);
   1029     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_CHANGE_NAME);
   1030 
   1031     if (len > HCIC_PARAM_SIZE_CHANGE_NAME)
   1032         len = HCIC_PARAM_SIZE_CHANGE_NAME;
   1033 
   1034     ARRAY_TO_STREAM (pp, name, len);
   1035 
   1036     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
   1037     return (TRUE);
   1038 }
   1039 
   1040 BOOLEAN btsnd_hcic_read_name (void)
   1041 {
   1042     BT_HDR *p;
   1043     UINT8 *pp;
   1044 
   1045     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_CMD)) == NULL)
   1046         return (FALSE);
   1047 
   1048     pp = (UINT8 *)(p + 1);
   1049 
   1050     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_CMD;
   1051     p->offset = 0;
   1052 
   1053     UINT16_TO_STREAM (pp, HCI_READ_LOCAL_NAME);
   1054     UINT8_TO_STREAM  (pp,  HCIC_PARAM_SIZE_READ_CMD);
   1055 
   1056     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
   1057     return (TRUE);
   1058 }
   1059 
   1060 BOOLEAN btsnd_hcic_write_page_tout (UINT16 timeout)
   1061 {
   1062     BT_HDR *p;
   1063     UINT8 *pp;
   1064 
   1065     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PARAM2)) == NULL)
   1066         return (FALSE);
   1067 
   1068     pp = (UINT8 *)(p + 1);
   1069 
   1070     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PARAM2;
   1071     p->offset = 0;
   1072 
   1073     UINT16_TO_STREAM (pp, HCI_WRITE_PAGE_TOUT);
   1074     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_WRITE_PARAM2);
   1075 
   1076     UINT16_TO_STREAM  (pp, timeout);
   1077 
   1078     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
   1079     return (TRUE);
   1080 }
   1081 
   1082 BOOLEAN btsnd_hcic_write_scan_enable (UINT8 flag)
   1083 {
   1084     BT_HDR *p;
   1085     UINT8 *pp;
   1086 
   1087     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PARAM1)) == NULL)
   1088         return (FALSE);
   1089 
   1090     pp = (UINT8 *)(p + 1);
   1091 
   1092     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PARAM1;
   1093     p->offset = 0;
   1094 
   1095     UINT16_TO_STREAM (pp, HCI_WRITE_SCAN_ENABLE);
   1096     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_WRITE_PARAM1);
   1097 
   1098     UINT8_TO_STREAM  (pp, flag);
   1099 
   1100     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
   1101     return (TRUE);
   1102 }
   1103 
   1104 BOOLEAN btsnd_hcic_write_pagescan_cfg(UINT16 interval, UINT16 window)
   1105 {
   1106     BT_HDR *p;
   1107     UINT8 *pp;
   1108 
   1109     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PAGESCAN_CFG)) == NULL)
   1110         return (FALSE);
   1111 
   1112     pp = (UINT8 *)(p + 1);
   1113 
   1114     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PAGESCAN_CFG;
   1115     p->offset = 0;
   1116 
   1117     UINT16_TO_STREAM (pp, HCI_WRITE_PAGESCAN_CFG);
   1118     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_WRITE_PAGESCAN_CFG);
   1119 
   1120     UINT16_TO_STREAM (pp, interval);
   1121     UINT16_TO_STREAM (pp, window);
   1122 
   1123     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
   1124     return (TRUE);
   1125 }
   1126 
   1127 BOOLEAN btsnd_hcic_write_inqscan_cfg(UINT16 interval, UINT16 window)
   1128 {
   1129     BT_HDR *p;
   1130     UINT8 *pp;
   1131 
   1132     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_INQSCAN_CFG)) == NULL)
   1133         return (FALSE);
   1134 
   1135     pp = (UINT8 *)(p + 1);
   1136 
   1137     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_INQSCAN_CFG;
   1138     p->offset = 0;
   1139 
   1140     UINT16_TO_STREAM (pp, HCI_WRITE_INQUIRYSCAN_CFG);
   1141     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_WRITE_INQSCAN_CFG);
   1142 
   1143     UINT16_TO_STREAM (pp, interval);
   1144     UINT16_TO_STREAM (pp, window);
   1145 
   1146     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
   1147     return (TRUE);
   1148 }
   1149 
   1150 BOOLEAN btsnd_hcic_write_auth_enable (UINT8 flag)
   1151 {
   1152     BT_HDR *p;
   1153     UINT8 *pp;
   1154 
   1155     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PARAM1)) == NULL)
   1156         return (FALSE);
   1157 
   1158     pp = (UINT8 *)(p + 1);
   1159 
   1160     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PARAM1;
   1161     p->offset = 0;
   1162 
   1163     UINT16_TO_STREAM (pp, HCI_WRITE_AUTHENTICATION_ENABLE);
   1164     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_WRITE_PARAM1);
   1165 
   1166     UINT8_TO_STREAM (pp, flag);
   1167 
   1168     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
   1169     return (TRUE);
   1170 }
   1171 
   1172 BOOLEAN btsnd_hcic_write_dev_class(DEV_CLASS dev_class)
   1173 {
   1174     BT_HDR *p;
   1175     UINT8 *pp;
   1176 
   1177     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PARAM3)) == NULL)
   1178         return (FALSE);
   1179 
   1180     pp = (UINT8 *)(p + 1);
   1181 
   1182     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PARAM3;
   1183     p->offset = 0;
   1184 
   1185     UINT16_TO_STREAM (pp, HCI_WRITE_CLASS_OF_DEVICE);
   1186     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_WRITE_PARAM3);
   1187 
   1188     DEVCLASS_TO_STREAM (pp, dev_class);
   1189 
   1190     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
   1191     return (TRUE);
   1192 }
   1193 
   1194 BOOLEAN btsnd_hcic_write_voice_settings(UINT16 flags)
   1195 {
   1196     BT_HDR *p;
   1197     UINT8 *pp;
   1198 
   1199     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PARAM2)) == NULL)
   1200         return (FALSE);
   1201 
   1202     pp = (UINT8 *)(p + 1);
   1203 
   1204     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PARAM2;
   1205     p->offset = 0;
   1206 
   1207     UINT16_TO_STREAM (pp, HCI_WRITE_VOICE_SETTINGS);
   1208     UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_WRITE_PARAM2);
   1209 
   1210     UINT16_TO_STREAM (pp, flags);
   1211 
   1212     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
   1213     return (TRUE);
   1214 }
   1215 
   1216 BOOLEAN btsnd_hcic_write_auto_flush_tout (UINT16 handle, UINT16 tout)
   1217 {
   1218     BT_HDR *p;
   1219     UINT8 *pp;
   1220 
   1221     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_AUTO_FLUSH_TOUT)) == NULL)
   1222         return (FALSE);
   1223 
   1224     pp = (UINT8 *)(p + 1);
   1225 
   1226     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_AUTO_FLUSH_TOUT;
   1227     p->offset = 0;
   1228 
   1229     UINT16_TO_STREAM (pp, HCI_WRITE_AUTO_FLUSH_TOUT);
   1230     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_WRITE_AUTO_FLUSH_TOUT);
   1231 
   1232     UINT16_TO_STREAM (pp, handle);
   1233     UINT16_TO_STREAM (pp, tout);
   1234 
   1235     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
   1236     return (TRUE);
   1237 }
   1238 
   1239 BOOLEAN btsnd_hcic_read_tx_power (UINT16 handle, UINT8 type)
   1240 {
   1241     BT_HDR *p;
   1242     UINT8 *pp;
   1243 
   1244     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_TX_POWER)) == NULL)
   1245         return (FALSE);
   1246 
   1247     pp = (UINT8 *)(p + 1);
   1248 
   1249     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_TX_POWER;
   1250     p->offset = 0;
   1251 
   1252     UINT16_TO_STREAM (pp, HCI_READ_TRANSMIT_POWER_LEVEL);
   1253     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_READ_TX_POWER);
   1254 
   1255     UINT16_TO_STREAM (pp, handle);
   1256     UINT8_TO_STREAM  (pp, type);
   1257 
   1258     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
   1259     return (TRUE);
   1260 }
   1261 
   1262 BOOLEAN btsnd_hcic_host_num_xmitted_pkts (UINT8 num_handles, UINT16 *handle,
   1263                                           UINT16 *num_pkts)
   1264 {
   1265     BT_HDR *p;
   1266     UINT8 *pp;
   1267     int j;
   1268 
   1269     if ((p = HCI_GET_CMD_BUF(1 + (num_handles * 4))) == NULL)
   1270         return (FALSE);
   1271 
   1272     pp = (UINT8 *)(p + 1);
   1273 
   1274     p->len    = HCIC_PREAMBLE_SIZE + 1 + (num_handles * 4);
   1275     p->offset = 0;
   1276 
   1277     UINT16_TO_STREAM (pp, HCI_HOST_NUM_PACKETS_DONE);
   1278     UINT8_TO_STREAM  (pp, p->len - HCIC_PREAMBLE_SIZE);
   1279 
   1280     UINT8_TO_STREAM (pp, num_handles);
   1281 
   1282     for (j = 0; j < num_handles; j++)
   1283     {
   1284         UINT16_TO_STREAM (pp, handle[j]);
   1285         UINT16_TO_STREAM (pp, num_pkts[j]);
   1286     }
   1287 
   1288     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
   1289     return (TRUE);
   1290 }
   1291 
   1292 BOOLEAN btsnd_hcic_write_link_super_tout (UINT8 local_controller_id, UINT16 handle, UINT16 timeout)
   1293 {
   1294     BT_HDR *p;
   1295     UINT8 *pp;
   1296 
   1297     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_LINK_SUPER_TOUT)) == NULL)
   1298         return (FALSE);
   1299 
   1300     pp = (UINT8 *)(p + 1);
   1301 
   1302     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_LINK_SUPER_TOUT;
   1303     p->offset = 0;
   1304 
   1305     UINT16_TO_STREAM (pp, HCI_WRITE_LINK_SUPER_TOUT);
   1306     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_WRITE_LINK_SUPER_TOUT);
   1307 
   1308     UINT16_TO_STREAM (pp, handle);
   1309     UINT16_TO_STREAM (pp, timeout);
   1310 
   1311     btu_hcif_send_cmd (local_controller_id,  p);
   1312     return (TRUE);
   1313 }
   1314 
   1315 BOOLEAN btsnd_hcic_write_cur_iac_lap (UINT8 num_cur_iac, LAP * const iac_lap)
   1316 {
   1317     BT_HDR *p;
   1318     UINT8 *pp;
   1319     int i;
   1320 
   1321     if ((p = HCI_GET_CMD_BUF(1 + (LAP_LEN * num_cur_iac))) == NULL)
   1322         return (FALSE);
   1323 
   1324     pp = (UINT8 *)(p + 1);
   1325 
   1326     p->len    = HCIC_PREAMBLE_SIZE + 1 + (LAP_LEN * num_cur_iac);
   1327     p->offset = 0;
   1328 
   1329     UINT16_TO_STREAM (pp, HCI_WRITE_CURRENT_IAC_LAP);
   1330     UINT8_TO_STREAM  (pp, p->len - HCIC_PREAMBLE_SIZE);
   1331 
   1332     UINT8_TO_STREAM (pp, num_cur_iac);
   1333 
   1334     for (i = 0; i < num_cur_iac; i++)
   1335         LAP_TO_STREAM (pp, iac_lap[i]);
   1336 
   1337     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
   1338     return (TRUE);
   1339 }
   1340 
   1341 /******************************************
   1342 **    Lisbon Features
   1343 *******************************************/
   1344 #if BTM_SSR_INCLUDED == TRUE
   1345 
   1346 BOOLEAN btsnd_hcic_sniff_sub_rate(UINT16 handle, UINT16 max_lat,
   1347                                   UINT16 min_remote_lat, UINT16 min_local_lat)
   1348 {
   1349     BT_HDR *p;
   1350     UINT8 *pp;
   1351 
   1352     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_SNIFF_SUB_RATE)) == NULL)
   1353         return (FALSE);
   1354 
   1355     pp = (UINT8 *)(p + 1);
   1356 
   1357     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_SNIFF_SUB_RATE;
   1358     p->offset = 0;
   1359 
   1360     UINT16_TO_STREAM (pp, HCI_SNIFF_SUB_RATE);
   1361     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_SNIFF_SUB_RATE);
   1362 
   1363     UINT16_TO_STREAM  (pp, handle);
   1364     UINT16_TO_STREAM  (pp, max_lat);
   1365     UINT16_TO_STREAM  (pp, min_remote_lat);
   1366     UINT16_TO_STREAM  (pp, min_local_lat);
   1367 
   1368     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
   1369     return (TRUE);
   1370 }
   1371 #endif /* BTM_SSR_INCLUDED */
   1372 
   1373 /**** Extended Inquiry Response Commands ****/
   1374 void btsnd_hcic_write_ext_inquiry_response (void *buffer, UINT8 fec_req)
   1375 {
   1376     BT_HDR *p = (BT_HDR *)buffer;
   1377     UINT8 *pp = (UINT8 *)(p + 1);
   1378 
   1379     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_EXT_INQ_RESP;
   1380     p->offset = 0;
   1381 
   1382     UINT16_TO_STREAM (pp, HCI_WRITE_EXT_INQ_RESPONSE);
   1383     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_EXT_INQ_RESP);
   1384 
   1385     UINT8_TO_STREAM (pp, fec_req);
   1386 
   1387     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
   1388 }
   1389 
   1390 BOOLEAN btsnd_hcic_io_cap_req_reply (BD_ADDR bd_addr, UINT8 capability,
   1391                                 UINT8 oob_present, UINT8 auth_req)
   1392 {
   1393     BT_HDR *p;
   1394     UINT8 *pp;
   1395 
   1396     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_IO_CAP_RESP)) == NULL)
   1397         return (FALSE);
   1398 
   1399     pp = (UINT8 *)(p + 1);
   1400 
   1401     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_IO_CAP_RESP;
   1402     p->offset = 0;
   1403 
   1404     UINT16_TO_STREAM (pp, HCI_IO_CAPABILITY_REQUEST_REPLY);
   1405     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_IO_CAP_RESP);
   1406 
   1407     BDADDR_TO_STREAM (pp, bd_addr);
   1408     UINT8_TO_STREAM  (pp, capability);
   1409     UINT8_TO_STREAM  (pp, oob_present);
   1410     UINT8_TO_STREAM  (pp, auth_req);
   1411 
   1412     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
   1413     return (TRUE);
   1414 }
   1415 
   1416 BOOLEAN btsnd_hcic_io_cap_req_neg_reply (BD_ADDR bd_addr, UINT8 err_code)
   1417 {
   1418     BT_HDR *p;
   1419     UINT8 *pp;
   1420 
   1421     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_IO_CAP_NEG_REPLY)) == NULL)
   1422         return (FALSE);
   1423 
   1424     pp = (UINT8 *)(p + 1);
   1425 
   1426     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_IO_CAP_NEG_REPLY;
   1427     p->offset = 0;
   1428 
   1429     UINT16_TO_STREAM (pp, HCI_IO_CAP_REQ_NEG_REPLY);
   1430     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_IO_CAP_NEG_REPLY);
   1431 
   1432     BDADDR_TO_STREAM (pp, bd_addr);
   1433     UINT8_TO_STREAM  (pp, err_code);
   1434 
   1435     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
   1436     return (TRUE);
   1437 }
   1438 
   1439 BOOLEAN btsnd_hcic_read_local_oob_data (void)
   1440 {
   1441     BT_HDR *p;
   1442     UINT8 *pp;
   1443 
   1444     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_R_LOCAL_OOB)) == NULL)
   1445         return (FALSE);
   1446 
   1447     pp = (UINT8 *)(p + 1);
   1448 
   1449     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_R_LOCAL_OOB;
   1450     p->offset = 0;
   1451 
   1452     UINT16_TO_STREAM (pp, HCI_READ_LOCAL_OOB_DATA);
   1453     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_R_LOCAL_OOB);
   1454 
   1455     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
   1456     return (TRUE);
   1457 }
   1458 
   1459 BOOLEAN btsnd_hcic_user_conf_reply (BD_ADDR bd_addr, BOOLEAN is_yes)
   1460 {
   1461     BT_HDR *p;
   1462     UINT8 *pp;
   1463 
   1464     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_UCONF_REPLY)) == NULL)
   1465         return (FALSE);
   1466 
   1467     pp = (UINT8 *)(p + 1);
   1468 
   1469     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_UCONF_REPLY;
   1470     p->offset = 0;
   1471 
   1472     if (!is_yes)
   1473     {
   1474         /* Negative reply */
   1475         UINT16_TO_STREAM (pp, HCI_USER_CONF_VALUE_NEG_REPLY);
   1476     }
   1477     else
   1478     {
   1479         /* Confirmation */
   1480         UINT16_TO_STREAM (pp, HCI_USER_CONF_REQUEST_REPLY);
   1481     }
   1482 
   1483     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_UCONF_REPLY);
   1484 
   1485     BDADDR_TO_STREAM (pp, bd_addr);
   1486 
   1487     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
   1488     return (TRUE);
   1489 }
   1490 
   1491 BOOLEAN btsnd_hcic_user_passkey_reply (BD_ADDR bd_addr, UINT32 value)
   1492 {
   1493     BT_HDR *p;
   1494     UINT8 *pp;
   1495 
   1496     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_U_PKEY_REPLY)) == NULL)
   1497         return (FALSE);
   1498 
   1499     pp = (UINT8 *)(p + 1);
   1500 
   1501     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_U_PKEY_REPLY;
   1502     p->offset = 0;
   1503 
   1504     UINT16_TO_STREAM (pp, HCI_USER_PASSKEY_REQ_REPLY);
   1505     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_U_PKEY_REPLY);
   1506 
   1507     BDADDR_TO_STREAM (pp, bd_addr);
   1508     UINT32_TO_STREAM (pp, value);
   1509 
   1510     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
   1511     return (TRUE);
   1512 }
   1513 
   1514 BOOLEAN btsnd_hcic_user_passkey_neg_reply (BD_ADDR bd_addr)
   1515 {
   1516     BT_HDR *p;
   1517     UINT8 *pp;
   1518 
   1519     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_U_PKEY_NEG_REPLY)) == NULL)
   1520         return (FALSE);
   1521 
   1522     pp = (UINT8 *)(p + 1);
   1523 
   1524     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_U_PKEY_NEG_REPLY;
   1525     p->offset = 0;
   1526 
   1527     UINT16_TO_STREAM (pp, HCI_USER_PASSKEY_REQ_NEG_REPLY);
   1528     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_U_PKEY_NEG_REPLY);
   1529 
   1530     BDADDR_TO_STREAM (pp, bd_addr);
   1531 
   1532     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
   1533     return (TRUE);
   1534 }
   1535 
   1536 BOOLEAN btsnd_hcic_rem_oob_reply (BD_ADDR bd_addr, UINT8 *p_c, UINT8 *p_r)
   1537 {
   1538     BT_HDR *p;
   1539     UINT8 *pp;
   1540 
   1541     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_REM_OOB_REPLY)) == NULL)
   1542         return (FALSE);
   1543 
   1544     pp = (UINT8 *)(p + 1);
   1545 
   1546     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_REM_OOB_REPLY;
   1547     p->offset = 0;
   1548 
   1549     UINT16_TO_STREAM (pp, HCI_REM_OOB_DATA_REQ_REPLY);
   1550     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_REM_OOB_REPLY);
   1551 
   1552     BDADDR_TO_STREAM (pp, bd_addr);
   1553     ARRAY16_TO_STREAM (pp, p_c);
   1554     ARRAY16_TO_STREAM (pp, p_r);
   1555 
   1556     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
   1557     return (TRUE);
   1558 }
   1559 
   1560 BOOLEAN btsnd_hcic_rem_oob_neg_reply (BD_ADDR bd_addr)
   1561 {
   1562     BT_HDR *p;
   1563     UINT8 *pp;
   1564 
   1565     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_REM_OOB_NEG_REPLY)) == NULL)
   1566         return (FALSE);
   1567 
   1568     pp = (UINT8 *)(p + 1);
   1569 
   1570     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_REM_OOB_NEG_REPLY;
   1571     p->offset = 0;
   1572 
   1573     UINT16_TO_STREAM (pp, HCI_REM_OOB_DATA_REQ_NEG_REPLY);
   1574     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_REM_OOB_NEG_REPLY);
   1575 
   1576     BDADDR_TO_STREAM (pp, bd_addr);
   1577 
   1578     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
   1579     return (TRUE);
   1580 }
   1581 
   1582 
   1583 BOOLEAN btsnd_hcic_read_inq_tx_power (void)
   1584 {
   1585     BT_HDR *p;
   1586     UINT8 *pp;
   1587 
   1588     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_R_TX_POWER)) == NULL)
   1589         return (FALSE);
   1590 
   1591     pp = (UINT8 *)(p + 1);
   1592 
   1593     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_R_TX_POWER;
   1594     p->offset = 0;
   1595 
   1596     UINT16_TO_STREAM (pp, HCI_READ_INQ_TX_POWER_LEVEL);
   1597     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_R_TX_POWER);
   1598 
   1599     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
   1600     return (TRUE);
   1601 }
   1602 
   1603 BOOLEAN btsnd_hcic_send_keypress_notif (BD_ADDR bd_addr, UINT8 notif)
   1604 {
   1605     BT_HDR *p;
   1606     UINT8 *pp;
   1607 
   1608     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_SEND_KEYPRESS_NOTIF)) == NULL)
   1609         return (FALSE);
   1610 
   1611     pp = (UINT8 *)(p + 1);
   1612 
   1613     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_SEND_KEYPRESS_NOTIF;
   1614     p->offset = 0;
   1615 
   1616     UINT16_TO_STREAM (pp, HCI_SEND_KEYPRESS_NOTIF);
   1617     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_SEND_KEYPRESS_NOTIF);
   1618 
   1619     BDADDR_TO_STREAM (pp, bd_addr);
   1620     UINT8_TO_STREAM (pp, notif);
   1621 
   1622     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
   1623     return (TRUE);
   1624 }
   1625 
   1626 /**** end of Simple Pairing Commands ****/
   1627 
   1628 #if L2CAP_NON_FLUSHABLE_PB_INCLUDED == TRUE
   1629 BOOLEAN btsnd_hcic_enhanced_flush (UINT16 handle, UINT8 packet_type)
   1630 {
   1631     BT_HDR *p;
   1632     UINT8 *pp;
   1633 
   1634     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_ENHANCED_FLUSH)) == NULL)
   1635         return (FALSE);
   1636 
   1637     pp = (UINT8 *)(p + 1);
   1638 
   1639     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_ENHANCED_FLUSH;
   1640     p->offset = 0;
   1641     UINT16_TO_STREAM (pp, HCI_ENHANCED_FLUSH);
   1642     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_ENHANCED_FLUSH);
   1643 
   1644     UINT16_TO_STREAM (pp, handle);
   1645     UINT8_TO_STREAM  (pp, packet_type);
   1646 
   1647     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
   1648     return (TRUE);
   1649 }
   1650 #endif
   1651 
   1652 /*************************
   1653 ** End of Lisbon Commands
   1654 **************************/
   1655 
   1656 BOOLEAN btsnd_hcic_get_link_quality (UINT16 handle)
   1657 {
   1658     BT_HDR *p;
   1659     UINT8 *pp;
   1660 
   1661     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CMD_HANDLE)) == NULL)
   1662         return (FALSE);
   1663 
   1664     pp = (UINT8 *)(p + 1);
   1665 
   1666     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CMD_HANDLE;
   1667     p->offset = 0;
   1668 
   1669     UINT16_TO_STREAM (pp, HCI_GET_LINK_QUALITY);
   1670     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_CMD_HANDLE);
   1671 
   1672     UINT16_TO_STREAM (pp, handle);
   1673 
   1674     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
   1675     return (TRUE);
   1676 }
   1677 
   1678 BOOLEAN btsnd_hcic_read_rssi (UINT16 handle)
   1679 {
   1680     BT_HDR *p;
   1681     UINT8 *pp;
   1682 
   1683     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CMD_HANDLE)) == NULL)
   1684         return (FALSE);
   1685 
   1686     pp = (UINT8 *)(p + 1);
   1687 
   1688     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CMD_HANDLE;
   1689     p->offset = 0;
   1690 
   1691     UINT16_TO_STREAM (pp, HCI_READ_RSSI);
   1692     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_CMD_HANDLE);
   1693 
   1694     UINT16_TO_STREAM (pp, handle);
   1695 
   1696     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
   1697     return (TRUE);
   1698 }
   1699 
   1700 BOOLEAN btsnd_hcic_enable_test_mode (void)
   1701 {
   1702     BT_HDR *p;
   1703     UINT8 *pp;
   1704 
   1705     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_CMD)) == NULL)
   1706         return (FALSE);
   1707 
   1708     pp = (UINT8 *)(p + 1);
   1709 
   1710     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_CMD;
   1711     p->offset = 0;
   1712 
   1713     UINT16_TO_STREAM (pp, HCI_ENABLE_DEV_UNDER_TEST_MODE);
   1714     UINT8_TO_STREAM  (pp,  HCIC_PARAM_SIZE_READ_CMD);
   1715 
   1716     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
   1717     return (TRUE);
   1718 }
   1719 
   1720 BOOLEAN btsnd_hcic_write_inqscan_type (UINT8 type)
   1721 {
   1722     BT_HDR *p;
   1723     UINT8 *pp;
   1724 
   1725     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PARAM1)) == NULL)
   1726         return (FALSE);
   1727 
   1728     pp = (UINT8 *)(p + 1);
   1729 
   1730     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PARAM1;
   1731     p->offset = 0;
   1732 
   1733     UINT16_TO_STREAM (pp, HCI_WRITE_INQSCAN_TYPE);
   1734     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_WRITE_PARAM1);
   1735 
   1736     UINT8_TO_STREAM  (pp, type);
   1737 
   1738     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
   1739     return (TRUE);
   1740 }
   1741 
   1742 BOOLEAN btsnd_hcic_write_inquiry_mode (UINT8 mode)
   1743 {
   1744     BT_HDR *p;
   1745     UINT8 *pp;
   1746 
   1747     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PARAM1)) == NULL)
   1748         return (FALSE);
   1749 
   1750     pp = (UINT8 *)(p + 1);
   1751 
   1752     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PARAM1;
   1753     p->offset = 0;
   1754 
   1755     UINT16_TO_STREAM (pp, HCI_WRITE_INQUIRY_MODE);
   1756     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_WRITE_PARAM1);
   1757 
   1758     UINT8_TO_STREAM  (pp, mode);
   1759 
   1760     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
   1761     return (TRUE);
   1762 }
   1763 
   1764 BOOLEAN btsnd_hcic_write_pagescan_type (UINT8 type)
   1765 {
   1766     BT_HDR *p;
   1767     UINT8 *pp;
   1768 
   1769     if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PARAM1)) == NULL)
   1770         return (FALSE);
   1771 
   1772     pp = (UINT8 *)(p + 1);
   1773 
   1774     p->len    = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PARAM1;
   1775     p->offset = 0;
   1776 
   1777     UINT16_TO_STREAM (pp, HCI_WRITE_PAGESCAN_TYPE);
   1778     UINT8_TO_STREAM  (pp, HCIC_PARAM_SIZE_WRITE_PARAM1);
   1779 
   1780     UINT8_TO_STREAM  (pp, type);
   1781 
   1782     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
   1783     return (TRUE);
   1784 }
   1785 
   1786 /* Must have room to store BT_HDR + max VSC length + callback pointer */
   1787 #if (HCI_CMD_POOL_BUF_SIZE < 268)
   1788 #error "HCI_CMD_POOL_BUF_SIZE must be larger than 268"
   1789 #endif
   1790 
   1791 void btsnd_hcic_vendor_spec_cmd (void *buffer, UINT16 opcode, UINT8 len,
   1792                                  UINT8 *p_data, void *p_cmd_cplt_cback)
   1793 {
   1794     BT_HDR *p = (BT_HDR *)buffer;
   1795     UINT8 *pp = (UINT8 *)(p + 1);
   1796 
   1797     p->len    = HCIC_PREAMBLE_SIZE + len;
   1798     p->offset = sizeof(void *);
   1799 
   1800     *((void **)pp) = p_cmd_cplt_cback;  /* Store command complete callback in buffer */
   1801     pp += sizeof(void *);               /* Skip over callback pointer */
   1802 
   1803     UINT16_TO_STREAM (pp, HCI_GRP_VENDOR_SPECIFIC | opcode);
   1804     UINT8_TO_STREAM  (pp, len);
   1805     ARRAY_TO_STREAM  (pp, p_data, len);
   1806 
   1807     btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID,  p);
   1808 }
   1809