15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Copyright (C) 2000-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 SCO connections. This includes 225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * operations such as connect, disconnect, change supported packet types. 235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h> 27258c2538e3b62a8cdb403f2730c45d721e5292b4Pavlin Radoslavov#include "bt_common.h" 28911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#include "bt_target.h" 295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_types.h" 30911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#include "bt_utils.h" 315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_api.h" 325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_int.h" 33911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#include "btu.h" 344de9bbcde79eb98dbfd56de292902549ac3e2bc1Mudumba Ananth#include "device/include/controller.h" 35181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth#include "device/include/esco_parameters.h" 36911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#include "hcidefs.h" 37911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#include "hcimsgs.h" 38d7ffd64accbd50a27289a388856e56244ccbb5daMyles Watson#include "osi/include/osi.h" 394de9bbcde79eb98dbfd56de292902549ac3e2bc1Mudumba Ananth 40d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (BTM_SCO_INCLUDED == TRUE) 415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 42ee96a3c60fca590d38025925c072d264e06493c4Myles Watson/******************************************************************************/ 439ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson/* L O C A L D A T A D E F I N I T I O N S */ 44ee96a3c60fca590d38025925c072d264e06493c4Myles Watson/******************************************************************************/ 455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 46911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#define SCO_ST_UNUSED 0 47911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#define SCO_ST_LISTENING 1 48911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#define SCO_ST_W4_CONN_RSP 2 49911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#define SCO_ST_CONNECTING 3 50911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#define SCO_ST_CONNECTED 4 51911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#define SCO_ST_DISCONNECTING 5 52911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#define SCO_ST_PEND_UNPARK 6 53911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#define SCO_ST_PEND_ROLECHANGE 7 54911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#define SCO_ST_PEND_MODECHANGE 8 555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 56ee96a3c60fca590d38025925c072d264e06493c4Myles Watson/******************************************************************************/ 579ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson/* L O C A L F U N C T I O N P R O T O T Y P E S */ 58ee96a3c60fca590d38025925c072d264e06493c4Myles Watson/******************************************************************************/ 595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 60181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananthstatic uint16_t btm_sco_voice_settings_to_legacy(enh_esco_params_t* p_parms); 615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 63ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 64ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_sco_flush_sco_data 65ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 669ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description This function is called to flush the SCO data for this 679ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * channel. 68ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 69ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 70ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 71ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 72911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#if (BTM_SCO_HCI_INCLUDED == TRUE && BTM_MAX_SCO_LINKS > 0) 73911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_sco_flush_sco_data(uint16_t sco_inx) { 74911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSCO_CONN* p; 75911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BT_HDR* p_buf; 765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 77911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (sco_inx < BTM_MAX_SCO_LINKS) { 78911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p = &btm_cb.sco_cb.sco_db[sco_inx]; 79911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson while ((p_buf = (BT_HDR*)fixed_queue_try_dequeue(p->xmit_data_q)) != NULL) 80911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson osi_free(p_buf); 81911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 82d628a0695e73973e0bd54dd026bfed900b69f804Myles Watson} 835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 84911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#else 85911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_sco_flush_sco_data(UNUSED_ATTR uint16_t sco_inx) {} 86d628a0695e73973e0bd54dd026bfed900b69f804Myles Watson#endif 875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 88ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 89ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_sco_init 90ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 91ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called at BTM startup to initialize 92ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 93ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 94ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 95ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 96911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_sco_init(void) { 97d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (BTM_SCO_HCI_INCLUDED == TRUE) 98911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (int i = 0; i < BTM_MAX_SCO_LINKS; i++) 99911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.sco_cb.sco_db[i].xmit_data_q = fixed_queue_new(SIZE_MAX); 1001a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov#endif 101911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Initialize nonzero defaults */ 102911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.sco_cb.sco_disc_reason = BTM_INVALID_SCO_DISC_REASON; 103181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth btm_cb.sco_cb.def_esco_parms = esco_parameters_for_codec(ESCO_CODEC_CVSD); 104181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth btm_cb.sco_cb.def_esco_parms.max_latency_ms = 12; 105181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth btm_cb.sco_cb.sco_route = ESCO_DATA_PATH_PCM; 1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 109ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 110ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_esco_conn_rsp 111ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 112ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called upon receipt of an (e)SCO connection 113ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * request event (BTM_ESCO_CONN_REQ_EVT) to accept or reject 114ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * the request. Parameters used to negotiate eSCO links. 115ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * If p_parms is NULL, then default values are used. 116ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * If the link type of the incoming request is SCO, then only 117ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * the tx_bw, max_latency, content format, and packet_types are 118ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * valid. The hci_status parameter should be 119ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * ([0x0] to accept, [0x0d..0x0f] to reject) 120ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 121ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 122ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 123ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 124911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btm_esco_conn_rsp(uint16_t sco_inx, uint8_t hci_status, BD_ADDR bda, 125181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth enh_esco_params_t* p_parms) { 126911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#if (BTM_MAX_SCO_LINKS > 0) 127911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSCO_CONN* p_sco = NULL; 1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 129911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (sco_inx < BTM_MAX_SCO_LINKS) p_sco = &btm_cb.sco_cb.sco_db[sco_inx]; 130911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 131911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Reject the connect request if refused by caller or wrong state */ 132911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (hci_status != HCI_SUCCESS || p_sco == NULL) { 133911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_sco) { 134911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_sco->state = (p_sco->state == SCO_ST_W4_CONN_RSP) ? SCO_ST_LISTENING 135911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson : SCO_ST_UNUSED; 1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 137911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!btm_cb.sco_cb.esco_supported) { 138911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_reject_conn(bda, hci_status); 139911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 140911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_reject_esco_conn(bda, hci_status); 141911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 142a43e1304c2cbca16d583e08b63cb4c95a37b7b87Jack He } else { 143a43e1304c2cbca16d583e08b63cb4c95a37b7b87Jack He /* Connection is being accepted */ 144911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_sco->state = SCO_ST_CONNECTING; 145181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth enh_esco_params_t* p_setup = &p_sco->esco.setup; 146911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If parameters not specified use the default */ 147a43e1304c2cbca16d583e08b63cb4c95a37b7b87Jack He if (p_parms) { 148911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_setup = *p_parms; 149a43e1304c2cbca16d583e08b63cb4c95a37b7b87Jack He } else { 150a43e1304c2cbca16d583e08b63cb4c95a37b7b87Jack He /* Use the last setup passed thru BTM_SetEscoMode (or defaults) */ 151911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_setup = btm_cb.sco_cb.def_esco_parms; 152911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 154181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth uint16_t temp_packet_types = 155181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth (p_setup->packet_types & BTM_SCO_SUPPORTED_PKTS_MASK & 156181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth btm_cb.btm_sco_pkt_types_supported); 1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 158911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Make sure at least one eSCO packet type is sent, else might confuse peer 159911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson */ 160911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Taking this out to confirm with BQB tests 161911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ** Real application would like to include this though, as many devices 162911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ** do not retry with SCO only if an eSCO connection fails. 163181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth if (!(temp_packet_types & BTM_ESCO_LINK_ONLY_MASK)) 164911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson { 165181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth temp_packet_types |= BTM_SCO_PKT_TYPES_MASK_EV3; 1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 167911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson */ 168911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If SCO request, remove eSCO packet types (conformance) */ 169911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_sco->esco.data.link_type == BTM_LINK_TYPE_SCO) { 170181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth temp_packet_types &= BTM_SCO_LINK_ONLY_MASK; 171181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth temp_packet_types |= BTM_SCO_EXCEPTION_PKTS_MASK; 172911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 173911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* OR in any exception packet types */ 174181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth temp_packet_types |= 175911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ((p_setup->packet_types & BTM_SCO_EXCEPTION_PKTS_MASK) | 176911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (btm_cb.btm_sco_pkt_types_supported & BTM_SCO_EXCEPTION_PKTS_MASK)); 177911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 178911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 179181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth /* Use Enhanced Synchronous commands if supported */ 180181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth if (controller_get_interface() 181181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth ->supports_enhanced_setup_synchronous_connection()) { 182181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth /* Use the saved SCO routing */ 183181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth p_setup->input_data_path = p_setup->output_data_path = 184181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth btm_cb.sco_cb.sco_route; 185181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth 186181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth BTM_TRACE_DEBUG( 187a43e1304c2cbca16d583e08b63cb4c95a37b7b87Jack He "%s: txbw 0x%x, rxbw 0x%x, lat 0x%x, retrans 0x%02x, " 188a43e1304c2cbca16d583e08b63cb4c95a37b7b87Jack He "pkt 0x%04x, path %u", 189181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth __func__, p_setup->transmit_bandwidth, p_setup->receive_bandwidth, 190181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth p_setup->max_latency_ms, p_setup->retransmission_effort, 191181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth p_setup->packet_types, p_setup->input_data_path); 192181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth 193181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth btsnd_hcic_enhanced_accept_synchronous_connection(bda, p_setup); 194181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth 195a43e1304c2cbca16d583e08b63cb4c95a37b7b87Jack He } else { 196a43e1304c2cbca16d583e08b63cb4c95a37b7b87Jack He /* Use legacy command if enhanced SCO setup is not supported */ 197181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth uint16_t voice_content_format = btm_sco_voice_settings_to_legacy(p_setup); 198181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth btsnd_hcic_accept_esco_conn( 199181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth bda, p_setup->transmit_bandwidth, p_setup->receive_bandwidth, 200181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth p_setup->max_latency_ms, voice_content_format, 201181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth p_setup->retransmission_effort, p_setup->packet_types); 202181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth } 203911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 207d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (BTM_SCO_HCI_INCLUDED == TRUE) 2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 209ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 210ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_sco_check_send_pkts 211ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 212ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to check if it can send packets 213ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * to the Host Controller. 214ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 215ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 216ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 217ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 218911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_sco_check_send_pkts(uint16_t sco_inx) { 219911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSCO_CB* p_cb = &btm_cb.sco_cb; 220911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSCO_CONN* p_ccb = &p_cb->sco_db[sco_inx]; 221911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 222911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If there is data to send, send it now */ 223911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BT_HDR* p_buf; 224911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson while ((p_buf = (BT_HDR*)fixed_queue_try_dequeue(p_ccb->xmit_data_q)) != 225911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson NULL) { 226d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (BTM_SCO_HCI_DEBUG == TRUE) 227911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("btm: [%d] buf in xmit_data_q", 228911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson fixed_queue_length(p_ccb->xmit_data_q) + 1); 2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 231911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson HCI_SCO_DATA_TO_LOWER(p_buf); 232911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* BTM_SCO_HCI_INCLUDED == TRUE */ 2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 237ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 238ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_route_sco_data 239ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 240ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description Route received SCO data. 241ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 242ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 243ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 244ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 245911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_route_sco_data(BT_HDR* p_msg) { 246d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (BTM_SCO_HCI_INCLUDED == TRUE) 247911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t sco_inx, handle; 248911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t* p = (uint8_t*)(p_msg + 1) + p_msg->offset; 249911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t pkt_size = 0; 250911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t pkt_status = 0; 251911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 252911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Extract Packet_Status_Flag and handle */ 253911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson STREAM_TO_UINT16(handle, p); 254911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson pkt_status = HCID_GET_EVENT(handle); 255911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson handle = HCID_GET_HANDLE(handle); 256911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 257911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson STREAM_TO_UINT8(pkt_size, p); 258911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 259911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson sco_inx = btm_find_scb_by_handle(handle); 260911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (sco_inx != BTM_MAX_SCO_LINKS) { 261911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* send data callback */ 262911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!btm_cb.sco_cb.p_data_cb) 263911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* if no data callback registered, just free the buffer */ 264911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson osi_free(p_msg); 265911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else { 266911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (*btm_cb.sco_cb.p_data_cb)(sco_inx, p_msg, 267911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (tBTM_SCO_DATA_FLAG)pkt_status); 2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 269911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else /* no mapping handle SCO connection is active, free the buffer */ 270911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson { 271cceb430489a70add1b996d54289867c17f4ac0fdPavlin Radoslavov osi_free(p_msg); 272911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 273911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#else 274911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson osi_free(p_msg); 2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 279ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 280ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_WriteScoData 281ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2829ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description This function write SCO data to a specified instance. The 2839ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * data to be written p_buf needs to carry an offset of 284ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * HCI_SCO_PREAMBLE_SIZE bytes, and the data length can not 2859ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * exceed BTM_SCO_DATA_SIZE_MAX bytes, whose default value is 2869ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * set to 60 and is configurable. Data longer than the maximum 2879ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * bytes will be truncated. 288ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 289ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns BTM_SUCCESS: data write is successful 290ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_ILLEGAL_VALUE: SCO data contains illegal offset value. 2919ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * BTM_SCO_BAD_LENGTH: SCO data length exceeds the max SCO 2929ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * packet size. 293ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_NO_RESOURCES: no resources. 2949ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * BTM_UNKNOWN_ADDR: unknown SCO connection handle, or SCO is 2959ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * not routed via HCI. 296ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 297ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 298ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 299d628a0695e73973e0bd54dd026bfed900b69f804Myles Watson#if (BTM_SCO_HCI_INCLUDED == TRUE && BTM_MAX_SCO_LINKS > 0) 300911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsontBTM_STATUS BTM_WriteScoData(uint16_t sco_inx, BT_HDR* p_buf) { 301911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSCO_CONN* p_ccb = &btm_cb.sco_cb.sco_db[sco_inx]; 302911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t* p; 303911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_STATUS status = BTM_SUCCESS; 304911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 305911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (sco_inx < BTM_MAX_SCO_LINKS && btm_cb.sco_cb.p_data_cb && 306911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_ccb->state == SCO_ST_CONNECTED) { 307911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Ensure we have enough space in the buffer for the SCO and HCI headers */ 308911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_buf->offset < HCI_SCO_PREAMBLE_SIZE) { 309911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_ERROR("BTM SCO - cannot send buffer, offset: %d", 310911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_buf->offset); 311911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson osi_free(p_buf); 312911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson status = BTM_ILLEGAL_VALUE; 313911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else /* write HCI header */ 3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 315911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Step back 3 bytes to add the headers */ 316911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_buf->offset -= HCI_SCO_PREAMBLE_SIZE; 317911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Set the pointer to the beginning of the data */ 318911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p = (uint8_t*)(p_buf + 1) + p_buf->offset; 319911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* add HCI handle */ 320911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT16_TO_STREAM(p, p_ccb->hci_handle); 321911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* only sent the first BTM_SCO_DATA_SIZE_MAX bytes data if more than max, 322911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson and set warning status */ 323911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_buf->len > BTM_SCO_DATA_SIZE_MAX) { 324911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_buf->len = BTM_SCO_DATA_SIZE_MAX; 325911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson status = BTM_SCO_BAD_LENGTH; 326911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 327911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 328911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT8_TO_STREAM(p, (uint8_t)p_buf->len); 329911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_buf->len += HCI_SCO_PREAMBLE_SIZE; 330911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 331911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson fixed_queue_enqueue(p_ccb->xmit_data_q, p_buf); 332911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 333911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sco_check_send_pkts(sco_inx); 3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 335911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 336911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson osi_free(p_buf); 3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 338181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth BTM_TRACE_ERROR("%s:invalid sco index: %d at state [%d]", __func__, sco_inx, 339181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth btm_cb.sco_cb.sco_db[sco_inx].state); 340911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson status = BTM_UNKNOWN_ADDR; 341911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 343181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth return status; 344d628a0695e73973e0bd54dd026bfed900b69f804Myles Watson} 3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 346d628a0695e73973e0bd54dd026bfed900b69f804Myles WatsontBTM_STATUS BTM_WriteScoData(UNUSED_ATTR uint16_t sco_inx, 347911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UNUSED_ATTR BT_HDR* p_buf) { 348911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_NO_RESOURCES); 3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 350d628a0695e73973e0bd54dd026bfed900b69f804Myles Watson#endif 3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 352911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#if (BTM_MAX_SCO_LINKS > 0) 3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 354ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 355ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_send_connect_request 356ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 3579ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description This function is called to respond to SCO connect 3589ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * indications 359ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 360ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 361ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 362ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 363d19e0785e662e640191a075eda07acce61c2aedaMarie Janssenstatic tBTM_STATUS btm_send_connect_request(uint16_t acl_handle, 364181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth enh_esco_params_t* p_setup) { 365911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tACL_CONN* p_acl; 366911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 367911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Send connect request depending on version of spec */ 368911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!btm_cb.sco_cb.esco_supported) { 369911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_add_SCO_conn(acl_handle, BTM_ESCO_2_SCO(p_setup->packet_types)); 370911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 371181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth uint16_t temp_packet_types = 372181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth (p_setup->packet_types & BTM_SCO_SUPPORTED_PKTS_MASK & 373181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth btm_cb.btm_sco_pkt_types_supported); 374911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 375911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* OR in any exception packet types */ 376181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth temp_packet_types |= 377911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ((p_setup->packet_types & BTM_SCO_EXCEPTION_PKTS_MASK) | 378911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (btm_cb.btm_sco_pkt_types_supported & BTM_SCO_EXCEPTION_PKTS_MASK)); 379911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 380911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Finally, remove EDR eSCO if the remote device doesn't support it */ 381911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* UPF25: Only SCO was brought up in this case */ 382911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_handle_to_acl_index(acl_handle); 383181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth uint8_t acl_index = btm_handle_to_acl_index(acl_handle); 384181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth if (acl_index < MAX_L2CAP_LINKS) { 385181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth p_acl = &btm_cb.acl_db[acl_index]; 386f6ac424a81bad038bbf9a90c7c569dba81978f51Venkata Jagadeesh Garaga if (!HCI_EDR_ESCO_2MPS_SUPPORTED(p_acl->peer_lmp_feature_pages[0])) { 387911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_WARNING("BTM Remote does not support 2-EDR eSCO"); 388181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth temp_packet_types |= 389181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth (ESCO_PKT_TYPES_MASK_NO_2_EV3 | ESCO_PKT_TYPES_MASK_NO_2_EV5); 390911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 391f6ac424a81bad038bbf9a90c7c569dba81978f51Venkata Jagadeesh Garaga if (!HCI_EDR_ESCO_3MPS_SUPPORTED(p_acl->peer_lmp_feature_pages[0])) { 392911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_WARNING("BTM Remote does not support 3-EDR eSCO"); 393181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth temp_packet_types |= 394181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth (ESCO_PKT_TYPES_MASK_NO_3_EV3 | ESCO_PKT_TYPES_MASK_NO_3_EV5); 395911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 396911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 397911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Check to see if BR/EDR Secure Connections is being used 398911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ** If so, we cannot use SCO-only packet types (HFP 1.7) 399911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson */ 400911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (BTM_BothEndsSupportSecureConnections(p_acl->remote_addr)) { 401181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth temp_packet_types &= ~(BTM_SCO_PKT_TYPE_MASK); 402911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s: SCO Conn: pkt_types after removing SCO (0x%04x)", 403a43e1304c2cbca16d583e08b63cb4c95a37b7b87Jack He __func__, temp_packet_types); 404911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 405911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Return error if no packet types left */ 406181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth if (temp_packet_types == 0) { 407911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_ERROR("%s: SCO Conn (BR/EDR SC): No packet types available", 408911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson __func__); 409911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_WRONG_MODE); 4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 411911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 412911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG( 413911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "%s: SCO Conn(BR/EDR SC):local or peer does not support BR/EDR SC", 414911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson __func__); 415911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 416911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 418181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth /* Save the previous types in case command fails */ 419181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth uint16_t saved_packet_types = p_setup->packet_types; 420181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth p_setup->packet_types = temp_packet_types; 421181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth 422181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth /* Use Enhanced Synchronous commands if supported */ 423181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth if (controller_get_interface() 424181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth ->supports_enhanced_setup_synchronous_connection()) { 425181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth /* Use the saved SCO routing */ 426181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth p_setup->input_data_path = p_setup->output_data_path = 427181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth btm_cb.sco_cb.sco_route; 428181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth 429181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth BTM_TRACE_DEBUG( 430181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth "%s: txbw 0x%x, rxbw 0x%x, " 431181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth "lat 0x%x, retrans 0x%02x, pkt 0x%04x, path %u", 432181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth __func__, p_setup->transmit_bandwidth, p_setup->receive_bandwidth, 433181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth p_setup->max_latency_ms, p_setup->retransmission_effort, 434181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth p_setup->packet_types, p_setup->input_data_path); 435181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth 436181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth btsnd_hcic_enhanced_set_up_synchronous_connection(acl_handle, p_setup); 437181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth p_setup->packet_types = saved_packet_types; 438181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth } else { /* Use older command */ 439181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth uint16_t voice_content_format = btm_sco_voice_settings_to_legacy(p_setup); 440181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth 441181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth BTM_TRACE_API( 442181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth "%s: txbw 0x%x, rxbw 0x%x, " 443181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth "lat 0x%x, voice 0x%x, retrans 0x%02x, pkt 0x%04x", 444181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth __func__, p_setup->transmit_bandwidth, p_setup->receive_bandwidth, 445181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth p_setup->max_latency_ms, voice_content_format, 446181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth p_setup->retransmission_effort, p_setup->packet_types); 447181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth 448181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth btsnd_hcic_setup_esco_conn( 449181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth acl_handle, p_setup->transmit_bandwidth, p_setup->receive_bandwidth, 450181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth p_setup->max_latency_ms, voice_content_format, 451181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth p_setup->retransmission_effort, p_setup->packet_types); 452181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth } 453911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 455911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_CMD_STARTED); 4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 460ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 461ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_set_sco_ind_cback 462ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 463ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to register for TCS SCO connect 464ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * indications. 465ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 466ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 467ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 468ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 469911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_set_sco_ind_cback(tBTM_SCO_IND_CBACK* sco_ind_cb) { 470911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.sco_cb.app_sco_ind_cb = sco_ind_cb; 4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 474ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 475ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_accept_sco_link 476ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 477ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to respond to TCS SCO connect 478ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * indications 479ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 480ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 481ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 482ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 483181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananthvoid btm_accept_sco_link(uint16_t sco_inx, enh_esco_params_t* p_setup, 484911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SCO_CB* p_conn_cb, tBTM_SCO_CB* p_disc_cb) { 485911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#if (BTM_MAX_SCO_LINKS > 0) 486911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSCO_CONN* p_sco; 4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 488911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (sco_inx >= BTM_MAX_SCO_LINKS) { 489911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_ERROR("btm_accept_sco_link: Invalid sco_inx(%d)", sco_inx); 490911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 491911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 493911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Link role is ignored in for this message */ 494911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_sco = &btm_cb.sco_cb.sco_db[sco_inx]; 495911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_sco->p_conn_cb = p_conn_cb; 496911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_sco->p_disc_cb = p_disc_cb; 497911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_sco->esco.data.link_type = 498911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_LINK_TYPE_ESCO; /* Accept with all supported types */ 4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 500911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("TCS accept SCO: Packet Types 0x%04x", p_setup->packet_types); 5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 502911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_esco_conn_rsp(sco_inx, HCI_SUCCESS, p_sco->esco.data.bd_addr, p_setup); 5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 504911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_reject_sco_link(sco_inx); 5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 509ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 510ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_reject_sco_link 511ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5129ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description This function is called to respond to SCO connect 5139ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * indications 514ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 515ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 516ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 517ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 518911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_reject_sco_link(uint16_t sco_inx) { 519911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_esco_conn_rsp(sco_inx, HCI_ERR_HOST_REJECT_RESOURCES, 520911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.sco_cb.sco_db[sco_inx].esco.data.bd_addr, NULL); 5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 524ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 525ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_CreateSco 526ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 527ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to create an SCO connection. If the 528ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * "is_orig" flag is true, the connection will be originated, 529ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * otherwise BTM will wait for the other side to connect. 530ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 531ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * NOTE: If BTM_IGNORE_SCO_PKT_TYPE is passed in the pkt_types 532ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * parameter the default packet types is used. 533ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 534ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns BTM_UNKNOWN_ADDR if the ACL connection is not up 535ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_BUSY if another SCO being set up to 536ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * the same BD address 537ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_NO_RESOURCES if the max SCO limit has been reached 538ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_CMD_STARTED if the connection establishment is started. 539ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * In this case, "*p_sco_inx" is filled in 540ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * with the sco index used for the connection. 541ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 542ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 543911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsontBTM_STATUS BTM_CreateSco(BD_ADDR remote_bda, bool is_orig, uint16_t pkt_types, 544911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t* p_sco_inx, tBTM_SCO_CB* p_conn_cb, 545911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SCO_CB* p_disc_cb) { 5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_MAX_SCO_LINKS > 0) 547181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth enh_esco_params_t* p_setup; 548911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSCO_CONN* p = &btm_cb.sco_cb.sco_db[0]; 549911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t xx; 550911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t acl_handle = 0; 551911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tACL_CONN* p_acl; 5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 553e7ef465c37298c2b64b7e9794659b1b1b50ab877Chris Manton#if (BTM_SCO_WAKE_PARKED_LINK == TRUE) 554911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_PM_PWR_MD pm; 555911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_PM_STATE state; 5568847ff137b311a37c57366ac8d138b605397dce1Mallikarjuna GB#else 557911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t mode; 558e7ef465c37298c2b64b7e9794659b1b1b50ab877Chris Manton#endif // BTM_SCO_WAKE_PARKED_LINK 5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 560911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_sco_inx = BTM_INVALID_SCO_INDEX; 5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 562911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If originating, ensure that there is an ACL connection to the BD Address */ 563a43e1304c2cbca16d583e08b63cb4c95a37b7b87Jack He 564911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (is_orig) { 565a43e1304c2cbca16d583e08b63cb4c95a37b7b87Jack He if (!remote_bda) { 566a43e1304c2cbca16d583e08b63cb4c95a37b7b87Jack He BTM_TRACE_ERROR("%s: remote_bda is null", __func__); 567a43e1304c2cbca16d583e08b63cb4c95a37b7b87Jack He return BTM_ILLEGAL_VALUE; 568a43e1304c2cbca16d583e08b63cb4c95a37b7b87Jack He } 569a43e1304c2cbca16d583e08b63cb4c95a37b7b87Jack He acl_handle = BTM_GetHCIConnHandle(remote_bda, BT_TRANSPORT_BR_EDR); 570a43e1304c2cbca16d583e08b63cb4c95a37b7b87Jack He if (acl_handle == 0xFFFF) { 571a43e1304c2cbca16d583e08b63cb4c95a37b7b87Jack He BTM_TRACE_ERROR( 572a43e1304c2cbca16d583e08b63cb4c95a37b7b87Jack He "%s: cannot find ACL handle for remote device " 573a43e1304c2cbca16d583e08b63cb4c95a37b7b87Jack He "%02x:%02x:%02x:%02x:%02x:%02x", 574a43e1304c2cbca16d583e08b63cb4c95a37b7b87Jack He __func__, remote_bda[0], remote_bda[1], remote_bda[2], remote_bda[3], 575a43e1304c2cbca16d583e08b63cb4c95a37b7b87Jack He remote_bda[4], remote_bda[5]); 576a43e1304c2cbca16d583e08b63cb4c95a37b7b87Jack He return BTM_UNKNOWN_ADDR; 577a43e1304c2cbca16d583e08b63cb4c95a37b7b87Jack He } 578911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 580911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (remote_bda) { 581911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If any SCO is being established to the remote BD address, refuse this */ 582911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++) { 583911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (((p->state == SCO_ST_CONNECTING) || (p->state == SCO_ST_LISTENING) || 584911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p->state == SCO_ST_PEND_UNPARK)) && 585911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (!memcmp(p->esco.data.bd_addr, remote_bda, BD_ADDR_LEN))) { 586a43e1304c2cbca16d583e08b63cb4c95a37b7b87Jack He return BTM_BUSY; 587911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 589911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 590911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Support only 1 wildcard BD address at a time */ 591911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++) { 592a43e1304c2cbca16d583e08b63cb4c95a37b7b87Jack He if ((p->state == SCO_ST_LISTENING) && (!p->rem_bd_known)) return BTM_BUSY; 5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 594911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 595911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 596a43e1304c2cbca16d583e08b63cb4c95a37b7b87Jack He /* Try to find an unused control block, and kick off the SCO establishment */ 597911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (xx = 0, p = &btm_cb.sco_cb.sco_db[0]; xx < BTM_MAX_SCO_LINKS; 598911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson xx++, p++) { 599911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p->state == SCO_ST_UNUSED) { 600911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (remote_bda) { 601911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (is_orig) { 602911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson/* can not create SCO link if in park mode */ 603d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (BTM_SCO_WAKE_PARKED_LINK == TRUE) 604911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((btm_read_power_mode_state(p->esco.data.bd_addr, &state) == 605911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_SUCCESS)) { 606911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (state == BTM_PM_ST_SNIFF || state == BTM_PM_ST_PARK || 607911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson state == BTM_PM_ST_PENDING) { 608911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s In sniff, park or pend mode: %d", __func__, 609911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson state); 610911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memset((void*)&pm, 0, sizeof(pm)); 611911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson pm.mode = BTM_PM_MD_ACTIVE; 612911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_SetPowerMode(BTM_PM_SET_ONLY_ID, remote_bda, &pm); 613911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->state = SCO_ST_PEND_UNPARK; 6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 615911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 616911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#else // BTM_SCO_WAKE_PARKED_LINK 617911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((BTM_ReadPowerMode(remote_bda, &mode) == BTM_SUCCESS) && 618911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (mode == BTM_PM_MD_PARK)) 619911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_WRONG_MODE); 620911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#endif // BTM_SCO_WAKE_PARKED_LINK 621911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 622911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(p->esco.data.bd_addr, remote_bda, BD_ADDR_LEN); 623911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->rem_bd_known = true; 624911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else 625911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->rem_bd_known = false; 626911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 627911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_setup = &p->esco.setup; 628911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_setup = btm_cb.sco_cb.def_esco_parms; 629911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 630a43e1304c2cbca16d583e08b63cb4c95a37b7b87Jack He /* Determine the packet types */ 631a43e1304c2cbca16d583e08b63cb4c95a37b7b87Jack He p_setup->packet_types = pkt_types & BTM_SCO_SUPPORTED_PKTS_MASK & 632a43e1304c2cbca16d583e08b63cb4c95a37b7b87Jack He btm_cb.btm_sco_pkt_types_supported; 633911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* OR in any exception packet types */ 634911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (controller_get_interface()->get_bt_version()->hci_version >= 635911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson HCI_PROTO_VERSION_2_0) { 636a43e1304c2cbca16d583e08b63cb4c95a37b7b87Jack He p_setup->packet_types |= 637a43e1304c2cbca16d583e08b63cb4c95a37b7b87Jack He (pkt_types & BTM_SCO_EXCEPTION_PKTS_MASK) | 638a43e1304c2cbca16d583e08b63cb4c95a37b7b87Jack He (btm_cb.btm_sco_pkt_types_supported & BTM_SCO_EXCEPTION_PKTS_MASK); 639911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 640911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 641911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->p_conn_cb = p_conn_cb; 642911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->p_disc_cb = p_disc_cb; 643911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->hci_handle = BTM_INVALID_HCI_HANDLE; 644911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->is_orig = is_orig; 645911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 646911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p->state != SCO_ST_PEND_UNPARK) { 647911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (is_orig) { 648911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If role change is in progress, do not proceed with SCO setup 649911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * Wait till role change is complete */ 650911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_acl = btm_bda_to_acl(remote_bda, BT_TRANSPORT_BR_EDR); 651911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_acl && p_acl->switch_role_state != BTM_ACL_SWKEY_STATE_IDLE) { 652911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_API("Role Change is in progress for ACL handle 0x%04x", 653911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson acl_handle); 654911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->state = SCO_ST_PEND_ROLECHANGE; 655911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 656911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 657911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 659911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p->state != SCO_ST_PEND_UNPARK && 660911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->state != SCO_ST_PEND_ROLECHANGE) { 661911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (is_orig) { 662181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth BTM_TRACE_API("%s:(e)SCO Link for ACL handle 0x%04x", __func__, 663181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth acl_handle); 6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 665911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((btm_send_connect_request(acl_handle, p_setup)) != 666911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_CMD_STARTED) 667911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_NO_RESOURCES); 6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 669911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->state = SCO_ST_CONNECTING; 670911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else 671911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->state = SCO_ST_LISTENING; 672911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 674911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_sco_inx = xx; 6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 676a43e1304c2cbca16d583e08b63cb4c95a37b7b87Jack He return BTM_CMD_STARTED; 6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 678911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 681911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If here, all SCO blocks in use */ 682a43e1304c2cbca16d583e08b63cb4c95a37b7b87Jack He return BTM_NO_RESOURCES; 6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 685e7ef465c37298c2b64b7e9794659b1b1b50ab877Chris Manton#if (BTM_SCO_WAKE_PARKED_LINK == TRUE) 6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 687ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 688ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_sco_chk_pend_unpark 689ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 690ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called by BTIF when there is a mode change 6919ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * event to see if there are SCO commands waiting for the 6929ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * unpark. 693ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 694ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 695ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 696ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 697911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_sco_chk_pend_unpark(uint8_t hci_status, uint16_t hci_handle) { 698911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#if (BTM_MAX_SCO_LINKS > 0) 699911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t xx; 700911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t acl_handle; 701911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSCO_CONN* p = &btm_cb.sco_cb.sco_db[0]; 7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 703911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++) { 704911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((p->state == SCO_ST_PEND_UNPARK) && 705911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ((acl_handle = BTM_GetHCIConnHandle( 706911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->esco.data.bd_addr, BT_TRANSPORT_BR_EDR)) == hci_handle)) 7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 708911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson { 709911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_API( 710181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth "%s:(e)SCO Link for ACL " 711181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth "handle 0x%04x, hci_status 0x%02x", 712181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth __func__, acl_handle, hci_status); 713911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 714911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((btm_send_connect_request(acl_handle, &p->esco.setup)) == 715911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_CMD_STARTED) 716911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->state = SCO_ST_CONNECTING; 7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 718911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 719e7ef465c37298c2b64b7e9794659b1b1b50ab877Chris Manton#endif // BTM_MAX_SCO_LINKS 7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 721e7ef465c37298c2b64b7e9794659b1b1b50ab877Chris Manton#endif // BTM_SCO_WAKE_PARKED_LINK 7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 724ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 725ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_sco_chk_pend_rolechange 726ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 727ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called by BTIF when there is a role change 7289ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * event to see if there are SCO commands waiting for the role 7299ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * change. 730ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 731ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 732ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 733ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 734911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_sco_chk_pend_rolechange(uint16_t hci_handle) { 735911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#if (BTM_MAX_SCO_LINKS > 0) 736911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t xx; 737911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t acl_handle; 738911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSCO_CONN* p = &btm_cb.sco_cb.sco_db[0]; 7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 740911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++) { 741911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((p->state == SCO_ST_PEND_ROLECHANGE) && 742911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ((acl_handle = BTM_GetHCIConnHandle( 743911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->esco.data.bd_addr, BT_TRANSPORT_BR_EDR)) == hci_handle)) 7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 745911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson { 746911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_API( 747911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "btm_sco_chk_pend_rolechange -> (e)SCO Link for ACL handle 0x%04x", 748911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson acl_handle); 749911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 750911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((btm_send_connect_request(acl_handle, &p->esco.setup)) == 751911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_CMD_STARTED) 752911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->state = SCO_ST_CONNECTING; 7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 754911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 7555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 759ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 760ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_sco_disc_chk_pend_for_modechange 761ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 762ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called by btm when there is a mode change 7639ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * event to see if there are SCO disconnect commands waiting 7649ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * for the mode change. 765ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 766ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 767ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 768ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 769911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_sco_disc_chk_pend_for_modechange(uint16_t hci_handle) { 770911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#if (BTM_MAX_SCO_LINKS > 0) 771911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSCO_CONN* p = &btm_cb.sco_cb.sco_db[0]; 7729ab2a9d97f4e0c4b3cd76416e3d6ed03b610ec6fMallikarjuna GB 773911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s: hci_handle 0x%04x, p->state 0x%02x", __func__, 774911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson hci_handle, p->state); 7759ab2a9d97f4e0c4b3cd76416e3d6ed03b610ec6fMallikarjuna GB 776911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (uint16_t xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++) { 777911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((p->state == SCO_ST_PEND_MODECHANGE) && 778911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (BTM_GetHCIConnHandle(p->esco.data.bd_addr, BT_TRANSPORT_BR_EDR)) == 779911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson hci_handle) 7809ab2a9d97f4e0c4b3cd76416e3d6ed03b610ec6fMallikarjuna GB 781911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson { 782911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s: SCO Link handle 0x%04x", __func__, p->hci_handle); 783911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_RemoveSco(xx); 7849ab2a9d97f4e0c4b3cd76416e3d6ed03b610ec6fMallikarjuna GB } 785911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 7869ab2a9d97f4e0c4b3cd76416e3d6ed03b610ec6fMallikarjuna GB#endif 7879ab2a9d97f4e0c4b3cd76416e3d6ed03b610ec6fMallikarjuna GB} 7889ab2a9d97f4e0c4b3cd76416e3d6ed03b610ec6fMallikarjuna GB 7899ab2a9d97f4e0c4b3cd76416e3d6ed03b610ec6fMallikarjuna GB/******************************************************************************* 790ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 791ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_sco_conn_req 792ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 793ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called by BTIF when an SCO connection 794ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * request is received from a remote. 795ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 796ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 797ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 798ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 799911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_sco_conn_req(BD_ADDR bda, DEV_CLASS dev_class, uint8_t link_type) { 800911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#if (BTM_MAX_SCO_LINKS > 0) 801911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSCO_CB* p_sco = &btm_cb.sco_cb; 802911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSCO_CONN* p = &p_sco->sco_db[0]; 803911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t xx; 804911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_ESCO_CONN_REQ_EVT_DATA evt_data; 805911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 806911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++) { 807911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* 808911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * If the sco state is in the SCO_ST_CONNECTING state, we still need 809911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * to return accept sco to avoid race conditon for sco creation 810911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson */ 811911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson int rem_bd_matches = 812911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->rem_bd_known && !memcmp(p->esco.data.bd_addr, bda, BD_ADDR_LEN); 813911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (((p->state == SCO_ST_CONNECTING) && rem_bd_matches) || 814911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ((p->state == SCO_ST_LISTENING) && 815911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (rem_bd_matches || !p->rem_bd_known))) { 816911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If this guy was a wildcard, he is not one any more */ 817911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->rem_bd_known = true; 818911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->esco.data.link_type = link_type; 819911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->state = SCO_ST_W4_CONN_RSP; 820911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(p->esco.data.bd_addr, bda, BD_ADDR_LEN); 821911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 822911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If no callback, auto-accept the connection if packet types match */ 823911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!p->esco.p_esco_cback) { 824911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If requesting eSCO reject if default parameters are SCO only */ 825911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((link_type == BTM_LINK_TYPE_ESCO && 826911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson !(p_sco->def_esco_parms.packet_types & BTM_ESCO_LINK_ONLY_MASK) && 827911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ((p_sco->def_esco_parms.packet_types & 828911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_SCO_EXCEPTION_PKTS_MASK) == BTM_SCO_EXCEPTION_PKTS_MASK)) 829911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 830911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Reject request if SCO is desired but no SCO packets delected */ 831911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson || 832911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (link_type == BTM_LINK_TYPE_SCO && 833911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson !(p_sco->def_esco_parms.packet_types & BTM_SCO_LINK_ONLY_MASK))) { 834911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_esco_conn_rsp(xx, HCI_ERR_HOST_REJECT_RESOURCES, bda, NULL); 835911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else /* Accept the request */ 8365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 837911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_esco_conn_rsp(xx, HCI_SUCCESS, bda, NULL); 8385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 839911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else /* Notify upper layer of connect indication */ 840911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson { 841911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(evt_data.bd_addr, bda, BD_ADDR_LEN); 842911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(evt_data.dev_class, dev_class, DEV_CLASS_LEN); 843911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson evt_data.link_type = link_type; 844911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson evt_data.sco_inx = xx; 845911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->esco.p_esco_cback(BTM_ESCO_CONN_REQ_EVT, 846911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (tBTM_ESCO_EVT_DATA*)&evt_data); 847911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 848911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 849911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 8505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 851911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 852911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 853911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* TCS usage */ 854911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.sco_cb.app_sco_ind_cb) { 855911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Now, try to find an unused control block */ 856911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (xx = 0, p = &btm_cb.sco_cb.sco_db[0]; xx < BTM_MAX_SCO_LINKS; 857911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson xx++, p++) { 858911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p->state == SCO_ST_UNUSED) { 859911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->is_orig = false; 860911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->state = SCO_ST_LISTENING; 861911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 862911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->esco.data.link_type = link_type; 863911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(p->esco.data.bd_addr, bda, BD_ADDR_LEN); 864911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->rem_bd_known = true; 865911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 866911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 8675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 868911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (xx < BTM_MAX_SCO_LINKS) { 869911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.sco_cb.app_sco_ind_cb(xx); 870911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 871911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 872911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 8735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 875911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If here, no one wants the SCO connection. Reject it */ 876911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_WARNING( 877911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "btm_sco_conn_req: No one wants this SCO connection; rejecting it"); 878911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_esco_conn_rsp(BTM_MAX_SCO_LINKS, HCI_ERR_HOST_REJECT_RESOURCES, bda, 879911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson NULL); 8805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 883ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 884ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_sco_connected 885ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 886ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called by BTIF when an (e)SCO connection 887ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * is connected. 888ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 889ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 890ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 891ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 892911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_sco_connected(uint8_t hci_status, BD_ADDR bda, uint16_t hci_handle, 893911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_ESCO_DATA* p_esco_data) { 894911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#if (BTM_MAX_SCO_LINKS > 0) 895911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSCO_CONN* p = &btm_cb.sco_cb.sco_db[0]; 896911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t xx; 897911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bool spt = false; 898911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_CHG_ESCO_PARAMS parms; 8995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 9005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 901911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.sco_cb.sco_disc_reason = hci_status; 9025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 903911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#if (BTM_MAX_SCO_LINKS > 0) 904911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++) { 905911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (((p->state == SCO_ST_CONNECTING) || (p->state == SCO_ST_LISTENING) || 906911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p->state == SCO_ST_W4_CONN_RSP)) && 907911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p->rem_bd_known) && 908911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (!bda || !memcmp(p->esco.data.bd_addr, bda, BD_ADDR_LEN))) { 909911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (hci_status != HCI_SUCCESS) { 910911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Report the error if originator, otherwise remain in Listen mode */ 911911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p->is_orig) { 912911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If role switch is pending, we need try again after role switch is 913911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * complete */ 914911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (hci_status == HCI_ERR_ROLE_SWITCH_PENDING) { 915911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_API("Role Change pending for HCI handle 0x%04x", 916911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson hci_handle); 917911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->state = SCO_ST_PEND_ROLECHANGE; 918911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 919911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* avoid calling disconnect callback because of sco creation race */ 920911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else if (hci_status != HCI_ERR_LMP_ERR_TRANS_COLLISION) { 921911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->state = SCO_ST_UNUSED; 922911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (*p->p_disc_cb)(xx); 923911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 924911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 925911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Notify the upper layer that incoming sco connection has failed. */ 926911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p->state == SCO_ST_CONNECTING) { 927911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->state = SCO_ST_UNUSED; 928911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (*p->p_disc_cb)(xx); 929911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else 930911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->state = SCO_ST_LISTENING; 931911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 9325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 933911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 934911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 9355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 936911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p->state == SCO_ST_LISTENING) spt = true; 9375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 938911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->state = SCO_ST_CONNECTED; 939911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->hci_handle = hci_handle; 9405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 941911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!btm_cb.sco_cb.esco_supported) { 942911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->esco.data.link_type = BTM_LINK_TYPE_SCO; 943911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (spt) { 944911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson parms.packet_types = p->esco.setup.packet_types; 945911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Keep the other parameters the same for SCO */ 946181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth parms.max_latency_ms = p->esco.setup.max_latency_ms; 947181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth parms.retransmission_effort = p->esco.setup.retransmission_effort; 9485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 949911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_ChangeEScoLinkParms(xx, &parms); 9505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 951911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 952911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_esco_data) p->esco.data = *p_esco_data; 953911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 954911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 955911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (*p->p_conn_cb)(xx); 956911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 957911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 9585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 959911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 9605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 9615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 9625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 964ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 965ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_find_scb_by_handle 966ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 9679ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description Look through all active SCO connection for a match based on 9689ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * the HCI handle. 969ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 970ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns index to matched SCO connection CB, or BTM_MAX_SCO_LINKS if 971ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * no match. 972ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 973ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 974911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonuint16_t btm_find_scb_by_handle(uint16_t handle) { 975911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson int xx; 976911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSCO_CONN* p = &btm_cb.sco_cb.sco_db[0]; 9775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 978911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++) { 979911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((p->state == SCO_ST_CONNECTED) && (p->hci_handle == handle)) { 980911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (xx); 9815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 982911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 9835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 984911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If here, no match found */ 985911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (xx); 9865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 9875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 989ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 990ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_RemoveSco 991ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 992ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to remove a specific SCO connection. 993ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 994ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns status of the operation 995ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 996ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 997911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsontBTM_STATUS BTM_RemoveSco(uint16_t sco_inx) { 998911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#if (BTM_MAX_SCO_LINKS > 0) 999911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSCO_CONN* p = &btm_cb.sco_cb.sco_db[sco_inx]; 1000911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t tempstate; 1001911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_PM_STATE state = BTM_PM_ST_INVALID; 10025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1003911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s", __func__); 10045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1005911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Validity check */ 1006911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((sco_inx >= BTM_MAX_SCO_LINKS) || (p->state == SCO_ST_UNUSED)) 1007911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_UNKNOWN_ADDR); 10085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1009911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If no HCI handle, simply drop the connection and return */ 1010911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p->hci_handle == BTM_INVALID_HCI_HANDLE || 1011911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->state == SCO_ST_PEND_UNPARK) { 1012911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->hci_handle = BTM_INVALID_HCI_HANDLE; 1013911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->state = SCO_ST_UNUSED; 1014911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->esco.p_esco_cback = NULL; /* Deregister the eSCO event callback */ 1015911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_SUCCESS); 1016911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1017911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1018911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((btm_read_power_mode_state(p->esco.data.bd_addr, &state) == 1019911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_SUCCESS) && 1020911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson state == BTM_PM_ST_PENDING) { 1021911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s: BTM_PM_ST_PENDING for ACL mapped with SCO Link 0x%04x", 1022911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson __func__, p->hci_handle); 1023911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->state = SCO_ST_PEND_MODECHANGE; 1024911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_CMD_STARTED); 1025911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 10269ab2a9d97f4e0c4b3cd76416e3d6ed03b610ec6fMallikarjuna GB 1027911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tempstate = p->state; 1028911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->state = SCO_ST_DISCONNECTING; 10295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1030911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_disconnect(p->hci_handle, HCI_ERR_PEER_USER); 10315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1032911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_CMD_STARTED); 10335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 1034911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_NO_RESOURCES); 10355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 10365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1039ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1040ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_remove_sco_links 1041ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 10429ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description This function is called to remove all sco links for an ACL 10439ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * link. 1044ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1045ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 1046ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1047ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1048911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_remove_sco_links(BD_ADDR bda) { 1049911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#if (BTM_MAX_SCO_LINKS > 0) 1050911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSCO_CONN* p = &btm_cb.sco_cb.sco_db[0]; 1051911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t xx; 10525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1053911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++) { 1054911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p->rem_bd_known && (!memcmp(p->esco.data.bd_addr, bda, BD_ADDR_LEN))) { 1055911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_RemoveSco(xx); 10565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1057911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 10585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 10595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1062ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1063ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_sco_removed 1064ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1065ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called by BTIF when an SCO connection 1066ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * is removed. 1067ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1068ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 1069ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1070ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1071911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_sco_removed(uint16_t hci_handle, uint8_t reason) { 1072911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#if (BTM_MAX_SCO_LINKS > 0) 1073911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSCO_CONN* p = &btm_cb.sco_cb.sco_db[0]; 1074911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t xx; 10755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 10765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1077911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.sco_cb.sco_disc_reason = reason; 10785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1079911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#if (BTM_MAX_SCO_LINKS > 0) 1080911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p = &btm_cb.sco_cb.sco_db[0]; 1081911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++) { 1082911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((p->state != SCO_ST_UNUSED) && (p->state != SCO_ST_LISTENING) && 1083911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p->hci_handle == hci_handle)) { 1084911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sco_flush_sco_data(xx); 1085911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1086911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->state = SCO_ST_UNUSED; 1087911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->hci_handle = BTM_INVALID_HCI_HANDLE; 1088911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->rem_bd_known = false; 1089911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->esco.p_esco_cback = NULL; /* Deregister eSCO callback */ 1090911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (*p->p_disc_cb)(xx); 1091911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1092911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 10935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1094911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 10955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 10965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1099ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1100ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_sco_acl_removed 1101ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1102ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called when an ACL connection is 1103ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * removed. If the BD address is NULL, it is assumed that 1104ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * the local device is down, and all SCO links are removed. 1105ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * If a specific BD address is passed, only SCO connections 1106ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * to that BD address are removed. 1107ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1108ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 1109ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1110ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1111911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_sco_acl_removed(BD_ADDR bda) { 1112911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#if (BTM_MAX_SCO_LINKS > 0) 1113911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSCO_CONN* p = &btm_cb.sco_cb.sco_db[0]; 1114911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t xx; 11155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1116911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++) { 1117911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p->state != SCO_ST_UNUSED) { 1118911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((!bda) || (!memcmp(p->esco.data.bd_addr, bda, BD_ADDR_LEN) && 1119911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->rem_bd_known)) { 1120911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sco_flush_sco_data(xx); 11215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1122911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->state = SCO_ST_UNUSED; 1123911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->esco.p_esco_cback = NULL; /* Deregister eSCO callback */ 1124911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (*p->p_disc_cb)(xx); 1125911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 11265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1127911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 11285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 11295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 11305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1132ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1133ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_SetScoPacketTypes 1134ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1135ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to set the packet types used for 1136ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * a specific SCO connection, 1137ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1138ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters pkt_types - One or more of the following 1139ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_SCO_PKT_TYPES_MASK_HV1 1140ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_SCO_PKT_TYPES_MASK_HV2 1141ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_SCO_PKT_TYPES_MASK_HV3 1142ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_SCO_PKT_TYPES_MASK_EV3 1143ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_SCO_PKT_TYPES_MASK_EV4 1144ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_SCO_PKT_TYPES_MASK_EV5 1145ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_SCO_PKT_TYPES_MASK_NO_2_EV3 1146ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_SCO_PKT_TYPES_MASK_NO_3_EV3 1147ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_SCO_PKT_TYPES_MASK_NO_2_EV5 1148ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_SCO_PKT_TYPES_MASK_NO_3_EV5 1149ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1150ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_SCO_LINK_ALL_MASK - enables all supported types 1151ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1152ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns status of the operation 1153ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1154ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1155911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsontBTM_STATUS BTM_SetScoPacketTypes(uint16_t sco_inx, uint16_t pkt_types) { 1156911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#if (BTM_MAX_SCO_LINKS > 0) 1157911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_CHG_ESCO_PARAMS parms; 1158911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSCO_CONN* p; 11595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1160911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Validity check */ 1161911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (sco_inx >= BTM_MAX_SCO_LINKS) return (BTM_UNKNOWN_ADDR); 11625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1163911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p = &btm_cb.sco_cb.sco_db[sco_inx]; 1164911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson parms.packet_types = pkt_types; 11655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1166911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Keep the other parameters the same for SCO */ 1167181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth parms.max_latency_ms = p->esco.setup.max_latency_ms; 1168181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth parms.retransmission_effort = p->esco.setup.retransmission_effort; 11695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1170911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_ChangeEScoLinkParms(sco_inx, &parms)); 11715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 1172911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_UNKNOWN_ADDR); 11735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 11745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 11755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1177ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1178ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_ReadScoPacketTypes 1179ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1180ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is read the packet types used for a specific 1181ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * SCO connection. 1182ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1183ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns Packet types supported for the connection 1184ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * One or more of the following (bitmask): 1185ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_SCO_PKT_TYPES_MASK_HV1 1186ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_SCO_PKT_TYPES_MASK_HV2 1187ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_SCO_PKT_TYPES_MASK_HV3 1188ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_SCO_PKT_TYPES_MASK_EV3 1189ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_SCO_PKT_TYPES_MASK_EV4 1190ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_SCO_PKT_TYPES_MASK_EV5 1191ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_SCO_PKT_TYPES_MASK_NO_2_EV3 1192ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_SCO_PKT_TYPES_MASK_NO_3_EV3 1193ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_SCO_PKT_TYPES_MASK_NO_2_EV5 1194ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_SCO_PKT_TYPES_MASK_NO_3_EV5 1195ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1196ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1197911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonuint16_t BTM_ReadScoPacketTypes(uint16_t sco_inx) { 1198911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#if (BTM_MAX_SCO_LINKS > 0) 1199911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSCO_CONN* p = &btm_cb.sco_cb.sco_db[sco_inx]; 1200911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1201911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Validity check */ 1202911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((sco_inx < BTM_MAX_SCO_LINKS) && (p->state == SCO_ST_CONNECTED)) 1203911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (p->esco.setup.packet_types); 1204911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else 12055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (0); 1206911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#else 1207911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (0); 12085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 12095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 12105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1212ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1213ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_ReadScoDiscReason 1214ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1215ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is returns the reason why an (e)SCO connection 1216ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * has been removed. It contains the value until read, or until 1217ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * another (e)SCO connection has disconnected. 1218ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1219ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns HCI reason or BTM_INVALID_SCO_DISC_REASON if not set. 1220ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1221ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1222911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonuint16_t BTM_ReadScoDiscReason(void) { 1223911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t res = btm_cb.sco_cb.sco_disc_reason; 1224911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.sco_cb.sco_disc_reason = BTM_INVALID_SCO_DISC_REASON; 1225911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (res); 12265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 12275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1229ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1230ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_ReadDeviceScoPacketTypes 1231ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1232ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is read the SCO packet types that 1233ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * the device supports. 1234ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1235ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns Packet types supported by the device. 1236ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * One or more of the following (bitmask): 1237ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_SCO_PKT_TYPES_MASK_HV1 1238ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_SCO_PKT_TYPES_MASK_HV2 1239ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_SCO_PKT_TYPES_MASK_HV3 1240ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_SCO_PKT_TYPES_MASK_EV3 1241ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_SCO_PKT_TYPES_MASK_EV4 1242ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_SCO_PKT_TYPES_MASK_EV5 1243ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_SCO_PKT_TYPES_MASK_NO_2_EV3 1244ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_SCO_PKT_TYPES_MASK_NO_3_EV3 1245ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_SCO_PKT_TYPES_MASK_NO_2_EV5 1246ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_SCO_PKT_TYPES_MASK_NO_3_EV5 1247ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1248ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1249911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonuint16_t BTM_ReadDeviceScoPacketTypes(void) { 1250911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (btm_cb.btm_sco_pkt_types_supported); 12515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 12525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1254ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1255ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_ReadScoHandle 1256ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 12579ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description This function is used to read the HCI handle used for a 12589ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * specific SCO connection, 1259ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1260ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns handle for the connection, or 0xFFFF if invalid SCO index. 1261ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1262ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1263911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonuint16_t BTM_ReadScoHandle(uint16_t sco_inx) { 1264911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#if (BTM_MAX_SCO_LINKS > 0) 1265911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSCO_CONN* p = &btm_cb.sco_cb.sco_db[sco_inx]; 1266911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1267911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Validity check */ 1268911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((sco_inx < BTM_MAX_SCO_LINKS) && (p->state == SCO_ST_CONNECTED)) 1269911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (p->hci_handle); 1270911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else 12715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BTM_INVALID_HCI_HANDLE); 1272911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#else 1273911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_INVALID_HCI_HANDLE); 12745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 12755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 12765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1278ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1279ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_ReadScoBdAddr 1280ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1281ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is read the remote BD Address for a specific 1282ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * SCO connection, 1283ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1284ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns pointer to BD address or NULL if not known 1285ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1286ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1287911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonuint8_t* BTM_ReadScoBdAddr(uint16_t sco_inx) { 1288911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#if (BTM_MAX_SCO_LINKS > 0) 1289911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSCO_CONN* p = &btm_cb.sco_cb.sco_db[sco_inx]; 1290911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1291911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Validity check */ 1292911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((sco_inx < BTM_MAX_SCO_LINKS) && (p->rem_bd_known)) 1293911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (p->esco.data.bd_addr); 1294911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else 12955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (NULL); 1296911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#else 1297911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (NULL); 12985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 12995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 13005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1302ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1303ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_SetEScoMode 1304ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1305ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function sets up the negotiated parameters for SCO or 13069ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * eSCO, and sets as the default mode used for outgoing calls 13079ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * to BTM_CreateSco. It does not change any currently active 13089ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * (e)SCO links. 13099ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Note: Incoming (e)SCO connections will always use packet 13109ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * types supported by the controller. If eSCO is not 13119ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * desired the feature should be disabled in the 13129ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * controller's feature mask. 1313ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1314ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns BTM_SUCCESS if the successful. 1315ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_BUSY if there are one or more active (e)SCO links. 1316ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1317ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1318181863e6c2a5f2575334bef5489d0e2a85132756Mudumba AnanthtBTM_STATUS BTM_SetEScoMode(enh_esco_params_t* p_parms) { 1319181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth enh_esco_params_t* p_def = &btm_cb.sco_cb.def_esco_parms; 1320181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth 1321181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth if (btm_cb.sco_cb.esco_supported) { 1322181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth *p_def = *p_parms; 1323911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 1324181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth /* Load defaults for SCO only */ 1325181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth *p_def = esco_parameters_for_codec(ESCO_CODEC_CVSD); 1326911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_def->packet_types &= BTM_SCO_LINK_ONLY_MASK; 1327181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth p_def->retransmission_effort = ESCO_RETRANSMISSION_OFF; 1328181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth p_def->max_latency_ms = 12; 1329a43e1304c2cbca16d583e08b63cb4c95a37b7b87Jack He BTM_TRACE_WARNING("%s: eSCO not supported", __func__); 1330911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1331911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1332181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth BTM_TRACE_API( 1333181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth "%s: txbw 0x%08x, rxbw 0x%08x, max_lat 0x%04x, " 1334181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth "pkt 0x%04x, rtx effort 0x%02x", 1335181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth __func__, p_def->transmit_bandwidth, p_def->receive_bandwidth, 1336181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth p_def->max_latency_ms, p_def->packet_types, p_def->retransmission_effort); 1337911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1338a43e1304c2cbca16d583e08b63cb4c95a37b7b87Jack He return BTM_SUCCESS; 13395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 13405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1342ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1343ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_RegForEScoEvts 1344ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1345ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function registers a SCO event callback with the 1346ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * specified instance. It should be used to received 1347ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * connection indication events and change of link parameter 1348ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * events. 1349ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1350ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns BTM_SUCCESS if the successful. 1351ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_ILLEGAL_VALUE if there is an illegal sco_inx 1352ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_MODE_UNSUPPORTED if controller version is not BT1.2 or 1353ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * later or does not support eSCO. 1354ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1355ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1356911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsontBTM_STATUS BTM_RegForEScoEvts(uint16_t sco_inx, 1357911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_ESCO_CBACK* p_esco_cback) { 1358911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#if (BTM_MAX_SCO_LINKS > 0) 1359911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!btm_cb.sco_cb.esco_supported) { 1360911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.sco_cb.sco_db[sco_inx].esco.p_esco_cback = NULL; 1361911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_MODE_UNSUPPORTED); 1362911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 13635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1364911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (sco_inx < BTM_MAX_SCO_LINKS && 1365911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.sco_cb.sco_db[sco_inx].state != SCO_ST_UNUSED) { 1366911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.sco_cb.sco_db[sco_inx].esco.p_esco_cback = p_esco_cback; 1367911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_SUCCESS); 1368911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1369911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_ILLEGAL_VALUE); 13705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 1371911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_MODE_UNSUPPORTED); 13725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 13735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 13745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1376ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1377ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_ReadEScoLinkParms 1378ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1379ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function returns the current eSCO link parameters for 13809ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * the specified handle. This can be called anytime a 13819ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * connection is active, but is typically called after 13829ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * receiving the SCO opened callback. 1383ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1384ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Note: If called over a 1.1 controller, only the packet types 1385ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * field has meaning. 1386ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1387ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns BTM_SUCCESS if returned data is valid connection. 13889ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * BTM_WRONG_MODE if no connection with a peer device or bad 13899ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * sco_inx. 1390ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1391ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1392911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsontBTM_STATUS BTM_ReadEScoLinkParms(uint16_t sco_inx, tBTM_ESCO_DATA* p_parms) { 1393911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#if (BTM_MAX_SCO_LINKS > 0) 1394911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t index; 1395ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1396181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth BTM_TRACE_API("%s: -> sco_inx 0x%04x", __func__, sco_inx); 13975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1398911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (sco_inx < BTM_MAX_SCO_LINKS && 1399911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.sco_cb.sco_db[sco_inx].state >= SCO_ST_CONNECTED) { 1400911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_parms = btm_cb.sco_cb.sco_db[sco_inx].esco.data; 1401911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_SUCCESS); 1402911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1403911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1404911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (sco_inx == BTM_FIRST_ACTIVE_SCO_INDEX) { 1405911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (index = 0; index < BTM_MAX_SCO_LINKS; index++) { 1406911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.sco_cb.sco_db[index].state >= SCO_ST_CONNECTED) { 1407181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth BTM_TRACE_API("%s: the first active SCO index is %d", __func__, index); 1408911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_parms = btm_cb.sco_cb.sco_db[index].esco.data; 14095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BTM_SUCCESS); 1410911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 14115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1412911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1413ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 14145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 14155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1416911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_API("BTM_ReadEScoLinkParms cannot find the SCO index!"); 1417911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memset(p_parms, 0, sizeof(tBTM_ESCO_DATA)); 1418911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_WRONG_MODE); 14195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 14205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1422ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1423ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_ChangeEScoLinkParms 1424ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1425ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function requests renegotiation of the parameters on 1426ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * the current eSCO Link. If any of the changes are accepted 1427ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * by the controllers, the BTM_ESCO_CHG_EVT event is sent in 1428ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * the tBTM_ESCO_CBACK function with the current settings of 1429ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * the link. The callback is registered through the call to 1430ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_SetEScoMode. 1431ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1432ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Note: If called over a SCO link (including 1.1 controller), 1433ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * a change packet type request is sent out instead. 1434ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1435ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns BTM_CMD_STARTED if command is successfully initiated. 1436ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_NO_RESOURCES - not enough resources to initiate command. 14379ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * BTM_WRONG_MODE if no connection with a peer device or bad 14389ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * sco_inx. 1439ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1440ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1441911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsontBTM_STATUS BTM_ChangeEScoLinkParms(uint16_t sco_inx, 1442911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_CHG_ESCO_PARAMS* p_parms) { 1443911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#if (BTM_MAX_SCO_LINKS > 0) 14445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1445911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Make sure sco handle is valid and on an active link */ 1446911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (sco_inx >= BTM_MAX_SCO_LINKS || 1447911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.sco_cb.sco_db[sco_inx].state != SCO_ST_CONNECTED) 1448911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_WRONG_MODE); 14495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1450181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth tSCO_CONN* p_sco = &btm_cb.sco_cb.sco_db[sco_inx]; 1451181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth enh_esco_params_t* p_setup = &p_sco->esco.setup; 1452181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth 1453181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth /* Save the previous types in case command fails */ 1454181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth uint16_t saved_packet_types = p_setup->packet_types; 1455911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1456911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If SCO connection OR eSCO not supported just send change packet types */ 1457911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_sco->esco.data.link_type == BTM_LINK_TYPE_SCO || 1458911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson !btm_cb.sco_cb.esco_supported) { 1459911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_setup->packet_types = 1460911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_parms->packet_types & 1461911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (btm_cb.btm_sco_pkt_types_supported & BTM_SCO_LINK_ONLY_MASK); 1462911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1463181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth BTM_TRACE_API("%s: SCO Link for handle 0x%04x, pkt 0x%04x", __func__, 1464181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth p_sco->hci_handle, p_setup->packet_types); 1465181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth 1466181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth BTM_TRACE_API("%s: SCO Link for handle 0x%04x, pkt 0x%04x", __func__, 1467181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth p_sco->hci_handle, p_setup->packet_types); 1468911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1469911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_change_conn_type(p_sco->hci_handle, 1470911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_ESCO_2_SCO(p_setup->packet_types)); 1471181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth } else /* eSCO is supported and the link type is eSCO */ 1472181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth { 1473181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth uint16_t temp_packet_types = 1474181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth (p_parms->packet_types & BTM_SCO_SUPPORTED_PKTS_MASK & 1475181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth btm_cb.btm_sco_pkt_types_supported); 1476911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1477911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* OR in any exception packet types */ 1478181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth temp_packet_types |= 1479911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ((p_parms->packet_types & BTM_SCO_EXCEPTION_PKTS_MASK) | 1480911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (btm_cb.btm_sco_pkt_types_supported & BTM_SCO_EXCEPTION_PKTS_MASK)); 1481181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth p_setup->packet_types = temp_packet_types; 1482911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1483181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth BTM_TRACE_API("%s -> eSCO Link for handle 0x%04x", __func__, 1484911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_sco->hci_handle); 1485911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_API( 1486181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth " txbw 0x%x, rxbw 0x%x, lat 0x%x, retrans 0x%02x, pkt 0x%04x", 1487181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth p_setup->transmit_bandwidth, p_setup->receive_bandwidth, 1488181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth p_parms->max_latency_ms, p_parms->retransmission_effort, 1489181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth temp_packet_types); 1490181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth 1491181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth /* Use Enhanced Synchronous commands if supported */ 1492181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth if (controller_get_interface() 1493181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth ->supports_enhanced_setup_synchronous_connection()) { 1494181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth /* Use the saved SCO routing */ 1495181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth p_setup->input_data_path = p_setup->output_data_path = 1496181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth btm_cb.sco_cb.sco_route; 1497181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth 1498181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth btsnd_hcic_enhanced_set_up_synchronous_connection(p_sco->hci_handle, 1499181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth p_setup); 1500181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth p_setup->packet_types = saved_packet_types; 1501181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth } else { /* Use older command */ 1502181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth uint16_t voice_content_format = btm_sco_voice_settings_to_legacy(p_setup); 1503181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth /* When changing an existing link, only change latency, retrans, and 1504181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth * pkts */ 1505181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth btsnd_hcic_setup_esco_conn(p_sco->hci_handle, p_setup->transmit_bandwidth, 1506181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth p_setup->receive_bandwidth, 1507181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth p_parms->max_latency_ms, voice_content_format, 1508181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth p_parms->retransmission_effort, 1509181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth p_setup->packet_types); 1510181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth } 1511181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth 1512181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth BTM_TRACE_API( 1513181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth "%s: txbw 0x%x, rxbw 0x%x, lat 0x%x, retrans 0x%02x, pkt 0x%04x", 1514181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth __func__, p_setup->transmit_bandwidth, p_setup->receive_bandwidth, 1515181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth p_parms->max_latency_ms, p_parms->retransmission_effort, 1516181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth temp_packet_types); 1517911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1518911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1519911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_CMD_STARTED); 15205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 1521911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_WRONG_MODE); 15225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 15235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 15245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1526ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1527ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_EScoConnRsp 1528ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1529ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called upon receipt of an (e)SCO connection 1530ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * request event (BTM_ESCO_CONN_REQ_EVT) to accept or reject 1531ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * the request. Parameters used to negotiate eSCO links. 1532ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * If p_parms is NULL, then values set through BTM_SetEScoMode 1533ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * are used. 1534ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * If the link type of the incoming request is SCO, then only 1535ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * the tx_bw, max_latency, content format, and packet_types are 1536ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * valid. The hci_status parameter should be 1537ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * ([0x0] to accept, [0x0d..0x0f] to reject) 1538ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1539ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1540ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 1541ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1542ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1543911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid BTM_EScoConnRsp(uint16_t sco_inx, uint8_t hci_status, 1544181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth enh_esco_params_t* p_parms) { 1545911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#if (BTM_MAX_SCO_LINKS > 0) 1546911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (sco_inx < BTM_MAX_SCO_LINKS && 1547911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.sco_cb.sco_db[sco_inx].state == SCO_ST_W4_CONN_RSP) { 1548911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_esco_conn_rsp(sco_inx, hci_status, 1549911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.sco_cb.sco_db[sco_inx].esco.data.bd_addr, p_parms); 1550911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 15515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 15525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 15535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1555ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1556ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_read_def_esco_mode 1557ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1558ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function copies the current default esco settings into 1559ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * the return buffer. 1560ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1561ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns tBTM_SCO_TYPE 1562ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1563ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1564181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananthvoid btm_read_def_esco_mode(enh_esco_params_t* p_parms) { 1565911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#if (BTM_MAX_SCO_LINKS > 0) 1566911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_parms = btm_cb.sco_cb.def_esco_parms; 15675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 15685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 15695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1571ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1572ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_esco_proc_conn_chg 1573ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1574ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called by BTIF when an SCO connection 1575ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * is changed. 1576ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1577ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 1578ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1579ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1580911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_esco_proc_conn_chg(uint8_t status, uint16_t handle, 1581911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t tx_interval, uint8_t retrans_window, 1582911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t rx_pkt_len, uint16_t tx_pkt_len) { 1583911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#if (BTM_MAX_SCO_LINKS > 0) 1584911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSCO_CONN* p = &btm_cb.sco_cb.sco_db[0]; 1585911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_CHG_ESCO_EVT_DATA data; 1586911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t xx; 1587911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1588911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT("btm_esco_proc_conn_chg -> handle 0x%04x, status 0x%02x", 1589911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson handle, status); 1590911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1591911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++) { 1592911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p->state == SCO_ST_CONNECTED && handle == p->hci_handle) { 1593911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If upper layer wants notification */ 1594911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p->esco.p_esco_cback) { 1595911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(data.bd_addr, p->esco.data.bd_addr, BD_ADDR_LEN); 1596911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson data.hci_status = status; 1597911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson data.sco_inx = xx; 1598911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson data.rx_pkt_len = p->esco.data.rx_pkt_len = rx_pkt_len; 1599911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson data.tx_pkt_len = p->esco.data.tx_pkt_len = tx_pkt_len; 1600911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson data.tx_interval = p->esco.data.tx_interval = tx_interval; 1601911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson data.retrans_window = p->esco.data.retrans_window = retrans_window; 1602911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1603911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (*p->esco.p_esco_cback)(BTM_ESCO_CHG_EVT, (tBTM_ESCO_EVT_DATA*)&data); 1604911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1605911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 16065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1607911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 16085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 16095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 16105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1612ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1613ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_is_sco_active 1614ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1615ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to see if a SCO handle is already in 1616ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * use. 1617ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1618ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns bool 1619ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1620ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1621911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonbool btm_is_sco_active(uint16_t handle) { 1622911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#if (BTM_MAX_SCO_LINKS > 0) 1623911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t xx; 1624911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSCO_CONN* p = &btm_cb.sco_cb.sco_db[0]; 16255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1626911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++) { 1627911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (handle == p->hci_handle && p->state == SCO_ST_CONNECTED) return (true); 1628911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 16295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 1630911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (false); 16315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 16325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1634ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1635ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_GetNumScoLinks 1636ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1637ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function returns the number of active sco links. 1638ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1639ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns uint8_t 1640ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1641ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1642911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonuint8_t BTM_GetNumScoLinks(void) { 1643911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#if (BTM_MAX_SCO_LINKS > 0) 1644911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSCO_CONN* p = &btm_cb.sco_cb.sco_db[0]; 1645911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t xx; 1646911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t num_scos = 0; 1647911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1648911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++) { 1649911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson switch (p->state) { 1650911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case SCO_ST_W4_CONN_RSP: 1651911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case SCO_ST_CONNECTING: 1652911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case SCO_ST_CONNECTED: 1653911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case SCO_ST_DISCONNECTING: 1654911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case SCO_ST_PEND_UNPARK: 1655911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson num_scos++; 16565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1657911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1658911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (num_scos); 16595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 1660911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (0); 16615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 16625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 16635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1665ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1666ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_is_sco_active_by_bdaddr 1667ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 16689ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description This function is called to see if a SCO connection is active 16699ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * for a bd address. 1670ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1671ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns bool 1672ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1673ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1674911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonbool btm_is_sco_active_by_bdaddr(BD_ADDR remote_bda) { 1675911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#if (BTM_MAX_SCO_LINKS > 0) 1676911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t xx; 1677911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSCO_CONN* p = &btm_cb.sco_cb.sco_db[0]; 1678911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1679911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If any SCO is being established to the remote BD address, refuse this */ 1680911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++) { 1681911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((!memcmp(p->esco.data.bd_addr, remote_bda, BD_ADDR_LEN)) && 1682911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p->state == SCO_ST_CONNECTED)) { 1683911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (true); 16845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1685911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 16865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 1687911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (false); 1688911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson} 1689181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth 1690181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth/******************************************************************************* 1691181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth * 1692181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth * Function btm_sco_voice_settings_2_legacy 1693181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth * 1694181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth * Description This function is called to convert the Enhanced eSCO 1695181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth * parameters into voice setting parameter mask used 1696181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth * for legacy setup synchronous connection HCI commands 1697181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth * 1698181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth * Returns UINT16 - 16-bit mask for voice settings 1699181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth * 1700181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth * HCI_INP_CODING_LINEAR 0x0000 (0000000000) 1701181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth * HCI_INP_CODING_U_LAW 0x0100 (0100000000) 1702181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth * HCI_INP_CODING_A_LAW 0x0200 (1000000000) 1703181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth * HCI_INP_CODING_MASK 0x0300 (1100000000) 1704181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth * 1705181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth * HCI_INP_DATA_FMT_1S_COMPLEMENT 0x0000 (0000000000) 1706181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth * HCI_INP_DATA_FMT_2S_COMPLEMENT 0x0040 (0001000000) 1707181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth * HCI_INP_DATA_FMT_SIGN_MAGNITUDE 0x0080 (0010000000) 1708181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth * HCI_INP_DATA_FMT_UNSIGNED 0x00c0 (0011000000) 1709181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth * HCI_INP_DATA_FMT_MASK 0x00c0 (0011000000) 1710181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth * 1711181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth * HCI_INP_SAMPLE_SIZE_8BIT 0x0000 (0000000000) 1712181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth * HCI_INP_SAMPLE_SIZE_16BIT 0x0020 (0000100000) 1713181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth * HCI_INP_SAMPLE_SIZE_MASK 0x0020 (0000100000) 1714181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth * 1715181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth * HCI_INP_LINEAR_PCM_BIT_POS_MASK 0x001c (0000011100) 1716181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth * HCI_INP_LINEAR_PCM_BIT_POS_OFFS 2 1717181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth * 1718181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth * HCI_AIR_CODING_FORMAT_CVSD 0x0000 (0000000000) 1719181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth * HCI_AIR_CODING_FORMAT_U_LAW 0x0001 (0000000001) 1720181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth * HCI_AIR_CODING_FORMAT_A_LAW 0x0002 (0000000010) 1721181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth * HCI_AIR_CODING_FORMAT_TRANSPNT 0x0003 (0000000011) 1722181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth * HCI_AIR_CODING_FORMAT_MASK 0x0003 (0000000011) 1723181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth * 1724181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth * default (0001100000) 1725181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth * HCI_DEFAULT_VOICE_SETTINGS (HCI_INP_CODING_LINEAR \ 1726181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth * | HCI_INP_DATA_FMT_2S_COMPLEMENT \ 1727181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth * | HCI_INP_SAMPLE_SIZE_16BIT \ 1728181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth * | HCI_AIR_CODING_FORMAT_CVSD) 1729181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth * 1730181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth ******************************************************************************/ 1731181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananthstatic uint16_t btm_sco_voice_settings_to_legacy(enh_esco_params_t* p_params) { 1732181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth uint16_t voice_settings = 0; 1733181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth 1734181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth /* Convert Input Coding Format: If no uLaw or aLAW then Linear will be used 1735181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth * (0) */ 1736181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth if (p_params->input_coding_format.coding_format == ESCO_CODING_FORMAT_ULAW) 1737181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth voice_settings |= HCI_INP_CODING_U_LAW; 1738181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth else if (p_params->input_coding_format.coding_format == 1739181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth ESCO_CODING_FORMAT_ALAW) 1740181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth voice_settings |= HCI_INP_CODING_A_LAW; 1741181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth /* else default value of '0 is good 'Linear' */ 1742181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth 1743181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth /* Convert Input Data Format. Use 2's Compliment as the default */ 1744181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth switch (p_params->input_pcm_data_format) { 1745181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth case ESCO_PCM_DATA_FORMAT_1_COMP: 1746181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth /* voice_settings |= HCI_INP_DATA_FMT_1S_COMPLEMENT; value is '0' 1747181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth * already */ 1748181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth break; 1749181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth 1750181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth case ESCO_PCM_DATA_FORMAT_SIGN: 1751181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth voice_settings |= HCI_INP_DATA_FMT_SIGN_MAGNITUDE; 1752181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth break; 1753181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth 1754181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth case ESCO_PCM_DATA_FORMAT_UNSIGN: 1755181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth voice_settings |= HCI_INP_DATA_FMT_UNSIGNED; 1756181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth break; 1757181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth 1758181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth default: /* 2's Compliment */ 1759181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth voice_settings |= HCI_INP_DATA_FMT_2S_COMPLEMENT; 1760181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth break; 1761181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth } 1762181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth 1763181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth /* Convert Over the Air Coding. Use CVSD as the default */ 1764181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth switch (p_params->transmit_coding_format.coding_format) { 1765181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth case ESCO_CODING_FORMAT_ULAW: 1766181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth voice_settings |= HCI_AIR_CODING_FORMAT_U_LAW; 1767181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth break; 1768181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth 1769181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth case ESCO_CODING_FORMAT_ALAW: 1770181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth voice_settings |= HCI_AIR_CODING_FORMAT_A_LAW; 1771181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth break; 1772181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth 1773181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth case ESCO_CODING_FORMAT_MSBC: 1774181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth voice_settings |= HCI_AIR_CODING_FORMAT_TRANSPNT; 1775181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth break; 1776181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth 1777181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth default: /* CVSD (0) */ 1778181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth break; 1779181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth } 1780181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth 1781181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth /* Convert PCM payload MSB position (0000011100) */ 1782181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth voice_settings |= (uint16_t)(((p_params->input_pcm_payload_msb_position & 0x7) 1783181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth << HCI_INP_LINEAR_PCM_BIT_POS_OFFS)); 1784181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth 1785181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth /* Convert Input Sample Size (0000011100) */ 1786181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth if (p_params->input_coded_data_size == 16) 1787181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth voice_settings |= HCI_INP_SAMPLE_SIZE_16BIT; 1788181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth else /* Use 8 bit for all others */ 1789181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth voice_settings |= HCI_INP_SAMPLE_SIZE_8BIT; 1790181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth 1791181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth BTM_TRACE_DEBUG("%s: voice setting for legacy 0x%03x", __func__, 1792181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth voice_settings); 1793181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth 1794181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth return (voice_settings); 1795181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth} 1796181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth 1797911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#else /* SCO_EXCLUDED == TRUE (Link in stubs) */ 1798911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1799911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsontBTM_STATUS BTM_CreateSco(BD_ADDR remote_bda, bool is_orig, uint16_t pkt_types, 1800911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t* p_sco_inx, tBTM_SCO_CB* p_conn_cb, 1801911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SCO_CB* p_disc_cb) { 1802911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_NO_RESOURCES); 1803911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson} 1804911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsontBTM_STATUS BTM_RemoveSco(uint16_t sco_inx) { return (BTM_NO_RESOURCES); } 1805911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsontBTM_STATUS BTM_SetScoPacketTypes(uint16_t sco_inx, uint16_t pkt_types) { 1806911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_NO_RESOURCES); 1807911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson} 1808911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonuint16_t BTM_ReadScoPacketTypes(uint16_t sco_inx) { return (0); } 1809911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonuint16_t BTM_ReadDeviceScoPacketTypes(void) { return (0); } 1810911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonuint16_t BTM_ReadScoHandle(uint16_t sco_inx) { 1811911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_INVALID_HCI_HANDLE); 1812911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson} 1813911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonuint8_t* BTM_ReadScoBdAddr(uint16_t sco_inx) { return ((uint8_t*)NULL); } 1814911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonuint16_t BTM_ReadScoDiscReason(void) { return (BTM_INVALID_SCO_DISC_REASON); } 1815181863e6c2a5f2575334bef5489d0e2a85132756Mudumba AnanthtBTM_STATUS BTM_SetEScoMode(enh_esco_params_t* p_parms) { 1816911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_MODE_UNSUPPORTED); 1817911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson} 1818911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsontBTM_STATUS BTM_RegForEScoEvts(uint16_t sco_inx, 1819911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_ESCO_CBACK* p_esco_cback) { 1820911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_ILLEGAL_VALUE); 1821911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson} 1822911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsontBTM_STATUS BTM_ReadEScoLinkParms(uint16_t sco_inx, tBTM_ESCO_DATA* p_parms) { 1823911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_MODE_UNSUPPORTED); 1824911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson} 1825911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsontBTM_STATUS BTM_ChangeEScoLinkParms(uint16_t sco_inx, 1826911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_CHG_ESCO_PARAMS* p_parms) { 1827911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_MODE_UNSUPPORTED); 18285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1829911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid BTM_EScoConnRsp(uint16_t sco_inx, uint8_t hci_status, 1830181863e6c2a5f2575334bef5489d0e2a85132756Mudumba Ananth enh_esco_params_t* p_parms) {} 1831911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonuint8_t BTM_GetNumScoLinks(void) { return (0); } 18325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* If SCO is being used */ 1834