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 handle BTM interface functions for the 225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Bluetooth device including Rest, HCI buffer size and others 235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2630e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson#include <assert.h> 275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <stdlib.h> 285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h> 295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <stdio.h> 305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <stddef.h> 315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_types.h" 335cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen#include "bt_utils.h" 345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_int.h" 3530e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson#include "btu.h" 3679ecab5d0418fde77e9afcdd451bd713af73e180Chris Manton#include "device/include/controller.h" 3730e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson#include "hci_layer.h" 3830e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson#include "hcimsgs.h" 395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "l2c_int.h" 4095b74f252f534ec757aab1fc08e086e02b2cfe8dSharvil Nanavati#include "btcore/include/module.h" 410f9b91e150e153229235c163861198e23600e636Sharvil Nanavati#include "osi/include/thread.h" 425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE 445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "gatt_int.h" 455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* BLE_INCLUDED */ 465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4730e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnsonextern thread_t *bt_workqueue_thread; 485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/********************************************************************************/ 505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* L O C A L D A T A D E F I N I T I O N S */ 515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/********************************************************************************/ 525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifndef BTM_DEV_RESET_TIMEOUT 545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTM_DEV_RESET_TIMEOUT 4 555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTM_DEV_REPLY_TIMEOUT 2 /* 1 second expiration time is not good. Timer may start between 0 and 1 second. */ 585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if it starts at the very end of the 0 second, timer will expire really easily. */ 595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTM_INFO_TIMEOUT 5 /* 5 seconds for info response */ 615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/********************************************************************************/ 635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* L O C A L F U N C T I O N P R O T O T Y P E S */ 645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/********************************************************************************/ 655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 663aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbachstatic void btm_decode_ext_features_page (UINT8 page_number, const BD_FEATURES p_features); 673aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach 685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_dev_init 715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is on the BTM startup 735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_dev_init (void) 785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if 0 /* cleared in btm_init; put back in if called from anywhere else! */ 805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset (&btm_cb.devcb, 0, sizeof (tBTM_DEVCB)); 815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Initialize nonzero defaults */ 845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_MAX_LOC_BD_NAME_LEN > 0) 855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(btm_cb.cfg.bd_name, 0, sizeof(tBTM_LOC_BD_NAME)); 865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.devcb.reset_timer.param = (TIMER_PARAM_TYPE)TT_DEV_RESET; 895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.devcb.rln_timer.param = (TIMER_PARAM_TYPE)TT_DEV_RLN; 905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.btm_acl_pkt_types_supported = BTM_ACL_PKT_TYPES_MASK_DH1 + BTM_ACL_PKT_TYPES_MASK_DM1 + 925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_ACL_PKT_TYPES_MASK_DH3 + BTM_ACL_PKT_TYPES_MASK_DM3 + 935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_ACL_PKT_TYPES_MASK_DH5 + BTM_ACL_PKT_TYPES_MASK_DM5; 945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.btm_sco_pkt_types_supported = BTM_SCO_PKT_TYPES_MASK_HV1 + 965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_HV2 + 975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_HV3 + 985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_EV3 + 995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_EV4 + 1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_EV5; 1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_db_reset 1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called by BTM_DeviceReset and clears out any 1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** pending callbacks for inquiries, discoveries, other pending 1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** functions that may be in progress. 1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_db_reset (void) 1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_CMPL_CB *p_cb; 1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_STATUS status = BTM_DEV_RESET; 1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_inq_db_reset(); 1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.devcb.p_rln_cmpl_cb) 1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb = btm_cb.devcb.p_rln_cmpl_cb; 1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.devcb.p_rln_cmpl_cb = NULL; 1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb) 1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*p_cb)((void *) NULL); 1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.devcb.p_rssi_cmpl_cb) 1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb = btm_cb.devcb.p_rssi_cmpl_cb; 1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.devcb.p_rssi_cmpl_cb = NULL; 1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb) 1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*p_cb)((tBTM_RSSI_RESULTS *) &status); 1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14130e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnsonstatic void reset_complete(void *result) { 14230e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson assert(result == FUTURE_SUCCESS); 14330e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson const controller_t *controller = controller_get_interface(); 1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14530e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson /* Tell L2CAP that all connections are gone */ 14630e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson l2cu_device_reset (); 1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14830e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson /* Clear current security state */ 14930e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson for (int devinx = 0; devinx < BTM_SEC_MAX_DEVICE_RECORDS; devinx++) { 15030e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_cb.sec_dev_rec[devinx].sec_state = BTM_SEC_STATE_IDLE; 15130e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson } 1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15330e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson /* After the reset controller should restore all parameters to defaults. */ 15430e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_cb.btm_inq_vars.inq_counter = 1; 15530e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_cb.btm_inq_vars.inq_scan_window = HCI_DEF_INQUIRYSCAN_WINDOW; 15630e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_cb.btm_inq_vars.inq_scan_period = HCI_DEF_INQUIRYSCAN_INTERVAL; 15730e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_cb.btm_inq_vars.inq_scan_type = HCI_DEF_SCAN_TYPE; 1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15930e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_cb.btm_inq_vars.page_scan_window = HCI_DEF_PAGESCAN_WINDOW; 16030e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_cb.btm_inq_vars.page_scan_period = HCI_DEF_PAGESCAN_INTERVAL; 16130e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_cb.btm_inq_vars.page_scan_type = HCI_DEF_SCAN_TYPE; 1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16330e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson#if (BLE_INCLUDED == TRUE) 16430e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_cb.ble_ctr_cb.conn_state = BLE_CONN_IDLE; 16530e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_cb.ble_ctr_cb.bg_conn_type = BTM_BLE_CONN_NONE; 16630e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_cb.ble_ctr_cb.p_select_cback = NULL; 16730e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson gatt_reset_bgdev_list(); 16830e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_ble_multi_adv_init(); 16930e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson#endif 1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17130e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_pm_reset(); 17230e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson 17330e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson l2c_link_processs_num_bufs(controller->get_acl_buffer_count_classic()); 17430e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson#if (BLE_INCLUDED == TRUE) 175444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 176f88a7a197ab6652988e575ee419f6bc93b8c5b47Andre Eisenbach#if (defined BLE_PRIVACY_SPT && BLE_PRIVACY_SPT == TRUE) 177444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji /* Set up the BLE privacy settings */ 178444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (controller->supports_ble() && controller->supports_ble_privacy() && 179444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji controller->get_ble_resolving_list_max_size() > 0) { 180b8b3e8070ad027e7a45ca5048ae807c4ec099b15Priti Aghera btm_ble_resolving_list_init(controller->get_ble_resolving_list_max_size()); 181444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji /* set the default random private address timeout */ 182444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji btsnd_hcic_ble_set_rand_priv_addr_timeout(BTM_BLE_PRIVATE_ADDR_INT); 183444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 184f88a7a197ab6652988e575ee419f6bc93b8c5b47Andre Eisenbach#endif 185444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 18630e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson if (controller->supports_ble()) { 187b8b3e8070ad027e7a45ca5048ae807c4ec099b15Priti Aghera btm_ble_white_list_init(controller->get_ble_white_list_size()); 18830e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson l2c_link_processs_ble_num_bufs(controller->get_acl_buffer_count_ble()); 18930e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson } 19030e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson#endif 1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19230e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson BTM_SetPinType (btm_cb.cfg.pin_type, btm_cb.cfg.pin_code, btm_cb.cfg.pin_code_len); 1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19430e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson for (int i = 0; i <= controller->get_last_features_classic_index(); i++) { 19530e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_decode_ext_features_page(i, controller->get_features_classic(i)->as_array); 19630e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson } 1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19830e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_report_device_status(BTM_DEV_STATUS_UP); 1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 20130e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson// TODO(zachoverflow): remove this function 20230e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnsonvoid BTM_DeviceReset (UNUSED_ATTR tBTM_CMPL_CB *p_cb) { 20330e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson /* Flush all ACL connections */ 20430e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_acl_device_down(); 20530e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson 20630e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson /* Clear the callback, so application would not hang on reset */ 20730e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_db_reset(); 20830e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson 20930e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson module_start_up_callbacked_wrapper( 21030e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson get_module(CONTROLLER_MODULE), 21130e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson bt_workqueue_thread, 21230e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson reset_complete 21330e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson ); 21430e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson} 2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_IsDeviceUp 2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to check if the device is up. 2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if device is up, else FALSE 2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN BTM_IsDeviceUp (void) 2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 22730e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson return controller_get_interface()->get_is_ready(); 2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 23230e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson** Function btm_dev_timeout 2333aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach** 23430e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson** Description This function is called when a timer list entry expires. 2353aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach** 2363aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach** Returns void 2373aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach** 2383aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach*******************************************************************************/ 23930e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnsonvoid btm_dev_timeout (TIMER_LIST_ENT *p_tle) 2403aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach{ 24130e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson TIMER_PARAM_TYPE timer_type = (TIMER_PARAM_TYPE)p_tle->param; 2423aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach 24330e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson if (timer_type == (TIMER_PARAM_TYPE)TT_DEV_RLN) 2443aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach { 24530e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson tBTM_CMPL_CB *p_cb = btm_cb.devcb.p_rln_cmpl_cb; 2463aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach 24730e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_cb.devcb.p_rln_cmpl_cb = NULL; 24830e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson 24930e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson if (p_cb) 25030e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson (*p_cb)((void *) NULL); 2513aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach } 2523aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach} 2533aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach 2543aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach/******************************************************************************* 2553aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach** 25630e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson** Function btm_decode_ext_features_page 2573aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach** 25830e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson** Description This function is decodes a features page. 2593aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach** 2603aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach** Returns void 2613aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach** 2623aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach*******************************************************************************/ 26330e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnsonstatic void btm_decode_ext_features_page (UINT8 page_number, const UINT8 *p_features) 2643aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach{ 26530e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson UINT8 last; 26630e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson UINT8 first; 26730e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson 26830e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson BTM_TRACE_DEBUG ("btm_decode_ext_features_page page: %d", page_number); 26930e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson switch (page_number) 27030e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson { 27130e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson /* Extended (Legacy) Page 0 */ 27230e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson case HCI_EXT_FEATURES_PAGE_0: 2733aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach 27430e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson /* Create ACL supported packet types mask */ 27530e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_cb.btm_acl_pkt_types_supported = (BTM_ACL_PKT_TYPES_MASK_DH1 + 27630e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson BTM_ACL_PKT_TYPES_MASK_DM1); 2773aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach 27830e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson if (HCI_3_SLOT_PACKETS_SUPPORTED(p_features)) 27930e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_cb.btm_acl_pkt_types_supported |= (BTM_ACL_PKT_TYPES_MASK_DH3 + 28030e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson BTM_ACL_PKT_TYPES_MASK_DM3); 2819d140a9dc432e457a0437920d5f84c22e3baea0dGanesh Ganapathi Batta 28230e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson if (HCI_5_SLOT_PACKETS_SUPPORTED(p_features)) 28330e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_cb.btm_acl_pkt_types_supported |= (BTM_ACL_PKT_TYPES_MASK_DH5 + 28430e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson BTM_ACL_PKT_TYPES_MASK_DM5); 2853aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach 28630e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson /* Add in EDR related ACL types */ 28730e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson if (!HCI_EDR_ACL_2MPS_SUPPORTED(p_features)) 28830e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson { 28930e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_cb.btm_acl_pkt_types_supported |= (BTM_ACL_PKT_TYPES_MASK_NO_2_DH1 + 29030e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson BTM_ACL_PKT_TYPES_MASK_NO_2_DH3 + 29130e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson BTM_ACL_PKT_TYPES_MASK_NO_2_DH5); 29230e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson } 2933aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach 29430e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson if (!HCI_EDR_ACL_3MPS_SUPPORTED(p_features)) 29530e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson { 29630e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_cb.btm_acl_pkt_types_supported |= (BTM_ACL_PKT_TYPES_MASK_NO_3_DH1 + 29730e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson BTM_ACL_PKT_TYPES_MASK_NO_3_DH3 + 29830e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson BTM_ACL_PKT_TYPES_MASK_NO_3_DH5); 29930e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson } 3003aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach 30130e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson /* Check to see if 3 and 5 slot packets are available */ 30230e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson if (HCI_EDR_ACL_2MPS_SUPPORTED(p_features) || 30330e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson HCI_EDR_ACL_3MPS_SUPPORTED(p_features)) 30430e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson { 30530e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson if (!HCI_3_SLOT_EDR_ACL_SUPPORTED(p_features)) 30630e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_cb.btm_acl_pkt_types_supported |= (BTM_ACL_PKT_TYPES_MASK_NO_2_DH3 + 30730e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson BTM_ACL_PKT_TYPES_MASK_NO_3_DH3); 3083aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach 30930e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson if (!HCI_5_SLOT_EDR_ACL_SUPPORTED(p_features)) 31030e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_cb.btm_acl_pkt_types_supported |= (BTM_ACL_PKT_TYPES_MASK_NO_2_DH5 + 31130e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson BTM_ACL_PKT_TYPES_MASK_NO_3_DH5); 31230e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson } 3133aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach 31430e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson BTM_TRACE_DEBUG("Local supported ACL packet types: 0x%04x", 31530e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_cb.btm_acl_pkt_types_supported); 3169d140a9dc432e457a0437920d5f84c22e3baea0dGanesh Ganapathi Batta 31730e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson /* Create (e)SCO supported packet types mask */ 31830e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_cb.btm_sco_pkt_types_supported = 0; 31930e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson#if BTM_SCO_INCLUDED == TRUE 32030e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_cb.sco_cb.esco_supported = FALSE; 32130e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson#endif 32230e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson if (HCI_SCO_LINK_SUPPORTED(p_features)) 32330e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson { 32430e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_cb.btm_sco_pkt_types_supported = BTM_SCO_PKT_TYPES_MASK_HV1; 3259d140a9dc432e457a0437920d5f84c22e3baea0dGanesh Ganapathi Batta 32630e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson if (HCI_HV2_PACKETS_SUPPORTED(p_features)) 32730e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_cb.btm_sco_pkt_types_supported |= BTM_SCO_PKT_TYPES_MASK_HV2; 3289d140a9dc432e457a0437920d5f84c22e3baea0dGanesh Ganapathi Batta 32930e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson if (HCI_HV3_PACKETS_SUPPORTED(p_features)) 33030e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_cb.btm_sco_pkt_types_supported |= BTM_SCO_PKT_TYPES_MASK_HV3; 33130e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson } 3329d140a9dc432e457a0437920d5f84c22e3baea0dGanesh Ganapathi Batta 33330e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson if (HCI_ESCO_EV3_SUPPORTED(p_features)) 33430e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_cb.btm_sco_pkt_types_supported |= BTM_SCO_PKT_TYPES_MASK_EV3; 3359d140a9dc432e457a0437920d5f84c22e3baea0dGanesh Ganapathi Batta 33630e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson if (HCI_ESCO_EV4_SUPPORTED(p_features)) 33730e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_cb.btm_sco_pkt_types_supported |= BTM_SCO_PKT_TYPES_MASK_EV4; 3389d140a9dc432e457a0437920d5f84c22e3baea0dGanesh Ganapathi Batta 33930e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson if (HCI_ESCO_EV5_SUPPORTED(p_features)) 34030e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_cb.btm_sco_pkt_types_supported |= BTM_SCO_PKT_TYPES_MASK_EV5; 34130e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson#if BTM_SCO_INCLUDED == TRUE 34230e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson if (btm_cb.btm_sco_pkt_types_supported & BTM_ESCO_LINK_ONLY_MASK) 34330e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson { 34430e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_cb.sco_cb.esco_supported = TRUE; 3453aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach 34630e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson /* Add in EDR related eSCO types */ 34730e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson if (HCI_EDR_ESCO_2MPS_SUPPORTED(p_features)) 34830e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson { 34930e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson if (!HCI_3_SLOT_EDR_ESCO_SUPPORTED(p_features)) 35030e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_cb.btm_sco_pkt_types_supported |= BTM_SCO_PKT_TYPES_MASK_NO_2_EV5; 35130e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson } 35230e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson else 35330e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson { 35430e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_cb.btm_sco_pkt_types_supported |= (BTM_SCO_PKT_TYPES_MASK_NO_2_EV3 + 35530e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson BTM_SCO_PKT_TYPES_MASK_NO_2_EV5); 35630e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson } 3573aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach 35830e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson if (HCI_EDR_ESCO_3MPS_SUPPORTED(p_features)) 35930e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson { 36030e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson if (!HCI_3_SLOT_EDR_ESCO_SUPPORTED(p_features)) 36130e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_cb.btm_sco_pkt_types_supported |= BTM_SCO_PKT_TYPES_MASK_NO_3_EV5; 36230e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson } 36330e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson else 36430e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson { 36530e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_cb.btm_sco_pkt_types_supported |= (BTM_SCO_PKT_TYPES_MASK_NO_3_EV3 + 36630e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson BTM_SCO_PKT_TYPES_MASK_NO_3_EV5); 36730e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson } 36830e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson } 36930e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson#endif 3703aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach 37130e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson BTM_TRACE_DEBUG("Local supported SCO packet types: 0x%04x", 37230e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_cb.btm_sco_pkt_types_supported); 3733aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach 37430e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson /* Create Default Policy Settings */ 37530e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson if (HCI_SWITCH_SUPPORTED(p_features)) 37630e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_cb.btm_def_link_policy |= HCI_ENABLE_MASTER_SLAVE_SWITCH; 37730e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson else 37830e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_cb.btm_def_link_policy &= ~HCI_ENABLE_MASTER_SLAVE_SWITCH; 3793aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach 38030e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson if (HCI_HOLD_MODE_SUPPORTED(p_features)) 38130e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_cb.btm_def_link_policy |= HCI_ENABLE_HOLD_MODE; 38230e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson else 38330e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_cb.btm_def_link_policy &= ~HCI_ENABLE_HOLD_MODE; 3843aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach 38530e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson if (HCI_SNIFF_MODE_SUPPORTED(p_features)) 38630e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_cb.btm_def_link_policy |= HCI_ENABLE_SNIFF_MODE; 38730e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson else 38830e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_cb.btm_def_link_policy &= ~HCI_ENABLE_SNIFF_MODE; 3893aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach 39030e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson if (HCI_PARK_MODE_SUPPORTED(p_features)) 39130e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_cb.btm_def_link_policy |= HCI_ENABLE_PARK_MODE; 39230e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson else 39330e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_cb.btm_def_link_policy &= ~HCI_ENABLE_PARK_MODE; 3943aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach 39530e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_sec_dev_reset (); 396603614704658ce7081a61a4f8929a1a979b2b449Andre Eisenbach 39730e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson if (HCI_LMP_INQ_RSSI_SUPPORTED(p_features)) 3983aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach { 39930e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson if (HCI_EXT_INQ_RSP_SUPPORTED(p_features)) 40030e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson BTM_SetInquiryMode (BTM_INQ_RESULT_EXTENDED); 40130e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson else 40230e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson BTM_SetInquiryMode (BTM_INQ_RESULT_WITH_RSSI); 4033aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach } 404603614704658ce7081a61a4f8929a1a979b2b449Andre Eisenbach 40530e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson#if L2CAP_NON_FLUSHABLE_PB_INCLUDED == TRUE 40630e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson if( HCI_NON_FLUSHABLE_PB_SUPPORTED(p_features)) 40730e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson l2cu_set_non_flushable_pbf(TRUE); 40830e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson else 40930e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson l2cu_set_non_flushable_pbf(FALSE); 41030e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson#endif 41130e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson BTM_SetPageScanType (BTM_DEFAULT_SCAN_TYPE); 41230e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson BTM_SetInquiryScanType (BTM_DEFAULT_SCAN_TYPE); 4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 41430e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson break; 4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 41630e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson /* Extended Page 1 */ 41730e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson case HCI_EXT_FEATURES_PAGE_1: 41830e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson /* Nothing to do for page 1 */ 41930e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson break; 4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 42130e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson /* Extended Page 2 */ 42230e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson case HCI_EXT_FEATURES_PAGE_2: 42330e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson /* Nothing to do for page 2 */ 42430e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson break; 4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 42630e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson default: 42730e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson BTM_TRACE_ERROR("btm_decode_ext_features_page page=%d unknown", page_number); 42830e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson break; 42930e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson } 4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_SetLocalDeviceName 4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to set the local device name. 4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns status of the operation 4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_SetLocalDeviceName (char *p_name) 4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p; 4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_name || !p_name[0] || (strlen ((char *)p_name) > BD_NAME_LEN)) 4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BTM_ILLEGAL_VALUE); 4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 44830e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson if (!controller_get_interface()->get_is_ready()) 4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BTM_DEV_RESET); 4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_MAX_LOC_BD_NAME_LEN > 0 4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Save the device name if local storage is enabled */ 4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p = (UINT8 *)btm_cb.cfg.bd_name; 4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p != (UINT8 *)p_name) 4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BCM_STRNCPY_S(btm_cb.cfg.bd_name, sizeof(btm_cb.cfg.bd_name), p_name, BTM_MAX_LOC_BD_NAME_LEN); 4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.cfg.bd_name[BTM_MAX_LOC_BD_NAME_LEN] = '\0'; 4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p = (UINT8 *)p_name; 4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btsnd_hcic_change_name(p)) 4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BTM_CMD_STARTED); 4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BTM_NO_RESOURCES); 4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_ReadLocalDeviceName 4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to read the local device name. 4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns status of the operation 4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** If success, BTM_SUCCESS is returned and p_name points stored 4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** local device name 4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** If BTM doesn't store local device name, BTM_NO_RESOURCES is 4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** is returned and p_name is set to NULL 4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_ReadLocalDeviceName (char **p_name) 4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_MAX_LOC_BD_NAME_LEN > 0 4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_name = btm_cb.cfg.bd_name; 4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_SUCCESS); 4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_name = NULL; 4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_NO_RESOURCES); 4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_ReadLocalDeviceNameFromController 4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Get local device name from controller. Do not use cached 5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** name (used to get chip-id prior to btm reset complete). 5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns BTM_CMD_STARTED if successful, otherwise an error 5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_ReadLocalDeviceNameFromController (tBTM_CMPL_CB *p_rln_cmpl_cback) 5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check if rln already in progress */ 5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.devcb.p_rln_cmpl_cb) 5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_NO_RESOURCES); 5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Save callback */ 5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.devcb.p_rln_cmpl_cb = p_rln_cmpl_cback; 5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_read_name(); 5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btu_start_timer (&btm_cb.devcb.rln_timer, BTU_TTYPE_BTM_DEV_CTL, BTM_DEV_REPLY_TIMEOUT); 5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BTM_CMD_STARTED; 5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_read_local_name_complete 5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when local name read complete. 5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** message is received from the HCI. 5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_read_local_name_complete (UINT8 *p, UINT16 evt_len) 5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_CMPL_CB *p_cb = btm_cb.devcb.p_rln_cmpl_cb; 5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 status; 5355cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(evt_len); 5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btu_stop_timer (&btm_cb.devcb.rln_timer); 5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If there was a callback address for read local name, call it */ 5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.devcb.p_rln_cmpl_cb = NULL; 5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb) 5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_UINT8 (status, p); 5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status == HCI_SUCCESS) 5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*p_cb)(p); 5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*p_cb)(NULL); 5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_SetDeviceClass 5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to set the local device class 5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns status of the operation 5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_SetDeviceClass (DEV_CLASS dev_class) 5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(!memcmp (btm_cb.devcb.dev_class, dev_class, DEV_CLASS_LEN)) 5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_SUCCESS); 5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (btm_cb.devcb.dev_class, dev_class, DEV_CLASS_LEN); 5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 56930e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson if (!controller_get_interface()->get_is_ready()) 5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BTM_DEV_RESET); 5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!btsnd_hcic_write_dev_class (dev_class)) 5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BTM_NO_RESOURCES); 5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BTM_SUCCESS); 5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_ReadDeviceClass 5825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to read the local device class 5845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns pointer to the device class 5865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 *BTM_ReadDeviceClass (void) 5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return ((UINT8 *)btm_cb.devcb.dev_class); 5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_ReadLocalFeatures 5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to read the local features 5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns pointer to the local features string 6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 60330e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson// TODO(zachoverflow): get rid of this function 6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 *BTM_ReadLocalFeatures (void) 6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 60630e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson // Discarding const modifier for now, until this function dies 60730e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson return (UINT8 *)controller_get_interface()->get_features_classic(0)->as_array; 6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_RegisterForDeviceStatusNotif 6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to register for device status 6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** change notifications. 6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** If one registration is already there calling function should 6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** save the pointer to the function that is return and 6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** call it when processing of the event is complete 6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns status of the operation 6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_DEV_STATUS_CB *BTM_RegisterForDeviceStatusNotif (tBTM_DEV_STATUS_CB *p_cb) 6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_DEV_STATUS_CB *p_prev = btm_cb.devcb.p_dev_status_cb; 6275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.devcb.p_dev_status_cb = p_cb; 6295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (p_prev); 6305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_VendorSpecificCommand 6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Send a vendor specific HCI command to the controller. 6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns 6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_SUCCESS Command sent. Does not expect command complete 6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** event. (command cmpl callback param is NULL) 6415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_CMD_STARTED Command sent. Waiting for command cmpl event. 6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Notes 6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Opcode will be OR'd with HCI_GRP_VENDOR_SPECIFIC. 6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_VendorSpecificCommand(UINT16 opcode, UINT8 param_len, 6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p_param_buf, tBTM_VSC_CMPL_CB *p_cb) 6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project void *p_buf; 6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6525344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("BTM: BTM_VendorSpecificCommand: Opcode: 0x%04X, ParamLen: %i.", 6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project opcode, param_len); 6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Allocate a buffer to hold HCI command plus the callback function */ 6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_buf = GKI_getbuf((UINT16)(sizeof(BT_HDR) + sizeof (tBTM_CMPL_CB *) + 6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project param_len + HCIC_PREAMBLE_SIZE))) != NULL) 6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Send the HCI command (opcode will be OR'd with HCI_GRP_VENDOR_SPECIFIC) */ 6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_vendor_spec_cmd (p_buf, opcode, param_len, p_param_buf, (void *)p_cb); 6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Return value */ 6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb != NULL) 6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BTM_CMD_STARTED); 6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BTM_SUCCESS); 6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BTM_NO_RESOURCES); 6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_vsc_complete 6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when local HCI Vendor Specific 6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Command complete message is received from the HCI. 6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_vsc_complete (UINT8 *p, UINT16 opcode, UINT16 evt_len, 6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_CMPL_CB *p_vsc_cplt_cback) 6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_VSC_CMPL vcs_cplt_params; 6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If there was a callback address for vcs complete, call it */ 6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_vsc_cplt_cback) 6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Pass paramters to the callback function */ 6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project vcs_cplt_params.opcode = opcode; /* Number of bytes in return info */ 6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project vcs_cplt_params.param_len = evt_len; /* Number of bytes in return info */ 6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project vcs_cplt_params.p_param_buf = p; 6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*p_vsc_cplt_cback)(&vcs_cplt_params); /* Call the VSC complete callback function */ 6975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_RegisterForVSEvents 7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to register/deregister for vendor 7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** specific HCI events. 7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** If is_register=TRUE, then the function will be registered; 7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** if is_register=FALSE, then the function will be deregistered. 7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns BTM_SUCCESS if successful, 7115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_BUSY if maximum number of callbacks have already been 7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** registered. 7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_RegisterForVSEvents (tBTM_VS_EVT_CB *p_cb, BOOLEAN is_register) 7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_STATUS retval = BTM_SUCCESS; 7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 i, free_idx = BTM_MAX_VSE_CALLBACKS; 7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* See if callback is already registered */ 7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i=0; i<BTM_MAX_VSE_CALLBACKS; i++) 7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.devcb.p_vend_spec_cb[i] == NULL) 7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Found a free slot. Store index */ 7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project free_idx = i; 7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (btm_cb.devcb.p_vend_spec_cb[i] == p_cb) 7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Found callback in lookup table. If deregistering, clear the entry. */ 7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (is_register == FALSE) 7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.devcb.p_vend_spec_cb[i] = NULL; 7345344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT("BTM Deregister For VSEvents is successfully"); 7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BTM_SUCCESS); 7375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Didn't find callback. Add callback to free slot if registering */ 7415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (is_register) 7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (free_idx < BTM_MAX_VSE_CALLBACKS) 7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.devcb.p_vend_spec_cb[free_idx] = p_cb; 7465344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT("BTM Register For VSEvents is successfully"); 7475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* No free entries available */ 7515344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_ERROR ("BTM_RegisterForVSEvents: too many callbacks registered"); 7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project retval = BTM_NO_RESOURCES; 7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (retval); 7585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 7615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_vendor_specific_evt 7635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Process event HCI_VENDOR_SPECIFIC_EVT 7655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Note: Some controllers do not send command complete, so 7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the callback and busy flag are cleared here also. 7685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 7705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 7725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_vendor_specific_evt (UINT8 *p, UINT8 evt_len) 7735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 i; 7755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7765344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("BTM Event: Vendor Specific event from controller"); 7775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i=0; i<BTM_MAX_VSE_CALLBACKS; i++) 7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.devcb.p_vend_spec_cb[i]) 7815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.devcb.p_vend_spec_cb[i])(evt_len, p); 7825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 7875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_WritePageTimeout 7895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Send HCI Write Page Timeout. 7915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns 7935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_SUCCESS Command sent. 7945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_NO_RESOURCES If out of resources to send the command. 7955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 7985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_WritePageTimeout(UINT16 timeout) 7995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 8005344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("BTM: BTM_WritePageTimeout: Timeout: %d.", timeout); 8015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Send the HCI command */ 8035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btsnd_hcic_write_page_tout (timeout)) 8045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BTM_SUCCESS); 8055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 8065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BTM_NO_RESOURCES); 8075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 8105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_WriteVoiceSettings 8125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Send HCI Write Voice Settings command. 8145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** See hcidefs.h for settings bitmask values. 8155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns 8175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_SUCCESS Command sent. 8185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_NO_RESOURCES If out of resources to send the command. 8195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 8225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_WriteVoiceSettings(UINT16 settings) 8235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 8245344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("BTM: BTM_WriteVoiceSettings: Settings: 0x%04x.", settings); 8255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Send the HCI command */ 8275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btsnd_hcic_write_voice_settings ((UINT16)(settings & 0x03ff))) 8285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BTM_SUCCESS); 8295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BTM_NO_RESOURCES); 8315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 8345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_EnableTestMode 8365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Send HCI the enable device under test command. 8385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Note: Controller can only be taken out of this mode by 8405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** resetting the controller. 8415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns 8435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_SUCCESS Command sent. 8445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_NO_RESOURCES If out of resources to send the command. 8455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 8485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_EnableTestMode(void) 8495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 8505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 cond; 8515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8525344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("BTM: BTM_EnableTestMode"); 8535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* set auto accept connection as this is needed during test mode */ 8555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Allocate a buffer to hold HCI command */ 8565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cond = HCI_DO_AUTO_ACCEPT_CONNECT; 8575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!btsnd_hcic_set_event_filter(HCI_FILTER_CONNECTION_SETUP, 8585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project HCI_FILTER_COND_NEW_DEVICE, 8595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project &cond, sizeof(cond))) 8605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BTM_NO_RESOURCES); 8625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* put device to connectable mode */ 8655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!BTM_SetConnectability(BTM_CONNECTABLE, BTM_DEFAULT_CONN_WINDOW, 8665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_DEFAULT_CONN_INTERVAL) == BTM_SUCCESS) 8675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BTM_NO_RESOURCES; 8695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* put device to discoverable mode */ 8725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!BTM_SetDiscoverability(BTM_GENERAL_DISCOVERABLE, BTM_DEFAULT_DISC_WINDOW, 8735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_DEFAULT_DISC_INTERVAL) == BTM_SUCCESS) 8745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BTM_NO_RESOURCES; 8765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* mask off all of event from controller */ 87930e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson hci_layer_get_interface()->transmit_command( 8801cdde97ec39374873bfd8b592aecc923ea9dd332Zach Johnson hci_packet_factory_get_interface()->make_set_event_mask((const bt_event_mask_t *)("\x00\x00\x00\x00\x00\x00\x00\x00")), 88130e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson NULL, 88230e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson NULL, 88330e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson NULL); 8845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Send the HCI command */ 8865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btsnd_hcic_enable_test_mode ()) 8875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BTM_SUCCESS); 8885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 8895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BTM_NO_RESOURCES); 8905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 8935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_DeleteStoredLinkKey 8955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to delete link key for the specified 8975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** device addresses from the NVRAM storage attached to the Bluetooth 8985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** controller. 8995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: bd_addr - Addresses of the devices 9015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_cb - Call back function to be called to return 9025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the results 9035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 9055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_DeleteStoredLinkKey(BD_ADDR bd_addr, tBTM_CMPL_CB *p_cb) 9065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 9075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BD_ADDR local_bd_addr; 9085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN delete_all_flag = FALSE; 9095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check if the previous command is completed */ 9115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.devcb.p_stored_link_key_cmpl_cb) 9125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BTM_BUSY); 9135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!bd_addr) 9155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* This is to delete all link keys */ 9175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project delete_all_flag = TRUE; 9185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* We don't care the BD address. Just pass a non zero pointer */ 9205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bd_addr = local_bd_addr; 9215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9235344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("BTM: BTM_DeleteStoredLinkKey: delete_all_flag: %s", 9245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project delete_all_flag ? "TRUE" : "FALSE"); 9255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Send the HCI command */ 9275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.devcb.p_stored_link_key_cmpl_cb = p_cb; 9285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!btsnd_hcic_delete_stored_key (bd_addr, delete_all_flag)) 9295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BTM_NO_RESOURCES); 9315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 9335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BTM_SUCCESS); 9345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 9355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 9375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_delete_stored_link_key_complete 9395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when the command complete message 9415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** is received from the HCI for the delete stored link key command. 9425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 9445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 9465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_delete_stored_link_key_complete (UINT8 *p) 9475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 9485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_CMPL_CB *p_cb = btm_cb.devcb.p_stored_link_key_cmpl_cb; 9495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_DELETE_STORED_LINK_KEY_COMPLETE result; 9505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If there was a callback registered for read stored link key, call it */ 9525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.devcb.p_stored_link_key_cmpl_cb = NULL; 9535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb) 9555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Set the call back event to indicate command complete */ 9575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result.event = BTM_CB_EVT_DELETE_STORED_LINK_KEYS; 9585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Extract the result fields from the HCI event */ 9605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_UINT8 (result.status, p); 9615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_UINT16 (result.num_keys, p); 9625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Call the call back and pass the result */ 9645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*p_cb)(&result); 9655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 9675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 9695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_report_device_status 9715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when there is a change in the device 9735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** status. This function will report the new device status to 9745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the application 9755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 9775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 9795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_report_device_status (tBTM_DEV_STATUS status) 9805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 9815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_DEV_STATUS_CB *p_cb = btm_cb.devcb.p_dev_status_cb; 9825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Call the call back to pass the device status to application */ 9845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb) 9855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*p_cb)(status); 9865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 9875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 989