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_common.h"
     27 #include "bt_target.h"
     28 #include "btu.h"
     29 #include "hcidefs.h"
     30 #include "hcimsgs.h"
     31 
     32 #include <stddef.h>
     33 #include <string.h>
     34 
     35 #include "btm_int.h" /* Included for UIPC_* macro definitions */
     36 
     37 void btsnd_hcic_inquiry(const LAP inq_lap, uint8_t duration,
     38                         uint8_t response_cnt) {
     39   BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
     40   uint8_t* pp = (uint8_t*)(p + 1);
     41 
     42   p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_INQUIRY;
     43   p->offset = 0;
     44 
     45   UINT16_TO_STREAM(pp, HCI_INQUIRY);
     46   UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_INQUIRY);
     47 
     48   LAP_TO_STREAM(pp, inq_lap);
     49   UINT8_TO_STREAM(pp, duration);
     50   UINT8_TO_STREAM(pp, response_cnt);
     51 
     52   btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
     53 }
     54 
     55 void btsnd_hcic_inq_cancel(void) {
     56   BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
     57   uint8_t* pp = (uint8_t*)(p + 1);
     58 
     59   p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_INQ_CANCEL;
     60   p->offset = 0;
     61   UINT16_TO_STREAM(pp, HCI_INQUIRY_CANCEL);
     62   UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_INQ_CANCEL);
     63 
     64   btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
     65 }
     66 
     67 void btsnd_hcic_per_inq_mode(uint16_t max_period, uint16_t min_period,
     68                              const LAP inq_lap, uint8_t duration,
     69                              uint8_t response_cnt) {
     70   BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
     71   uint8_t* pp = (uint8_t*)(p + 1);
     72 
     73   p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_PER_INQ_MODE;
     74   p->offset = 0;
     75 
     76   UINT16_TO_STREAM(pp, HCI_PERIODIC_INQUIRY_MODE);
     77   UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_PER_INQ_MODE);
     78 
     79   UINT16_TO_STREAM(pp, max_period);
     80   UINT16_TO_STREAM(pp, min_period);
     81   LAP_TO_STREAM(pp, inq_lap);
     82   UINT8_TO_STREAM(pp, duration);
     83   UINT8_TO_STREAM(pp, response_cnt);
     84 
     85   btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
     86 }
     87 
     88 void btsnd_hcic_exit_per_inq(void) {
     89   BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
     90   uint8_t* pp = (uint8_t*)(p + 1);
     91 
     92   p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_EXIT_PER_INQ;
     93   p->offset = 0;
     94   UINT16_TO_STREAM(pp, HCI_EXIT_PERIODIC_INQUIRY_MODE);
     95   UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_EXIT_PER_INQ);
     96 
     97   btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
     98 }
     99 
    100 void btsnd_hcic_create_conn(BD_ADDR dest, uint16_t packet_types,
    101                             uint8_t page_scan_rep_mode, uint8_t page_scan_mode,
    102                             uint16_t clock_offset, uint8_t allow_switch) {
    103   BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
    104   uint8_t* pp = (uint8_t*)(p + 1);
    105 
    106 #ifndef BT_10A
    107   p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CREATE_CONN;
    108 #else
    109   p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CREATE_CONN - 1;
    110 #endif
    111   p->offset = 0;
    112 
    113   UINT16_TO_STREAM(pp, HCI_CREATE_CONNECTION);
    114 #ifndef BT_10A
    115   UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_CREATE_CONN);
    116 #else
    117   UINT8_TO_STREAM(pp, (HCIC_PARAM_SIZE_CREATE_CONN - 1));
    118 #endif
    119   BDADDR_TO_STREAM(pp, dest);
    120   UINT16_TO_STREAM(pp, packet_types);
    121   UINT8_TO_STREAM(pp, page_scan_rep_mode);
    122   UINT8_TO_STREAM(pp, page_scan_mode);
    123   UINT16_TO_STREAM(pp, clock_offset);
    124 #if !defined(BT_10A)
    125   UINT8_TO_STREAM(pp, allow_switch);
    126 #endif
    127   btm_acl_paging(p, dest);
    128 }
    129 
    130 void btsnd_hcic_disconnect(uint16_t handle, uint8_t reason) {
    131   BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
    132   uint8_t* pp = (uint8_t*)(p + 1);
    133 
    134   p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_DISCONNECT;
    135   p->offset = 0;
    136 
    137   UINT16_TO_STREAM(pp, HCI_DISCONNECT);
    138   UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_DISCONNECT);
    139   UINT16_TO_STREAM(pp, handle);
    140   UINT8_TO_STREAM(pp, reason);
    141 
    142   btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
    143 }
    144 
    145 #if (BTM_SCO_INCLUDED == TRUE)
    146 void btsnd_hcic_add_SCO_conn(uint16_t handle, uint16_t packet_types) {
    147   BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
    148   uint8_t* pp = (uint8_t*)(p + 1);
    149 
    150   p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_ADD_SCO_CONN;
    151   p->offset = 0;
    152 
    153   UINT16_TO_STREAM(pp, HCI_ADD_SCO_CONNECTION);
    154   UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_ADD_SCO_CONN);
    155 
    156   UINT16_TO_STREAM(pp, handle);
    157   UINT16_TO_STREAM(pp, packet_types);
    158 
    159   btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
    160 }
    161 #endif /* BTM_SCO_INCLUDED */
    162 
    163 void btsnd_hcic_create_conn_cancel(BD_ADDR dest) {
    164   BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
    165   uint8_t* pp = (uint8_t*)(p + 1);
    166 
    167   p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CREATE_CONN_CANCEL;
    168   p->offset = 0;
    169 
    170   UINT16_TO_STREAM(pp, HCI_CREATE_CONNECTION_CANCEL);
    171   UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_CREATE_CONN_CANCEL);
    172 
    173   BDADDR_TO_STREAM(pp, dest);
    174 
    175   btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
    176 }
    177 
    178 void btsnd_hcic_accept_conn(BD_ADDR dest, uint8_t role) {
    179   BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
    180   uint8_t* pp = (uint8_t*)(p + 1);
    181 
    182   p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_ACCEPT_CONN;
    183   p->offset = 0;
    184 
    185   UINT16_TO_STREAM(pp, HCI_ACCEPT_CONNECTION_REQUEST);
    186   UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_ACCEPT_CONN);
    187   BDADDR_TO_STREAM(pp, dest);
    188   UINT8_TO_STREAM(pp, role);
    189 
    190   btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
    191 }
    192 
    193 void btsnd_hcic_reject_conn(BD_ADDR dest, uint8_t reason) {
    194   BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
    195   uint8_t* pp = (uint8_t*)(p + 1);
    196 
    197   p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_REJECT_CONN;
    198   p->offset = 0;
    199 
    200   UINT16_TO_STREAM(pp, HCI_REJECT_CONNECTION_REQUEST);
    201   UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_REJECT_CONN);
    202 
    203   BDADDR_TO_STREAM(pp, dest);
    204   UINT8_TO_STREAM(pp, reason);
    205 
    206   btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
    207 }
    208 
    209 void btsnd_hcic_link_key_req_reply(BD_ADDR bd_addr, LINK_KEY link_key) {
    210   BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
    211   uint8_t* pp = (uint8_t*)(p + 1);
    212 
    213   p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_LINK_KEY_REQ_REPLY;
    214   p->offset = 0;
    215 
    216   UINT16_TO_STREAM(pp, HCI_LINK_KEY_REQUEST_REPLY);
    217   UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_LINK_KEY_REQ_REPLY);
    218 
    219   BDADDR_TO_STREAM(pp, bd_addr);
    220   ARRAY16_TO_STREAM(pp, link_key);
    221 
    222   btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
    223 }
    224 
    225 void btsnd_hcic_link_key_neg_reply(BD_ADDR bd_addr) {
    226   BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
    227   uint8_t* pp = (uint8_t*)(p + 1);
    228 
    229   p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_LINK_KEY_NEG_REPLY;
    230   p->offset = 0;
    231 
    232   UINT16_TO_STREAM(pp, HCI_LINK_KEY_REQUEST_NEG_REPLY);
    233   UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_LINK_KEY_NEG_REPLY);
    234 
    235   BDADDR_TO_STREAM(pp, bd_addr);
    236 
    237   btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
    238 }
    239 
    240 void btsnd_hcic_pin_code_req_reply(BD_ADDR bd_addr, uint8_t pin_code_len,
    241                                    PIN_CODE pin_code) {
    242   BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
    243   uint8_t* pp = (uint8_t*)(p + 1);
    244   int i;
    245 
    246   p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_PIN_CODE_REQ_REPLY;
    247   p->offset = 0;
    248 
    249   UINT16_TO_STREAM(pp, HCI_PIN_CODE_REQUEST_REPLY);
    250   UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_PIN_CODE_REQ_REPLY);
    251 
    252   BDADDR_TO_STREAM(pp, bd_addr);
    253   UINT8_TO_STREAM(pp, pin_code_len);
    254 
    255   for (i = 0; i < pin_code_len; i++) *pp++ = *pin_code++;
    256 
    257   for (; i < PIN_CODE_LEN; i++) *pp++ = 0;
    258 
    259   btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
    260 }
    261 
    262 void btsnd_hcic_pin_code_neg_reply(BD_ADDR bd_addr) {
    263   BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
    264   uint8_t* pp = (uint8_t*)(p + 1);
    265 
    266   p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_PIN_CODE_NEG_REPLY;
    267   p->offset = 0;
    268 
    269   UINT16_TO_STREAM(pp, HCI_PIN_CODE_REQUEST_NEG_REPLY);
    270   UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_PIN_CODE_NEG_REPLY);
    271 
    272   BDADDR_TO_STREAM(pp, bd_addr);
    273 
    274   btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
    275 }
    276 
    277 void btsnd_hcic_change_conn_type(uint16_t handle, uint16_t packet_types) {
    278   BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
    279   uint8_t* pp = (uint8_t*)(p + 1);
    280 
    281   p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CHANGE_CONN_TYPE;
    282   p->offset = 0;
    283 
    284   UINT16_TO_STREAM(pp, HCI_CHANGE_CONN_PACKET_TYPE);
    285   UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_CHANGE_CONN_TYPE);
    286 
    287   UINT16_TO_STREAM(pp, handle);
    288   UINT16_TO_STREAM(pp, packet_types);
    289 
    290   btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
    291 }
    292 
    293 void btsnd_hcic_auth_request(uint16_t handle) {
    294   BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
    295   uint8_t* pp = (uint8_t*)(p + 1);
    296 
    297   p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CMD_HANDLE;
    298   p->offset = 0;
    299 
    300   UINT16_TO_STREAM(pp, HCI_AUTHENTICATION_REQUESTED);
    301   UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_CMD_HANDLE);
    302 
    303   UINT16_TO_STREAM(pp, handle);
    304 
    305   btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
    306 }
    307 
    308 void btsnd_hcic_set_conn_encrypt(uint16_t handle, bool enable) {
    309   BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
    310   uint8_t* pp = (uint8_t*)(p + 1);
    311 
    312   p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_SET_CONN_ENCRYPT;
    313   p->offset = 0;
    314 
    315   UINT16_TO_STREAM(pp, HCI_SET_CONN_ENCRYPTION);
    316   UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_SET_CONN_ENCRYPT);
    317 
    318   UINT16_TO_STREAM(pp, handle);
    319   UINT8_TO_STREAM(pp, enable);
    320 
    321   btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
    322 }
    323 
    324 void btsnd_hcic_rmt_name_req(BD_ADDR bd_addr, uint8_t page_scan_rep_mode,
    325                              uint8_t page_scan_mode, uint16_t clock_offset) {
    326   BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
    327   uint8_t* pp = (uint8_t*)(p + 1);
    328 
    329   p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_RMT_NAME_REQ;
    330   p->offset = 0;
    331 
    332   UINT16_TO_STREAM(pp, HCI_RMT_NAME_REQUEST);
    333   UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_RMT_NAME_REQ);
    334 
    335   BDADDR_TO_STREAM(pp, bd_addr);
    336   UINT8_TO_STREAM(pp, page_scan_rep_mode);
    337   UINT8_TO_STREAM(pp, page_scan_mode);
    338   UINT16_TO_STREAM(pp, clock_offset);
    339 
    340   btm_acl_paging(p, bd_addr);
    341 }
    342 
    343 void btsnd_hcic_rmt_name_req_cancel(BD_ADDR bd_addr) {
    344   BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
    345   uint8_t* pp = (uint8_t*)(p + 1);
    346 
    347   p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_RMT_NAME_REQ_CANCEL;
    348   p->offset = 0;
    349 
    350   UINT16_TO_STREAM(pp, HCI_RMT_NAME_REQUEST_CANCEL);
    351   UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_RMT_NAME_REQ_CANCEL);
    352 
    353   BDADDR_TO_STREAM(pp, bd_addr);
    354 
    355   btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
    356 }
    357 
    358 void btsnd_hcic_rmt_features_req(uint16_t handle) {
    359   BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
    360   uint8_t* pp = (uint8_t*)(p + 1);
    361 
    362   p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CMD_HANDLE;
    363   p->offset = 0;
    364 
    365   UINT16_TO_STREAM(pp, HCI_READ_RMT_FEATURES);
    366   UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_CMD_HANDLE);
    367 
    368   UINT16_TO_STREAM(pp, handle);
    369 
    370   btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
    371 }
    372 
    373 void btsnd_hcic_rmt_ext_features(uint16_t handle, uint8_t page_num) {
    374   BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
    375   uint8_t* pp = (uint8_t*)(p + 1);
    376 
    377   p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_RMT_EXT_FEATURES;
    378   p->offset = 0;
    379 
    380   UINT16_TO_STREAM(pp, HCI_READ_RMT_EXT_FEATURES);
    381   UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_RMT_EXT_FEATURES);
    382 
    383   UINT16_TO_STREAM(pp, handle);
    384   UINT8_TO_STREAM(pp, page_num);
    385 
    386   btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
    387 }
    388 
    389 void btsnd_hcic_rmt_ver_req(uint16_t handle) {
    390   BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
    391   uint8_t* pp = (uint8_t*)(p + 1);
    392 
    393   p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CMD_HANDLE;
    394   p->offset = 0;
    395 
    396   UINT16_TO_STREAM(pp, HCI_READ_RMT_VERSION_INFO);
    397   UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_CMD_HANDLE);
    398 
    399   UINT16_TO_STREAM(pp, handle);
    400 
    401   btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
    402 }
    403 
    404 void btsnd_hcic_read_rmt_clk_offset(uint16_t handle) {
    405   BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
    406   uint8_t* pp = (uint8_t*)(p + 1);
    407 
    408   p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CMD_HANDLE;
    409   p->offset = 0;
    410 
    411   UINT16_TO_STREAM(pp, HCI_READ_RMT_CLOCK_OFFSET);
    412   UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_CMD_HANDLE);
    413 
    414   UINT16_TO_STREAM(pp, handle);
    415 
    416   btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
    417 }
    418 
    419 void btsnd_hcic_read_lmp_handle(uint16_t handle) {
    420   BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
    421   uint8_t* pp = (uint8_t*)(p + 1);
    422 
    423   p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CMD_HANDLE;
    424   p->offset = 0;
    425 
    426   UINT16_TO_STREAM(pp, HCI_READ_LMP_HANDLE);
    427   UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_CMD_HANDLE);
    428 
    429   UINT16_TO_STREAM(pp, handle);
    430 
    431   btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
    432 }
    433 
    434 void btsnd_hcic_setup_esco_conn(uint16_t handle, uint32_t transmit_bandwidth,
    435                                 uint32_t receive_bandwidth,
    436                                 uint16_t max_latency, uint16_t voice,
    437                                 uint8_t retrans_effort, uint16_t packet_types) {
    438   BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
    439   uint8_t* pp = (uint8_t*)(p + 1);
    440 
    441   p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_SETUP_ESCO;
    442   p->offset = 0;
    443 
    444   UINT16_TO_STREAM(pp, HCI_SETUP_ESCO_CONNECTION);
    445   UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_SETUP_ESCO);
    446 
    447   UINT16_TO_STREAM(pp, handle);
    448   UINT32_TO_STREAM(pp, transmit_bandwidth);
    449   UINT32_TO_STREAM(pp, receive_bandwidth);
    450   UINT16_TO_STREAM(pp, max_latency);
    451   UINT16_TO_STREAM(pp, voice);
    452   UINT8_TO_STREAM(pp, retrans_effort);
    453   UINT16_TO_STREAM(pp, packet_types);
    454 
    455   btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
    456 }
    457 
    458 void btsnd_hcic_accept_esco_conn(BD_ADDR bd_addr, uint32_t transmit_bandwidth,
    459                                  uint32_t receive_bandwidth,
    460                                  uint16_t max_latency, uint16_t content_fmt,
    461                                  uint8_t retrans_effort,
    462                                  uint16_t packet_types) {
    463   BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
    464   uint8_t* pp = (uint8_t*)(p + 1);
    465 
    466   p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_ACCEPT_ESCO;
    467   p->offset = 0;
    468 
    469   UINT16_TO_STREAM(pp, HCI_ACCEPT_ESCO_CONNECTION);
    470   UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_ACCEPT_ESCO);
    471 
    472   BDADDR_TO_STREAM(pp, bd_addr);
    473   UINT32_TO_STREAM(pp, transmit_bandwidth);
    474   UINT32_TO_STREAM(pp, receive_bandwidth);
    475   UINT16_TO_STREAM(pp, max_latency);
    476   UINT16_TO_STREAM(pp, content_fmt);
    477   UINT8_TO_STREAM(pp, retrans_effort);
    478   UINT16_TO_STREAM(pp, packet_types);
    479 
    480   btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
    481 }
    482 
    483 void btsnd_hcic_reject_esco_conn(BD_ADDR bd_addr, uint8_t reason) {
    484   BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
    485   uint8_t* pp = (uint8_t*)(p + 1);
    486 
    487   p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_REJECT_ESCO;
    488   p->offset = 0;
    489 
    490   UINT16_TO_STREAM(pp, HCI_REJECT_ESCO_CONNECTION);
    491   UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_REJECT_ESCO);
    492 
    493   BDADDR_TO_STREAM(pp, bd_addr);
    494   UINT8_TO_STREAM(pp, reason);
    495 
    496   btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
    497 }
    498 
    499 void btsnd_hcic_hold_mode(uint16_t handle, uint16_t max_hold_period,
    500                           uint16_t min_hold_period) {
    501   BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
    502   uint8_t* pp = (uint8_t*)(p + 1);
    503 
    504   p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_HOLD_MODE;
    505   p->offset = 0;
    506 
    507   UINT16_TO_STREAM(pp, HCI_HOLD_MODE);
    508   UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_HOLD_MODE);
    509 
    510   UINT16_TO_STREAM(pp, handle);
    511   UINT16_TO_STREAM(pp, max_hold_period);
    512   UINT16_TO_STREAM(pp, min_hold_period);
    513 
    514   btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
    515 }
    516 
    517 void btsnd_hcic_sniff_mode(uint16_t handle, uint16_t max_sniff_period,
    518                            uint16_t min_sniff_period, uint16_t sniff_attempt,
    519                            uint16_t sniff_timeout) {
    520   BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
    521   uint8_t* pp = (uint8_t*)(p + 1);
    522 
    523   p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_SNIFF_MODE;
    524   p->offset = 0;
    525 
    526   UINT16_TO_STREAM(pp, HCI_SNIFF_MODE);
    527   UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_SNIFF_MODE);
    528 
    529   UINT16_TO_STREAM(pp, handle);
    530   UINT16_TO_STREAM(pp, max_sniff_period);
    531   UINT16_TO_STREAM(pp, min_sniff_period);
    532   UINT16_TO_STREAM(pp, sniff_attempt);
    533   UINT16_TO_STREAM(pp, sniff_timeout);
    534 
    535   btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
    536 }
    537 
    538 void btsnd_hcic_exit_sniff_mode(uint16_t handle) {
    539   BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
    540   uint8_t* pp = (uint8_t*)(p + 1);
    541 
    542   p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CMD_HANDLE;
    543   p->offset = 0;
    544 
    545   UINT16_TO_STREAM(pp, HCI_EXIT_SNIFF_MODE);
    546   UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_CMD_HANDLE);
    547 
    548   UINT16_TO_STREAM(pp, handle);
    549 
    550   btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
    551 }
    552 
    553 void btsnd_hcic_park_mode(uint16_t handle, uint16_t beacon_max_interval,
    554                           uint16_t beacon_min_interval) {
    555   BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
    556   uint8_t* pp = (uint8_t*)(p + 1);
    557 
    558   p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_PARK_MODE;
    559   p->offset = 0;
    560 
    561   UINT16_TO_STREAM(pp, HCI_PARK_MODE);
    562   UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_PARK_MODE);
    563 
    564   UINT16_TO_STREAM(pp, handle);
    565   UINT16_TO_STREAM(pp, beacon_max_interval);
    566   UINT16_TO_STREAM(pp, beacon_min_interval);
    567 
    568   btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
    569 }
    570 
    571 void btsnd_hcic_exit_park_mode(uint16_t handle) {
    572   BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
    573   uint8_t* pp = (uint8_t*)(p + 1);
    574 
    575   p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CMD_HANDLE;
    576   p->offset = 0;
    577 
    578   UINT16_TO_STREAM(pp, HCI_EXIT_PARK_MODE);
    579   UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_CMD_HANDLE);
    580 
    581   UINT16_TO_STREAM(pp, handle);
    582 
    583   btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
    584 }
    585 
    586 void btsnd_hcic_qos_setup(uint16_t handle, uint8_t flags, uint8_t service_type,
    587                           uint32_t token_rate, uint32_t peak, uint32_t latency,
    588                           uint32_t delay_var) {
    589   BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
    590   uint8_t* pp = (uint8_t*)(p + 1);
    591 
    592   p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_QOS_SETUP;
    593   p->offset = 0;
    594 
    595   UINT16_TO_STREAM(pp, HCI_QOS_SETUP);
    596   UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_QOS_SETUP);
    597 
    598   UINT16_TO_STREAM(pp, handle);
    599   UINT8_TO_STREAM(pp, flags);
    600   UINT8_TO_STREAM(pp, service_type);
    601   UINT32_TO_STREAM(pp, token_rate);
    602   UINT32_TO_STREAM(pp, peak);
    603   UINT32_TO_STREAM(pp, latency);
    604   UINT32_TO_STREAM(pp, delay_var);
    605 
    606   btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
    607 }
    608 
    609 void btsnd_hcic_switch_role(BD_ADDR bd_addr, uint8_t role) {
    610   BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
    611   uint8_t* pp = (uint8_t*)(p + 1);
    612 
    613   p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_SWITCH_ROLE;
    614   p->offset = 0;
    615 
    616   UINT16_TO_STREAM(pp, HCI_SWITCH_ROLE);
    617   UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_SWITCH_ROLE);
    618 
    619   BDADDR_TO_STREAM(pp, bd_addr);
    620   UINT8_TO_STREAM(pp, role);
    621 
    622   btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
    623 }
    624 
    625 void btsnd_hcic_write_policy_set(uint16_t handle, uint16_t settings) {
    626   BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
    627   uint8_t* pp = (uint8_t*)(p + 1);
    628 
    629   p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_POLICY_SET;
    630   p->offset = 0;
    631   UINT16_TO_STREAM(pp, HCI_WRITE_POLICY_SETTINGS);
    632   UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_WRITE_POLICY_SET);
    633 
    634   UINT16_TO_STREAM(pp, handle);
    635   UINT16_TO_STREAM(pp, settings);
    636 
    637   btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
    638 }
    639 
    640 void btsnd_hcic_write_def_policy_set(uint16_t settings) {
    641   BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
    642   uint8_t* pp = (uint8_t*)(p + 1);
    643 
    644   p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_DEF_POLICY_SET;
    645   p->offset = 0;
    646   UINT16_TO_STREAM(pp, HCI_WRITE_DEF_POLICY_SETTINGS);
    647   UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_WRITE_DEF_POLICY_SET);
    648 
    649   UINT16_TO_STREAM(pp, settings);
    650 
    651   btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
    652 }
    653 
    654 void btsnd_hcic_set_event_filter(uint8_t filt_type, uint8_t filt_cond_type,
    655                                  uint8_t* filt_cond, uint8_t filt_cond_len) {
    656   BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
    657   uint8_t* pp = (uint8_t*)(p + 1);
    658 
    659   p->offset = 0;
    660 
    661   UINT16_TO_STREAM(pp, HCI_SET_EVENT_FILTER);
    662 
    663   if (filt_type) {
    664     p->len = (uint16_t)(HCIC_PREAMBLE_SIZE + 2 + filt_cond_len);
    665     UINT8_TO_STREAM(pp, (uint8_t)(2 + filt_cond_len));
    666 
    667     UINT8_TO_STREAM(pp, filt_type);
    668     UINT8_TO_STREAM(pp, filt_cond_type);
    669 
    670     if (filt_cond_type == HCI_FILTER_COND_DEVICE_CLASS) {
    671       DEVCLASS_TO_STREAM(pp, filt_cond);
    672       filt_cond += DEV_CLASS_LEN;
    673       DEVCLASS_TO_STREAM(pp, filt_cond);
    674       filt_cond += DEV_CLASS_LEN;
    675 
    676       filt_cond_len -= (2 * DEV_CLASS_LEN);
    677     } else if (filt_cond_type == HCI_FILTER_COND_BD_ADDR) {
    678       BDADDR_TO_STREAM(pp, filt_cond);
    679       filt_cond += BD_ADDR_LEN;
    680 
    681       filt_cond_len -= BD_ADDR_LEN;
    682     }
    683 
    684     if (filt_cond_len) ARRAY_TO_STREAM(pp, filt_cond, filt_cond_len);
    685   } else {
    686     p->len = (uint16_t)(HCIC_PREAMBLE_SIZE + 1);
    687     UINT8_TO_STREAM(pp, 1);
    688 
    689     UINT8_TO_STREAM(pp, filt_type);
    690   }
    691 
    692   btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
    693 }
    694 
    695 void btsnd_hcic_write_pin_type(uint8_t type) {
    696   BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
    697   uint8_t* pp = (uint8_t*)(p + 1);
    698 
    699   p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PARAM1;
    700   p->offset = 0;
    701 
    702   UINT16_TO_STREAM(pp, HCI_WRITE_PIN_TYPE);
    703   UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_WRITE_PARAM1);
    704 
    705   UINT8_TO_STREAM(pp, type);
    706 
    707   btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
    708 }
    709 
    710 void btsnd_hcic_delete_stored_key(BD_ADDR bd_addr, bool delete_all_flag) {
    711   BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
    712   uint8_t* pp = (uint8_t*)(p + 1);
    713 
    714   p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_DELETE_STORED_KEY;
    715   p->offset = 0;
    716 
    717   UINT16_TO_STREAM(pp, HCI_DELETE_STORED_LINK_KEY);
    718   UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_DELETE_STORED_KEY);
    719 
    720   BDADDR_TO_STREAM(pp, bd_addr);
    721   UINT8_TO_STREAM(pp, delete_all_flag);
    722 
    723   btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
    724 }
    725 
    726 void btsnd_hcic_change_name(BD_NAME name) {
    727   BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
    728   uint8_t* pp = (uint8_t*)(p + 1);
    729   uint16_t len = strlen((char*)name) + 1;
    730 
    731   memset(pp, 0, HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CHANGE_NAME);
    732 
    733   p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CHANGE_NAME;
    734   p->offset = 0;
    735 
    736   UINT16_TO_STREAM(pp, HCI_CHANGE_LOCAL_NAME);
    737   UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_CHANGE_NAME);
    738 
    739   if (len > HCIC_PARAM_SIZE_CHANGE_NAME) len = HCIC_PARAM_SIZE_CHANGE_NAME;
    740 
    741   ARRAY_TO_STREAM(pp, name, len);
    742 
    743   btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
    744 }
    745 
    746 void btsnd_hcic_read_name(void) {
    747   BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
    748   uint8_t* pp = (uint8_t*)(p + 1);
    749 
    750   p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_CMD;
    751   p->offset = 0;
    752 
    753   UINT16_TO_STREAM(pp, HCI_READ_LOCAL_NAME);
    754   UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_READ_CMD);
    755 
    756   btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
    757 }
    758 
    759 void btsnd_hcic_write_page_tout(uint16_t timeout) {
    760   BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
    761   uint8_t* pp = (uint8_t*)(p + 1);
    762 
    763   p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PARAM2;
    764   p->offset = 0;
    765 
    766   UINT16_TO_STREAM(pp, HCI_WRITE_PAGE_TOUT);
    767   UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_WRITE_PARAM2);
    768 
    769   UINT16_TO_STREAM(pp, timeout);
    770 
    771   btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
    772 }
    773 
    774 void btsnd_hcic_write_scan_enable(uint8_t flag) {
    775   BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
    776   uint8_t* pp = (uint8_t*)(p + 1);
    777 
    778   p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PARAM1;
    779   p->offset = 0;
    780 
    781   UINT16_TO_STREAM(pp, HCI_WRITE_SCAN_ENABLE);
    782   UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_WRITE_PARAM1);
    783 
    784   UINT8_TO_STREAM(pp, flag);
    785 
    786   btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
    787 }
    788 
    789 void btsnd_hcic_write_pagescan_cfg(uint16_t interval, uint16_t window) {
    790   BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
    791   uint8_t* pp = (uint8_t*)(p + 1);
    792 
    793   p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PAGESCAN_CFG;
    794   p->offset = 0;
    795 
    796   UINT16_TO_STREAM(pp, HCI_WRITE_PAGESCAN_CFG);
    797   UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_WRITE_PAGESCAN_CFG);
    798 
    799   UINT16_TO_STREAM(pp, interval);
    800   UINT16_TO_STREAM(pp, window);
    801 
    802   btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
    803 }
    804 
    805 void btsnd_hcic_write_inqscan_cfg(uint16_t interval, uint16_t window) {
    806   BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
    807   uint8_t* pp = (uint8_t*)(p + 1);
    808 
    809   p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_INQSCAN_CFG;
    810   p->offset = 0;
    811 
    812   UINT16_TO_STREAM(pp, HCI_WRITE_INQUIRYSCAN_CFG);
    813   UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_WRITE_INQSCAN_CFG);
    814 
    815   UINT16_TO_STREAM(pp, interval);
    816   UINT16_TO_STREAM(pp, window);
    817 
    818   btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
    819 }
    820 
    821 void btsnd_hcic_write_auth_enable(uint8_t flag) {
    822   BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
    823   uint8_t* pp = (uint8_t*)(p + 1);
    824 
    825   p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PARAM1;
    826   p->offset = 0;
    827 
    828   UINT16_TO_STREAM(pp, HCI_WRITE_AUTHENTICATION_ENABLE);
    829   UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_WRITE_PARAM1);
    830 
    831   UINT8_TO_STREAM(pp, flag);
    832 
    833   btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
    834 }
    835 
    836 void btsnd_hcic_write_dev_class(DEV_CLASS dev_class) {
    837   BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
    838   uint8_t* pp = (uint8_t*)(p + 1);
    839 
    840   p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PARAM3;
    841   p->offset = 0;
    842 
    843   UINT16_TO_STREAM(pp, HCI_WRITE_CLASS_OF_DEVICE);
    844   UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_WRITE_PARAM3);
    845 
    846   DEVCLASS_TO_STREAM(pp, dev_class);
    847 
    848   btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
    849 }
    850 
    851 void btsnd_hcic_write_voice_settings(uint16_t flags) {
    852   BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
    853   uint8_t* pp = (uint8_t*)(p + 1);
    854 
    855   p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PARAM2;
    856   p->offset = 0;
    857 
    858   UINT16_TO_STREAM(pp, HCI_WRITE_VOICE_SETTINGS);
    859   UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_WRITE_PARAM2);
    860 
    861   UINT16_TO_STREAM(pp, flags);
    862 
    863   btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
    864 }
    865 
    866 void btsnd_hcic_write_auto_flush_tout(uint16_t handle, uint16_t tout) {
    867   BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
    868   uint8_t* pp = (uint8_t*)(p + 1);
    869 
    870   p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_AUTO_FLUSH_TOUT;
    871   p->offset = 0;
    872 
    873   UINT16_TO_STREAM(pp, HCI_WRITE_AUTO_FLUSH_TOUT);
    874   UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_WRITE_AUTO_FLUSH_TOUT);
    875 
    876   UINT16_TO_STREAM(pp, handle);
    877   UINT16_TO_STREAM(pp, tout);
    878 
    879   btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
    880 }
    881 
    882 void btsnd_hcic_read_tx_power(uint16_t handle, uint8_t type) {
    883   BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
    884   uint8_t* pp = (uint8_t*)(p + 1);
    885 
    886   p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_TX_POWER;
    887   p->offset = 0;
    888 
    889   UINT16_TO_STREAM(pp, HCI_READ_TRANSMIT_POWER_LEVEL);
    890   UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_READ_TX_POWER);
    891 
    892   UINT16_TO_STREAM(pp, handle);
    893   UINT8_TO_STREAM(pp, type);
    894 
    895   btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
    896 }
    897 
    898 void btsnd_hcic_host_num_xmitted_pkts(uint8_t num_handles, uint16_t* handle,
    899                                       uint16_t* num_pkts) {
    900   BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
    901   uint8_t* pp = (uint8_t*)(p + 1);
    902 
    903   p->len = HCIC_PREAMBLE_SIZE + 1 + (num_handles * 4);
    904   p->offset = 0;
    905 
    906   UINT16_TO_STREAM(pp, HCI_HOST_NUM_PACKETS_DONE);
    907   UINT8_TO_STREAM(pp, p->len - HCIC_PREAMBLE_SIZE);
    908 
    909   UINT8_TO_STREAM(pp, num_handles);
    910 
    911   for (int i = 0; i < num_handles; i++) {
    912     UINT16_TO_STREAM(pp, handle[i]);
    913     UINT16_TO_STREAM(pp, num_pkts[i]);
    914   }
    915 
    916   btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
    917 }
    918 
    919 void btsnd_hcic_write_link_super_tout(uint8_t local_controller_id,
    920                                       uint16_t handle, uint16_t timeout) {
    921   BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
    922   uint8_t* pp = (uint8_t*)(p + 1);
    923 
    924   p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_LINK_SUPER_TOUT;
    925   p->offset = 0;
    926 
    927   UINT16_TO_STREAM(pp, HCI_WRITE_LINK_SUPER_TOUT);
    928   UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_WRITE_LINK_SUPER_TOUT);
    929 
    930   UINT16_TO_STREAM(pp, handle);
    931   UINT16_TO_STREAM(pp, timeout);
    932 
    933   btu_hcif_send_cmd(local_controller_id, p);
    934 }
    935 
    936 void btsnd_hcic_write_cur_iac_lap(uint8_t num_cur_iac, LAP* const iac_lap) {
    937   BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
    938   uint8_t* pp = (uint8_t*)(p + 1);
    939 
    940   p->len = HCIC_PREAMBLE_SIZE + 1 + (LAP_LEN * num_cur_iac);
    941   p->offset = 0;
    942 
    943   UINT16_TO_STREAM(pp, HCI_WRITE_CURRENT_IAC_LAP);
    944   UINT8_TO_STREAM(pp, p->len - HCIC_PREAMBLE_SIZE);
    945 
    946   UINT8_TO_STREAM(pp, num_cur_iac);
    947 
    948   for (int i = 0; i < num_cur_iac; i++) LAP_TO_STREAM(pp, iac_lap[i]);
    949 
    950   btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
    951 }
    952 
    953 /******************************************
    954  *    Lisbon Features
    955  ******************************************/
    956 #if (BTM_SSR_INCLUDED == TRUE)
    957 
    958 void btsnd_hcic_sniff_sub_rate(uint16_t handle, uint16_t max_lat,
    959                                uint16_t min_remote_lat,
    960                                uint16_t min_local_lat) {
    961   BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
    962   uint8_t* pp = (uint8_t*)(p + 1);
    963 
    964   p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_SNIFF_SUB_RATE;
    965   p->offset = 0;
    966 
    967   UINT16_TO_STREAM(pp, HCI_SNIFF_SUB_RATE);
    968   UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_SNIFF_SUB_RATE);
    969 
    970   UINT16_TO_STREAM(pp, handle);
    971   UINT16_TO_STREAM(pp, max_lat);
    972   UINT16_TO_STREAM(pp, min_remote_lat);
    973   UINT16_TO_STREAM(pp, min_local_lat);
    974 
    975   btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
    976 }
    977 #endif /* BTM_SSR_INCLUDED */
    978 
    979 /**** Extended Inquiry Response Commands ****/
    980 void btsnd_hcic_write_ext_inquiry_response(void* buffer, uint8_t fec_req) {
    981   BT_HDR* p = (BT_HDR*)buffer;
    982   uint8_t* pp = (uint8_t*)(p + 1);
    983 
    984   p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_EXT_INQ_RESP;
    985   p->offset = 0;
    986 
    987   UINT16_TO_STREAM(pp, HCI_WRITE_EXT_INQ_RESPONSE);
    988   UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_EXT_INQ_RESP);
    989 
    990   UINT8_TO_STREAM(pp, fec_req);
    991 
    992   btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
    993 }
    994 
    995 void btsnd_hcic_io_cap_req_reply(BD_ADDR bd_addr, uint8_t capability,
    996                                  uint8_t oob_present, uint8_t auth_req) {
    997   BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
    998   uint8_t* pp = (uint8_t*)(p + 1);
    999 
   1000   p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_IO_CAP_RESP;
   1001   p->offset = 0;
   1002 
   1003   UINT16_TO_STREAM(pp, HCI_IO_CAPABILITY_REQUEST_REPLY);
   1004   UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_IO_CAP_RESP);
   1005 
   1006   BDADDR_TO_STREAM(pp, bd_addr);
   1007   UINT8_TO_STREAM(pp, capability);
   1008   UINT8_TO_STREAM(pp, oob_present);
   1009   UINT8_TO_STREAM(pp, auth_req);
   1010 
   1011   btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
   1012 }
   1013 
   1014 void btsnd_hcic_enhanced_set_up_synchronous_connection(
   1015     uint16_t conn_handle, enh_esco_params_t* p_params) {
   1016   BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
   1017   uint8_t* pp = (uint8_t*)(p + 1);
   1018 
   1019   p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_ENH_SET_ESCO_CONN;
   1020   p->offset = 0;
   1021 
   1022   UINT16_TO_STREAM(pp, HCI_ENH_SETUP_ESCO_CONNECTION);
   1023   UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_ENH_SET_ESCO_CONN);
   1024 
   1025   UINT16_TO_STREAM(pp, conn_handle);
   1026   UINT32_TO_STREAM(pp, p_params->transmit_bandwidth);
   1027   UINT32_TO_STREAM(pp, p_params->receive_bandwidth);
   1028   UINT8_TO_STREAM(pp, p_params->transmit_coding_format.coding_format);
   1029   UINT16_TO_STREAM(pp, p_params->transmit_coding_format.company_id);
   1030   UINT16_TO_STREAM(pp,
   1031                    p_params->transmit_coding_format.vendor_specific_codec_id);
   1032   UINT8_TO_STREAM(pp, p_params->receive_coding_format.coding_format);
   1033   UINT16_TO_STREAM(pp, p_params->receive_coding_format.company_id);
   1034   UINT16_TO_STREAM(pp,
   1035                    p_params->receive_coding_format.vendor_specific_codec_id);
   1036   UINT16_TO_STREAM(pp, p_params->transmit_codec_frame_size);
   1037   UINT16_TO_STREAM(pp, p_params->receive_codec_frame_size);
   1038   UINT32_TO_STREAM(pp, p_params->input_bandwidth);
   1039   UINT32_TO_STREAM(pp, p_params->output_bandwidth);
   1040   UINT8_TO_STREAM(pp, p_params->input_coding_format.coding_format);
   1041   UINT16_TO_STREAM(pp, p_params->input_coding_format.company_id);
   1042   UINT16_TO_STREAM(pp, p_params->input_coding_format.vendor_specific_codec_id);
   1043   UINT8_TO_STREAM(pp, p_params->output_coding_format.coding_format);
   1044   UINT16_TO_STREAM(pp, p_params->output_coding_format.company_id);
   1045   UINT16_TO_STREAM(pp, p_params->output_coding_format.vendor_specific_codec_id);
   1046   UINT16_TO_STREAM(pp, p_params->input_coded_data_size);
   1047   UINT16_TO_STREAM(pp, p_params->output_coded_data_size);
   1048   UINT8_TO_STREAM(pp, p_params->input_pcm_data_format);
   1049   UINT8_TO_STREAM(pp, p_params->output_pcm_data_format);
   1050   UINT8_TO_STREAM(pp, p_params->input_pcm_payload_msb_position);
   1051   UINT8_TO_STREAM(pp, p_params->output_pcm_payload_msb_position);
   1052   UINT8_TO_STREAM(pp, p_params->input_data_path);
   1053   UINT8_TO_STREAM(pp, p_params->output_data_path);
   1054   UINT8_TO_STREAM(pp, p_params->input_transport_unit_size);
   1055   UINT8_TO_STREAM(pp, p_params->output_transport_unit_size);
   1056   UINT16_TO_STREAM(pp, p_params->max_latency_ms);
   1057   UINT16_TO_STREAM(pp, p_params->packet_types);
   1058   UINT8_TO_STREAM(pp, p_params->retransmission_effort);
   1059 
   1060   btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
   1061 }
   1062 
   1063 void btsnd_hcic_enhanced_accept_synchronous_connection(
   1064     BD_ADDR bd_addr, enh_esco_params_t* p_params) {
   1065   BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
   1066   uint8_t* pp = (uint8_t*)(p + 1);
   1067 
   1068   p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_ENH_ACC_ESCO_CONN;
   1069   p->offset = 0;
   1070 
   1071   UINT16_TO_STREAM(pp, HCI_ENH_ACCEPT_ESCO_CONNECTION);
   1072   UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_ENH_ACC_ESCO_CONN);
   1073 
   1074   BDADDR_TO_STREAM(pp, bd_addr);
   1075   UINT32_TO_STREAM(pp, p_params->transmit_bandwidth);
   1076   UINT32_TO_STREAM(pp, p_params->receive_bandwidth);
   1077   UINT8_TO_STREAM(pp, p_params->transmit_coding_format.coding_format);
   1078   UINT16_TO_STREAM(pp, p_params->transmit_coding_format.company_id);
   1079   UINT16_TO_STREAM(pp,
   1080                    p_params->transmit_coding_format.vendor_specific_codec_id);
   1081   UINT8_TO_STREAM(pp, p_params->receive_coding_format.coding_format);
   1082   UINT16_TO_STREAM(pp, p_params->receive_coding_format.company_id);
   1083   UINT16_TO_STREAM(pp,
   1084                    p_params->receive_coding_format.vendor_specific_codec_id);
   1085   UINT16_TO_STREAM(pp, p_params->transmit_codec_frame_size);
   1086   UINT16_TO_STREAM(pp, p_params->receive_codec_frame_size);
   1087   UINT32_TO_STREAM(pp, p_params->input_bandwidth);
   1088   UINT32_TO_STREAM(pp, p_params->output_bandwidth);
   1089   UINT8_TO_STREAM(pp, p_params->input_coding_format.coding_format);
   1090   UINT16_TO_STREAM(pp, p_params->input_coding_format.company_id);
   1091   UINT16_TO_STREAM(pp, p_params->input_coding_format.vendor_specific_codec_id);
   1092   UINT8_TO_STREAM(pp, p_params->output_coding_format.coding_format);
   1093   UINT16_TO_STREAM(pp, p_params->output_coding_format.company_id);
   1094   UINT16_TO_STREAM(pp, p_params->output_coding_format.vendor_specific_codec_id);
   1095   UINT16_TO_STREAM(pp, p_params->input_coded_data_size);
   1096   UINT16_TO_STREAM(pp, p_params->output_coded_data_size);
   1097   UINT8_TO_STREAM(pp, p_params->input_pcm_data_format);
   1098   UINT8_TO_STREAM(pp, p_params->output_pcm_data_format);
   1099   UINT8_TO_STREAM(pp, p_params->input_pcm_payload_msb_position);
   1100   UINT8_TO_STREAM(pp, p_params->output_pcm_payload_msb_position);
   1101   UINT8_TO_STREAM(pp, p_params->input_data_path);
   1102   UINT8_TO_STREAM(pp, p_params->output_data_path);
   1103   UINT8_TO_STREAM(pp, p_params->input_transport_unit_size);
   1104   UINT8_TO_STREAM(pp, p_params->output_transport_unit_size);
   1105   UINT16_TO_STREAM(pp, p_params->max_latency_ms);
   1106   UINT16_TO_STREAM(pp, p_params->packet_types);
   1107   UINT8_TO_STREAM(pp, p_params->retransmission_effort);
   1108 
   1109   btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
   1110 }
   1111 
   1112 void btsnd_hcic_io_cap_req_neg_reply(BD_ADDR bd_addr, uint8_t err_code) {
   1113   BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
   1114   uint8_t* pp = (uint8_t*)(p + 1);
   1115 
   1116   p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_IO_CAP_NEG_REPLY;
   1117   p->offset = 0;
   1118 
   1119   UINT16_TO_STREAM(pp, HCI_IO_CAP_REQ_NEG_REPLY);
   1120   UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_IO_CAP_NEG_REPLY);
   1121 
   1122   BDADDR_TO_STREAM(pp, bd_addr);
   1123   UINT8_TO_STREAM(pp, err_code);
   1124 
   1125   btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
   1126 }
   1127 
   1128 void btsnd_hcic_read_local_oob_data(void) {
   1129   BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
   1130   uint8_t* pp = (uint8_t*)(p + 1);
   1131 
   1132   p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_R_LOCAL_OOB;
   1133   p->offset = 0;
   1134 
   1135   UINT16_TO_STREAM(pp, HCI_READ_LOCAL_OOB_DATA);
   1136   UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_R_LOCAL_OOB);
   1137 
   1138   btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
   1139 }
   1140 
   1141 void btsnd_hcic_user_conf_reply(BD_ADDR bd_addr, bool is_yes) {
   1142   BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
   1143   uint8_t* pp = (uint8_t*)(p + 1);
   1144 
   1145   p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_UCONF_REPLY;
   1146   p->offset = 0;
   1147 
   1148   if (!is_yes) {
   1149     /* Negative reply */
   1150     UINT16_TO_STREAM(pp, HCI_USER_CONF_VALUE_NEG_REPLY);
   1151   } else {
   1152     /* Confirmation */
   1153     UINT16_TO_STREAM(pp, HCI_USER_CONF_REQUEST_REPLY);
   1154   }
   1155 
   1156   UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_UCONF_REPLY);
   1157 
   1158   BDADDR_TO_STREAM(pp, bd_addr);
   1159 
   1160   btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
   1161 }
   1162 
   1163 void btsnd_hcic_user_passkey_reply(BD_ADDR bd_addr, uint32_t value) {
   1164   BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
   1165   uint8_t* pp = (uint8_t*)(p + 1);
   1166 
   1167   p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_U_PKEY_REPLY;
   1168   p->offset = 0;
   1169 
   1170   UINT16_TO_STREAM(pp, HCI_USER_PASSKEY_REQ_REPLY);
   1171   UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_U_PKEY_REPLY);
   1172 
   1173   BDADDR_TO_STREAM(pp, bd_addr);
   1174   UINT32_TO_STREAM(pp, value);
   1175 
   1176   btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
   1177 }
   1178 
   1179 void btsnd_hcic_user_passkey_neg_reply(BD_ADDR bd_addr) {
   1180   BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
   1181   uint8_t* pp = (uint8_t*)(p + 1);
   1182 
   1183   p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_U_PKEY_NEG_REPLY;
   1184   p->offset = 0;
   1185 
   1186   UINT16_TO_STREAM(pp, HCI_USER_PASSKEY_REQ_NEG_REPLY);
   1187   UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_U_PKEY_NEG_REPLY);
   1188 
   1189   BDADDR_TO_STREAM(pp, bd_addr);
   1190 
   1191   btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
   1192 }
   1193 
   1194 void btsnd_hcic_rem_oob_reply(BD_ADDR bd_addr, uint8_t* p_c, uint8_t* p_r) {
   1195   BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
   1196   uint8_t* pp = (uint8_t*)(p + 1);
   1197 
   1198   p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_REM_OOB_REPLY;
   1199   p->offset = 0;
   1200 
   1201   UINT16_TO_STREAM(pp, HCI_REM_OOB_DATA_REQ_REPLY);
   1202   UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_REM_OOB_REPLY);
   1203 
   1204   BDADDR_TO_STREAM(pp, bd_addr);
   1205   ARRAY16_TO_STREAM(pp, p_c);
   1206   ARRAY16_TO_STREAM(pp, p_r);
   1207 
   1208   btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
   1209 }
   1210 
   1211 void btsnd_hcic_rem_oob_neg_reply(BD_ADDR bd_addr) {
   1212   BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
   1213   uint8_t* pp = (uint8_t*)(p + 1);
   1214 
   1215   p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_REM_OOB_NEG_REPLY;
   1216   p->offset = 0;
   1217 
   1218   UINT16_TO_STREAM(pp, HCI_REM_OOB_DATA_REQ_NEG_REPLY);
   1219   UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_REM_OOB_NEG_REPLY);
   1220 
   1221   BDADDR_TO_STREAM(pp, bd_addr);
   1222 
   1223   btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
   1224 }
   1225 
   1226 void btsnd_hcic_read_inq_tx_power(void) {
   1227   BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
   1228   uint8_t* pp = (uint8_t*)(p + 1);
   1229 
   1230   p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_R_TX_POWER;
   1231   p->offset = 0;
   1232 
   1233   UINT16_TO_STREAM(pp, HCI_READ_INQ_TX_POWER_LEVEL);
   1234   UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_R_TX_POWER);
   1235 
   1236   btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
   1237 }
   1238 
   1239 void btsnd_hcic_send_keypress_notif(BD_ADDR bd_addr, uint8_t notif) {
   1240   BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
   1241   uint8_t* pp = (uint8_t*)(p + 1);
   1242 
   1243   p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_SEND_KEYPRESS_NOTIF;
   1244   p->offset = 0;
   1245 
   1246   UINT16_TO_STREAM(pp, HCI_SEND_KEYPRESS_NOTIF);
   1247   UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_SEND_KEYPRESS_NOTIF);
   1248 
   1249   BDADDR_TO_STREAM(pp, bd_addr);
   1250   UINT8_TO_STREAM(pp, notif);
   1251 
   1252   btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
   1253 }
   1254 
   1255 /**** end of Simple Pairing Commands ****/
   1256 
   1257 #if (L2CAP_NON_FLUSHABLE_PB_INCLUDED == TRUE)
   1258 void btsnd_hcic_enhanced_flush(uint16_t handle, uint8_t packet_type) {
   1259   BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
   1260   uint8_t* pp = (uint8_t*)(p + 1);
   1261 
   1262   p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_ENHANCED_FLUSH;
   1263   p->offset = 0;
   1264   UINT16_TO_STREAM(pp, HCI_ENHANCED_FLUSH);
   1265   UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_ENHANCED_FLUSH);
   1266 
   1267   UINT16_TO_STREAM(pp, handle);
   1268   UINT8_TO_STREAM(pp, packet_type);
   1269 
   1270   btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
   1271 }
   1272 #endif
   1273 
   1274 /*************************
   1275  * End of Lisbon Commands
   1276  *************************/
   1277 
   1278 void btsnd_hcic_get_link_quality(uint16_t handle) {
   1279   BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
   1280   uint8_t* pp = (uint8_t*)(p + 1);
   1281 
   1282   p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CMD_HANDLE;
   1283   p->offset = 0;
   1284 
   1285   UINT16_TO_STREAM(pp, HCI_GET_LINK_QUALITY);
   1286   UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_CMD_HANDLE);
   1287 
   1288   UINT16_TO_STREAM(pp, handle);
   1289 
   1290   btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
   1291 }
   1292 
   1293 void btsnd_hcic_read_rssi(uint16_t handle) {
   1294   BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
   1295   uint8_t* pp = (uint8_t*)(p + 1);
   1296 
   1297   p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CMD_HANDLE;
   1298   p->offset = 0;
   1299 
   1300   UINT16_TO_STREAM(pp, HCI_READ_RSSI);
   1301   UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_CMD_HANDLE);
   1302 
   1303   UINT16_TO_STREAM(pp, handle);
   1304 
   1305   btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
   1306 }
   1307 
   1308 void btsnd_hcic_enable_test_mode(void) {
   1309   BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
   1310   uint8_t* pp = (uint8_t*)(p + 1);
   1311 
   1312   p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_CMD;
   1313   p->offset = 0;
   1314 
   1315   UINT16_TO_STREAM(pp, HCI_ENABLE_DEV_UNDER_TEST_MODE);
   1316   UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_READ_CMD);
   1317 
   1318   btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
   1319 }
   1320 
   1321 void btsnd_hcic_write_inqscan_type(uint8_t type) {
   1322   BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
   1323   uint8_t* pp = (uint8_t*)(p + 1);
   1324 
   1325   p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PARAM1;
   1326   p->offset = 0;
   1327 
   1328   UINT16_TO_STREAM(pp, HCI_WRITE_INQSCAN_TYPE);
   1329   UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_WRITE_PARAM1);
   1330 
   1331   UINT8_TO_STREAM(pp, type);
   1332 
   1333   btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
   1334 }
   1335 
   1336 void btsnd_hcic_write_inquiry_mode(uint8_t mode) {
   1337   BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
   1338   uint8_t* pp = (uint8_t*)(p + 1);
   1339 
   1340   p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PARAM1;
   1341   p->offset = 0;
   1342 
   1343   UINT16_TO_STREAM(pp, HCI_WRITE_INQUIRY_MODE);
   1344   UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_WRITE_PARAM1);
   1345 
   1346   UINT8_TO_STREAM(pp, mode);
   1347 
   1348   btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
   1349 }
   1350 
   1351 void btsnd_hcic_write_pagescan_type(uint8_t type) {
   1352   BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
   1353   uint8_t* pp = (uint8_t*)(p + 1);
   1354 
   1355   p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PARAM1;
   1356   p->offset = 0;
   1357 
   1358   UINT16_TO_STREAM(pp, HCI_WRITE_PAGESCAN_TYPE);
   1359   UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_WRITE_PARAM1);
   1360 
   1361   UINT8_TO_STREAM(pp, type);
   1362 
   1363   btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
   1364 }
   1365 
   1366 /* Must have room to store BT_HDR + max VSC length + callback pointer */
   1367 #if (HCI_CMD_BUF_SIZE < 268)
   1368 #error "HCI_CMD_BUF_SIZE must be larger than 268"
   1369 #endif
   1370 
   1371 void btsnd_hcic_vendor_spec_cmd(void* buffer, uint16_t opcode, uint8_t len,
   1372                                 uint8_t* p_data, void* p_cmd_cplt_cback) {
   1373   BT_HDR* p = (BT_HDR*)buffer;
   1374   uint8_t* pp = (uint8_t*)(p + 1);
   1375 
   1376   p->len = HCIC_PREAMBLE_SIZE + len;
   1377   p->offset = sizeof(void*);
   1378 
   1379   *((void**)pp) =
   1380       p_cmd_cplt_cback; /* Store command complete callback in buffer */
   1381   pp += sizeof(void*);  /* Skip over callback pointer */
   1382 
   1383   UINT16_TO_STREAM(pp, HCI_GRP_VENDOR_SPECIFIC | opcode);
   1384   UINT8_TO_STREAM(pp, len);
   1385   ARRAY_TO_STREAM(pp, p_data, len);
   1386 
   1387   btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
   1388 }
   1389