15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************
25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Copyright (C) 1999-2012 Broadcom Corporation
45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Licensed under the Apache License, Version 2.0 (the "License");
65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  you may not use this file except in compliance with the License.
75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  You may obtain a copy of the License at:
85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  http://www.apache.org/licenses/LICENSE-2.0
105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  See the License for the specific language governing permissions and
155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  limitations under the License.
165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/
185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************
205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  This file contains functions that interface with the HCI transport. On
225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  the receive side, it routes events to the appropriate handler, e.g.
235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  L2CAP, ScoMgr. On the transmit side, it manages the command
245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  transmission.
255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/
275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton#define LOG_TAG "bt_btu_hcif"
2944802768c447ab480d4227b3a852a97d923b816dSharvil Nanavati
302b7e9058076f1b6afde219b4d7a36368ca97d7fcAjay Panicker#include <base/bind.h>
31dabf8d36c6a6896953fff4a12365716d438f173aJakub Pawlowski#include <base/callback.h>
32dabf8d36c6a6896953fff4a12365716d438f173aJakub Pawlowski#include <base/location.h>
33f2af1c42ccb2f642b241c2261b42d0be61d45438Jack He#include <base/logging.h>
342b7e9058076f1b6afde219b4d7a36368ca97d7fcAjay Panicker#include <base/threading/thread.h>
3549a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen#include <stdio.h>
365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <stdlib.h>
375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h>
385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
39911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#include "bt_common.h"
405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_types.h"
4149a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen#include "bt_utils.h"
425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_api.h"
435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_int.h"
4449a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen#include "btu.h"
45911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#include "device/include/controller.h"
4649a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen#include "hci_layer.h"
4749a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen#include "hcimsgs.h"
4849a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen#include "l2c_int.h"
49911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#include "osi/include/log.h"
50911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#include "osi/include/osi.h"
51218f375e989a6189cd9a3227656be17bf614485bZach Johnson
52dabf8d36c6a6896953fff4a12365716d438f173aJakub Pawlowskiusing tracked_objects::Location;
53dabf8d36c6a6896953fff4a12365716d438f173aJakub Pawlowski
54d19e0785e662e640191a075eda07acce61c2aedaMarie Janssenextern void btm_process_cancel_complete(uint8_t status, uint8_t mode);
55911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonextern void btm_ble_test_command_complete(uint8_t* p);
5622c6e505dc65ab3d624e4ccd7c48c95fe2128703Kévin PETIT
57ee96a3c60fca590d38025925c072d264e06493c4Myles Watson/******************************************************************************/
589ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson/*            L O C A L    F U N C T I O N     P R O T O T Y P E S            */
59ee96a3c60fca590d38025925c072d264e06493c4Myles Watson/******************************************************************************/
60911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_inquiry_comp_evt(uint8_t* p);
61911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_inquiry_result_evt(uint8_t* p);
62911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_inquiry_rssi_result_evt(uint8_t* p);
63911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_extended_inquiry_result_evt(uint8_t* p);
64911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
65911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_connection_comp_evt(uint8_t* p);
66911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_connection_request_evt(uint8_t* p);
67911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_disconnection_comp_evt(uint8_t* p);
68911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_authentication_comp_evt(uint8_t* p);
69911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_rmt_name_request_comp_evt(uint8_t* p, uint16_t evt_len);
70911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_encryption_change_evt(uint8_t* p);
71911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_read_rmt_features_comp_evt(uint8_t* p);
72911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_read_rmt_ext_features_comp_evt(uint8_t* p);
73911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_read_rmt_version_comp_evt(uint8_t* p);
74911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_qos_setup_comp_evt(uint8_t* p);
75911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_command_complete_evt(BT_HDR* response, void* context);
76911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_command_status_evt(uint8_t status, BT_HDR* command,
77911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                        void* context);
78911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_hardware_error_evt(uint8_t* p);
79911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_flush_occured_evt(void);
80911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_role_change_evt(uint8_t* p);
81911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_num_compl_data_pkts_evt(uint8_t* p);
82911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_mode_change_evt(uint8_t* p);
83911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_pin_code_request_evt(uint8_t* p);
84911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_link_key_request_evt(uint8_t* p);
85911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_link_key_notification_evt(uint8_t* p);
86911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_loopback_command_evt(void);
87911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_data_buf_overflow_evt(void);
88911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_max_slots_changed_evt(void);
89911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_read_clock_off_comp_evt(uint8_t* p);
90911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_conn_pkt_type_change_evt(void);
91911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_qos_violation_evt(uint8_t* p);
92911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_page_scan_mode_change_evt(void);
93911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_page_scan_rep_mode_chng_evt(void);
94911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_esco_connection_comp_evt(uint8_t* p);
95911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_esco_connection_chg_evt(uint8_t* p);
965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* Simple Pairing Events */
98911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_host_support_evt(uint8_t* p);
99911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_io_cap_request_evt(uint8_t* p);
100911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_io_cap_response_evt(uint8_t* p);
101911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_user_conf_request_evt(uint8_t* p);
102911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_user_passkey_request_evt(uint8_t* p);
103911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_user_passkey_notif_evt(uint8_t* p);
104911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_keypress_notif_evt(uint8_t* p);
105911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_rem_oob_request_evt(uint8_t* p);
106911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
107911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_simple_pair_complete_evt(uint8_t* p);
108bdd2f5001ffc7c53f0e38c2a98e393b1855f9ce6Myles Watson#if L2CAP_NON_FLUSHABLE_PB_INCLUDED == TRUE
109911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_enhanced_flush_complete_evt(void);
110911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#endif
111911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
112bdd2f5001ffc7c53f0e38c2a98e393b1855f9ce6Myles Watson#if (BTM_SSR_INCLUDED == TRUE)
113911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_ssr_evt(uint8_t* p, uint16_t evt_len);
114911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#endif /* BTM_SSR_INCLUDED == TRUE */
115911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
116911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_ble_ll_conn_complete_evt(uint8_t* p, uint16_t evt_len);
117911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_ble_read_remote_feat_evt(uint8_t* p);
118911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_ble_ll_conn_param_upd_evt(uint8_t* p, uint16_t evt_len);
119911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_ble_proc_ltk_req(uint8_t* p);
120911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_encryption_key_refresh_cmpl_evt(uint8_t* p);
121911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_ble_data_length_change_evt(uint8_t* p, uint16_t evt_len);
1227fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#if (BLE_LLT_INCLUDED == TRUE)
123911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_ble_rc_param_req_evt(uint8_t* p);
1247fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif
125d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (BLE_PRIVACY_SPT == TRUE)
126911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_ble_proc_enhanced_conn_cmpl(uint8_t* p, uint16_t evt_len);
127444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif
128444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1292b7e9058076f1b6afde219b4d7a36368ca97d7fcAjay Panickerstatic void do_in_hci_thread(const tracked_objects::Location& from_here,
1302b7e9058076f1b6afde219b4d7a36368ca97d7fcAjay Panicker                             const base::Closure& task) {
1312b7e9058076f1b6afde219b4d7a36368ca97d7fcAjay Panicker  base::MessageLoop* hci_message_loop = get_message_loop();
1322b7e9058076f1b6afde219b4d7a36368ca97d7fcAjay Panicker  if (!hci_message_loop || !hci_message_loop->task_runner().get()) {
1332b7e9058076f1b6afde219b4d7a36368ca97d7fcAjay Panicker    LOG_ERROR(LOG_TAG, "%s: HCI message loop not running, accessed from %s",
1342b7e9058076f1b6afde219b4d7a36368ca97d7fcAjay Panicker              __func__, from_here.ToString().c_str());
1352b7e9058076f1b6afde219b4d7a36368ca97d7fcAjay Panicker    return;
1362b7e9058076f1b6afde219b4d7a36368ca97d7fcAjay Panicker  }
1372b7e9058076f1b6afde219b4d7a36368ca97d7fcAjay Panicker
1382b7e9058076f1b6afde219b4d7a36368ca97d7fcAjay Panicker  hci_message_loop->task_runner()->PostTask(from_here, task);
1392b7e9058076f1b6afde219b4d7a36368ca97d7fcAjay Panicker}
1402b7e9058076f1b6afde219b4d7a36368ca97d7fcAjay Panicker
1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
142ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
143ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btu_hcif_process_event
144ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
145ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is called when an event is received from
146ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  the Host Controller.
147ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
148ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
149ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
150ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
151911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btu_hcif_process_event(UNUSED_ATTR uint8_t controller_id, BT_HDR* p_msg) {
152911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* p = (uint8_t*)(p_msg + 1) + p_msg->offset;
153911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t hci_evt_code, hci_evt_len;
154911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t ble_sub_code;
155911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT8(hci_evt_code, p);
156911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT8(hci_evt_len, p);
157911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
158911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  switch (hci_evt_code) {
159911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case HCI_INQUIRY_COMP_EVT:
160911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btu_hcif_inquiry_comp_evt(p);
161911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
162911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case HCI_INQUIRY_RESULT_EVT:
163911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btu_hcif_inquiry_result_evt(p);
164911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
165911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case HCI_INQUIRY_RSSI_RESULT_EVT:
166911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btu_hcif_inquiry_rssi_result_evt(p);
167911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
168911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case HCI_EXTENDED_INQUIRY_RESULT_EVT:
169911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btu_hcif_extended_inquiry_result_evt(p);
170911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
171911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case HCI_CONNECTION_COMP_EVT:
172911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btu_hcif_connection_comp_evt(p);
173911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
174911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case HCI_CONNECTION_REQUEST_EVT:
175911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btu_hcif_connection_request_evt(p);
176911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
177911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case HCI_DISCONNECTION_COMP_EVT:
178911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btu_hcif_disconnection_comp_evt(p);
179911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
180911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case HCI_AUTHENTICATION_COMP_EVT:
181911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btu_hcif_authentication_comp_evt(p);
182911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
183911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case HCI_RMT_NAME_REQUEST_COMP_EVT:
184911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btu_hcif_rmt_name_request_comp_evt(p, hci_evt_len);
185911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
186911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case HCI_ENCRYPTION_CHANGE_EVT:
187911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btu_hcif_encryption_change_evt(p);
188911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
189911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case HCI_ENCRYPTION_KEY_REFRESH_COMP_EVT:
190911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btu_hcif_encryption_key_refresh_cmpl_evt(p);
191911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
192911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case HCI_READ_RMT_FEATURES_COMP_EVT:
193911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btu_hcif_read_rmt_features_comp_evt(p);
194911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
195911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case HCI_READ_RMT_EXT_FEATURES_COMP_EVT:
196911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btu_hcif_read_rmt_ext_features_comp_evt(p);
197911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
198911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case HCI_READ_RMT_VERSION_COMP_EVT:
199911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btu_hcif_read_rmt_version_comp_evt(p);
200911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
201911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case HCI_QOS_SETUP_COMP_EVT:
202911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btu_hcif_qos_setup_comp_evt(p);
203911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
204911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case HCI_COMMAND_COMPLETE_EVT:
205911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      LOG_ERROR(LOG_TAG,
206911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                "%s should not have received a command complete event. "
207911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                "Someone didn't go through the hci transmit_command function.",
208911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                __func__);
209911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
210911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case HCI_COMMAND_STATUS_EVT:
211911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      LOG_ERROR(LOG_TAG,
212911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                "%s should not have received a command status event. "
213911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                "Someone didn't go through the hci transmit_command function.",
214911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                __func__);
215911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
216911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case HCI_HARDWARE_ERROR_EVT:
217911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btu_hcif_hardware_error_evt(p);
218911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
219911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case HCI_FLUSH_OCCURED_EVT:
220911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btu_hcif_flush_occured_evt();
221911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
222911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case HCI_ROLE_CHANGE_EVT:
223911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btu_hcif_role_change_evt(p);
224911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
225911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case HCI_NUM_COMPL_DATA_PKTS_EVT:
226911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btu_hcif_num_compl_data_pkts_evt(p);
227911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
228911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case HCI_MODE_CHANGE_EVT:
229911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btu_hcif_mode_change_evt(p);
230911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
231911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case HCI_PIN_CODE_REQUEST_EVT:
232911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btu_hcif_pin_code_request_evt(p);
233911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
234911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case HCI_LINK_KEY_REQUEST_EVT:
235911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btu_hcif_link_key_request_evt(p);
236911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
237911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case HCI_LINK_KEY_NOTIFICATION_EVT:
238911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btu_hcif_link_key_notification_evt(p);
239911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
240911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case HCI_LOOPBACK_COMMAND_EVT:
241911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btu_hcif_loopback_command_evt();
242911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
243911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case HCI_DATA_BUF_OVERFLOW_EVT:
244911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btu_hcif_data_buf_overflow_evt();
245911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
246911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case HCI_MAX_SLOTS_CHANGED_EVT:
247911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btu_hcif_max_slots_changed_evt();
248911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
249911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case HCI_READ_CLOCK_OFF_COMP_EVT:
250911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btu_hcif_read_clock_off_comp_evt(p);
251911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
252911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case HCI_CONN_PKT_TYPE_CHANGE_EVT:
253911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btu_hcif_conn_pkt_type_change_evt();
254911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
255911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case HCI_QOS_VIOLATION_EVT:
256911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btu_hcif_qos_violation_evt(p);
257911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
258911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case HCI_PAGE_SCAN_MODE_CHANGE_EVT:
259911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btu_hcif_page_scan_mode_change_evt();
260911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
261911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case HCI_PAGE_SCAN_REP_MODE_CHNG_EVT:
262911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btu_hcif_page_scan_rep_mode_chng_evt();
263911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
264911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case HCI_ESCO_CONNECTION_COMP_EVT:
265911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btu_hcif_esco_connection_comp_evt(p);
266911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
267911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case HCI_ESCO_CONNECTION_CHANGED_EVT:
268911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btu_hcif_esco_connection_chg_evt(p);
269911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_SSR_INCLUDED == TRUE)
271911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case HCI_SNIFF_SUB_RATE_EVT:
272911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btu_hcif_ssr_evt(p, hci_evt_len);
273911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
274911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#endif /* BTM_SSR_INCLUDED == TRUE */
275911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case HCI_RMT_HOST_SUP_FEAT_NOTIFY_EVT:
276911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btu_hcif_host_support_evt(p);
277911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
278911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case HCI_IO_CAPABILITY_REQUEST_EVT:
279911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btu_hcif_io_cap_request_evt(p);
280911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
281911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case HCI_IO_CAPABILITY_RESPONSE_EVT:
282911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btu_hcif_io_cap_response_evt(p);
283911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
284911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case HCI_USER_CONFIRMATION_REQUEST_EVT:
285911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btu_hcif_user_conf_request_evt(p);
286911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
287911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case HCI_USER_PASSKEY_REQUEST_EVT:
288911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btu_hcif_user_passkey_request_evt(p);
289911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
290911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case HCI_REMOTE_OOB_DATA_REQUEST_EVT:
291911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btu_hcif_rem_oob_request_evt(p);
292911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
293911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case HCI_SIMPLE_PAIRING_COMPLETE_EVT:
294911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btu_hcif_simple_pair_complete_evt(p);
295911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
296911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case HCI_USER_PASSKEY_NOTIFY_EVT:
297911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btu_hcif_user_passkey_notif_evt(p);
298911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
299911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case HCI_KEYPRESS_NOTIFY_EVT:
300911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btu_hcif_keypress_notif_evt(p);
301911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
302d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (L2CAP_NON_FLUSHABLE_PB_INCLUDED == TRUE)
303911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case HCI_ENHANCED_FLUSH_COMPLETE_EVT:
304911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btu_hcif_enhanced_flush_complete_evt();
305911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
308eafd45d08653bb1621c82a2f3cf922a43a0b1bc5Jakub Pawlowski    case HCI_BLE_EVENT: {
309911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      STREAM_TO_UINT8(ble_sub_code, p);
310911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
311911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      HCI_TRACE_EVENT("BLE HCI(id=%d) event = 0x%02x)", hci_evt_code,
312911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                      ble_sub_code);
313911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
314eafd45d08653bb1621c82a2f3cf922a43a0b1bc5Jakub Pawlowski      uint8_t ble_evt_len = hci_evt_len - 1;
315911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      switch (ble_sub_code) {
316911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        case HCI_BLE_ADV_PKT_RPT_EVT: /* result of inquiry */
3179e3005684fe9fa592630d685e9cceb71cd27dfe7Jakub Pawlowski          HCI_TRACE_EVENT("HCI_BLE_ADV_PKT_RPT_EVT");
318eafd45d08653bb1621c82a2f3cf922a43a0b1bc5Jakub Pawlowski          btm_ble_process_adv_pkt(ble_evt_len, p);
319911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          break;
320911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        case HCI_BLE_CONN_COMPLETE_EVT:
321911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          btu_ble_ll_conn_complete_evt(p, hci_evt_len);
322911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          break;
323911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        case HCI_BLE_LL_CONN_PARAM_UPD_EVT:
324911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          btu_ble_ll_conn_param_upd_evt(p, hci_evt_len);
325911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          break;
326911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        case HCI_BLE_READ_REMOTE_FEAT_CMPL_EVT:
327911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          btu_ble_read_remote_feat_evt(p);
328911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          break;
329911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        case HCI_BLE_LTK_REQ_EVT: /* received only at slave device */
330911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          btu_ble_proc_ltk_req(p);
331911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          break;
332d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (BLE_PRIVACY_SPT == TRUE)
333911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        case HCI_BLE_ENHANCED_CONN_COMPLETE_EVT:
334911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          btu_ble_proc_enhanced_conn_cmpl(p, hci_evt_len);
335911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          break;
336444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif
3377fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#if (BLE_LLT_INCLUDED == TRUE)
338911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        case HCI_BLE_RC_PARAM_REQ_EVT:
339911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          btu_ble_rc_param_req_evt(p);
340911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          break;
3417fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif
342911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        case HCI_BLE_DATA_LENGTH_CHANGE_EVT:
343911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          btu_ble_data_length_change_evt(p, hci_evt_len);
344911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          break;
345751381c64fee63590f0888c8eac5c8a474f1e25bJakub Pawlowski
3465a475e71a01322367a2ba591aecd62781902cfc2Avish Shah        case HCI_BLE_PHY_UPDATE_COMPLETE_EVT:
347eafd45d08653bb1621c82a2f3cf922a43a0b1bc5Jakub Pawlowski          btm_ble_process_phy_update_pkt(ble_evt_len, p);
348eafd45d08653bb1621c82a2f3cf922a43a0b1bc5Jakub Pawlowski          break;
349eafd45d08653bb1621c82a2f3cf922a43a0b1bc5Jakub Pawlowski
350801db30048049a63869587af4b89a6e5a4dabb9bJakub Pawlowski        case HCI_LE_EXTENDED_ADVERTISING_REPORT_EVT:
351801db30048049a63869587af4b89a6e5a4dabb9bJakub Pawlowski          btm_ble_process_ext_adv_pkt(hci_evt_len, p);
352801db30048049a63869587af4b89a6e5a4dabb9bJakub Pawlowski          break;
353801db30048049a63869587af4b89a6e5a4dabb9bJakub Pawlowski
354751381c64fee63590f0888c8eac5c8a474f1e25bJakub Pawlowski        case HCI_LE_ADVERTISING_SET_TERMINATED_EVT:
355751381c64fee63590f0888c8eac5c8a474f1e25bJakub Pawlowski          btm_le_on_advertising_set_terminated(p, hci_evt_len);
356751381c64fee63590f0888c8eac5c8a474f1e25bJakub Pawlowski          break;
357911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      }
358911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
359eafd45d08653bb1621c82a2f3cf922a43a0b1bc5Jakub Pawlowski    }
360eafd45d08653bb1621c82a2f3cf922a43a0b1bc5Jakub Pawlowski
361911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case HCI_VENDOR_SPECIFIC_EVT:
362911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btm_vendor_specific_evt(p, hci_evt_len);
363911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
364911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
368ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
369ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btu_hcif_send_cmd
370ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
3719ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description      This function is called to send commands to the Host
3729ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *                  Controller.
373ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
374ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
375ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
376ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
377911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btu_hcif_send_cmd(UNUSED_ATTR uint8_t controller_id, BT_HDR* p_buf) {
378911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (!p_buf) return;
379911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
380911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint16_t opcode;
381911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* stream = p_buf->data + p_buf->offset;
382911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  void* vsc_callback = NULL;
383911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
384911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT16(opcode, stream);
385911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
386911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  // Eww...horrible hackery here
387911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* If command was a VSC, then extract command_complete callback */
388911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if ((opcode & HCI_GRP_VENDOR_SPECIFIC) == HCI_GRP_VENDOR_SPECIFIC ||
389911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      (opcode == HCI_BLE_RAND) || (opcode == HCI_BLE_ENCRYPT)) {
390911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    vsc_callback = *((void**)(p_buf + 1));
391911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
392911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
393911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  hci_layer_get_interface()->transmit_command(
394911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_buf, btu_hcif_command_complete_evt, btu_hcif_command_status_evt,
395218f375e989a6189cd9a3227656be17bf614485bZach Johnson      vsc_callback);
3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
398dabf8d36c6a6896953fff4a12365716d438f173aJakub Pawlowskiusing hci_cmd_cb = base::Callback<void(uint8_t* /* return_parameters */,
399dabf8d36c6a6896953fff4a12365716d438f173aJakub Pawlowski                                       uint16_t /* return_parameters_length*/)>;
400dabf8d36c6a6896953fff4a12365716d438f173aJakub Pawlowski
401dabf8d36c6a6896953fff4a12365716d438f173aJakub Pawlowskistruct cmd_with_cb_data {
402dabf8d36c6a6896953fff4a12365716d438f173aJakub Pawlowski  hci_cmd_cb cb;
403dabf8d36c6a6896953fff4a12365716d438f173aJakub Pawlowski  Location posted_from;
404dabf8d36c6a6896953fff4a12365716d438f173aJakub Pawlowski};
405dabf8d36c6a6896953fff4a12365716d438f173aJakub Pawlowski
406dabf8d36c6a6896953fff4a12365716d438f173aJakub Pawlowskivoid cmd_with_cb_data_init(cmd_with_cb_data* cb_wrapper) {
407dabf8d36c6a6896953fff4a12365716d438f173aJakub Pawlowski  new (&cb_wrapper->cb) hci_cmd_cb;
408dabf8d36c6a6896953fff4a12365716d438f173aJakub Pawlowski  new (&cb_wrapper->posted_from) Location;
409dabf8d36c6a6896953fff4a12365716d438f173aJakub Pawlowski}
410dabf8d36c6a6896953fff4a12365716d438f173aJakub Pawlowski
411dabf8d36c6a6896953fff4a12365716d438f173aJakub Pawlowskivoid cmd_with_cb_data_cleanup(cmd_with_cb_data* cb_wrapper) {
412dabf8d36c6a6896953fff4a12365716d438f173aJakub Pawlowski  cb_wrapper->cb.~hci_cmd_cb();
413dabf8d36c6a6896953fff4a12365716d438f173aJakub Pawlowski  cb_wrapper->posted_from.~Location();
414dabf8d36c6a6896953fff4a12365716d438f173aJakub Pawlowski}
415d964cf944e23470d696177fb2ddf8df3684290b8Jakub Pawlowski
4162b7e9058076f1b6afde219b4d7a36368ca97d7fcAjay Panickerstatic void btu_hcif_command_complete_evt_with_cb_on_task(BT_HDR* event,
4172b7e9058076f1b6afde219b4d7a36368ca97d7fcAjay Panicker                                                          void* context) {
418911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  command_opcode_t opcode;
419911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* stream =
4202b7e9058076f1b6afde219b4d7a36368ca97d7fcAjay Panicker      event->data + event->offset +
421911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      3;  // 2 to skip the event headers, 1 to skip the command credits
422911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT16(opcode, stream);
423d964cf944e23470d696177fb2ddf8df3684290b8Jakub Pawlowski
4242b7e9058076f1b6afde219b4d7a36368ca97d7fcAjay Panicker  cmd_with_cb_data* cb_wrapper = (cmd_with_cb_data*)context;
425dabf8d36c6a6896953fff4a12365716d438f173aJakub Pawlowski  HCI_TRACE_DEBUG("command complete for: %s",
426dabf8d36c6a6896953fff4a12365716d438f173aJakub Pawlowski                  cb_wrapper->posted_from.ToString().c_str());
4272b7e9058076f1b6afde219b4d7a36368ca97d7fcAjay Panicker  cb_wrapper->cb.Run(stream, event->len - 5);
428dabf8d36c6a6896953fff4a12365716d438f173aJakub Pawlowski  cmd_with_cb_data_cleanup(cb_wrapper);
429dabf8d36c6a6896953fff4a12365716d438f173aJakub Pawlowski  osi_free(cb_wrapper);
430d964cf944e23470d696177fb2ddf8df3684290b8Jakub Pawlowski
431911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  osi_free(event);
432d964cf944e23470d696177fb2ddf8df3684290b8Jakub Pawlowski}
433d964cf944e23470d696177fb2ddf8df3684290b8Jakub Pawlowski
434911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_command_complete_evt_with_cb(BT_HDR* response,
435911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                                  void* context) {
4362b7e9058076f1b6afde219b4d7a36368ca97d7fcAjay Panicker  do_in_hci_thread(FROM_HERE,
4372b7e9058076f1b6afde219b4d7a36368ca97d7fcAjay Panicker                   base::Bind(btu_hcif_command_complete_evt_with_cb_on_task,
4382b7e9058076f1b6afde219b4d7a36368ca97d7fcAjay Panicker                              response, context));
439d964cf944e23470d696177fb2ddf8df3684290b8Jakub Pawlowski}
440d964cf944e23470d696177fb2ddf8df3684290b8Jakub Pawlowski
4412b7e9058076f1b6afde219b4d7a36368ca97d7fcAjay Panickerstatic void btu_hcif_command_status_evt_with_cb_on_task(uint8_t status,
4422b7e9058076f1b6afde219b4d7a36368ca97d7fcAjay Panicker                                                        BT_HDR* event,
4432b7e9058076f1b6afde219b4d7a36368ca97d7fcAjay Panicker                                                        void* context) {
444911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  command_opcode_t opcode;
4452b7e9058076f1b6afde219b4d7a36368ca97d7fcAjay Panicker  uint8_t* stream = event->data + event->offset;
446911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT16(opcode, stream);
447d964cf944e23470d696177fb2ddf8df3684290b8Jakub Pawlowski
4482b7e9058076f1b6afde219b4d7a36368ca97d7fcAjay Panicker  CHECK(status != 0);
449dabf8d36c6a6896953fff4a12365716d438f173aJakub Pawlowski
450911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  // report command status error
4512b7e9058076f1b6afde219b4d7a36368ca97d7fcAjay Panicker  cmd_with_cb_data* cb_wrapper = (cmd_with_cb_data*)context;
452dabf8d36c6a6896953fff4a12365716d438f173aJakub Pawlowski  HCI_TRACE_DEBUG("command status for: %s",
453dabf8d36c6a6896953fff4a12365716d438f173aJakub Pawlowski                  cb_wrapper->posted_from.ToString().c_str());
4542b7e9058076f1b6afde219b4d7a36368ca97d7fcAjay Panicker  cb_wrapper->cb.Run(&status, sizeof(uint16_t));
455dabf8d36c6a6896953fff4a12365716d438f173aJakub Pawlowski  cmd_with_cb_data_cleanup(cb_wrapper);
456dabf8d36c6a6896953fff4a12365716d438f173aJakub Pawlowski  osi_free(cb_wrapper);
457d964cf944e23470d696177fb2ddf8df3684290b8Jakub Pawlowski
458911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  osi_free(event);
459d964cf944e23470d696177fb2ddf8df3684290b8Jakub Pawlowski}
460d964cf944e23470d696177fb2ddf8df3684290b8Jakub Pawlowski
461911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_command_status_evt_with_cb(uint8_t status, BT_HDR* command,
462911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                                void* context) {
463911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  // Command is pending, we  report only error.
464911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (!status) {
465911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    osi_free(command);
466911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return;
467911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
468d964cf944e23470d696177fb2ddf8df3684290b8Jakub Pawlowski
4692b7e9058076f1b6afde219b4d7a36368ca97d7fcAjay Panicker  do_in_hci_thread(
4702b7e9058076f1b6afde219b4d7a36368ca97d7fcAjay Panicker      FROM_HERE, base::Bind(btu_hcif_command_status_evt_with_cb_on_task, status,
4712b7e9058076f1b6afde219b4d7a36368ca97d7fcAjay Panicker                            command, context));
472d964cf944e23470d696177fb2ddf8df3684290b8Jakub Pawlowski}
473d964cf944e23470d696177fb2ddf8df3684290b8Jakub Pawlowski
474d964cf944e23470d696177fb2ddf8df3684290b8Jakub Pawlowski/* This function is called to send commands to the Host Controller. |cb| is
475d964cf944e23470d696177fb2ddf8df3684290b8Jakub Pawlowski * called when command status event is called with error code, or when the
476d964cf944e23470d696177fb2ddf8df3684290b8Jakub Pawlowski * command complete event is received. */
477dabf8d36c6a6896953fff4a12365716d438f173aJakub Pawlowskivoid btu_hcif_send_cmd_with_cb(const tracked_objects::Location& posted_from,
478dabf8d36c6a6896953fff4a12365716d438f173aJakub Pawlowski                               uint16_t opcode, uint8_t* params,
479dabf8d36c6a6896953fff4a12365716d438f173aJakub Pawlowski                               uint8_t params_len, hci_cmd_cb cb) {
480911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
481911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* pp = (uint8_t*)(p + 1);
482d964cf944e23470d696177fb2ddf8df3684290b8Jakub Pawlowski
483d964cf944e23470d696177fb2ddf8df3684290b8Jakub Pawlowski  p->len = HCIC_PREAMBLE_SIZE + params_len;
484d964cf944e23470d696177fb2ddf8df3684290b8Jakub Pawlowski  p->offset = 0;
485d964cf944e23470d696177fb2ddf8df3684290b8Jakub Pawlowski
4860c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski  UINT16_TO_STREAM(pp, opcode);
4870c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski  UINT8_TO_STREAM(pp, params_len);
488d964cf944e23470d696177fb2ddf8df3684290b8Jakub Pawlowski  if (params) {
489d964cf944e23470d696177fb2ddf8df3684290b8Jakub Pawlowski    memcpy(pp, params, params_len);
490d964cf944e23470d696177fb2ddf8df3684290b8Jakub Pawlowski  }
491d964cf944e23470d696177fb2ddf8df3684290b8Jakub Pawlowski
492dabf8d36c6a6896953fff4a12365716d438f173aJakub Pawlowski  cmd_with_cb_data* cb_wrapper =
493dabf8d36c6a6896953fff4a12365716d438f173aJakub Pawlowski      (cmd_with_cb_data*)osi_malloc(sizeof(cmd_with_cb_data));
494dabf8d36c6a6896953fff4a12365716d438f173aJakub Pawlowski
495dabf8d36c6a6896953fff4a12365716d438f173aJakub Pawlowski  cmd_with_cb_data_init(cb_wrapper);
496dabf8d36c6a6896953fff4a12365716d438f173aJakub Pawlowski  cb_wrapper->cb = cb;
497dabf8d36c6a6896953fff4a12365716d438f173aJakub Pawlowski  cb_wrapper->posted_from = posted_from;
498dabf8d36c6a6896953fff4a12365716d438f173aJakub Pawlowski
499d964cf944e23470d696177fb2ddf8df3684290b8Jakub Pawlowski  hci_layer_get_interface()->transmit_command(
500d964cf944e23470d696177fb2ddf8df3684290b8Jakub Pawlowski      p, btu_hcif_command_complete_evt_with_cb,
501dabf8d36c6a6896953fff4a12365716d438f173aJakub Pawlowski      btu_hcif_command_status_evt_with_cb, (void*)cb_wrapper);
502d964cf944e23470d696177fb2ddf8df3684290b8Jakub Pawlowski}
503d964cf944e23470d696177fb2ddf8df3684290b8Jakub Pawlowski
5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
505ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
506ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btu_hcif_inquiry_comp_evt
507ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
508ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      Process event HCI_INQUIRY_COMP_EVT
509ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
510ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
511ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
512ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
513911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_inquiry_comp_evt(uint8_t* p) {
514911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t status;
5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
516911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT8(status, p);
5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
518911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* Tell inquiry processing that we are done */
519911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btm_process_inq_complete(status, BTM_BR_INQUIRY_MASK);
5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
523ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
524ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btu_hcif_inquiry_result_evt
525ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
526ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      Process event HCI_INQUIRY_RESULT_EVT
527ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
528ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
529ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
530ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
531911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_inquiry_result_evt(uint8_t* p) {
532911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* Store results in the cache */
533911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btm_process_inq_results(p, BTM_INQ_RESULT_STANDARD);
5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
537ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
538ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btu_hcif_inquiry_rssi_result_evt
539ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
540ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      Process event HCI_INQUIRY_RSSI_RESULT_EVT
541ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
542ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
543ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
544ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
545911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_inquiry_rssi_result_evt(uint8_t* p) {
546911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* Store results in the cache */
547911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btm_process_inq_results(p, BTM_INQ_RESULT_WITH_RSSI);
5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
551ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
552ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btu_hcif_extended_inquiry_result_evt
553ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
554ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      Process event HCI_EXTENDED_INQUIRY_RESULT_EVT
555ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
556ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
557ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
558ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
559911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_extended_inquiry_result_evt(uint8_t* p) {
560911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* Store results in the cache */
561911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btm_process_inq_results(p, BTM_INQ_RESULT_EXTENDED);
5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
565ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
566ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btu_hcif_connection_comp_evt
567ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
568ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      Process event HCI_CONNECTION_COMP_EVT
569ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
570ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
571ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
572ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
573911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_connection_comp_evt(uint8_t* p) {
574911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t status;
575911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint16_t handle;
576a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowski  RawAddress bda;
577911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t link_type;
578911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t enc_mode;
579d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (BTM_SCO_INCLUDED == TRUE)
580911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_ESCO_DATA esco_data;
5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
5825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
583911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT8(status, p);
584911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT16(handle, p);
585b8a477e9ac51898b05cb328eda897d95f1ef3d02Jakub Pawlowski  STREAM_TO_BDADDR(bda, p);
586911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT8(link_type, p);
587911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT8(enc_mode, p);
5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
589911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  handle = HCID_GET_HANDLE(handle);
5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
591911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (link_type == HCI_LINK_TYPE_ACL) {
592911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    btm_sec_connected(bda, handle, status, enc_mode);
5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
594911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    l2c_link_hci_conn_comp(status, handle, bda);
595911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
596d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (BTM_SCO_INCLUDED == TRUE)
597911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  else {
598911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    memset(&esco_data, 0, sizeof(tBTM_ESCO_DATA));
599911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* esco_data.link_type = HCI_LINK_TYPE_SCO; already zero */
600c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski    esco_data.bd_addr = bda;
601c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski    btm_sco_connected(status, &bda, handle, &esco_data);
602911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* BTM_SCO_INCLUDED */
6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
607ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
608ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btu_hcif_connection_request_evt
609ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
610ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      Process event HCI_CONNECTION_REQUEST_EVT
611ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
612ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
613ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
614ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
615911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_connection_request_evt(uint8_t* p) {
616a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowski  RawAddress bda;
617911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  DEV_CLASS dc;
618911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t link_type;
619911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
620b8a477e9ac51898b05cb328eda897d95f1ef3d02Jakub Pawlowski  STREAM_TO_BDADDR(bda, p);
621911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_DEVCLASS(dc, p);
622911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT8(link_type, p);
623911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
624911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* Pass request to security manager to check connect filters before */
625911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* passing request to l2cap */
626911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (link_type == HCI_LINK_TYPE_ACL) {
627911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    btm_sec_conn_req(bda, dc);
628911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
629d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (BTM_SCO_INCLUDED == TRUE)
630911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  else {
631911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    btm_sco_conn_req(bda, dc, link_type);
632911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* BTM_SCO_INCLUDED */
6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
637ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
638ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btu_hcif_disconnection_comp_evt
639ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
640ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      Process event HCI_DISCONNECTION_COMP_EVT
641ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
642ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
643ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
644ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
645911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_disconnection_comp_evt(uint8_t* p) {
646911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint16_t handle;
647911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t reason;
6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
649911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  ++p;
650911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT16(handle, p);
651911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT8(reason, p);
6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
653911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  handle = HCID_GET_HANDLE(handle);
6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
655d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (BTM_SCO_INCLUDED == TRUE)
656911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* If L2CAP doesn't know about it, send it to SCO */
657911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (!l2c_link_hci_disc_comp(handle, reason)) btm_sco_removed(handle, reason);
6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
659911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  l2c_link_hci_disc_comp(handle, reason);
6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* BTM_SCO_INCLUDED */
6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
662911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* Notify security manager */
663911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btm_sec_disconnected(handle, reason);
6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
667ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
668ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btu_hcif_authentication_comp_evt
669ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
670ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      Process event HCI_AUTHENTICATION_COMP_EVT
671ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
672ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
673ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
674ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
675911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_authentication_comp_evt(uint8_t* p) {
676911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t status;
677911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint16_t handle;
6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
679911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT8(status, p);
680911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT16(handle, p);
6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
682911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btm_sec_auth_complete(handle, status);
6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
686ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
687ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btu_hcif_rmt_name_request_comp_evt
688ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
689ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      Process event HCI_RMT_NAME_REQUEST_COMP_EVT
690ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
691ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
692ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
693ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
694911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_rmt_name_request_comp_evt(uint8_t* p, uint16_t evt_len) {
695911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t status;
696a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowski  RawAddress bd_addr;
6975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
698911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT8(status, p);
699b8a477e9ac51898b05cb328eda897d95f1ef3d02Jakub Pawlowski  STREAM_TO_BDADDR(bd_addr, p);
7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
701911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  evt_len -= (1 + BD_ADDR_LEN);
7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
703c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski  btm_process_remote_name(&bd_addr, p, evt_len, status);
7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
705c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski  btm_sec_rmt_name_request_complete(&bd_addr, p, status);
7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
709ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
710ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btu_hcif_encryption_change_evt
711ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
712ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      Process event HCI_ENCRYPTION_CHANGE_EVT
713ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
714ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
715ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
716ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
717911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_encryption_change_evt(uint8_t* p) {
718911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t status;
719911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint16_t handle;
720911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t encr_enable;
721911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
722911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT8(status, p);
723911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT16(handle, p);
724911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT8(encr_enable, p);
725911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
726911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btm_acl_encrypt_change(handle, status, encr_enable);
727911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btm_sec_encrypt_change(handle, status, encr_enable);
7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
731ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
732ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btu_hcif_read_rmt_features_comp_evt
733ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
734ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      Process event HCI_READ_RMT_FEATURES_COMP_EVT
735ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
736ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
737ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
738ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
739911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_read_rmt_features_comp_evt(uint8_t* p) {
740911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btm_read_remote_features_complete(p);
7415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
744ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
745ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btu_hcif_read_rmt_ext_features_comp_evt
746ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
747ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      Process event HCI_READ_RMT_EXT_FEATURES_COMP_EVT
748ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
749ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
750ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
751ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
752911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_read_rmt_ext_features_comp_evt(uint8_t* p) {
753911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* p_cur = p;
754911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t status;
755911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint16_t handle;
756911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
757911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT8(status, p_cur);
758911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
759911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (status == HCI_SUCCESS)
760911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    btm_read_remote_ext_features_complete(p);
761911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  else {
762911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    STREAM_TO_UINT16(handle, p_cur);
763911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    btm_read_remote_ext_features_failed(status, handle);
764911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
7655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
768ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
769ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btu_hcif_read_rmt_version_comp_evt
770ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
771ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      Process event HCI_READ_RMT_VERSION_COMP_EVT
772ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
773ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
774ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
775ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
776911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_read_rmt_version_comp_evt(uint8_t* p) {
777911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btm_read_remote_version_complete(p);
7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
781ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
782ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btu_hcif_qos_setup_comp_evt
783ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
784ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      Process event HCI_QOS_SETUP_COMP_EVT
785ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
786ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
787ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
788ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
789911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_qos_setup_comp_evt(uint8_t* p) {
790911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t status;
791911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint16_t handle;
792911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  FLOW_SPEC flow;
793911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
794911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT8(status, p);
795911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT16(handle, p);
796911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT8(flow.qos_flags, p);
797911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT8(flow.service_type, p);
798911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT32(flow.token_rate, p);
799911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT32(flow.peak_bandwidth, p);
800911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT32(flow.latency, p);
801911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT32(flow.delay_variation, p);
802911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
803911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btm_qos_setup_complete(status, handle, &flow);
8045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
8055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
807ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
808ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btu_hcif_esco_connection_comp_evt
809ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
810ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      Process event HCI_ESCO_CONNECTION_COMP_EVT
811ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
812ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
813ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
814ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
815911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_esco_connection_comp_evt(uint8_t* p) {
816d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (BTM_SCO_INCLUDED == TRUE)
817911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_ESCO_DATA data;
818911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint16_t handle;
819a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowski  RawAddress bda;
820911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t status;
821911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
822911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT8(status, p);
823911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT16(handle, p);
824b8a477e9ac51898b05cb328eda897d95f1ef3d02Jakub Pawlowski  STREAM_TO_BDADDR(bda, p);
825911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
826911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT8(data.link_type, p);
827911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT8(data.tx_interval, p);
828911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT8(data.retrans_window, p);
829911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT16(data.rx_pkt_len, p);
830911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT16(data.tx_pkt_len, p);
831911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT8(data.air_mode, p);
832911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
833c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski  data.bd_addr = bda;
834c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski  btm_sco_connected(status, &bda, handle, &data);
8355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
8365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
8375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
839ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
840ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btu_hcif_esco_connection_chg_evt
841ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
842ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      Process event HCI_ESCO_CONNECTION_CHANGED_EVT
843ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
844ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
845ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
846ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
847911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_esco_connection_chg_evt(uint8_t* p) {
848d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (BTM_SCO_INCLUDED == TRUE)
849911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint16_t handle;
850911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint16_t tx_pkt_len;
851911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint16_t rx_pkt_len;
852911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t status;
853911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t tx_interval;
854911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t retrans_window;
855911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
856911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT8(status, p);
857911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT16(handle, p);
858911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
859911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT8(tx_interval, p);
860911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT8(retrans_window, p);
861911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT16(rx_pkt_len, p);
862911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT16(tx_pkt_len, p);
863911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
864911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btm_esco_proc_conn_chg(status, handle, tx_interval, retrans_window,
865911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                         rx_pkt_len, tx_pkt_len);
8665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
8675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
8685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
870ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
871ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btu_hcif_hdl_command_complete
872ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
873ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      Handle command complete event
874ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
875ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
876ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
877ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
878911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_hdl_command_complete(uint16_t opcode, uint8_t* p,
879911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                          uint16_t evt_len,
880911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                          void* p_cplt_cback) {
881911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  switch (opcode) {
882911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case HCI_INQUIRY_CANCEL:
883911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      /* Tell inquiry processing that we are done */
884911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btm_process_cancel_complete(HCI_SUCCESS, BTM_BR_INQUIRY_MASK);
885911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
886911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case HCI_SET_EVENT_FILTER:
887911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btm_event_filter_complete(p);
888911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
889911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
890911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case HCI_DELETE_STORED_LINK_KEY:
891911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btm_delete_stored_link_key_complete(p);
892911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
893911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
894911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case HCI_READ_LOCAL_NAME:
895911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btm_read_local_name_complete(p, evt_len);
896911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
897911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
898911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case HCI_GET_LINK_QUALITY:
899911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btm_read_link_quality_complete(p);
900911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
901911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
902911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case HCI_READ_RSSI:
903911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btm_read_rssi_complete(p);
904911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
905911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
9064820b2a6e69a8c13a2d57c8b7d41ba3b6d6471d2Pavlin Radoslavov    case HCI_READ_FAILED_CONTACT_COUNTER:
9074820b2a6e69a8c13a2d57c8b7d41ba3b6d6471d2Pavlin Radoslavov      btm_read_failed_contact_counter_complete(p);
9084820b2a6e69a8c13a2d57c8b7d41ba3b6d6471d2Pavlin Radoslavov      break;
9094820b2a6e69a8c13a2d57c8b7d41ba3b6d6471d2Pavlin Radoslavov
910ecb6c72a1d06dbcbd0e5c07628b572c5f22a5f1dPavlin Radoslavov    case HCI_READ_AUTOMATIC_FLUSH_TIMEOUT:
911ecb6c72a1d06dbcbd0e5c07628b572c5f22a5f1dPavlin Radoslavov      btm_read_automatic_flush_timeout_complete(p);
912ecb6c72a1d06dbcbd0e5c07628b572c5f22a5f1dPavlin Radoslavov      break;
913ecb6c72a1d06dbcbd0e5c07628b572c5f22a5f1dPavlin Radoslavov
914911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case HCI_READ_TRANSMIT_POWER_LEVEL:
915911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btm_read_tx_power_complete(p, false);
916911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
917911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
918911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case HCI_CREATE_CONNECTION_CANCEL:
919911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btm_create_conn_cancel_complete(p);
920911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
921911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
922911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case HCI_READ_LOCAL_OOB_DATA:
923911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btm_read_local_oob_complete(p);
924911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
925911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
926911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case HCI_READ_INQ_TX_POWER_LEVEL:
927911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btm_read_inq_tx_power_complete(p);
928911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
929911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
930911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* BLE Commands sComplete*/
931911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case HCI_BLE_ADD_WHITE_LIST:
932911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btm_ble_add_2_white_list_complete(*p);
933911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
934911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
935911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case HCI_BLE_CLEAR_WHITE_LIST:
936911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btm_ble_clear_white_list_complete(p, evt_len);
937911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
938911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
939911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case HCI_BLE_REMOVE_WHITE_LIST:
940911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btm_ble_remove_from_white_list_complete(p, evt_len);
941911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
942911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
943911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case HCI_BLE_RAND:
944911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case HCI_BLE_ENCRYPT:
945911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btm_ble_rand_enc_complete(p, opcode, (tBTM_RAND_ENC_CB*)p_cplt_cback);
946911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
947911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
948911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case HCI_BLE_READ_ADV_CHNL_TX_POWER:
949911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btm_read_tx_power_complete(p, true);
950911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
951911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
952911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case HCI_BLE_WRITE_ADV_ENABLE:
953911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btm_ble_write_adv_enable_complete(p);
954911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
955911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
956911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case HCI_BLE_CREATE_LL_CONN:
957911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btm_ble_create_ll_conn_complete(*p);
958911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
959911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
960911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case HCI_BLE_TRANSMITTER_TEST:
961911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case HCI_BLE_RECEIVER_TEST:
962911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case HCI_BLE_TEST_END:
963911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btm_ble_test_command_complete(p);
964911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
965444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
966d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (BLE_PRIVACY_SPT == TRUE)
967911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case HCI_BLE_ADD_DEV_RESOLVING_LIST:
968911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btm_ble_add_resolving_list_entry_complete(p, evt_len);
969911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
970911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
971911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case HCI_BLE_RM_DEV_RESOLVING_LIST:
972911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btm_ble_remove_resolving_list_entry_complete(p, evt_len);
973911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
974911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
975911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case HCI_BLE_CLEAR_RESOLVING_LIST:
976911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btm_ble_clear_resolving_list_complete(p, evt_len);
977911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
978911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
979911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case HCI_BLE_READ_RESOLVABLE_ADDR_PEER:
980911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btm_ble_read_resolving_list_entry_complete(p, evt_len);
981911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
982911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
983911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case HCI_BLE_READ_RESOLVABLE_ADDR_LOCAL:
984911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case HCI_BLE_SET_ADDR_RESOLUTION_ENABLE:
985911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case HCI_BLE_SET_RAND_PRIV_ADDR_TIMOUT:
986911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
987444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif
988911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    default:
989911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      if ((opcode & HCI_GRP_VENDOR_SPECIFIC) == HCI_GRP_VENDOR_SPECIFIC)
990911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        btm_vsc_complete(p, opcode, evt_len, (tBTM_CMPL_CB*)p_cplt_cback);
991911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
992911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
9935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
9945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
996ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
997ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btu_hcif_command_complete_evt
998ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
999ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      Process event HCI_COMMAND_COMPLETE_EVT
1000ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1001ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
1002ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1003ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
10042b7e9058076f1b6afde219b4d7a36368ca97d7fcAjay Panickerstatic void btu_hcif_command_complete_evt_on_task(BT_HDR* event,
10052b7e9058076f1b6afde219b4d7a36368ca97d7fcAjay Panicker                                                  void* context) {
1006911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  command_opcode_t opcode;
1007911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* stream =
10082b7e9058076f1b6afde219b4d7a36368ca97d7fcAjay Panicker      event->data + event->offset +
1009911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      3;  // 2 to skip the event headers, 1 to skip the command credits
1010911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT16(opcode, stream);
1011911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1012911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btu_hcif_hdl_command_complete(
1013911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      opcode, stream,
10142b7e9058076f1b6afde219b4d7a36368ca97d7fcAjay Panicker      event->len -
1015911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          5,  // 3 for the command complete headers, 2 for the event headers
10162b7e9058076f1b6afde219b4d7a36368ca97d7fcAjay Panicker      context);
10175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1018911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  osi_free(event);
1019218f375e989a6189cd9a3227656be17bf614485bZach Johnson}
10205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1021911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_command_complete_evt(BT_HDR* response, void* context) {
10222b7e9058076f1b6afde219b4d7a36368ca97d7fcAjay Panicker  do_in_hci_thread(FROM_HERE, base::Bind(btu_hcif_command_complete_evt_on_task,
10232b7e9058076f1b6afde219b4d7a36368ca97d7fcAjay Panicker                                         response, context));
10245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
10255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1027ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1028ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btu_hcif_hdl_command_status
1029ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1030ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      Handle a command status event
1031ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1032ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
1033ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1034ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1035911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_hdl_command_status(uint16_t opcode, uint8_t status,
1036911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                        uint8_t* p_cmd,
1037911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                        void* p_vsc_status_cback) {
1038a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowski  RawAddress bd_addr;
1039911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint16_t handle;
1040d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (BTM_SCO_INCLUDED == TRUE)
1041911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_ESCO_DATA esco_data;
10425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
10435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1044911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  switch (opcode) {
1045911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case HCI_EXIT_SNIFF_MODE:
1046911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case HCI_EXIT_PARK_MODE:
1047d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (BTM_SCO_WAKE_PARKED_LINK == TRUE)
1048911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      if (status != HCI_SUCCESS) {
1049911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        /* Allow SCO initiation to continue if waiting for change mode event */
1050911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        if (p_cmd != NULL) {
1051911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          p_cmd++; /* bypass length field */
1052911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          STREAM_TO_UINT16(handle, p_cmd);
1053911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          btm_sco_chk_pend_unpark(status, handle);
1054911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        }
1055911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      }
10565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
1057911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* Case Falls Through */
1058911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1059911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case HCI_HOLD_MODE:
1060911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case HCI_SNIFF_MODE:
1061911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case HCI_PARK_MODE:
1062911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btm_pm_proc_cmd_status(status);
1063911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      break;
1064911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1065911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    default:
1066911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      /* If command failed to start, we may need to tell BTM */
1067911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      if (status != HCI_SUCCESS) {
1068911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        switch (opcode) {
1069911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          case HCI_INQUIRY:
1070911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            /* Tell inquiry processing that we are done */
1071911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            btm_process_inq_complete(status, BTM_BR_INQUIRY_MASK);
1072911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            break;
10735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1074911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          case HCI_RMT_NAME_REQUEST:
1075911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            /* Tell inquiry processing that we are done */
1076911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            btm_process_remote_name(NULL, NULL, 0, status);
1077911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1078911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            btm_sec_rmt_name_request_complete(NULL, NULL, status);
10795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
10805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1081911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          case HCI_QOS_SETUP_COMP_EVT:
1082911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            /* Tell qos setup that we are done */
1083911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            btm_qos_setup_complete(status, 0, NULL);
1084911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            break;
1085911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1086911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          case HCI_SWITCH_ROLE:
1087911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            /* Tell BTM that the command failed */
1088911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            /* read bd addr out of stored command */
1089911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            if (p_cmd != NULL) {
1090911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson              p_cmd++;
1091b8a477e9ac51898b05cb328eda897d95f1ef3d02Jakub Pawlowski              STREAM_TO_BDADDR(bd_addr, p_cmd);
1092c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski              btm_acl_role_changed(status, &bd_addr, BTM_ROLE_UNDEFINED);
1093911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            } else
1094911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson              btm_acl_role_changed(status, NULL, BTM_ROLE_UNDEFINED);
1095c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski            l2c_link_role_changed(nullptr, BTM_ROLE_UNDEFINED,
1096911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                  HCI_ERR_COMMAND_DISALLOWED);
1097911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            break;
1098911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1099911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          case HCI_CREATE_CONNECTION:
1100911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            /* read bd addr out of stored command */
1101911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            if (p_cmd != NULL) {
1102911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson              p_cmd++;
1103b8a477e9ac51898b05cb328eda897d95f1ef3d02Jakub Pawlowski              STREAM_TO_BDADDR(bd_addr, p_cmd);
1104911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson              btm_sec_connected(bd_addr, HCI_INVALID_HANDLE, status, 0);
1105911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson              l2c_link_hci_conn_comp(status, HCI_INVALID_HANDLE, bd_addr);
1106911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            }
1107911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            break;
1108911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1109911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          case HCI_READ_RMT_EXT_FEATURES:
1110911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            if (p_cmd != NULL) {
1111911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson              p_cmd++; /* skip command length */
1112911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson              STREAM_TO_UINT16(handle, p_cmd);
1113911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            } else
1114911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson              handle = HCI_INVALID_HANDLE;
1115911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1116911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            btm_read_remote_ext_features_failed(status, handle);
1117911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            break;
1118911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1119911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          case HCI_AUTHENTICATION_REQUESTED:
1120911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            /* Device refused to start authentication.  That should be treated
1121911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson             * as authentication failure. */
1122911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            btm_sec_auth_complete(BTM_INVALID_HCI_HANDLE, status);
1123911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            break;
1124911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1125911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          case HCI_SET_CONN_ENCRYPTION:
1126911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            /* Device refused to start encryption.  That should be treated as
1127911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson             * encryption failure. */
1128911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            btm_sec_encrypt_change(BTM_INVALID_HCI_HANDLE, status, false);
1129911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            break;
1130911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1131911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          case HCI_BLE_CREATE_LL_CONN:
1132911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            btm_ble_create_ll_conn_complete(status);
1133911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            break;
113424adb37e4106bf8544c7729d34451fdf2777c4dcPriti Aghera
1135d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (BTM_SCO_INCLUDED == TRUE)
1136911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          case HCI_SETUP_ESCO_CONNECTION:
113757f6508cf7b22788fa2e7a739cec241b785718fbMudumba Ananth          case HCI_ENH_SETUP_ESCO_CONNECTION:
1138911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            /* read handle out of stored command */
1139911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            if (p_cmd != NULL) {
1140911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson              p_cmd++;
1141911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson              STREAM_TO_UINT16(handle, p_cmd);
1142911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
114357f6508cf7b22788fa2e7a739cec241b785718fbMudumba Ananth              /* Determine if initial connection failed or is a change
114457f6508cf7b22788fa2e7a739cec241b785718fbMudumba Ananth               * of setup */
1145911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson              if (btm_is_sco_active(handle))
1146911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                btm_esco_proc_conn_chg(status, handle, 0, 0, 0, 0);
1147911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson              else
1148911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                btm_sco_connected(status, NULL, handle, &esco_data);
1149911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            }
1150911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            break;
11515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
11525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1153911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          /* This is commented out until an upper layer cares about returning
1154911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          event
1155911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          #if (L2CAP_NON_FLUSHABLE_PB_INCLUDED == TRUE)
1156911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                      case HCI_ENHANCED_FLUSH:
1157911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                          break;
1158911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          #endif
1159911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          */
1160911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          default:
1161911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            if ((opcode & HCI_GRP_VENDOR_SPECIFIC) == HCI_GRP_VENDOR_SPECIFIC)
1162911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson              btm_vsc_complete(&status, opcode, 1,
1163911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                               (tBTM_CMPL_CB*)p_vsc_status_cback);
1164911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            break;
1165911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        }
11665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1167911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      } else {
1168911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        if ((opcode & HCI_GRP_VENDOR_SPECIFIC) == HCI_GRP_VENDOR_SPECIFIC)
1169911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          btm_vsc_complete(&status, opcode, 1,
1170911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                           (tBTM_CMPL_CB*)p_vsc_status_cback);
1171911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      }
1172911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
11735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
11745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1176ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1177ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btu_hcif_command_status_evt
1178ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1179ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      Process event HCI_COMMAND_STATUS_EVT
1180ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1181ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
1182ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1183ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
11842b7e9058076f1b6afde219b4d7a36368ca97d7fcAjay Panickerstatic void btu_hcif_command_status_evt_on_task(uint8_t status, BT_HDR* event,
11852b7e9058076f1b6afde219b4d7a36368ca97d7fcAjay Panicker                                                void* context) {
1186911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  command_opcode_t opcode;
11872b7e9058076f1b6afde219b4d7a36368ca97d7fcAjay Panicker  uint8_t* stream = event->data + event->offset;
1188911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT16(opcode, stream);
1189911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
11902b7e9058076f1b6afde219b4d7a36368ca97d7fcAjay Panicker  btu_hcif_hdl_command_status(opcode, status, stream, context);
1191911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  osi_free(event);
11925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
11935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1194911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_command_status_evt(uint8_t status, BT_HDR* command,
1195911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                        void* context) {
11962b7e9058076f1b6afde219b4d7a36368ca97d7fcAjay Panicker  do_in_hci_thread(FROM_HERE, base::Bind(btu_hcif_command_status_evt_on_task,
11972b7e9058076f1b6afde219b4d7a36368ca97d7fcAjay Panicker                                         status, command, context));
11985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
11995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1201ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1202ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btu_hcif_hardware_error_evt
1203ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1204ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      Process event HCI_HARDWARE_ERROR_EVT
1205ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1206ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
1207ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1208ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1209911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_hardware_error_evt(uint8_t* p) {
1210911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  HCI_TRACE_ERROR("Ctlr H/w error event - code:0x%x", *p);
12115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1212911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* If anyone wants device status notifications, give him one. */
1213911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btm_report_device_status(BTM_DEV_STATUS_DOWN);
12145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1215911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* Reset the controller */
1216911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (BTM_IsDeviceUp()) BTM_DeviceReset(NULL);
12175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
12185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1220ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1221ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btu_hcif_flush_occured_evt
1222ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1223ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      Process event HCI_FLUSH_OCCURED_EVT
1224ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1225ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
1226ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1227ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1228911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_flush_occured_evt(void) {}
12295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1231ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1232ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btu_hcif_role_change_evt
1233ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1234ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      Process event HCI_ROLE_CHANGE_EVT
1235ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1236ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
1237ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1238ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1239911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_role_change_evt(uint8_t* p) {
1240911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t status;
1241a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowski  RawAddress bda;
1242911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t role;
1243911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1244911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT8(status, p);
1245b8a477e9ac51898b05cb328eda897d95f1ef3d02Jakub Pawlowski  STREAM_TO_BDADDR(bda, p);
1246911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT8(role, p);
1247911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1248942648ef5a4b25508cc9ffe7073ddab5e04a9ab4Srinu Jella  btm_blacklist_role_change_device(bda, status);
1249c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski  l2c_link_role_changed(&bda, role, status);
1250c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski  btm_acl_role_changed(status, &bda, role);
12515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
12525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1254ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1255ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btu_hcif_num_compl_data_pkts_evt
1256ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1257ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      Process event HCI_NUM_COMPL_DATA_PKTS_EVT
1258ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1259ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
1260ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1261ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1262911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_num_compl_data_pkts_evt(uint8_t* p) {
1263911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* Process for L2CAP and SCO */
1264911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  l2c_link_process_num_completed_pkts(p);
12655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1266911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* Send on to SCO */
1267911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /*?? No SCO for now */
12685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
12695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1271ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1272ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btu_hcif_mode_change_evt
1273ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1274ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      Process event HCI_MODE_CHANGE_EVT
1275ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1276ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
1277ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1278ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1279911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_mode_change_evt(uint8_t* p) {
1280911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t status;
1281911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint16_t handle;
1282911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t current_mode;
1283911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint16_t interval;
1284911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1285911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT8(status, p);
1286911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1287911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT16(handle, p);
1288911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT8(current_mode, p);
1289911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT16(interval, p);
1290d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (BTM_SCO_WAKE_PARKED_LINK == TRUE)
1291911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btm_sco_chk_pend_unpark(status, handle);
12925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
1293911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btm_pm_proc_mode_change(status, handle, current_mode, interval);
12945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1295d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (HID_DEV_INCLUDED == TRUE && HID_DEV_PM_INCLUDED == TRUE)
1296911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  hidd_pm_proc_mode_change(status, current_mode, interval);
12975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
12985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
12995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1301ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1302ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btu_hcif_ssr_evt
1303ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1304ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      Process event HCI_SNIFF_SUB_RATE_EVT
1305ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1306ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
1307ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1308ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1309bdd2f5001ffc7c53f0e38c2a98e393b1855f9ce6Myles Watson#if (BTM_SSR_INCLUDED == TRUE)
1310911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_ssr_evt(uint8_t* p, uint16_t evt_len) {
1311911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btm_pm_proc_ssr_evt(p, evt_len);
13125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1313911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#endif
13145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1316ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1317ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btu_hcif_pin_code_request_evt
1318ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1319ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      Process event HCI_PIN_CODE_REQUEST_EVT
1320ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1321ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
1322ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1323ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1324911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_pin_code_request_evt(uint8_t* p) {
1325a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowski  RawAddress bda;
13265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1327b8a477e9ac51898b05cb328eda897d95f1ef3d02Jakub Pawlowski  STREAM_TO_BDADDR(bda, p);
13285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1329911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* Tell L2CAP that there was a PIN code request,  */
1330911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* it may need to stretch timeouts                */
1331911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  l2c_pin_code_request(bda);
13325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1333911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btm_sec_pin_code_request(bda);
13345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
13355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1337ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1338ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btu_hcif_link_key_request_evt
1339ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1340ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      Process event HCI_LINK_KEY_REQUEST_EVT
1341ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1342ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
1343ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1344ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1345911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_link_key_request_evt(uint8_t* p) {
1346a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowski  RawAddress bda;
13475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1348b8a477e9ac51898b05cb328eda897d95f1ef3d02Jakub Pawlowski  STREAM_TO_BDADDR(bda, p);
1349911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btm_sec_link_key_request(bda);
13505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
13515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1353ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1354ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btu_hcif_link_key_notification_evt
1355ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1356ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      Process event HCI_LINK_KEY_NOTIFICATION_EVT
1357ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1358ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
1359ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1360ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1361911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_link_key_notification_evt(uint8_t* p) {
1362a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowski  RawAddress bda;
1363911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  LINK_KEY key;
1364911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t key_type;
13655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1366b8a477e9ac51898b05cb328eda897d95f1ef3d02Jakub Pawlowski  STREAM_TO_BDADDR(bda, p);
1367911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_ARRAY16(key, p);
1368911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT8(key_type, p);
13695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1370911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btm_sec_link_key_notification(bda, key, key_type);
13715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
13725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1374ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1375ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btu_hcif_loopback_command_evt
1376ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1377ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      Process event HCI_LOOPBACK_COMMAND_EVT
1378ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1379ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
1380ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1381ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1382911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_loopback_command_evt(void) {}
13835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1385ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1386ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btu_hcif_data_buf_overflow_evt
1387ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1388ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      Process event HCI_DATA_BUF_OVERFLOW_EVT
1389ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1390ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
1391ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1392ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1393911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_data_buf_overflow_evt(void) {}
13945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1396ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1397ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btu_hcif_max_slots_changed_evt
1398ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1399ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      Process event HCI_MAX_SLOTS_CHANGED_EVT
1400ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1401ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
1402ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1403ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1404911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_max_slots_changed_evt(void) {}
14055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1407ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1408ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btu_hcif_read_clock_off_comp_evt
1409ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1410ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      Process event HCI_READ_CLOCK_OFF_COMP_EVT
1411ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1412ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
1413ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1414ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1415911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_read_clock_off_comp_evt(uint8_t* p) {
1416911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t status;
1417911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint16_t handle;
1418911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint16_t clock_offset;
14195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1420911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT8(status, p);
14215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1422911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* If failed to get clock offset just drop the result */
1423911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (status != HCI_SUCCESS) return;
14245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1425911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT16(handle, p);
1426911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT16(clock_offset, p);
14275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1428911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  handle = HCID_GET_HANDLE(handle);
14295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1430911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btm_process_clk_off_comp_evt(handle, clock_offset);
1431911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btm_sec_update_clock_offset(handle, clock_offset);
14325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
14335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1435ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1436ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btu_hcif_conn_pkt_type_change_evt
1437ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1438ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      Process event HCI_CONN_PKT_TYPE_CHANGE_EVT
1439ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1440ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
1441ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1442ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1443911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_conn_pkt_type_change_evt(void) {}
14445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1446ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1447ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btu_hcif_qos_violation_evt
1448ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1449ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      Process event HCI_QOS_VIOLATION_EVT
1450ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1451ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
1452ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1453ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1454911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_qos_violation_evt(uint8_t* p) {
1455911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint16_t handle;
14565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1457911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT16(handle, p);
14585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1459911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  handle = HCID_GET_HANDLE(handle);
14605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1461911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  l2c_link_hci_qos_violation(handle);
14625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
14635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1465ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1466ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btu_hcif_page_scan_mode_change_evt
1467ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1468ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      Process event HCI_PAGE_SCAN_MODE_CHANGE_EVT
1469ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1470ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
1471ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1472ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1473911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_page_scan_mode_change_evt(void) {}
14745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1476ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1477ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btu_hcif_page_scan_rep_mode_chng_evt
1478ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1479ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      Process event HCI_PAGE_SCAN_REP_MODE_CHNG_EVT
1480ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1481ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
1482ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1483ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1484911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_page_scan_rep_mode_chng_evt(void) {}
14855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/**********************************************
1487ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Simple Pairing Events
1488ee96a3c60fca590d38025925c072d264e06493c4Myles Watson **********************************************/
14895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1491ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1492ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btu_hcif_host_support_evt
1493ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1494ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      Process event HCI_RMT_HOST_SUP_FEAT_NOTIFY_EVT
1495ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1496ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
1497ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1498ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1499911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_host_support_evt(uint8_t* p) {
1500911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btm_sec_rmt_host_support_feat_evt(p);
15015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
15025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1504ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1505ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btu_hcif_io_cap_request_evt
1506ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1507ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      Process event HCI_IO_CAPABILITY_REQUEST_EVT
1508ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1509ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
1510ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1511ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1512911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_io_cap_request_evt(uint8_t* p) {
1513a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowski  RawAddress bda;
1514b8a477e9ac51898b05cb328eda897d95f1ef3d02Jakub Pawlowski  STREAM_TO_BDADDR(bda, p);
1515c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski  btm_io_capabilities_req(bda);
15165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
15175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1519ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1520ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btu_hcif_io_cap_response_evt
1521ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1522ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      Process event HCI_IO_CAPABILITY_RESPONSE_EVT
1523ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1524ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
1525ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1526ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1527911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_io_cap_response_evt(uint8_t* p) {
1528911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btm_io_capabilities_rsp(p);
15295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
15305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1532ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1533ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btu_hcif_user_conf_request_evt
1534ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1535ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      Process event HCI_USER_CONFIRMATION_REQUEST_EVT
1536ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1537ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
1538ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1539ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1540911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_user_conf_request_evt(uint8_t* p) {
1541911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btm_proc_sp_req_evt(BTM_SP_CFM_REQ_EVT, p);
15425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
15435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1545ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1546ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btu_hcif_user_passkey_request_evt
1547ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1548ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      Process event HCI_USER_PASSKEY_REQUEST_EVT
1549ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1550ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
1551ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1552ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1553911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_user_passkey_request_evt(uint8_t* p) {
1554911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btm_proc_sp_req_evt(BTM_SP_KEY_REQ_EVT, p);
15555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
15565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1558ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1559ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btu_hcif_user_passkey_notif_evt
1560ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1561ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      Process event HCI_USER_PASSKEY_NOTIFY_EVT
1562ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1563ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
1564ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1565ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1566911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_user_passkey_notif_evt(uint8_t* p) {
1567911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btm_proc_sp_req_evt(BTM_SP_KEY_NOTIF_EVT, p);
15685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
15695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1571ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1572ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btu_hcif_keypress_notif_evt
1573ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1574ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      Process event HCI_KEYPRESS_NOTIFY_EVT
1575ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1576ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
1577ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1578ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1579911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_keypress_notif_evt(uint8_t* p) {
1580911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btm_keypress_notif_evt(p);
15815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
15825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1584ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1585ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btu_hcif_rem_oob_request_evt
1586ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1587ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      Process event HCI_REMOTE_OOB_DATA_REQUEST_EVT
1588ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1589ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
1590ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1591ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1592911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_rem_oob_request_evt(uint8_t* p) { btm_rem_oob_req(p); }
15935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1595ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1596ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btu_hcif_simple_pair_complete_evt
1597ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1598ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      Process event HCI_SIMPLE_PAIRING_COMPLETE_EVT
1599ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1600ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
1601ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1602ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1603911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_simple_pair_complete_evt(uint8_t* p) {
1604911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btm_simple_pair_complete(p);
16055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
16065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1608ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1609ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btu_hcif_enhanced_flush_complete_evt
1610ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1611ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      Process event HCI_ENHANCED_FLUSH_COMPLETE_EVT
1612ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1613ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
1614ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1615ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1616d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (L2CAP_NON_FLUSHABLE_PB_INCLUDED == TRUE)
1617911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_enhanced_flush_complete_evt(void) {
1618911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* This is empty until an upper layer cares about returning event */
16195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
16205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
16215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/**********************************************
1622ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * End of Simple Pairing Events
1623ee96a3c60fca590d38025925c072d264e06493c4Myles Watson **********************************************/
16245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/**********************************************
1626ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BLE Events
1627ee96a3c60fca590d38025925c072d264e06493c4Myles Watson **********************************************/
1628911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_hcif_encryption_key_refresh_cmpl_evt(uint8_t* p) {
1629911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t status;
1630911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t enc_enable = 0;
1631911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint16_t handle;
16325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1633911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT8(status, p);
1634911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT16(handle, p);
16355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1636911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (status == HCI_SUCCESS) enc_enable = 1;
1637ad839868b5aed781ba54af620e439e5c96ee019aAndre Eisenbach
1638911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btm_sec_encrypt_change(handle, status, enc_enable);
16395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
16405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1641911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_ble_ll_conn_complete_evt(uint8_t* p, uint16_t evt_len) {
1642911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btm_ble_conn_complete(p, evt_len, false);
16435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1644d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (BLE_PRIVACY_SPT == TRUE)
1645911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_ble_proc_enhanced_conn_cmpl(uint8_t* p, uint16_t evt_len) {
1646911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btm_ble_conn_complete(p, evt_len, true);
1647444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
1648444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif
1649b5ba4fdbc433544de3806f8e82976898e444b491Jakub Pawlowski
1650b5ba4fdbc433544de3806f8e82976898e444b491Jakub Pawlowskiextern void gatt_notify_conn_update(uint16_t handle, uint16_t interval,
1651b5ba4fdbc433544de3806f8e82976898e444b491Jakub Pawlowski                                    uint16_t latency, uint16_t timeout,
1652b5ba4fdbc433544de3806f8e82976898e444b491Jakub Pawlowski                                    uint8_t status);
1653b5ba4fdbc433544de3806f8e82976898e444b491Jakub Pawlowski
1654911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_ble_ll_conn_param_upd_evt(uint8_t* p, uint16_t evt_len) {
1655911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* LE connection update has completed successfully as a master. */
1656911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* We can enable the update request if the result is a success. */
1657911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* extract the HCI handle first */
1658911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t status;
1659911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint16_t handle;
1660911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint16_t interval;
1661911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint16_t latency;
1662911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint16_t timeout;
1663911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1664911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT8(status, p);
1665911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT16(handle, p);
1666911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT16(interval, p);
1667911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT16(latency, p);
1668911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT16(timeout, p);
1669911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1670911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  l2cble_process_conn_update_evt(handle, status, interval, latency, timeout);
1671b5ba4fdbc433544de3806f8e82976898e444b491Jakub Pawlowski
1672b5ba4fdbc433544de3806f8e82976898e444b491Jakub Pawlowski  gatt_notify_conn_update(handle & 0x0FFF, interval, latency, timeout, status);
16735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
16745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1675911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_ble_read_remote_feat_evt(uint8_t* p) {
1676911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btm_ble_read_remote_features_complete(p);
16775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
16785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1679911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_ble_proc_ltk_req(uint8_t* p) {
1680911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint16_t ediv, handle;
1681911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* pp;
16825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1683911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT16(handle, p);
1684911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  pp = p + 8;
1685911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT16(ediv, pp);
1686911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btm_ble_ltk_request(handle, p, ediv);
1687911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* This is empty until an upper layer cares about returning event */
16885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1689636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera
1690911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_ble_data_length_change_evt(uint8_t* p, uint16_t evt_len) {
1691911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint16_t handle;
1692911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint16_t tx_data_len;
1693911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint16_t rx_data_len;
1694636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera
1695911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (!controller_get_interface()->supports_ble_packet_extension()) {
1696911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    HCI_TRACE_WARNING("%s, request not supported", __func__);
1697911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return;
1698911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
1699636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera
1700911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT16(handle, p);
1701911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT16(tx_data_len, p);
1702911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p += 2; /* Skip the TxTimer */
1703911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT16(rx_data_len, p);
1704636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera
1705911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  l2cble_process_data_length_change_event(handle, tx_data_len, rx_data_len);
1706636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera}
1707636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera
17085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/**********************************************
1709ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * End of BLE Events Handler
1710ee96a3c60fca590d38025925c072d264e06493c4Myles Watson **********************************************/
1711d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (BLE_LLT_INCLUDED == TRUE)
1712911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btu_ble_rc_param_req_evt(uint8_t* p) {
1713911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint16_t handle;
1714911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint16_t int_min, int_max, latency, timeout;
1715911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1716911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT16(handle, p);
1717911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT16(int_min, p);
1718911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT16(int_max, p);
1719911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT16(latency, p);
1720911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT16(timeout, p);
1721911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
1722911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  l2cble_process_rc_param_request_evt(handle, int_min, int_max, latency,
1723911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                      timeout);
17247fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta}
17257fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif /* BLE_LLT_INCLUDED */
1726