btm_devctl.cc revision 444a8da807abaf5f9e813ce70c56a79160495fb3
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_dev_num = 0; 16630e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_cb.ble_ctr_cb.bg_conn_type = BTM_BLE_CONN_NONE; 16730e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_cb.ble_ctr_cb.p_select_cback = NULL; 16830e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson memset(&btm_cb.ble_ctr_cb.bg_dev_list, 0, (sizeof(tBTM_LE_BG_CONN_DEV)*BTM_BLE_MAX_BG_CONN_DEV_NUM)); 16930e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson gatt_reset_bgdev_list(); 17030e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_ble_multi_adv_init(); 17130e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson#endif 1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17330e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_pm_reset(); 17430e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson 17530e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson l2c_link_processs_num_bufs(controller->get_acl_buffer_count_classic()); 17630e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson#if (BLE_INCLUDED == TRUE) 177444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 178444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji /* Set up the BLE privacy settings */ 179444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (controller->supports_ble() && controller->supports_ble_privacy() && 180444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji controller->get_ble_resolving_list_max_size() > 0) { 181444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji btm_ble_resolving_list_init (controller->get_ble_resolving_list_max_size()); 182444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji /* set the default random private address timeout */ 183444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji btsnd_hcic_ble_set_rand_priv_addr_timeout(BTM_BLE_PRIVATE_ADDR_INT); 184444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 185444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 18630e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson if (controller->supports_ble()) { 18730e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson l2c_link_processs_ble_num_bufs(controller->get_acl_buffer_count_ble()); 18830e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson } 18930e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson#endif 1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19130e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson BTM_SetPinType (btm_cb.cfg.pin_type, btm_cb.cfg.pin_code, btm_cb.cfg.pin_code_len); 1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19330e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson for (int i = 0; i <= controller->get_last_features_classic_index(); i++) { 19430e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_decode_ext_features_page(i, controller->get_features_classic(i)->as_array); 19530e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson } 1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19730e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_report_device_status(BTM_DEV_STATUS_UP); 1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 20030e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson// TODO(zachoverflow): remove this function 20130e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnsonvoid BTM_DeviceReset (UNUSED_ATTR tBTM_CMPL_CB *p_cb) { 20230e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson /* Flush all ACL connections */ 20330e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_acl_device_down(); 20430e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson 20530e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson /* Clear the callback, so application would not hang on reset */ 20630e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_db_reset(); 20730e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson 20830e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson module_start_up_callbacked_wrapper( 20930e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson get_module(CONTROLLER_MODULE), 21030e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson bt_workqueue_thread, 21130e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson reset_complete 21230e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson ); 21330e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson} 2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_IsDeviceUp 2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to check if the device is up. 2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if device is up, else FALSE 2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN BTM_IsDeviceUp (void) 2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 22630e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson return controller_get_interface()->get_is_ready(); 2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 23130e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson** Function btm_dev_timeout 2323aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach** 23330e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson** Description This function is called when a timer list entry expires. 2343aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach** 2353aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach** Returns void 2363aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach** 2373aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach*******************************************************************************/ 23830e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnsonvoid btm_dev_timeout (TIMER_LIST_ENT *p_tle) 2393aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach{ 24030e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson TIMER_PARAM_TYPE timer_type = (TIMER_PARAM_TYPE)p_tle->param; 2413aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach 24230e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson if (timer_type == (TIMER_PARAM_TYPE)TT_DEV_RLN) 2433aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach { 24430e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson tBTM_CMPL_CB *p_cb = btm_cb.devcb.p_rln_cmpl_cb; 2453aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach 24630e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_cb.devcb.p_rln_cmpl_cb = NULL; 24730e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson 24830e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson if (p_cb) 24930e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson (*p_cb)((void *) NULL); 2503aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach } 2513aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach} 2523aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach 2533aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach/******************************************************************************* 2543aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach** 25530e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson** Function btm_decode_ext_features_page 2563aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach** 25730e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson** Description This function is decodes a features page. 2583aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach** 2593aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach** Returns void 2603aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach** 2613aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach*******************************************************************************/ 26230e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnsonstatic void btm_decode_ext_features_page (UINT8 page_number, const UINT8 *p_features) 2633aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach{ 26430e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson UINT8 last; 26530e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson UINT8 first; 26630e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson 26730e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson BTM_TRACE_DEBUG ("btm_decode_ext_features_page page: %d", page_number); 26830e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson switch (page_number) 26930e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson { 27030e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson /* Extended (Legacy) Page 0 */ 27130e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson case HCI_EXT_FEATURES_PAGE_0: 2723aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach 27330e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson /* Create ACL supported packet types mask */ 27430e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_cb.btm_acl_pkt_types_supported = (BTM_ACL_PKT_TYPES_MASK_DH1 + 27530e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson BTM_ACL_PKT_TYPES_MASK_DM1); 2763aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach 27730e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson if (HCI_3_SLOT_PACKETS_SUPPORTED(p_features)) 27830e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_cb.btm_acl_pkt_types_supported |= (BTM_ACL_PKT_TYPES_MASK_DH3 + 27930e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson BTM_ACL_PKT_TYPES_MASK_DM3); 2809d140a9dc432e457a0437920d5f84c22e3baea0dGanesh Ganapathi Batta 28130e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson if (HCI_5_SLOT_PACKETS_SUPPORTED(p_features)) 28230e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_cb.btm_acl_pkt_types_supported |= (BTM_ACL_PKT_TYPES_MASK_DH5 + 28330e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson BTM_ACL_PKT_TYPES_MASK_DM5); 2843aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach 28530e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson /* Add in EDR related ACL types */ 28630e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson if (!HCI_EDR_ACL_2MPS_SUPPORTED(p_features)) 28730e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson { 28830e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_cb.btm_acl_pkt_types_supported |= (BTM_ACL_PKT_TYPES_MASK_NO_2_DH1 + 28930e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson BTM_ACL_PKT_TYPES_MASK_NO_2_DH3 + 29030e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson BTM_ACL_PKT_TYPES_MASK_NO_2_DH5); 29130e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson } 2923aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach 29330e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson if (!HCI_EDR_ACL_3MPS_SUPPORTED(p_features)) 29430e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson { 29530e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_cb.btm_acl_pkt_types_supported |= (BTM_ACL_PKT_TYPES_MASK_NO_3_DH1 + 29630e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson BTM_ACL_PKT_TYPES_MASK_NO_3_DH3 + 29730e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson BTM_ACL_PKT_TYPES_MASK_NO_3_DH5); 29830e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson } 2993aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach 30030e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson /* Check to see if 3 and 5 slot packets are available */ 30130e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson if (HCI_EDR_ACL_2MPS_SUPPORTED(p_features) || 30230e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson HCI_EDR_ACL_3MPS_SUPPORTED(p_features)) 30330e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson { 30430e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson if (!HCI_3_SLOT_EDR_ACL_SUPPORTED(p_features)) 30530e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_cb.btm_acl_pkt_types_supported |= (BTM_ACL_PKT_TYPES_MASK_NO_2_DH3 + 30630e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson BTM_ACL_PKT_TYPES_MASK_NO_3_DH3); 3073aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach 30830e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson if (!HCI_5_SLOT_EDR_ACL_SUPPORTED(p_features)) 30930e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_cb.btm_acl_pkt_types_supported |= (BTM_ACL_PKT_TYPES_MASK_NO_2_DH5 + 31030e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson BTM_ACL_PKT_TYPES_MASK_NO_3_DH5); 31130e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson } 3123aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach 31330e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson BTM_TRACE_DEBUG("Local supported ACL packet types: 0x%04x", 31430e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_cb.btm_acl_pkt_types_supported); 3159d140a9dc432e457a0437920d5f84c22e3baea0dGanesh Ganapathi Batta 31630e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson /* Create (e)SCO supported packet types mask */ 31730e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_cb.btm_sco_pkt_types_supported = 0; 31830e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson#if BTM_SCO_INCLUDED == TRUE 31930e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_cb.sco_cb.esco_supported = FALSE; 32030e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson#endif 32130e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson if (HCI_SCO_LINK_SUPPORTED(p_features)) 32230e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson { 32330e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_cb.btm_sco_pkt_types_supported = BTM_SCO_PKT_TYPES_MASK_HV1; 3249d140a9dc432e457a0437920d5f84c22e3baea0dGanesh Ganapathi Batta 32530e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson if (HCI_HV2_PACKETS_SUPPORTED(p_features)) 32630e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_cb.btm_sco_pkt_types_supported |= BTM_SCO_PKT_TYPES_MASK_HV2; 3279d140a9dc432e457a0437920d5f84c22e3baea0dGanesh Ganapathi Batta 32830e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson if (HCI_HV3_PACKETS_SUPPORTED(p_features)) 32930e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_cb.btm_sco_pkt_types_supported |= BTM_SCO_PKT_TYPES_MASK_HV3; 33030e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson } 3319d140a9dc432e457a0437920d5f84c22e3baea0dGanesh Ganapathi Batta 33230e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson if (HCI_ESCO_EV3_SUPPORTED(p_features)) 33330e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_cb.btm_sco_pkt_types_supported |= BTM_SCO_PKT_TYPES_MASK_EV3; 3349d140a9dc432e457a0437920d5f84c22e3baea0dGanesh Ganapathi Batta 33530e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson if (HCI_ESCO_EV4_SUPPORTED(p_features)) 33630e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_cb.btm_sco_pkt_types_supported |= BTM_SCO_PKT_TYPES_MASK_EV4; 3379d140a9dc432e457a0437920d5f84c22e3baea0dGanesh Ganapathi Batta 33830e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson if (HCI_ESCO_EV5_SUPPORTED(p_features)) 33930e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_cb.btm_sco_pkt_types_supported |= BTM_SCO_PKT_TYPES_MASK_EV5; 34030e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson#if BTM_SCO_INCLUDED == TRUE 34130e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson if (btm_cb.btm_sco_pkt_types_supported & BTM_ESCO_LINK_ONLY_MASK) 34230e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson { 34330e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_cb.sco_cb.esco_supported = TRUE; 3443aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach 34530e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson /* Add in EDR related eSCO types */ 34630e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson if (HCI_EDR_ESCO_2MPS_SUPPORTED(p_features)) 34730e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson { 34830e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson if (!HCI_3_SLOT_EDR_ESCO_SUPPORTED(p_features)) 34930e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_cb.btm_sco_pkt_types_supported |= BTM_SCO_PKT_TYPES_MASK_NO_2_EV5; 35030e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson } 35130e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson else 35230e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson { 35330e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_cb.btm_sco_pkt_types_supported |= (BTM_SCO_PKT_TYPES_MASK_NO_2_EV3 + 35430e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson BTM_SCO_PKT_TYPES_MASK_NO_2_EV5); 35530e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson } 3563aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach 35730e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson if (HCI_EDR_ESCO_3MPS_SUPPORTED(p_features)) 35830e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson { 35930e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson if (!HCI_3_SLOT_EDR_ESCO_SUPPORTED(p_features)) 36030e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_cb.btm_sco_pkt_types_supported |= BTM_SCO_PKT_TYPES_MASK_NO_3_EV5; 36130e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson } 36230e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson else 36330e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson { 36430e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_cb.btm_sco_pkt_types_supported |= (BTM_SCO_PKT_TYPES_MASK_NO_3_EV3 + 36530e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson BTM_SCO_PKT_TYPES_MASK_NO_3_EV5); 36630e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson } 36730e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson } 36830e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson#endif 3693aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach 37030e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson BTM_TRACE_DEBUG("Local supported SCO packet types: 0x%04x", 37130e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_cb.btm_sco_pkt_types_supported); 3723aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach 37330e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson /* Create Default Policy Settings */ 37430e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson if (HCI_SWITCH_SUPPORTED(p_features)) 37530e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_cb.btm_def_link_policy |= HCI_ENABLE_MASTER_SLAVE_SWITCH; 37630e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson else 37730e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_cb.btm_def_link_policy &= ~HCI_ENABLE_MASTER_SLAVE_SWITCH; 3783aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach 37930e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson if (HCI_HOLD_MODE_SUPPORTED(p_features)) 38030e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_cb.btm_def_link_policy |= HCI_ENABLE_HOLD_MODE; 38130e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson else 38230e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_cb.btm_def_link_policy &= ~HCI_ENABLE_HOLD_MODE; 3833aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach 38430e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson if (HCI_SNIFF_MODE_SUPPORTED(p_features)) 38530e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_cb.btm_def_link_policy |= HCI_ENABLE_SNIFF_MODE; 38630e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson else 38730e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_cb.btm_def_link_policy &= ~HCI_ENABLE_SNIFF_MODE; 3883aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach 38930e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson if (HCI_PARK_MODE_SUPPORTED(p_features)) 39030e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_cb.btm_def_link_policy |= HCI_ENABLE_PARK_MODE; 39130e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson else 39230e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_cb.btm_def_link_policy &= ~HCI_ENABLE_PARK_MODE; 3933aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach 39430e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson btm_sec_dev_reset (); 39530e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson#if ((BTM_EIR_SERVER_INCLUDED == TRUE)||(BTM_EIR_CLIENT_INCLUDED == TRUE)) 39630e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson if (HCI_LMP_INQ_RSSI_SUPPORTED(p_features)) 3973aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach { 39830e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson if (HCI_EXT_INQ_RSP_SUPPORTED(p_features)) 39930e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson BTM_SetInquiryMode (BTM_INQ_RESULT_EXTENDED); 40030e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson else 40130e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson BTM_SetInquiryMode (BTM_INQ_RESULT_WITH_RSSI); 4023aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach } 40330e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson#else 40430e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson if (HCI_LMP_INQ_RSSI_SUPPORTED(p_features)) 40530e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson BTM_SetInquiryMode (BTM_INQ_RESULT_WITH_RSSI); 40630e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson#endif 40730e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson#if L2CAP_NON_FLUSHABLE_PB_INCLUDED == TRUE 40830e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson if( HCI_NON_FLUSHABLE_PB_SUPPORTED(p_features)) 40930e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson l2cu_set_non_flushable_pbf(TRUE); 41030e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson else 41130e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson l2cu_set_non_flushable_pbf(FALSE); 41230e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson#endif 41330e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson BTM_SetPageScanType (BTM_DEFAULT_SCAN_TYPE); 41430e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson BTM_SetInquiryScanType (BTM_DEFAULT_SCAN_TYPE); 4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 41630e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson break; 4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 41830e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson /* Extended Page 1 */ 41930e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson case HCI_EXT_FEATURES_PAGE_1: 42030e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson /* Nothing to do for page 1 */ 42130e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson break; 4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 42330e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson /* Extended Page 2 */ 42430e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson case HCI_EXT_FEATURES_PAGE_2: 42530e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson /* Nothing to do for page 2 */ 42630e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson break; 4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 42830e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson default: 42930e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson BTM_TRACE_ERROR("btm_decode_ext_features_page page=%d unknown", page_number); 43030e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson break; 43130e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson } 4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_SetLocalDeviceName 4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to set the local device name. 4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns status of the operation 4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_SetLocalDeviceName (char *p_name) 4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p; 4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_name || !p_name[0] || (strlen ((char *)p_name) > BD_NAME_LEN)) 4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BTM_ILLEGAL_VALUE); 4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 45030e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson if (!controller_get_interface()->get_is_ready()) 4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BTM_DEV_RESET); 4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_MAX_LOC_BD_NAME_LEN > 0 4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Save the device name if local storage is enabled */ 4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p = (UINT8 *)btm_cb.cfg.bd_name; 4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p != (UINT8 *)p_name) 4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4585738f83aeb59361a0a2eda2460113f6dc919427The 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); 4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.cfg.bd_name[BTM_MAX_LOC_BD_NAME_LEN] = '\0'; 4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p = (UINT8 *)p_name; 4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btsnd_hcic_change_name(p)) 4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BTM_CMD_STARTED); 4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BTM_NO_RESOURCES); 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/******************************************************************************* 4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_ReadLocalDeviceName 4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to read the local device name. 4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns status of the operation 4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** If success, BTM_SUCCESS is returned and p_name points stored 4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** local device name 4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** If BTM doesn't store local device name, BTM_NO_RESOURCES is 4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** is returned and p_name is set to NULL 4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_ReadLocalDeviceName (char **p_name) 4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_MAX_LOC_BD_NAME_LEN > 0 4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_name = btm_cb.cfg.bd_name; 4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_SUCCESS); 4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_name = NULL; 4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_NO_RESOURCES); 4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_ReadLocalDeviceNameFromController 5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Get local device name from controller. Do not use cached 5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** name (used to get chip-id prior to btm reset complete). 5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns BTM_CMD_STARTED if successful, otherwise an error 5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_ReadLocalDeviceNameFromController (tBTM_CMPL_CB *p_rln_cmpl_cback) 5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check if rln already in progress */ 5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.devcb.p_rln_cmpl_cb) 5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_NO_RESOURCES); 5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Save callback */ 5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.devcb.p_rln_cmpl_cb = p_rln_cmpl_cback; 5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_read_name(); 5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btu_start_timer (&btm_cb.devcb.rln_timer, BTU_TTYPE_BTM_DEV_CTL, BTM_DEV_REPLY_TIMEOUT); 5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BTM_CMD_STARTED; 5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_read_local_name_complete 5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when local name read complete. 5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** message is received from the HCI. 5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_read_local_name_complete (UINT8 *p, UINT16 evt_len) 5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_CMPL_CB *p_cb = btm_cb.devcb.p_rln_cmpl_cb; 5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 status; 5375cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(evt_len); 5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btu_stop_timer (&btm_cb.devcb.rln_timer); 5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If there was a callback address for read local name, call it */ 5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.devcb.p_rln_cmpl_cb = NULL; 5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb) 5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_UINT8 (status, p); 5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status == HCI_SUCCESS) 5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*p_cb)(p); 5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*p_cb)(NULL); 5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_SetDeviceClass 5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to set the local device class 5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns status of the operation 5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_SetDeviceClass (DEV_CLASS dev_class) 5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(!memcmp (btm_cb.devcb.dev_class, dev_class, DEV_CLASS_LEN)) 5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_SUCCESS); 5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (btm_cb.devcb.dev_class, dev_class, DEV_CLASS_LEN); 5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 57130e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson if (!controller_get_interface()->get_is_ready()) 5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BTM_DEV_RESET); 5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!btsnd_hcic_write_dev_class (dev_class)) 5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BTM_NO_RESOURCES); 5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BTM_SUCCESS); 5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_ReadDeviceClass 5845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to read the local device class 5865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns pointer to the device class 5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 *BTM_ReadDeviceClass (void) 5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return ((UINT8 *)btm_cb.devcb.dev_class); 5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_ReadLocalFeatures 5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to read the local features 6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns pointer to the local features string 6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 60530e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson// TODO(zachoverflow): get rid of this function 6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 *BTM_ReadLocalFeatures (void) 6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 60830e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson // Discarding const modifier for now, until this function dies 60930e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson return (UINT8 *)controller_get_interface()->get_features_classic(0)->as_array; 6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_RegisterForDeviceStatusNotif 6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to register for device status 6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** change notifications. 6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** If one registration is already there calling function should 6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** save the pointer to the function that is return and 6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** call it when processing of the event is complete 6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns status of the operation 6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_DEV_STATUS_CB *BTM_RegisterForDeviceStatusNotif (tBTM_DEV_STATUS_CB *p_cb) 6275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_DEV_STATUS_CB *p_prev = btm_cb.devcb.p_dev_status_cb; 6295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.devcb.p_dev_status_cb = p_cb; 6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (p_prev); 6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_VendorSpecificCommand 6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Send a vendor specific HCI command to the controller. 6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns 6415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_SUCCESS Command sent. Does not expect command complete 6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** event. (command cmpl callback param is NULL) 6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_CMD_STARTED Command sent. Waiting for command cmpl event. 6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Notes 6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Opcode will be OR'd with HCI_GRP_VENDOR_SPECIFIC. 6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_VendorSpecificCommand(UINT16 opcode, UINT8 param_len, 6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p_param_buf, tBTM_VSC_CMPL_CB *p_cb) 6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project void *p_buf; 6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6545344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("BTM: BTM_VendorSpecificCommand: Opcode: 0x%04X, ParamLen: %i.", 6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project opcode, param_len); 6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Allocate a buffer to hold HCI command plus the callback function */ 6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_buf = GKI_getbuf((UINT16)(sizeof(BT_HDR) + sizeof (tBTM_CMPL_CB *) + 6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project param_len + HCIC_PREAMBLE_SIZE))) != NULL) 6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Send the HCI command (opcode will be OR'd with HCI_GRP_VENDOR_SPECIFIC) */ 6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_vendor_spec_cmd (p_buf, opcode, param_len, p_param_buf, (void *)p_cb); 6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Return value */ 6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb != NULL) 6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BTM_CMD_STARTED); 6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BTM_SUCCESS); 6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BTM_NO_RESOURCES); 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/******************************************************************************* 6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_vsc_complete 6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when local HCI Vendor Specific 6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Command complete message is received from the HCI. 6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_vsc_complete (UINT8 *p, UINT16 opcode, UINT16 evt_len, 6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_CMPL_CB *p_vsc_cplt_cback) 6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_VSC_CMPL vcs_cplt_params; 6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If there was a callback address for vcs complete, call it */ 6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_vsc_cplt_cback) 6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Pass paramters to the callback function */ 6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project vcs_cplt_params.opcode = opcode; /* Number of bytes in return info */ 6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project vcs_cplt_params.param_len = evt_len; /* Number of bytes in return info */ 6975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project vcs_cplt_params.p_param_buf = p; 6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*p_vsc_cplt_cback)(&vcs_cplt_params); /* Call the VSC complete callback function */ 6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_RegisterForVSEvents 7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to register/deregister for vendor 7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** specific HCI events. 7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** If is_register=TRUE, then the function will be registered; 7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** if is_register=FALSE, then the function will be deregistered. 7115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns BTM_SUCCESS if successful, 7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_BUSY if maximum number of callbacks have already been 7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** registered. 7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_RegisterForVSEvents (tBTM_VS_EVT_CB *p_cb, BOOLEAN is_register) 7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_STATUS retval = BTM_SUCCESS; 7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 i, free_idx = BTM_MAX_VSE_CALLBACKS; 7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* See if callback is already registered */ 7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i=0; i<BTM_MAX_VSE_CALLBACKS; i++) 7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.devcb.p_vend_spec_cb[i] == NULL) 7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Found a free slot. Store index */ 7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project free_idx = i; 7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (btm_cb.devcb.p_vend_spec_cb[i] == p_cb) 7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Found callback in lookup table. If deregistering, clear the entry. */ 7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (is_register == FALSE) 7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.devcb.p_vend_spec_cb[i] = NULL; 7365344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT("BTM Deregister For VSEvents is successfully"); 7375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BTM_SUCCESS); 7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Didn't find callback. Add callback to free slot if registering */ 7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (is_register) 7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (free_idx < BTM_MAX_VSE_CALLBACKS) 7465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.devcb.p_vend_spec_cb[free_idx] = p_cb; 7485344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT("BTM Register For VSEvents is successfully"); 7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 7515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* No free entries available */ 7535344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_ERROR ("BTM_RegisterForVSEvents: too many callbacks registered"); 7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project retval = BTM_NO_RESOURCES; 7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (retval); 7605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 7635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_vendor_specific_evt 7655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Process event HCI_VENDOR_SPECIFIC_EVT 7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Note: Some controllers do not send command complete, so 7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the callback and busy flag are cleared here also. 7705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 7725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 7745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_vendor_specific_evt (UINT8 *p, UINT8 evt_len) 7755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 i; 7775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7785344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("BTM Event: Vendor Specific event from controller"); 7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i=0; i<BTM_MAX_VSE_CALLBACKS; i++) 7815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.devcb.p_vend_spec_cb[i]) 7835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.devcb.p_vend_spec_cb[i])(evt_len, p); 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/******************************************************************************* 7895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_WritePageTimeout 7915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Send HCI Write Page Timeout. 7935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns 7955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_SUCCESS Command sent. 7965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_NO_RESOURCES If out of resources to send the command. 7975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 8005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_WritePageTimeout(UINT16 timeout) 8015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 8025344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("BTM: BTM_WritePageTimeout: Timeout: %d.", timeout); 8035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Send the HCI command */ 8055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btsnd_hcic_write_page_tout (timeout)) 8065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BTM_SUCCESS); 8075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 8085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BTM_NO_RESOURCES); 8095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 8125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_WriteVoiceSettings 8145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Send HCI Write Voice Settings command. 8165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** See hcidefs.h for settings bitmask values. 8175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns 8195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_SUCCESS Command sent. 8205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_NO_RESOURCES If out of resources to send the command. 8215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 8245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_WriteVoiceSettings(UINT16 settings) 8255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 8265344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("BTM: BTM_WriteVoiceSettings: Settings: 0x%04x.", settings); 8275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Send the HCI command */ 8295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btsnd_hcic_write_voice_settings ((UINT16)(settings & 0x03ff))) 8305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BTM_SUCCESS); 8315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BTM_NO_RESOURCES); 8335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 8365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_EnableTestMode 8385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Send HCI the enable device under test command. 8405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Note: Controller can only be taken out of this mode by 8425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** resetting the controller. 8435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns 8455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_SUCCESS Command sent. 8465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_NO_RESOURCES If out of resources to send the command. 8475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 8505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_EnableTestMode(void) 8515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 8525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 cond; 8535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8545344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("BTM: BTM_EnableTestMode"); 8555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* set auto accept connection as this is needed during test mode */ 8575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Allocate a buffer to hold HCI command */ 8585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cond = HCI_DO_AUTO_ACCEPT_CONNECT; 8595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!btsnd_hcic_set_event_filter(HCI_FILTER_CONNECTION_SETUP, 8605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project HCI_FILTER_COND_NEW_DEVICE, 8615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project &cond, sizeof(cond))) 8625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BTM_NO_RESOURCES); 8645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* put device to connectable mode */ 8675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!BTM_SetConnectability(BTM_CONNECTABLE, BTM_DEFAULT_CONN_WINDOW, 8685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_DEFAULT_CONN_INTERVAL) == BTM_SUCCESS) 8695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BTM_NO_RESOURCES; 8715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* put device to discoverable mode */ 8745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!BTM_SetDiscoverability(BTM_GENERAL_DISCOVERABLE, BTM_DEFAULT_DISC_WINDOW, 8755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_DEFAULT_DISC_INTERVAL) == BTM_SUCCESS) 8765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BTM_NO_RESOURCES; 8785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* mask off all of event from controller */ 88130e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson hci_layer_get_interface()->transmit_command( 8821cdde97ec39374873bfd8b592aecc923ea9dd332Zach Johnson hci_packet_factory_get_interface()->make_set_event_mask((const bt_event_mask_t *)("\x00\x00\x00\x00\x00\x00\x00\x00")), 88330e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson NULL, 88430e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson NULL, 88530e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson NULL); 8865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Send the HCI command */ 8885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btsnd_hcic_enable_test_mode ()) 8895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BTM_SUCCESS); 8905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 8915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BTM_NO_RESOURCES); 8925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 8955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_DeleteStoredLinkKey 8975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to delete link key for the specified 8995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** device addresses from the NVRAM storage attached to the Bluetooth 9005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** controller. 9015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: bd_addr - Addresses of the devices 9035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_cb - Call back function to be called to return 9045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the results 9055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 9075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_DeleteStoredLinkKey(BD_ADDR bd_addr, tBTM_CMPL_CB *p_cb) 9085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 9095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BD_ADDR local_bd_addr; 9105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN delete_all_flag = FALSE; 9115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check if the previous command is completed */ 9135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.devcb.p_stored_link_key_cmpl_cb) 9145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BTM_BUSY); 9155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!bd_addr) 9175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* This is to delete all link keys */ 9195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project delete_all_flag = TRUE; 9205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* We don't care the BD address. Just pass a non zero pointer */ 9225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bd_addr = local_bd_addr; 9235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9255344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("BTM: BTM_DeleteStoredLinkKey: delete_all_flag: %s", 9265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project delete_all_flag ? "TRUE" : "FALSE"); 9275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Send the HCI command */ 9295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.devcb.p_stored_link_key_cmpl_cb = p_cb; 9305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!btsnd_hcic_delete_stored_key (bd_addr, delete_all_flag)) 9315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BTM_NO_RESOURCES); 9335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 9355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BTM_SUCCESS); 9365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 9375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 9395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_delete_stored_link_key_complete 9415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when the command complete message 9435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** is received from the HCI for the delete stored link key command. 9445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 9465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 9485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_delete_stored_link_key_complete (UINT8 *p) 9495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 9505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_CMPL_CB *p_cb = btm_cb.devcb.p_stored_link_key_cmpl_cb; 9515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_DELETE_STORED_LINK_KEY_COMPLETE result; 9525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If there was a callback registered for read stored link key, call it */ 9545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.devcb.p_stored_link_key_cmpl_cb = NULL; 9555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb) 9575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Set the call back event to indicate command complete */ 9595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result.event = BTM_CB_EVT_DELETE_STORED_LINK_KEYS; 9605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Extract the result fields from the HCI event */ 9625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_UINT8 (result.status, p); 9635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_UINT16 (result.num_keys, p); 9645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Call the call back and pass the result */ 9665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*p_cb)(&result); 9675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 9695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 9715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_report_device_status 9735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when there is a change in the device 9755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** status. This function will report the new device status to 9765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the application 9775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 9795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 9815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_report_device_status (tBTM_DEV_STATUS status) 9825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 9835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_DEV_STATUS_CB *p_cb = btm_cb.devcb.p_dev_status_cb; 9845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Call the call back to pass the device status to application */ 9865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb) 9875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*p_cb)(status); 9885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 9895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 991