btm_sco.cc revision f6ac424a81bad038bbf9a90c7c569dba81978f51
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" 35911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#include "hcidefs.h" 36911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#include "hcimsgs.h" 37d7ffd64accbd50a27289a388856e56244ccbb5daMyles Watson#include "osi/include/osi.h" 384de9bbcde79eb98dbfd56de292902549ac3e2bc1Mudumba Ananth 39d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (BTM_SCO_INCLUDED == TRUE) 405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 41ee96a3c60fca590d38025925c072d264e06493c4Myles Watson/******************************************************************************/ 429ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson/* L O C A L D A T A D E F I N I T I O N S */ 43ee96a3c60fca590d38025925c072d264e06493c4Myles Watson/******************************************************************************/ 445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 45911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#define SCO_ST_UNUSED 0 46911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#define SCO_ST_LISTENING 1 47911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#define SCO_ST_W4_CONN_RSP 2 48911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#define SCO_ST_CONNECTING 3 49911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#define SCO_ST_CONNECTED 4 50911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#define SCO_ST_DISCONNECTING 5 51911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#define SCO_ST_PEND_UNPARK 6 52911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#define SCO_ST_PEND_ROLECHANGE 7 53911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#define SCO_ST_PEND_MODECHANGE 8 545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 55ee96a3c60fca590d38025925c072d264e06493c4Myles Watson/******************************************************************************/ 569ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson/* L O C A L F U N C T I O N P R O T O T Y P E S */ 57ee96a3c60fca590d38025925c072d264e06493c4Myles Watson/******************************************************************************/ 585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 59911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic const tBTM_ESCO_PARAMS btm_esco_defaults = { 60911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_64KBITS_RATE, /* TX Bandwidth (64 kbits/sec) */ 61911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_64KBITS_RATE, /* RX Bandwidth (64 kbits/sec) */ 62911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 0x000c, /* 12 ms (HS/HF can use EV3, 2-EV3, 3-EV3) */ 63911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 0x0060, /* Inp Linear, Air CVSD, 2s Comp, 16bit */ 64911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (BTM_SCO_PKT_TYPES_MASK_HV1 + /* Packet Types */ 65911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_SCO_PKT_TYPES_MASK_HV2 + BTM_SCO_PKT_TYPES_MASK_HV3 + 66911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_SCO_PKT_TYPES_MASK_EV3 + BTM_SCO_PKT_TYPES_MASK_EV4 + 675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_EV5), 68911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_ESCO_RETRANS_QUALITY /* Retransmission Effort */ 695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 72ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 73ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_sco_flush_sco_data 74ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 759ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description This function is called to flush the SCO data for this 769ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * channel. 77ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 78ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 79ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 80ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 81911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#if (BTM_SCO_HCI_INCLUDED == TRUE && BTM_MAX_SCO_LINKS > 0) 82911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_sco_flush_sco_data(uint16_t sco_inx) { 83911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSCO_CONN* p; 84911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BT_HDR* p_buf; 855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 86911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (sco_inx < BTM_MAX_SCO_LINKS) { 87911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p = &btm_cb.sco_cb.sco_db[sco_inx]; 88911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson while ((p_buf = (BT_HDR*)fixed_queue_try_dequeue(p->xmit_data_q)) != NULL) 89911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson osi_free(p_buf); 90911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 91d628a0695e73973e0bd54dd026bfed900b69f804Myles Watson} 925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 93911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#else 94911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_sco_flush_sco_data(UNUSED_ATTR uint16_t sco_inx) {} 95d628a0695e73973e0bd54dd026bfed900b69f804Myles Watson#endif 965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 97ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 98ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_sco_init 99ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 100ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called at BTM startup to initialize 101ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 102ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 103ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 104ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 105911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_sco_init(void) { 106d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (BTM_SCO_HCI_INCLUDED == TRUE) 107911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (int i = 0; i < BTM_MAX_SCO_LINKS; i++) 108911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.sco_cb.sco_db[i].xmit_data_q = fixed_queue_new(SIZE_MAX); 1091a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov#endif 1101a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov 111911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Initialize nonzero defaults */ 112911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.sco_cb.sco_disc_reason = BTM_INVALID_SCO_DISC_REASON; 1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 114911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.sco_cb.def_esco_parms = 115911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_esco_defaults; /* Initialize with defaults */ 116911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.sco_cb.desired_sco_mode = BTM_DEFAULT_SCO_MODE; 1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 120ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 121ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_esco_conn_rsp 122ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 123ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called upon receipt of an (e)SCO connection 124ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * request event (BTM_ESCO_CONN_REQ_EVT) to accept or reject 125ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * the request. Parameters used to negotiate eSCO links. 126ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * If p_parms is NULL, then default values are used. 127ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * If the link type of the incoming request is SCO, then only 128ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * the tx_bw, max_latency, content format, and packet_types are 129ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * valid. The hci_status parameter should be 130ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * ([0x0] to accept, [0x0d..0x0f] to reject) 131ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 132ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 133ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 134ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 135911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btm_esco_conn_rsp(uint16_t sco_inx, uint8_t hci_status, BD_ADDR bda, 136911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_ESCO_PARAMS* p_parms) { 137911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#if (BTM_MAX_SCO_LINKS > 0) 138911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSCO_CONN* p_sco = NULL; 139911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_ESCO_PARAMS* p_setup; 140911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t temp_pkt_types; 1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 142911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (sco_inx < BTM_MAX_SCO_LINKS) p_sco = &btm_cb.sco_cb.sco_db[sco_inx]; 143911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 144911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Reject the connect request if refused by caller or wrong state */ 145911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (hci_status != HCI_SUCCESS || p_sco == NULL) { 146911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_sco) { 147911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_sco->state = (p_sco->state == SCO_ST_W4_CONN_RSP) ? SCO_ST_LISTENING 148911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson : SCO_ST_UNUSED; 1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 150911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 151911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!btm_cb.sco_cb.esco_supported) { 152911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_reject_conn(bda, hci_status); 153911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 154911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_reject_esco_conn(bda, hci_status); 155911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 156911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else /* Connection is being accepted */ 157911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson { 158911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_sco->state = SCO_ST_CONNECTING; 159911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_setup = &p_sco->esco.setup; 160911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If parameters not specified use the default */ 161911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_parms) 162911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_setup = *p_parms; 163911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else /* Use the last setup passed thru BTM_SetEscoMode (or defaults) */ 1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 165911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_setup = btm_cb.sco_cb.def_esco_parms; 166911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 168911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson temp_pkt_types = (p_setup->packet_types & BTM_SCO_SUPPORTED_PKTS_MASK & 169911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.btm_sco_pkt_types_supported); 1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 171911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Make sure at least one eSCO packet type is sent, else might confuse peer 172911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson */ 173911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Taking this out to confirm with BQB tests 174911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ** Real application would like to include this though, as many devices 175911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ** do not retry with SCO only if an eSCO connection fails. 176911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!(temp_pkt_types & BTM_ESCO_LINK_ONLY_MASK)) 177911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson { 178911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson temp_pkt_types |= BTM_SCO_PKT_TYPES_MASK_EV3; 1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 180911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson */ 181911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If SCO request, remove eSCO packet types (conformance) */ 182911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_sco->esco.data.link_type == BTM_LINK_TYPE_SCO) { 183911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson temp_pkt_types &= BTM_SCO_LINK_ONLY_MASK; 184911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson temp_pkt_types |= BTM_SCO_EXCEPTION_PKTS_MASK; 185911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 186911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* OR in any exception packet types */ 187911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson temp_pkt_types |= 188911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ((p_setup->packet_types & BTM_SCO_EXCEPTION_PKTS_MASK) | 189911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (btm_cb.btm_sco_pkt_types_supported & BTM_SCO_EXCEPTION_PKTS_MASK)); 190911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 191911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 192911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_accept_esco_conn(bda, p_setup->tx_bw, p_setup->rx_bw, 193911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_setup->max_latency, p_setup->voice_contfmt, 194911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_setup->retrans_effort, temp_pkt_types); 195911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_setup->packet_types = temp_pkt_types; 196911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 200d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (BTM_SCO_HCI_INCLUDED == TRUE) 2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 202ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 203ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_sco_check_send_pkts 204ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 205ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to check if it can send packets 206ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * to the Host Controller. 207ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 208ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 209ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 210ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 211911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_sco_check_send_pkts(uint16_t sco_inx) { 212911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSCO_CB* p_cb = &btm_cb.sco_cb; 213911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSCO_CONN* p_ccb = &p_cb->sco_db[sco_inx]; 214911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 215911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If there is data to send, send it now */ 216911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BT_HDR* p_buf; 217911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson while ((p_buf = (BT_HDR*)fixed_queue_try_dequeue(p_ccb->xmit_data_q)) != 218911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson NULL) { 219d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (BTM_SCO_HCI_DEBUG == TRUE) 220911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("btm: [%d] buf in xmit_data_q", 221911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson fixed_queue_length(p_ccb->xmit_data_q) + 1); 2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 224911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson HCI_SCO_DATA_TO_LOWER(p_buf); 225911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* BTM_SCO_HCI_INCLUDED == TRUE */ 2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 230ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 231ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_route_sco_data 232ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 233ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description Route received SCO data. 234ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 235ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 236ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 237ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 238911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_route_sco_data(BT_HDR* p_msg) { 239d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (BTM_SCO_HCI_INCLUDED == TRUE) 240911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t sco_inx, handle; 241911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t* p = (uint8_t*)(p_msg + 1) + p_msg->offset; 242911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t pkt_size = 0; 243911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t pkt_status = 0; 244911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 245911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Extract Packet_Status_Flag and handle */ 246911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson STREAM_TO_UINT16(handle, p); 247911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson pkt_status = HCID_GET_EVENT(handle); 248911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson handle = HCID_GET_HANDLE(handle); 249911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 250911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson STREAM_TO_UINT8(pkt_size, p); 251911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 252911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson sco_inx = btm_find_scb_by_handle(handle); 253911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (sco_inx != BTM_MAX_SCO_LINKS) { 254911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* send data callback */ 255911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!btm_cb.sco_cb.p_data_cb) 256911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* if no data callback registered, just free the buffer */ 257911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson osi_free(p_msg); 258911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else { 259911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (*btm_cb.sco_cb.p_data_cb)(sco_inx, p_msg, 260911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (tBTM_SCO_DATA_FLAG)pkt_status); 2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 262911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else /* no mapping handle SCO connection is active, free the buffer */ 263911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson { 264cceb430489a70add1b996d54289867c17f4ac0fdPavlin Radoslavov osi_free(p_msg); 265911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 266911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#else 267911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson osi_free(p_msg); 2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 272ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 273ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_WriteScoData 274ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2759ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description This function write SCO data to a specified instance. The 2769ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * data to be written p_buf needs to carry an offset of 277ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * HCI_SCO_PREAMBLE_SIZE bytes, and the data length can not 2789ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * exceed BTM_SCO_DATA_SIZE_MAX bytes, whose default value is 2799ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * set to 60 and is configurable. Data longer than the maximum 2809ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * bytes will be truncated. 281ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 282ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns BTM_SUCCESS: data write is successful 283ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_ILLEGAL_VALUE: SCO data contains illegal offset value. 2849ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * BTM_SCO_BAD_LENGTH: SCO data length exceeds the max SCO 2859ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * packet size. 286ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_NO_RESOURCES: no resources. 2879ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * BTM_UNKNOWN_ADDR: unknown SCO connection handle, or SCO is 2889ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * not routed via HCI. 289ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 290ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 291ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 292d628a0695e73973e0bd54dd026bfed900b69f804Myles Watson#if (BTM_SCO_HCI_INCLUDED == TRUE && BTM_MAX_SCO_LINKS > 0) 293911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsontBTM_STATUS BTM_WriteScoData(uint16_t sco_inx, BT_HDR* p_buf) { 294911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSCO_CONN* p_ccb = &btm_cb.sco_cb.sco_db[sco_inx]; 295911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t* p; 296911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_STATUS status = BTM_SUCCESS; 297911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 298911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (sco_inx < BTM_MAX_SCO_LINKS && btm_cb.sco_cb.p_data_cb && 299911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_ccb->state == SCO_ST_CONNECTED) { 300911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Ensure we have enough space in the buffer for the SCO and HCI headers */ 301911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_buf->offset < HCI_SCO_PREAMBLE_SIZE) { 302911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_ERROR("BTM SCO - cannot send buffer, offset: %d", 303911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_buf->offset); 304911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson osi_free(p_buf); 305911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson status = BTM_ILLEGAL_VALUE; 306911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else /* write HCI header */ 3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 308911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Step back 3 bytes to add the headers */ 309911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_buf->offset -= HCI_SCO_PREAMBLE_SIZE; 310911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Set the pointer to the beginning of the data */ 311911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p = (uint8_t*)(p_buf + 1) + p_buf->offset; 312911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* add HCI handle */ 313911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT16_TO_STREAM(p, p_ccb->hci_handle); 314911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* only sent the first BTM_SCO_DATA_SIZE_MAX bytes data if more than max, 315911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson and set warning status */ 316911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_buf->len > BTM_SCO_DATA_SIZE_MAX) { 317911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_buf->len = BTM_SCO_DATA_SIZE_MAX; 318911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson status = BTM_SCO_BAD_LENGTH; 319911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 320911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 321911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT8_TO_STREAM(p, (uint8_t)p_buf->len); 322911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_buf->len += HCI_SCO_PREAMBLE_SIZE; 323911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 324911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson fixed_queue_enqueue(p_ccb->xmit_data_q, p_buf); 325911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 326911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sco_check_send_pkts(sco_inx); 3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 328911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 329911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson osi_free(p_buf); 3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 331911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_WARNING("BTM_WriteScoData, invalid sco index: %d at state [%d]", 332911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson sco_inx, btm_cb.sco_cb.sco_db[sco_inx].state); 333911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson status = BTM_UNKNOWN_ADDR; 334911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 336911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (status); 337d628a0695e73973e0bd54dd026bfed900b69f804Myles Watson} 3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 339d628a0695e73973e0bd54dd026bfed900b69f804Myles WatsontBTM_STATUS BTM_WriteScoData(UNUSED_ATTR uint16_t sco_inx, 340911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UNUSED_ATTR BT_HDR* p_buf) { 341911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_NO_RESOURCES); 3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 343d628a0695e73973e0bd54dd026bfed900b69f804Myles Watson#endif 3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 345911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#if (BTM_MAX_SCO_LINKS > 0) 3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 347ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 348ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_send_connect_request 349ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 3509ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description This function is called to respond to SCO connect 3519ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * indications 352ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 353ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 354ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 355ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 356d19e0785e662e640191a075eda07acce61c2aedaMarie Janssenstatic tBTM_STATUS btm_send_connect_request(uint16_t acl_handle, 357911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_ESCO_PARAMS* p_setup) { 358911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t temp_pkt_types; 359911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t xx; 360911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tACL_CONN* p_acl; 361911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 362911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Send connect request depending on version of spec */ 363911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!btm_cb.sco_cb.esco_supported) { 364911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_add_SCO_conn(acl_handle, BTM_ESCO_2_SCO(p_setup->packet_types)); 365911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 366911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson temp_pkt_types = (p_setup->packet_types & BTM_SCO_SUPPORTED_PKTS_MASK & 367911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.btm_sco_pkt_types_supported); 368911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 369911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* OR in any exception packet types */ 370911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson temp_pkt_types |= 371911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ((p_setup->packet_types & BTM_SCO_EXCEPTION_PKTS_MASK) | 372911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (btm_cb.btm_sco_pkt_types_supported & BTM_SCO_EXCEPTION_PKTS_MASK)); 373911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 374911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Finally, remove EDR eSCO if the remote device doesn't support it */ 375911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* UPF25: Only SCO was brought up in this case */ 376911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_handle_to_acl_index(acl_handle); 377911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson xx = btm_handle_to_acl_index(acl_handle); 378911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (xx < MAX_L2CAP_LINKS) { 379911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_acl = &btm_cb.acl_db[xx]; 380f6ac424a81bad038bbf9a90c7c569dba81978f51Venkata Jagadeesh Garaga if (!HCI_EDR_ESCO_2MPS_SUPPORTED(p_acl->peer_lmp_feature_pages[0])) { 381911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_WARNING("BTM Remote does not support 2-EDR eSCO"); 382911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson temp_pkt_types |= (HCI_ESCO_PKT_TYPES_MASK_NO_2_EV3 | 383911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson HCI_ESCO_PKT_TYPES_MASK_NO_2_EV5); 384911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 385f6ac424a81bad038bbf9a90c7c569dba81978f51Venkata Jagadeesh Garaga if (!HCI_EDR_ESCO_3MPS_SUPPORTED(p_acl->peer_lmp_feature_pages[0])) { 386911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_WARNING("BTM Remote does not support 3-EDR eSCO"); 387911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson temp_pkt_types |= (HCI_ESCO_PKT_TYPES_MASK_NO_3_EV3 | 388911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson HCI_ESCO_PKT_TYPES_MASK_NO_3_EV5); 389911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 390911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 391911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Check to see if BR/EDR Secure Connections is being used 392911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ** If so, we cannot use SCO-only packet types (HFP 1.7) 393911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson */ 394911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (BTM_BothEndsSupportSecureConnections(p_acl->remote_addr)) { 395911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson temp_pkt_types &= ~(BTM_SCO_PKT_TYPE_MASK); 396911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s: SCO Conn: pkt_types after removing SCO (0x%04x)", 397911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson __func__, temp_pkt_types); 398911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 399911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Return error if no packet types left */ 400911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (temp_pkt_types == 0) { 401911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_ERROR("%s: SCO Conn (BR/EDR SC): No packet types available", 402911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson __func__); 403911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_WRONG_MODE); 4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 405911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 406911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG( 407911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "%s: SCO Conn(BR/EDR SC):local or peer does not support BR/EDR SC", 408911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson __func__); 409911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 410911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 412911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_API( 413911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson " txbw 0x%x, rxbw 0x%x, lat 0x%x, voice 0x%x, retrans 0x%02x, pkt " 414911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "0x%04x", 415911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_setup->tx_bw, p_setup->rx_bw, p_setup->max_latency, 416911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_setup->voice_contfmt, p_setup->retrans_effort, temp_pkt_types); 4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 418911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_setup_esco_conn(acl_handle, p_setup->tx_bw, p_setup->rx_bw, 419911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_setup->max_latency, p_setup->voice_contfmt, 420911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_setup->retrans_effort, temp_pkt_types); 421911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_setup->packet_types = temp_pkt_types; 422911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 424911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_CMD_STARTED); 4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 429ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 430ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_set_sco_ind_cback 431ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 432ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to register for TCS SCO connect 433ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * indications. 434ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 435ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 436ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 437ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 438911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_set_sco_ind_cback(tBTM_SCO_IND_CBACK* sco_ind_cb) { 439911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.sco_cb.app_sco_ind_cb = sco_ind_cb; 4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 443ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 444ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_accept_sco_link 445ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 446ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to respond to TCS SCO connect 447ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * indications 448ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 449ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 450ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 451ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 452911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_accept_sco_link(uint16_t sco_inx, tBTM_ESCO_PARAMS* p_setup, 453911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SCO_CB* p_conn_cb, tBTM_SCO_CB* p_disc_cb) { 454911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#if (BTM_MAX_SCO_LINKS > 0) 455911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSCO_CONN* p_sco; 4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 457911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (sco_inx >= BTM_MAX_SCO_LINKS) { 458911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_ERROR("btm_accept_sco_link: Invalid sco_inx(%d)", sco_inx); 459911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 460911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 462911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Link role is ignored in for this message */ 463911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_sco = &btm_cb.sco_cb.sco_db[sco_inx]; 464911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_sco->p_conn_cb = p_conn_cb; 465911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_sco->p_disc_cb = p_disc_cb; 466911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_sco->esco.data.link_type = 467911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_LINK_TYPE_ESCO; /* Accept with all supported types */ 4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 469911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("TCS accept SCO: Packet Types 0x%04x", p_setup->packet_types); 4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 471911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_esco_conn_rsp(sco_inx, HCI_SUCCESS, p_sco->esco.data.bd_addr, p_setup); 4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 473911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_reject_sco_link(sco_inx); 4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 478ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 479ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_reject_sco_link 480ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 4819ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description This function is called to respond to SCO connect 4829ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * indications 483ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 484ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 485ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 486ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 487911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_reject_sco_link(uint16_t sco_inx) { 488911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_esco_conn_rsp(sco_inx, HCI_ERR_HOST_REJECT_RESOURCES, 489911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.sco_cb.sco_db[sco_inx].esco.data.bd_addr, NULL); 4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 493ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 494ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_CreateSco 495ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 496ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to create an SCO connection. If the 497ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * "is_orig" flag is true, the connection will be originated, 498ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * otherwise BTM will wait for the other side to connect. 499ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 500ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * NOTE: If BTM_IGNORE_SCO_PKT_TYPE is passed in the pkt_types 501ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * parameter the default packet types is used. 502ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 503ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns BTM_UNKNOWN_ADDR if the ACL connection is not up 504ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_BUSY if another SCO being set up to 505ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * the same BD address 506ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_NO_RESOURCES if the max SCO limit has been reached 507ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_CMD_STARTED if the connection establishment is started. 508ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * In this case, "*p_sco_inx" is filled in 509ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * with the sco index used for the connection. 510ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 511ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 512911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsontBTM_STATUS BTM_CreateSco(BD_ADDR remote_bda, bool is_orig, uint16_t pkt_types, 513911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t* p_sco_inx, tBTM_SCO_CB* p_conn_cb, 514911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SCO_CB* p_disc_cb) { 5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_MAX_SCO_LINKS > 0) 516911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_ESCO_PARAMS* p_setup; 517911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSCO_CONN* p = &btm_cb.sco_cb.sco_db[0]; 518911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t xx; 519911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t acl_handle = 0; 520911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t temp_pkt_types; 521911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tACL_CONN* p_acl; 5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 523e7ef465c37298c2b64b7e9794659b1b1b50ab877Chris Manton#if (BTM_SCO_WAKE_PARKED_LINK == TRUE) 524911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_PM_PWR_MD pm; 525911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_PM_STATE state; 5268847ff137b311a37c57366ac8d138b605397dce1Mallikarjuna GB#else 527911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t mode; 528e7ef465c37298c2b64b7e9794659b1b1b50ab877Chris Manton#endif // BTM_SCO_WAKE_PARKED_LINK 5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 530911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_sco_inx = BTM_INVALID_SCO_INDEX; 5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 532911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If originating, ensure that there is an ACL connection to the BD Address */ 533911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (is_orig) { 534911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((!remote_bda) || ((acl_handle = BTM_GetHCIConnHandle( 535911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson remote_bda, BT_TRANSPORT_BR_EDR)) == 0xFFFF)) 536911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_UNKNOWN_ADDR); 537911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 539911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (remote_bda) { 540911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If any SCO is being established to the remote BD address, refuse this */ 541911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++) { 542911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (((p->state == SCO_ST_CONNECTING) || (p->state == SCO_ST_LISTENING) || 543911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p->state == SCO_ST_PEND_UNPARK)) && 544911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (!memcmp(p->esco.data.bd_addr, remote_bda, BD_ADDR_LEN))) { 545911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_BUSY); 546911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 548911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 549911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Support only 1 wildcard BD address at a time */ 550911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++) { 551911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((p->state == SCO_ST_LISTENING) && (!p->rem_bd_known)) 552911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_BUSY); 5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 554911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 555911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 556911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Now, try to find an unused control block, and kick off the SCO 557911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * establishment */ 558911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (xx = 0, p = &btm_cb.sco_cb.sco_db[0]; xx < BTM_MAX_SCO_LINKS; 559911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson xx++, p++) { 560911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p->state == SCO_ST_UNUSED) { 561911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (remote_bda) { 562911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (is_orig) { 563911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson/* can not create SCO link if in park mode */ 564d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (BTM_SCO_WAKE_PARKED_LINK == TRUE) 565911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((btm_read_power_mode_state(p->esco.data.bd_addr, &state) == 566911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_SUCCESS)) { 567911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (state == BTM_PM_ST_SNIFF || state == BTM_PM_ST_PARK || 568911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson state == BTM_PM_ST_PENDING) { 569911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s In sniff, park or pend mode: %d", __func__, 570911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson state); 571911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memset((void*)&pm, 0, sizeof(pm)); 572911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson pm.mode = BTM_PM_MD_ACTIVE; 573911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_SetPowerMode(BTM_PM_SET_ONLY_ID, remote_bda, &pm); 574911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->state = SCO_ST_PEND_UNPARK; 5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 576911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 577911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#else // BTM_SCO_WAKE_PARKED_LINK 578911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((BTM_ReadPowerMode(remote_bda, &mode) == BTM_SUCCESS) && 579911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (mode == BTM_PM_MD_PARK)) 580911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_WRONG_MODE); 581911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#endif // BTM_SCO_WAKE_PARKED_LINK 582911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 583911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(p->esco.data.bd_addr, remote_bda, BD_ADDR_LEN); 584911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->rem_bd_known = true; 585911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else 586911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->rem_bd_known = false; 587911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 588911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Link role is ignored in for this message */ 589911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (pkt_types == BTM_IGNORE_SCO_PKT_TYPE) 590911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson pkt_types = btm_cb.sco_cb.def_esco_parms.packet_types; 591911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 592911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_setup = &p->esco.setup; 593911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_setup = btm_cb.sco_cb.def_esco_parms; 594911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_setup->packet_types = 595911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (btm_cb.sco_cb.desired_sco_mode == BTM_LINK_TYPE_SCO) 596911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ? (pkt_types & BTM_SCO_LINK_ONLY_MASK) 597911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson : pkt_types; 598911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 599911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson temp_pkt_types = (p_setup->packet_types & BTM_SCO_SUPPORTED_PKTS_MASK & 600911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.btm_sco_pkt_types_supported); 601911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 602911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* OR in any exception packet types */ 603911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (controller_get_interface()->get_bt_version()->hci_version >= 604911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson HCI_PROTO_VERSION_2_0) { 605911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson temp_pkt_types |= 606911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ((p_setup->packet_types & BTM_SCO_EXCEPTION_PKTS_MASK) | 607911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (btm_cb.btm_sco_pkt_types_supported & 608911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_SCO_EXCEPTION_PKTS_MASK)); 609911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else /* Only using SCO packet types; turn off EDR also */ 610911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson { 611911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson temp_pkt_types |= BTM_SCO_EXCEPTION_PKTS_MASK; 612911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 613911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 614911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_setup->packet_types = temp_pkt_types; 615911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->p_conn_cb = p_conn_cb; 616911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->p_disc_cb = p_disc_cb; 617911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->hci_handle = BTM_INVALID_HCI_HANDLE; 618911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->is_orig = is_orig; 619911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 620911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p->state != SCO_ST_PEND_UNPARK) { 621911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (is_orig) { 622911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If role change is in progress, do not proceed with SCO setup 623911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * Wait till role change is complete */ 624911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_acl = btm_bda_to_acl(remote_bda, BT_TRANSPORT_BR_EDR); 625911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_acl && p_acl->switch_role_state != BTM_ACL_SWKEY_STATE_IDLE) { 626911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_API("Role Change is in progress for ACL handle 0x%04x", 627911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson acl_handle); 628911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->state = SCO_ST_PEND_ROLECHANGE; 629911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 630911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 631911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 633911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p->state != SCO_ST_PEND_UNPARK && 634911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->state != SCO_ST_PEND_ROLECHANGE) { 635911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (is_orig) { 636911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_API( 637911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "BTM_CreateSco -> (e)SCO Link for ACL handle 0x%04x, Desired " 638911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "Type %d", 639911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson acl_handle, btm_cb.sco_cb.desired_sco_mode); 6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 641911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((btm_send_connect_request(acl_handle, p_setup)) != 642911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_CMD_STARTED) 643911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_NO_RESOURCES); 6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 645911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->state = SCO_ST_CONNECTING; 646911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else 647911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->state = SCO_ST_LISTENING; 648911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 650911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_sco_inx = xx; 6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 652911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_CMD_STARTED); 6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 654911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 657911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If here, all SCO blocks in use */ 658911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_NO_RESOURCES); 6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 661e7ef465c37298c2b64b7e9794659b1b1b50ab877Chris Manton#if (BTM_SCO_WAKE_PARKED_LINK == TRUE) 6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 663ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 664ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_sco_chk_pend_unpark 665ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 666ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called by BTIF when there is a mode change 6679ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * event to see if there are SCO commands waiting for the 6689ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * unpark. 669ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 670ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 671ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 672ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 673911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_sco_chk_pend_unpark(uint8_t hci_status, uint16_t hci_handle) { 674911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#if (BTM_MAX_SCO_LINKS > 0) 675911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t xx; 676911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t acl_handle; 677911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSCO_CONN* p = &btm_cb.sco_cb.sco_db[0]; 6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 679911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++) { 680911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((p->state == SCO_ST_PEND_UNPARK) && 681911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ((acl_handle = BTM_GetHCIConnHandle( 682911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->esco.data.bd_addr, BT_TRANSPORT_BR_EDR)) == hci_handle)) 6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 684911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson { 685911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_API( 686911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "btm_sco_chk_pend_unpark -> (e)SCO Link for ACL handle 0x%04x, " 687911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "Desired Type %d, hci_status 0x%02x", 688911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson acl_handle, btm_cb.sco_cb.desired_sco_mode, hci_status); 689911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 690911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((btm_send_connect_request(acl_handle, &p->esco.setup)) == 691911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_CMD_STARTED) 692911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->state = SCO_ST_CONNECTING; 6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 694911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 695e7ef465c37298c2b64b7e9794659b1b1b50ab877Chris Manton#endif // BTM_MAX_SCO_LINKS 6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 697e7ef465c37298c2b64b7e9794659b1b1b50ab877Chris Manton#endif // BTM_SCO_WAKE_PARKED_LINK 6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 700ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 701ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_sco_chk_pend_rolechange 702ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 703ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called by BTIF when there is a role change 7049ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * event to see if there are SCO commands waiting for the role 7059ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * change. 706ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 707ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 708ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 709ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 710911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_sco_chk_pend_rolechange(uint16_t hci_handle) { 711911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#if (BTM_MAX_SCO_LINKS > 0) 712911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t xx; 713911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t acl_handle; 714911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSCO_CONN* p = &btm_cb.sco_cb.sco_db[0]; 7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 716911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++) { 717911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((p->state == SCO_ST_PEND_ROLECHANGE) && 718911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ((acl_handle = BTM_GetHCIConnHandle( 719911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->esco.data.bd_addr, BT_TRANSPORT_BR_EDR)) == hci_handle)) 7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 721911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson { 722911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_API( 723911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "btm_sco_chk_pend_rolechange -> (e)SCO Link for ACL handle 0x%04x", 724911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson acl_handle); 725911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 726911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((btm_send_connect_request(acl_handle, &p->esco.setup)) == 727911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_CMD_STARTED) 728911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->state = SCO_ST_CONNECTING; 7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 730911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 735ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 736ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_sco_disc_chk_pend_for_modechange 737ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 738ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called by btm when there is a mode change 7399ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * event to see if there are SCO disconnect commands waiting 7409ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * for the mode change. 741ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 742ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 743ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 744ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 745911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_sco_disc_chk_pend_for_modechange(uint16_t hci_handle) { 746911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#if (BTM_MAX_SCO_LINKS > 0) 747911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSCO_CONN* p = &btm_cb.sco_cb.sco_db[0]; 7489ab2a9d97f4e0c4b3cd76416e3d6ed03b610ec6fMallikarjuna GB 749911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s: hci_handle 0x%04x, p->state 0x%02x", __func__, 750911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson hci_handle, p->state); 7519ab2a9d97f4e0c4b3cd76416e3d6ed03b610ec6fMallikarjuna GB 752911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (uint16_t xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++) { 753911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((p->state == SCO_ST_PEND_MODECHANGE) && 754911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (BTM_GetHCIConnHandle(p->esco.data.bd_addr, BT_TRANSPORT_BR_EDR)) == 755911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson hci_handle) 7569ab2a9d97f4e0c4b3cd76416e3d6ed03b610ec6fMallikarjuna GB 757911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson { 758911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s: SCO Link handle 0x%04x", __func__, p->hci_handle); 759911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_RemoveSco(xx); 7609ab2a9d97f4e0c4b3cd76416e3d6ed03b610ec6fMallikarjuna GB } 761911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 7629ab2a9d97f4e0c4b3cd76416e3d6ed03b610ec6fMallikarjuna GB#endif 7639ab2a9d97f4e0c4b3cd76416e3d6ed03b610ec6fMallikarjuna GB} 7649ab2a9d97f4e0c4b3cd76416e3d6ed03b610ec6fMallikarjuna GB 7659ab2a9d97f4e0c4b3cd76416e3d6ed03b610ec6fMallikarjuna GB/******************************************************************************* 766ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 767ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_sco_conn_req 768ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 769ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called by BTIF when an SCO connection 770ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * request is received from a remote. 771ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 772ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 773ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 774ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 775911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_sco_conn_req(BD_ADDR bda, DEV_CLASS dev_class, uint8_t link_type) { 776911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#if (BTM_MAX_SCO_LINKS > 0) 777911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSCO_CB* p_sco = &btm_cb.sco_cb; 778911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSCO_CONN* p = &p_sco->sco_db[0]; 779911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t xx; 780911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_ESCO_CONN_REQ_EVT_DATA evt_data; 781911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 782911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++) { 783911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* 784911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * If the sco state is in the SCO_ST_CONNECTING state, we still need 785911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * to return accept sco to avoid race conditon for sco creation 786911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson */ 787911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson int rem_bd_matches = 788911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->rem_bd_known && !memcmp(p->esco.data.bd_addr, bda, BD_ADDR_LEN); 789911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (((p->state == SCO_ST_CONNECTING) && rem_bd_matches) || 790911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ((p->state == SCO_ST_LISTENING) && 791911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (rem_bd_matches || !p->rem_bd_known))) { 792911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If this guy was a wildcard, he is not one any more */ 793911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->rem_bd_known = true; 794911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->esco.data.link_type = link_type; 795911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->state = SCO_ST_W4_CONN_RSP; 796911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(p->esco.data.bd_addr, bda, BD_ADDR_LEN); 797911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 798911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If no callback, auto-accept the connection if packet types match */ 799911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!p->esco.p_esco_cback) { 800911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If requesting eSCO reject if default parameters are SCO only */ 801911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((link_type == BTM_LINK_TYPE_ESCO && 802911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson !(p_sco->def_esco_parms.packet_types & BTM_ESCO_LINK_ONLY_MASK) && 803911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ((p_sco->def_esco_parms.packet_types & 804911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_SCO_EXCEPTION_PKTS_MASK) == BTM_SCO_EXCEPTION_PKTS_MASK)) 805911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 806911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Reject request if SCO is desired but no SCO packets delected */ 807911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson || 808911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (link_type == BTM_LINK_TYPE_SCO && 809911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson !(p_sco->def_esco_parms.packet_types & BTM_SCO_LINK_ONLY_MASK))) { 810911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_esco_conn_rsp(xx, HCI_ERR_HOST_REJECT_RESOURCES, bda, NULL); 811911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else /* Accept the request */ 8125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 813911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_esco_conn_rsp(xx, HCI_SUCCESS, bda, NULL); 8145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 815911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else /* Notify upper layer of connect indication */ 816911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson { 817911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(evt_data.bd_addr, bda, BD_ADDR_LEN); 818911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(evt_data.dev_class, dev_class, DEV_CLASS_LEN); 819911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson evt_data.link_type = link_type; 820911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson evt_data.sco_inx = xx; 821911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->esco.p_esco_cback(BTM_ESCO_CONN_REQ_EVT, 822911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (tBTM_ESCO_EVT_DATA*)&evt_data); 823911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 824911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 825911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 8265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 827911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 828911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 829911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* TCS usage */ 830911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.sco_cb.app_sco_ind_cb) { 831911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Now, try to find an unused control block */ 832911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (xx = 0, p = &btm_cb.sco_cb.sco_db[0]; xx < BTM_MAX_SCO_LINKS; 833911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson xx++, p++) { 834911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p->state == SCO_ST_UNUSED) { 835911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->is_orig = false; 836911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->state = SCO_ST_LISTENING; 837911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 838911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->esco.data.link_type = link_type; 839911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(p->esco.data.bd_addr, bda, BD_ADDR_LEN); 840911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->rem_bd_known = true; 841911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 842911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 8435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 844911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (xx < BTM_MAX_SCO_LINKS) { 845911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.sco_cb.app_sco_ind_cb(xx); 846911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 847911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 848911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 8495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 851911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If here, no one wants the SCO connection. Reject it */ 852911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_WARNING( 853911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "btm_sco_conn_req: No one wants this SCO connection; rejecting it"); 854911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_esco_conn_rsp(BTM_MAX_SCO_LINKS, HCI_ERR_HOST_REJECT_RESOURCES, bda, 855911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson NULL); 8565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 859ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 860ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_sco_connected 861ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 862ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called by BTIF when an (e)SCO connection 863ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * is connected. 864ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 865ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 866ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 867ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 868911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_sco_connected(uint8_t hci_status, BD_ADDR bda, uint16_t hci_handle, 869911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_ESCO_DATA* p_esco_data) { 870911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#if (BTM_MAX_SCO_LINKS > 0) 871911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSCO_CONN* p = &btm_cb.sco_cb.sco_db[0]; 872911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t xx; 873911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bool spt = false; 874911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_CHG_ESCO_PARAMS parms; 8755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 8765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 877911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.sco_cb.sco_disc_reason = hci_status; 8785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 879911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#if (BTM_MAX_SCO_LINKS > 0) 880911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++) { 881911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (((p->state == SCO_ST_CONNECTING) || (p->state == SCO_ST_LISTENING) || 882911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p->state == SCO_ST_W4_CONN_RSP)) && 883911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p->rem_bd_known) && 884911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (!bda || !memcmp(p->esco.data.bd_addr, bda, BD_ADDR_LEN))) { 885911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (hci_status != HCI_SUCCESS) { 886911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Report the error if originator, otherwise remain in Listen mode */ 887911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p->is_orig) { 888911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If role switch is pending, we need try again after role switch is 889911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * complete */ 890911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (hci_status == HCI_ERR_ROLE_SWITCH_PENDING) { 891911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_API("Role Change pending for HCI handle 0x%04x", 892911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson hci_handle); 893911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->state = SCO_ST_PEND_ROLECHANGE; 894911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 895911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* avoid calling disconnect callback because of sco creation race */ 896911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else if (hci_status != HCI_ERR_LMP_ERR_TRANS_COLLISION) { 897911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->state = SCO_ST_UNUSED; 898911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (*p->p_disc_cb)(xx); 899911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 900911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 901911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Notify the upper layer that incoming sco connection has failed. */ 902911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p->state == SCO_ST_CONNECTING) { 903911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->state = SCO_ST_UNUSED; 904911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (*p->p_disc_cb)(xx); 905911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else 906911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->state = SCO_ST_LISTENING; 907911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 9085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 909911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 910911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 9115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 912911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p->state == SCO_ST_LISTENING) spt = true; 9135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 914911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->state = SCO_ST_CONNECTED; 915911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->hci_handle = hci_handle; 9165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 917911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!btm_cb.sco_cb.esco_supported) { 918911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->esco.data.link_type = BTM_LINK_TYPE_SCO; 919911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (spt) { 920911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson parms.packet_types = p->esco.setup.packet_types; 921911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Keep the other parameters the same for SCO */ 922911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson parms.max_latency = p->esco.setup.max_latency; 923911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson parms.retrans_effort = p->esco.setup.retrans_effort; 9245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 925911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_ChangeEScoLinkParms(xx, &parms); 9265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 927911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 928911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_esco_data) p->esco.data = *p_esco_data; 929911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 930911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 931911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (*p->p_conn_cb)(xx); 932911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 933911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 9345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 935911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 9365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 9375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 9385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 940ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 941ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_find_scb_by_handle 942ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 9439ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description Look through all active SCO connection for a match based on 9449ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * the HCI handle. 945ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 946ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns index to matched SCO connection CB, or BTM_MAX_SCO_LINKS if 947ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * no match. 948ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 949ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 950911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonuint16_t btm_find_scb_by_handle(uint16_t handle) { 951911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson int xx; 952911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSCO_CONN* p = &btm_cb.sco_cb.sco_db[0]; 9535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 954911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++) { 955911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((p->state == SCO_ST_CONNECTED) && (p->hci_handle == handle)) { 956911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (xx); 9575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 958911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 9595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 960911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If here, no match found */ 961911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (xx); 9625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 9635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 965ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 966ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_RemoveSco 967ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 968ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to remove a specific SCO connection. 969ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 970ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns status of the operation 971ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 972ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 973911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsontBTM_STATUS BTM_RemoveSco(uint16_t sco_inx) { 974911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#if (BTM_MAX_SCO_LINKS > 0) 975911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSCO_CONN* p = &btm_cb.sco_cb.sco_db[sco_inx]; 976911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t tempstate; 977911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_PM_STATE state = BTM_PM_ST_INVALID; 9785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 979911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s", __func__); 9805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 981911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Validity check */ 982911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((sco_inx >= BTM_MAX_SCO_LINKS) || (p->state == SCO_ST_UNUSED)) 983911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_UNKNOWN_ADDR); 9845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 985911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If no HCI handle, simply drop the connection and return */ 986911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p->hci_handle == BTM_INVALID_HCI_HANDLE || 987911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->state == SCO_ST_PEND_UNPARK) { 988911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->hci_handle = BTM_INVALID_HCI_HANDLE; 989911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->state = SCO_ST_UNUSED; 990911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->esco.p_esco_cback = NULL; /* Deregister the eSCO event callback */ 991911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_SUCCESS); 992911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 993911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 994911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((btm_read_power_mode_state(p->esco.data.bd_addr, &state) == 995911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_SUCCESS) && 996911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson state == BTM_PM_ST_PENDING) { 997911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s: BTM_PM_ST_PENDING for ACL mapped with SCO Link 0x%04x", 998911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson __func__, p->hci_handle); 999911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->state = SCO_ST_PEND_MODECHANGE; 1000911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_CMD_STARTED); 1001911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 10029ab2a9d97f4e0c4b3cd76416e3d6ed03b610ec6fMallikarjuna GB 1003911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tempstate = p->state; 1004911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->state = SCO_ST_DISCONNECTING; 10055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1006911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_disconnect(p->hci_handle, HCI_ERR_PEER_USER); 10075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1008911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_CMD_STARTED); 10095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 1010911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_NO_RESOURCES); 10115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 10125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1015ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1016ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_remove_sco_links 1017ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 10189ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description This function is called to remove all sco links for an ACL 10199ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * link. 1020ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1021ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 1022ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1023ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1024911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_remove_sco_links(BD_ADDR bda) { 1025911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#if (BTM_MAX_SCO_LINKS > 0) 1026911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSCO_CONN* p = &btm_cb.sco_cb.sco_db[0]; 1027911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t xx; 10285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1029911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++) { 1030911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p->rem_bd_known && (!memcmp(p->esco.data.bd_addr, bda, BD_ADDR_LEN))) { 1031911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_RemoveSco(xx); 10325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1033911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 10345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 10355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1038ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1039ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_sco_removed 1040ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1041ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called by BTIF when an SCO connection 1042ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * is removed. 1043ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1044ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 1045ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1046ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1047911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_sco_removed(uint16_t hci_handle, uint8_t reason) { 1048911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#if (BTM_MAX_SCO_LINKS > 0) 1049911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSCO_CONN* p = &btm_cb.sco_cb.sco_db[0]; 1050911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t xx; 10515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 10525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1053911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.sco_cb.sco_disc_reason = reason; 10545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1055911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#if (BTM_MAX_SCO_LINKS > 0) 1056911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p = &btm_cb.sco_cb.sco_db[0]; 1057911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++) { 1058911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((p->state != SCO_ST_UNUSED) && (p->state != SCO_ST_LISTENING) && 1059911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p->hci_handle == hci_handle)) { 1060911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sco_flush_sco_data(xx); 1061911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1062911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->state = SCO_ST_UNUSED; 1063911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->hci_handle = BTM_INVALID_HCI_HANDLE; 1064911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->rem_bd_known = false; 1065911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->esco.p_esco_cback = NULL; /* Deregister eSCO callback */ 1066911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (*p->p_disc_cb)(xx); 1067911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1068911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 10695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1070911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 10715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 10725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1075ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1076ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_sco_acl_removed 1077ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1078ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called when an ACL connection is 1079ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * removed. If the BD address is NULL, it is assumed that 1080ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * the local device is down, and all SCO links are removed. 1081ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * If a specific BD address is passed, only SCO connections 1082ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * to that BD address are removed. 1083ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1084ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 1085ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1086ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1087911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_sco_acl_removed(BD_ADDR bda) { 1088911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#if (BTM_MAX_SCO_LINKS > 0) 1089911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSCO_CONN* p = &btm_cb.sco_cb.sco_db[0]; 1090911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t xx; 10915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1092911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++) { 1093911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p->state != SCO_ST_UNUSED) { 1094911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((!bda) || (!memcmp(p->esco.data.bd_addr, bda, BD_ADDR_LEN) && 1095911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->rem_bd_known)) { 1096911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sco_flush_sco_data(xx); 10975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1098911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->state = SCO_ST_UNUSED; 1099911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p->esco.p_esco_cback = NULL; /* Deregister eSCO callback */ 1100911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (*p->p_disc_cb)(xx); 1101911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 11025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1103911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 11045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 11055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 11065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1108ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1109ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_SetScoPacketTypes 1110ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1111ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to set the packet types used for 1112ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * a specific SCO connection, 1113ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1114ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters pkt_types - One or more of the following 1115ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_SCO_PKT_TYPES_MASK_HV1 1116ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_SCO_PKT_TYPES_MASK_HV2 1117ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_SCO_PKT_TYPES_MASK_HV3 1118ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_SCO_PKT_TYPES_MASK_EV3 1119ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_SCO_PKT_TYPES_MASK_EV4 1120ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_SCO_PKT_TYPES_MASK_EV5 1121ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_SCO_PKT_TYPES_MASK_NO_2_EV3 1122ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_SCO_PKT_TYPES_MASK_NO_3_EV3 1123ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_SCO_PKT_TYPES_MASK_NO_2_EV5 1124ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_SCO_PKT_TYPES_MASK_NO_3_EV5 1125ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1126ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_SCO_LINK_ALL_MASK - enables all supported types 1127ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1128ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns status of the operation 1129ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1130ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1131911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsontBTM_STATUS BTM_SetScoPacketTypes(uint16_t sco_inx, uint16_t pkt_types) { 1132911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#if (BTM_MAX_SCO_LINKS > 0) 1133911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_CHG_ESCO_PARAMS parms; 1134911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSCO_CONN* p; 11355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1136911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Validity check */ 1137911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (sco_inx >= BTM_MAX_SCO_LINKS) return (BTM_UNKNOWN_ADDR); 11385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1139911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p = &btm_cb.sco_cb.sco_db[sco_inx]; 1140911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson parms.packet_types = pkt_types; 11415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1142911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Keep the other parameters the same for SCO */ 1143911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson parms.max_latency = p->esco.setup.max_latency; 1144911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson parms.retrans_effort = p->esco.setup.retrans_effort; 11455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1146911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_ChangeEScoLinkParms(sco_inx, &parms)); 11475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 1148911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_UNKNOWN_ADDR); 11495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 11505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 11515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1153ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1154ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_ReadScoPacketTypes 1155ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1156ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is read the packet types used for a specific 1157ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * SCO connection. 1158ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1159ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns Packet types supported for the connection 1160ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * One or more of the following (bitmask): 1161ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_SCO_PKT_TYPES_MASK_HV1 1162ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_SCO_PKT_TYPES_MASK_HV2 1163ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_SCO_PKT_TYPES_MASK_HV3 1164ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_SCO_PKT_TYPES_MASK_EV3 1165ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_SCO_PKT_TYPES_MASK_EV4 1166ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_SCO_PKT_TYPES_MASK_EV5 1167ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_SCO_PKT_TYPES_MASK_NO_2_EV3 1168ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_SCO_PKT_TYPES_MASK_NO_3_EV3 1169ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_SCO_PKT_TYPES_MASK_NO_2_EV5 1170ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_SCO_PKT_TYPES_MASK_NO_3_EV5 1171ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1172ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1173911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonuint16_t BTM_ReadScoPacketTypes(uint16_t sco_inx) { 1174911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#if (BTM_MAX_SCO_LINKS > 0) 1175911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSCO_CONN* p = &btm_cb.sco_cb.sco_db[sco_inx]; 1176911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1177911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Validity check */ 1178911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((sco_inx < BTM_MAX_SCO_LINKS) && (p->state == SCO_ST_CONNECTED)) 1179911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (p->esco.setup.packet_types); 1180911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else 11815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (0); 1182911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#else 1183911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (0); 11845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 11855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 11865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1188ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1189ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_ReadScoDiscReason 1190ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1191ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is returns the reason why an (e)SCO connection 1192ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * has been removed. It contains the value until read, or until 1193ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * another (e)SCO connection has disconnected. 1194ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1195ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns HCI reason or BTM_INVALID_SCO_DISC_REASON if not set. 1196ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1197ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1198911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonuint16_t BTM_ReadScoDiscReason(void) { 1199911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t res = btm_cb.sco_cb.sco_disc_reason; 1200911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.sco_cb.sco_disc_reason = BTM_INVALID_SCO_DISC_REASON; 1201911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (res); 12025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 12035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1205ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1206ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_ReadDeviceScoPacketTypes 1207ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1208ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is read the SCO packet types that 1209ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * the device supports. 1210ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1211ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns Packet types supported by the device. 1212ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * One or more of the following (bitmask): 1213ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_SCO_PKT_TYPES_MASK_HV1 1214ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_SCO_PKT_TYPES_MASK_HV2 1215ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_SCO_PKT_TYPES_MASK_HV3 1216ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_SCO_PKT_TYPES_MASK_EV3 1217ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_SCO_PKT_TYPES_MASK_EV4 1218ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_SCO_PKT_TYPES_MASK_EV5 1219ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_SCO_PKT_TYPES_MASK_NO_2_EV3 1220ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_SCO_PKT_TYPES_MASK_NO_3_EV3 1221ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_SCO_PKT_TYPES_MASK_NO_2_EV5 1222ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_SCO_PKT_TYPES_MASK_NO_3_EV5 1223ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1224ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1225911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonuint16_t BTM_ReadDeviceScoPacketTypes(void) { 1226911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (btm_cb.btm_sco_pkt_types_supported); 12275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 12285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1230ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1231ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_ReadScoHandle 1232ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 12339ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description This function is used to read the HCI handle used for a 12349ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * specific SCO connection, 1235ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1236ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns handle for the connection, or 0xFFFF if invalid SCO index. 1237ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1238ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1239911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonuint16_t BTM_ReadScoHandle(uint16_t sco_inx) { 1240911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#if (BTM_MAX_SCO_LINKS > 0) 1241911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSCO_CONN* p = &btm_cb.sco_cb.sco_db[sco_inx]; 1242911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1243911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Validity check */ 1244911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((sco_inx < BTM_MAX_SCO_LINKS) && (p->state == SCO_ST_CONNECTED)) 1245911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (p->hci_handle); 1246911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else 12475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BTM_INVALID_HCI_HANDLE); 1248911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#else 1249911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_INVALID_HCI_HANDLE); 12505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 12515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 12525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1254ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1255ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_ReadScoBdAddr 1256ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1257ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is read the remote BD Address for a specific 1258ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * SCO connection, 1259ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1260ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns pointer to BD address or NULL if not known 1261ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1262ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1263911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonuint8_t* BTM_ReadScoBdAddr(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->rem_bd_known)) 1269911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (p->esco.data.bd_addr); 1270911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else 12715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (NULL); 1272911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#else 1273911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (NULL); 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_SetEScoMode 1280ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1281ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function sets up the negotiated parameters for SCO or 12829ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * eSCO, and sets as the default mode used for outgoing calls 12839ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * to BTM_CreateSco. It does not change any currently active 12849ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * (e)SCO links. 12859ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Note: Incoming (e)SCO connections will always use packet 12869ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * types supported by the controller. If eSCO is not 12879ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * desired the feature should be disabled in the 12889ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * controller's feature mask. 1289ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1290ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns BTM_SUCCESS if the successful. 1291ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_BUSY if there are one or more active (e)SCO links. 1292ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1293ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1294911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsontBTM_STATUS BTM_SetEScoMode(tBTM_SCO_TYPE sco_mode, tBTM_ESCO_PARAMS* p_parms) { 1295911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSCO_CB* p_esco = &btm_cb.sco_cb; 1296911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_ESCO_PARAMS* p_def = &p_esco->def_esco_parms; 1297911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1298911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_esco->esco_supported) { 1299911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_parms) { 1300911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (sco_mode == BTM_LINK_TYPE_ESCO) 1301911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_def = *p_parms; /* Save as the default parameters */ 1302911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else /* Load only the SCO packet types */ 1303911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson { 1304911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_def->packet_types = p_parms->packet_types; 1305911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_def->tx_bw = BTM_64KBITS_RATE; 1306911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_def->rx_bw = BTM_64KBITS_RATE; 1307911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_def->max_latency = 0x000a; 1308911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_def->voice_contfmt = 0x0060; 13095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_def->retrans_effort = 0; 13105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1311911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* OR in any exception packet types */ 1312911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_def->packet_types |= BTM_SCO_EXCEPTION_PKTS_MASK; 1313911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1314911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1315911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_esco->desired_sco_mode = sco_mode; 1316911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_API("BTM_SetEScoMode -> mode %d", sco_mode); 1317911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 1318911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_esco->desired_sco_mode = BTM_LINK_TYPE_SCO; 1319911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_def->packet_types &= BTM_SCO_LINK_ONLY_MASK; 1320911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_def->retrans_effort = 0; 1321911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_API("BTM_SetEScoMode -> mode SCO (eSCO not supported)"); 1322911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1323911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1324911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG( 1325911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson " txbw 0x%08x, rxbw 0x%08x, max_lat 0x%04x, voice 0x%04x, pkt 0x%04x, " 1326911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "rtx effort 0x%02x", 1327911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_def->tx_bw, p_def->rx_bw, p_def->max_latency, p_def->voice_contfmt, 1328911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_def->packet_types, p_def->retrans_effort); 1329911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1330911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_SUCCESS); 13315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 13325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1334ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1335ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_RegForEScoEvts 1336ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1337ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function registers a SCO event callback with the 1338ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * specified instance. It should be used to received 1339ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * connection indication events and change of link parameter 1340ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * events. 1341ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1342ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns BTM_SUCCESS if the successful. 1343ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_ILLEGAL_VALUE if there is an illegal sco_inx 1344ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_MODE_UNSUPPORTED if controller version is not BT1.2 or 1345ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * later or does not support eSCO. 1346ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1347ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1348911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsontBTM_STATUS BTM_RegForEScoEvts(uint16_t sco_inx, 1349911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_ESCO_CBACK* p_esco_cback) { 1350911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#if (BTM_MAX_SCO_LINKS > 0) 1351911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!btm_cb.sco_cb.esco_supported) { 1352911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.sco_cb.sco_db[sco_inx].esco.p_esco_cback = NULL; 1353911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_MODE_UNSUPPORTED); 1354911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 13555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1356911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (sco_inx < BTM_MAX_SCO_LINKS && 1357911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.sco_cb.sco_db[sco_inx].state != SCO_ST_UNUSED) { 1358911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.sco_cb.sco_db[sco_inx].esco.p_esco_cback = p_esco_cback; 1359911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_SUCCESS); 1360911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1361911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_ILLEGAL_VALUE); 13625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 1363911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_MODE_UNSUPPORTED); 13645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 13655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 13665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1368ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1369ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_ReadEScoLinkParms 1370ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1371ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function returns the current eSCO link parameters for 13729ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * the specified handle. This can be called anytime a 13739ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * connection is active, but is typically called after 13749ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * receiving the SCO opened callback. 1375ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1376ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Note: If called over a 1.1 controller, only the packet types 1377ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * field has meaning. 1378ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1379ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns BTM_SUCCESS if returned data is valid connection. 13809ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * BTM_WRONG_MODE if no connection with a peer device or bad 13819ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * sco_inx. 1382ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1383ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1384911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsontBTM_STATUS BTM_ReadEScoLinkParms(uint16_t sco_inx, tBTM_ESCO_DATA* p_parms) { 1385911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#if (BTM_MAX_SCO_LINKS > 0) 1386911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t index; 1387ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1388911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_API("BTM_ReadEScoLinkParms -> sco_inx 0x%04x", sco_inx); 13895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1390911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (sco_inx < BTM_MAX_SCO_LINKS && 1391911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.sco_cb.sco_db[sco_inx].state >= SCO_ST_CONNECTED) { 1392911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_parms = btm_cb.sco_cb.sco_db[sco_inx].esco.data; 1393911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_SUCCESS); 1394911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1395911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1396911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (sco_inx == BTM_FIRST_ACTIVE_SCO_INDEX) { 1397911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (index = 0; index < BTM_MAX_SCO_LINKS; index++) { 1398911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.sco_cb.sco_db[index].state >= SCO_ST_CONNECTED) { 1399911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_API("BTM_ReadEScoLinkParms the first active SCO index is %d", 1400911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson index); 1401911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_parms = btm_cb.sco_cb.sco_db[index].esco.data; 14025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BTM_SUCCESS); 1403911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 14045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1405911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1406ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 14075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 14085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1409911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_API("BTM_ReadEScoLinkParms cannot find the SCO index!"); 1410911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memset(p_parms, 0, sizeof(tBTM_ESCO_DATA)); 1411911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_WRONG_MODE); 14125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 14135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1415ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1416ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_ChangeEScoLinkParms 1417ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1418ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function requests renegotiation of the parameters on 1419ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * the current eSCO Link. If any of the changes are accepted 1420ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * by the controllers, the BTM_ESCO_CHG_EVT event is sent in 1421ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * the tBTM_ESCO_CBACK function with the current settings of 1422ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * the link. The callback is registered through the call to 1423ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_SetEScoMode. 1424ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1425ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Note: If called over a SCO link (including 1.1 controller), 1426ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * a change packet type request is sent out instead. 1427ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1428ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns BTM_CMD_STARTED if command is successfully initiated. 1429ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_NO_RESOURCES - not enough resources to initiate command. 14309ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * BTM_WRONG_MODE if no connection with a peer device or bad 14319ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * sco_inx. 1432ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1433ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1434911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsontBTM_STATUS BTM_ChangeEScoLinkParms(uint16_t sco_inx, 1435911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_CHG_ESCO_PARAMS* p_parms) { 1436911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#if (BTM_MAX_SCO_LINKS > 0) 1437911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_ESCO_PARAMS* p_setup; 1438911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSCO_CONN* p_sco; 1439911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t temp_pkt_types; 14405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1441911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Make sure sco handle is valid and on an active link */ 1442911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (sco_inx >= BTM_MAX_SCO_LINKS || 1443911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.sco_cb.sco_db[sco_inx].state != SCO_ST_CONNECTED) 1444911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_WRONG_MODE); 14455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1446911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_sco = &btm_cb.sco_cb.sco_db[sco_inx]; 1447911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_setup = &p_sco->esco.setup; 1448911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1449911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If SCO connection OR eSCO not supported just send change packet types */ 1450911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_sco->esco.data.link_type == BTM_LINK_TYPE_SCO || 1451911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson !btm_cb.sco_cb.esco_supported) { 1452911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_setup->packet_types = 1453911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_parms->packet_types & 1454911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (btm_cb.btm_sco_pkt_types_supported & BTM_SCO_LINK_ONLY_MASK); 1455911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1456911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_API( 1457911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "BTM_ChangeEScoLinkParms -> SCO Link for handle 0x%04x, pkt 0x%04x", 1458911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_sco->hci_handle, p_setup->packet_types); 1459911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1460911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_change_conn_type(p_sco->hci_handle, 1461911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_ESCO_2_SCO(p_setup->packet_types)); 1462911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 1463911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson temp_pkt_types = (p_parms->packet_types & BTM_SCO_SUPPORTED_PKTS_MASK & 1464911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.btm_sco_pkt_types_supported); 1465911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1466911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* OR in any exception packet types */ 1467911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson temp_pkt_types |= 1468911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ((p_parms->packet_types & BTM_SCO_EXCEPTION_PKTS_MASK) | 1469911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (btm_cb.btm_sco_pkt_types_supported & BTM_SCO_EXCEPTION_PKTS_MASK)); 1470911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1471911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_API("BTM_ChangeEScoLinkParms -> eSCO Link for handle 0x%04x", 1472911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_sco->hci_handle); 1473911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_API( 1474911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson " txbw 0x%x, rxbw 0x%x, lat 0x%x, voice 0x%x, retrans 0x%02x, pkt " 1475911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "0x%04x", 1476911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_setup->tx_bw, p_setup->rx_bw, p_parms->max_latency, 1477911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_setup->voice_contfmt, p_parms->retrans_effort, temp_pkt_types); 1478911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1479911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* When changing an existing link, only change latency, retrans, and pkts */ 1480911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_setup_esco_conn( 1481911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_sco->hci_handle, p_setup->tx_bw, p_setup->rx_bw, p_parms->max_latency, 1482911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_setup->voice_contfmt, p_parms->retrans_effort, temp_pkt_types); 1483911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_parms->packet_types = temp_pkt_types; 1484911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1485911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1486911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_CMD_STARTED); 14875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 1488911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_WRONG_MODE); 14895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 14905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 14915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1493ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1494ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_EScoConnRsp 1495ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1496ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called upon receipt of an (e)SCO connection 1497ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * request event (BTM_ESCO_CONN_REQ_EVT) to accept or reject 1498ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * the request. Parameters used to negotiate eSCO links. 1499ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * If p_parms is NULL, then values set through BTM_SetEScoMode 1500ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * are used. 1501ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * If the link type of the incoming request is SCO, then only 1502ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * the tx_bw, max_latency, content format, and packet_types are 1503ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * valid. The hci_status parameter should be 1504ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * ([0x0] to accept, [0x0d..0x0f] to reject) 1505ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1506ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1507ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 1508ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1509ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1510911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid BTM_EScoConnRsp(uint16_t sco_inx, uint8_t hci_status, 1511911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_ESCO_PARAMS* p_parms) { 1512911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#if (BTM_MAX_SCO_LINKS > 0) 1513911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (sco_inx < BTM_MAX_SCO_LINKS && 1514911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.sco_cb.sco_db[sco_inx].state == SCO_ST_W4_CONN_RSP) { 1515911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_esco_conn_rsp(sco_inx, hci_status, 1516911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.sco_cb.sco_db[sco_inx].esco.data.bd_addr, p_parms); 1517911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 15185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 15195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 15205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1522ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1523ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_read_def_esco_mode 1524ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1525ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function copies the current default esco settings into 1526ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * the return buffer. 1527ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1528ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns tBTM_SCO_TYPE 1529ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1530ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1531911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsontBTM_SCO_TYPE btm_read_def_esco_mode(tBTM_ESCO_PARAMS* p_parms) { 1532911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#if (BTM_MAX_SCO_LINKS > 0) 1533911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_parms = btm_cb.sco_cb.def_esco_parms; 1534911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return btm_cb.sco_cb.desired_sco_mode; 15355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 1536911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return BTM_LINK_TYPE_SCO; 15375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 15385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 15395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1541ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1542ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_esco_proc_conn_chg 1543ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1544ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called by BTIF when an SCO connection 1545ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * is changed. 1546ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1547ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 1548ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1549ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1550911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_esco_proc_conn_chg(uint8_t status, uint16_t handle, 1551911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t tx_interval, uint8_t retrans_window, 1552911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t rx_pkt_len, uint16_t tx_pkt_len) { 1553911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#if (BTM_MAX_SCO_LINKS > 0) 1554911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSCO_CONN* p = &btm_cb.sco_cb.sco_db[0]; 1555911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_CHG_ESCO_EVT_DATA data; 1556911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t xx; 1557911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1558911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT("btm_esco_proc_conn_chg -> handle 0x%04x, status 0x%02x", 1559911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson handle, status); 1560911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1561911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++) { 1562911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p->state == SCO_ST_CONNECTED && handle == p->hci_handle) { 1563911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If upper layer wants notification */ 1564911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p->esco.p_esco_cback) { 1565911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(data.bd_addr, p->esco.data.bd_addr, BD_ADDR_LEN); 1566911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson data.hci_status = status; 1567911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson data.sco_inx = xx; 1568911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson data.rx_pkt_len = p->esco.data.rx_pkt_len = rx_pkt_len; 1569911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson data.tx_pkt_len = p->esco.data.tx_pkt_len = tx_pkt_len; 1570911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson data.tx_interval = p->esco.data.tx_interval = tx_interval; 1571911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson data.retrans_window = p->esco.data.retrans_window = retrans_window; 1572911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1573911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (*p->esco.p_esco_cback)(BTM_ESCO_CHG_EVT, (tBTM_ESCO_EVT_DATA*)&data); 1574911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1575911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 15765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1577911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 15785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 15795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 15805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1582ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1583ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_is_sco_active 1584ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1585ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to see if a SCO handle is already in 1586ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * use. 1587ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1588ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns bool 1589ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1590ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1591911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonbool btm_is_sco_active(uint16_t handle) { 1592911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#if (BTM_MAX_SCO_LINKS > 0) 1593911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t xx; 1594911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSCO_CONN* p = &btm_cb.sco_cb.sco_db[0]; 15955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1596911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++) { 1597911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (handle == p->hci_handle && p->state == SCO_ST_CONNECTED) return (true); 1598911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 15995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 1600911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (false); 16015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 16025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1604ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1605ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_GetNumScoLinks 1606ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1607ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function returns the number of active sco links. 1608ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1609ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns uint8_t 1610ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1611ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1612911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonuint8_t BTM_GetNumScoLinks(void) { 1613911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#if (BTM_MAX_SCO_LINKS > 0) 1614911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSCO_CONN* p = &btm_cb.sco_cb.sco_db[0]; 1615911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t xx; 1616911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t num_scos = 0; 1617911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1618911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++) { 1619911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson switch (p->state) { 1620911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case SCO_ST_W4_CONN_RSP: 1621911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case SCO_ST_CONNECTING: 1622911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case SCO_ST_CONNECTED: 1623911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case SCO_ST_DISCONNECTING: 1624911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case SCO_ST_PEND_UNPARK: 1625911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson num_scos++; 16265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1627911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1628911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (num_scos); 16295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 1630911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (0); 16315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 16325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 16335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1635ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1636ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_is_sco_active_by_bdaddr 1637ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 16389ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description This function is called to see if a SCO connection is active 16399ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * for a bd address. 1640ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1641ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns bool 1642ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1643ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1644911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonbool btm_is_sco_active_by_bdaddr(BD_ADDR remote_bda) { 1645911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#if (BTM_MAX_SCO_LINKS > 0) 1646911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t xx; 1647911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSCO_CONN* p = &btm_cb.sco_cb.sco_db[0]; 1648911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1649911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If any SCO is being established to the remote BD address, refuse this */ 1650911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++) { 1651911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((!memcmp(p->esco.data.bd_addr, remote_bda, BD_ADDR_LEN)) && 1652911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p->state == SCO_ST_CONNECTED)) { 1653911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (true); 16545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1655911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 16565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 1657911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (false); 1658911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson} 1659911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#else /* SCO_EXCLUDED == TRUE (Link in stubs) */ 1660911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1661911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsontBTM_STATUS BTM_CreateSco(BD_ADDR remote_bda, bool is_orig, uint16_t pkt_types, 1662911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t* p_sco_inx, tBTM_SCO_CB* p_conn_cb, 1663911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_SCO_CB* p_disc_cb) { 1664911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_NO_RESOURCES); 1665911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson} 1666911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsontBTM_STATUS BTM_RemoveSco(uint16_t sco_inx) { return (BTM_NO_RESOURCES); } 1667911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsontBTM_STATUS BTM_SetScoPacketTypes(uint16_t sco_inx, uint16_t pkt_types) { 1668911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_NO_RESOURCES); 1669911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson} 1670911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonuint16_t BTM_ReadScoPacketTypes(uint16_t sco_inx) { return (0); } 1671911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonuint16_t BTM_ReadDeviceScoPacketTypes(void) { return (0); } 1672911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonuint16_t BTM_ReadScoHandle(uint16_t sco_inx) { 1673911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_INVALID_HCI_HANDLE); 1674911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson} 1675911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonuint8_t* BTM_ReadScoBdAddr(uint16_t sco_inx) { return ((uint8_t*)NULL); } 1676911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonuint16_t BTM_ReadScoDiscReason(void) { return (BTM_INVALID_SCO_DISC_REASON); } 1677911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsontBTM_STATUS BTM_SetEScoMode(tBTM_SCO_TYPE sco_mode, tBTM_ESCO_PARAMS* p_parms) { 1678911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_MODE_UNSUPPORTED); 1679911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson} 1680911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsontBTM_STATUS BTM_RegForEScoEvts(uint16_t sco_inx, 1681911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_ESCO_CBACK* p_esco_cback) { 1682911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_ILLEGAL_VALUE); 1683911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson} 1684911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsontBTM_STATUS BTM_ReadEScoLinkParms(uint16_t sco_inx, tBTM_ESCO_DATA* p_parms) { 1685911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_MODE_UNSUPPORTED); 1686911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson} 1687911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsontBTM_STATUS BTM_ChangeEScoLinkParms(uint16_t sco_inx, 1688911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_CHG_ESCO_PARAMS* p_parms) { 1689911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_MODE_UNSUPPORTED); 16905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1691911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid BTM_EScoConnRsp(uint16_t sco_inx, uint8_t hci_status, 1692911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_ESCO_PARAMS* p_parms) {} 1693911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonuint8_t BTM_GetNumScoLinks(void) { return (0); } 16945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* If SCO is being used */ 1696