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> 275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_types.h" 285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_target.h" 295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "gki.h" 305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_types.h" 315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "hcimsgs.h" 325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btu.h" 335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_api.h" 345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_int.h" 355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "hcidefs.h" 365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_SCO_INCLUDED == TRUE 385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/********************************************************************************/ 405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* L O C A L D A T A D E F I N I T I O N S */ 415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/********************************************************************************/ 425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define SCO_ST_UNUSED 0 445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define SCO_ST_LISTENING 1 455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define SCO_ST_W4_CONN_RSP 2 465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define SCO_ST_CONNECTING 3 475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define SCO_ST_CONNECTED 4 485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define SCO_ST_DISCONNECTING 5 495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define SCO_ST_PEND_UNPARK 6 505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define SCO_ST_PEND_ROLECHANGE 7 515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/********************************************************************************/ 535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* L O C A L F U N C T I O N P R O T O T Y P E S */ 545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/********************************************************************************/ 555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic const tBTM_ESCO_PARAMS btm_esco_defaults = 575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_64KBITS_RATE, /* TX Bandwidth (64 kbits/sec) */ 595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_64KBITS_RATE, /* RX Bandwidth (64 kbits/sec) */ 605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 0x000a, /* 10 ms (HS/HF can use EV3, 2-EV3, 3-EV3) */ 615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 0x0060, /* Inp Linear, Air CVSD, 2s Comp, 16bit */ 625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (BTM_SCO_PKT_TYPES_MASK_HV1 + /* Packet Types */ 635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_HV2 + 645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_HV3 + 655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_EV3 + 665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_EV4 + 675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_PKT_TYPES_MASK_EV5), 685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_ESCO_RETRANS_POWER /* Retransmission Effort (Power) */ 695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sco_flush_sco_data 745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to flush the SCO data for this channel. 765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sco_flush_sco_data(UINT16 sco_inx) 815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_SCO_HCI_INCLUDED == TRUE 835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_MAX_SCO_LINKS>0) 845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSCO_CONN *p ; 855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_HDR *p_buf; 865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (sco_inx < BTM_MAX_SCO_LINKS) 885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p = &btm_cb.sco_cb.sco_db[sco_inx]; 905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while (p->xmit_data_q.p_first) 915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_buf = (BT_HDR *)GKI_dequeue (&p->xmit_data_q)) != NULL) 935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_freebuf (p_buf); 945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sco_init 1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called at BTM startup to initialize 1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sco_init (void) 1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if 0 /* cleared in btm_init; put back in if called from anywhere else! */ 1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset (&btm_cb.sco_cb, 0, sizeof(tSCO_CB)); 1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Initialize nonzero defaults */ 1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.sco_cb.sco_disc_reason = BTM_INVALID_SCO_DISC_REASON; 1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.sco_cb.def_esco_parms = btm_esco_defaults; /* Initialize with defaults */ 1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.sco_cb.desired_sco_mode = BTM_DEFAULT_SCO_MODE; 1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_esco_conn_rsp 1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called upon receipt of an (e)SCO connection 1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** request event (BTM_ESCO_CONN_REQ_EVT) to accept or reject 1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the request. Parameters used to negotiate eSCO links. 1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** If p_parms is NULL, then default values are used. 1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** If the link type of the incoming request is SCO, then only 1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the tx_bw, max_latency, content format, and packet_types are 1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** valid. The hci_status parameter should be 1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** ([0x0] to accept, [0x0d..0x0f] to reject) 1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_esco_conn_rsp (UINT16 sco_inx, UINT8 hci_status, BD_ADDR bda, 1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_ESCO_PARAMS *p_parms) 1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_MAX_SCO_LINKS>0) 1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSCO_CONN *p_sco = NULL; 1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_ESCO_PARAMS *p_setup; 1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 temp_pkt_types; 1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (sco_inx < BTM_MAX_SCO_LINKS) 1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco = &btm_cb.sco_cb.sco_db[sco_inx]; 1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Reject the connect request if refused by caller or wrong state */ 1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (hci_status != HCI_SUCCESS || p_sco == NULL) 1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_sco) 1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = (p_sco->state == SCO_ST_W4_CONN_RSP) ? SCO_ST_LISTENING 1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project : SCO_ST_UNUSED; 1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!btm_cb.sco_cb.esco_supported) 1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!btsnd_hcic_reject_conn (bda, hci_status)) 1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_ERROR0("Could not reject (e)SCO conn: No Buffer!!!"); 1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!btsnd_hcic_reject_esco_conn (bda, hci_status)) 1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_ERROR0("Could not reject (e)SCO conn: No Buffer!!!"); 1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else /* Connection is being accepted */ 1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->state = SCO_ST_CONNECTING; 1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.devcb.local_version.hci_version >= HCI_PROTO_VERSION_1_2) 1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_setup = &p_sco->esco.setup; 1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If parameters not specified use the default */ 1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_parms) 1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_setup = *p_parms; 1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else /* Use the last setup passed thru BTM_SetEscoMode (or defaults) */ 1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_setup = btm_cb.sco_cb.def_esco_parms; 1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project temp_pkt_types = (p_setup->packet_types & 1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SCO_SUPPORTED_PKTS_MASK & 1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.btm_sco_pkt_types_supported); 1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Make sure at least one eSCO packet type is sent, else might confuse peer */ 1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Taking this out to confirm with BQB tests 1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Real application would like to include this though, as many devices 1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** do not retry with SCO only if an eSCO connection fails. 1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!(temp_pkt_types & BTM_ESCO_LINK_ONLY_MASK)) 1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project temp_pkt_types |= BTM_SCO_PKT_TYPES_MASK_EV3; 1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If SCO request, remove eSCO packet types (conformance) */ 1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_sco->esco.data.link_type == BTM_LINK_TYPE_SCO) 2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project temp_pkt_types &= BTM_SCO_LINK_ONLY_MASK; 2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.devcb.local_version.hci_version >= HCI_PROTO_VERSION_2_0) 2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project temp_pkt_types |= BTM_SCO_EXCEPTION_PKTS_MASK; 2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* OR in any exception packet types if at least 2.0 version of spec */ 2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (btm_cb.devcb.local_version.hci_version >= HCI_PROTO_VERSION_2_0) 2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project temp_pkt_types |= ((p_setup->packet_types & BTM_SCO_EXCEPTION_PKTS_MASK) | 2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (btm_cb.btm_sco_pkt_types_supported & BTM_SCO_EXCEPTION_PKTS_MASK)); 2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btsnd_hcic_accept_esco_conn (bda, p_setup->tx_bw, p_setup->rx_bw, 2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_setup->max_latency, p_setup->voice_contfmt, 2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_setup->retrans_effort, temp_pkt_types)) 2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_setup->packet_types = temp_pkt_types; 2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_ERROR0("Could not accept SCO conn: No Buffer!!!"); 2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else /* Controller is version 1.1 or earlier */ 2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_accept_conn (bda, 0); 2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_SCO_HCI_INCLUDED == TRUE 2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sco_check_send_pkts 2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to check if it can send packets 2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** to the Host Controller. 2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sco_check_send_pkts (UINT16 sco_inx) 2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_HDR *p_buf; 2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSCO_CB *p_cb = &btm_cb.sco_cb; 2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSCO_CONN *p_ccb = &p_cb->sco_db[sco_inx]; 2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If there is data to send, send it now */ 2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while (p_ccb->xmit_data_q.p_first != NULL) 2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf = NULL; 2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_SCO_HCI_DEBUG 2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG1 ("btm: [%d] buf in xmit_data_q", p_ccb->xmit_data_q.count ); 2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf = (BT_HDR *)GKI_dequeue (&p_ccb->xmit_data_q); 2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project HCI_SCO_DATA_TO_LOWER (p_buf); 2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* BTM_SCO_HCI_INCLUDED == TRUE */ 2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_route_sco_data 2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Route received SCO data. 2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_route_sco_data(BT_HDR *p_msg) 2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_SCO_HCI_INCLUDED == TRUE 2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 sco_inx, handle; 2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p = (UINT8 *)(p_msg + 1) + p_msg->offset; 2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 pkt_size = 0; 2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 pkt_status = 0; 2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Extract Packet_Status_Flag and handle */ 2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_UINT16 (handle, p); 2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pkt_status = HCID_GET_EVENT(handle); 2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project handle = HCID_GET_HANDLE (handle); 2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_UINT8 (pkt_size, p); 2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((sco_inx = btm_find_scb_by_handle(handle)) != BTM_MAX_SCO_LINKS ) 2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send data callback */ 2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!btm_cb.sco_cb.p_data_cb ) 2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if no data callback registered, just free the buffer */ 2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_freebuf (p_msg); 2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.sco_cb.p_data_cb)(sco_inx, p_msg, (tBTM_SCO_DATA_FLAG) pkt_status); 3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else /* no mapping handle SCO connection is active, free the buffer */ 3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_freebuf (p_msg); 3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_freebuf(p_msg); 3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_WriteScoData 3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function write SCO data to a specified instance. The data 3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** to be written p_buf needs to carry an offset of 3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** HCI_SCO_PREAMBLE_SIZE bytes, and the data length can not 3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** exceed BTM_SCO_DATA_SIZE_MAX bytes, whose default value is set 3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** to 60 and is configurable. Data longer than the maximum bytes 3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** will be truncated. 3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns BTM_SUCCESS: data write is successful 3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_ILLEGAL_VALUE: SCO data contains illegal offset value. 3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_SCO_BAD_LENGTH: SCO data length exceeds the max SCO packet 3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** size. 3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_NO_RESOURCES: no resources. 3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_UNKNOWN_ADDR: unknown SCO connection handle, or SCO is not 3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** routed via HCI. 3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_WriteScoData (UINT16 sco_inx, BT_HDR *p_buf) 3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_SCO_HCI_INCLUDED == TRUE) && (BTM_MAX_SCO_LINKS>0) 3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSCO_CONN *p_ccb = &btm_cb.sco_cb.sco_db[sco_inx]; 3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p; 3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_STATUS status = BTM_SUCCESS; 3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (sco_inx < BTM_MAX_SCO_LINKS && btm_cb.sco_cb.p_data_cb && 3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_ccb->state == SCO_ST_CONNECTED) 3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Ensure we have enough space in the buffer for the SCO and HCI headers */ 3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_buf->offset < HCI_SCO_PREAMBLE_SIZE) 3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_ERROR1 ("BTM SCO - cannot send buffer, offset: %d", p_buf->offset); 3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_freebuf (p_buf); 3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = BTM_ILLEGAL_VALUE; 3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else /* write HCI header */ 3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Step back 3 bytes to add the headers */ 3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->offset -= HCI_SCO_PREAMBLE_SIZE; 3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Set the pointer to the beginning of the data */ 3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p = (UINT8 *)(p_buf + 1) + p_buf->offset; 3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* add HCI handle */ 3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16_TO_STREAM (p, p_ccb->hci_handle); 3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* only sent the first BTM_SCO_DATA_SIZE_MAX bytes data if more than max, 3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project and set warning status */ 3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_buf->len > BTM_SCO_DATA_SIZE_MAX) 3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->len = BTM_SCO_DATA_SIZE_MAX; 3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = BTM_SCO_BAD_LENGTH; 3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_STREAM (p, (UINT8)p_buf->len); 3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->len += HCI_SCO_PREAMBLE_SIZE; 3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_enqueue (&p_ccb->xmit_data_q, p_buf); 3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sco_check_send_pkts (sco_inx); 3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_freebuf(p_buf); 3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_WARNING2 ("BTM_WriteScoData, invalid sco index: %d at state [%d]", 3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sco_inx, btm_cb.sco_cb.sco_db[sco_inx].state); 3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = BTM_UNKNOWN_ADDR; 3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (status); 3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BTM_NO_RESOURCES); 3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_MAX_SCO_LINKS>0) 3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_send_connect_request 3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to respond to SCO connect indications 3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_STATUS btm_send_connect_request(UINT16 acl_handle, 4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_ESCO_PARAMS *p_setup) 4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 temp_pkt_types; 4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 xx; 4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tACL_CONN *p_acl; 4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Send connect request depending on version of spec */ 4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!btm_cb.sco_cb.esco_supported) 4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!btsnd_hcic_add_SCO_conn (acl_handle, BTM_ESCO_2_SCO(p_setup->packet_types))) 4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BTM_NO_RESOURCES); 4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project temp_pkt_types = (p_setup->packet_types & BTM_SCO_SUPPORTED_PKTS_MASK & 4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.btm_sco_pkt_types_supported); 4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* OR in any exception packet types if at least 2.0 version of spec */ 4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.devcb.local_version.hci_version >= HCI_PROTO_VERSION_2_0) 4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project temp_pkt_types |= ((p_setup->packet_types & BTM_SCO_EXCEPTION_PKTS_MASK) | 4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (btm_cb.btm_sco_pkt_types_supported & BTM_SCO_EXCEPTION_PKTS_MASK)); 4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Finally, remove EDR eSCO if the remote device doesn't support it */ 4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* UPF25: Only SCO was brought up in this case */ 4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_handle_to_acl_index(acl_handle); 4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((xx = btm_handle_to_acl_index(acl_handle)) < MAX_L2CAP_LINKS) 4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_acl = &btm_cb.acl_db[xx]; 4303aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach if (!HCI_EDR_ESCO_2MPS_SUPPORTED(p_acl->peer_lmp_features[HCI_EXT_FEATURES_PAGE_0])) 4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_WARNING0("BTM Remote does not support 2-EDR eSCO"); 4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project temp_pkt_types |= (HCI_ESCO_PKT_TYPES_MASK_NO_2_EV3 | 4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project HCI_ESCO_PKT_TYPES_MASK_NO_2_EV5); 4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4373aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach if (!HCI_EDR_ESCO_3MPS_SUPPORTED(p_acl->peer_lmp_features[HCI_EXT_FEATURES_PAGE_0])) 4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_WARNING0("BTM Remote does not support 3-EDR eSCO"); 4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project temp_pkt_types |= (HCI_ESCO_PKT_TYPES_MASK_NO_3_EV3 | 4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project HCI_ESCO_PKT_TYPES_MASK_NO_3_EV5); 4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_API6(" txbw 0x%x, rxbw 0x%x, lat 0x%x, voice 0x%x, retrans 0x%02x, pkt 0x%04x", 4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_setup->tx_bw, p_setup->rx_bw, 4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_setup->max_latency, p_setup->voice_contfmt, 4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_setup->retrans_effort, temp_pkt_types); 4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!btsnd_hcic_setup_esco_conn(acl_handle, 4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_setup->tx_bw, 4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_setup->rx_bw, 4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_setup->max_latency, 4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_setup->voice_contfmt, 4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_setup->retrans_effort, 4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project temp_pkt_types)) 4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BTM_NO_RESOURCES); 4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_setup->packet_types = temp_pkt_types; 4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BTM_CMD_STARTED); 4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_set_sco_ind_cback 4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to register for TCS SCO connect 4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** indications. 4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_set_sco_ind_cback( tBTM_SCO_IND_CBACK *sco_ind_cb ) 4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.sco_cb.app_sco_ind_cb = sco_ind_cb; 4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_accept_sco_link 4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to respond to TCS SCO connect 4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** indications 4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_accept_sco_link(UINT16 sco_inx, tBTM_ESCO_PARAMS *p_setup, 4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SCO_CB *p_conn_cb, tBTM_SCO_CB *p_disc_cb) 4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_MAX_SCO_LINKS>0) 4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSCO_CONN *p_sco; 4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (sco_inx >= BTM_MAX_SCO_LINKS) 5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_ERROR1("btm_accept_sco_link: Invalid sco_inx(%d)", sco_inx); 5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Link role is ignored in for this message */ 5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco = &btm_cb.sco_cb.sco_db[sco_inx]; 5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->p_conn_cb = p_conn_cb; 5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->p_disc_cb = p_disc_cb; 5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->esco.data.link_type = BTM_LINK_TYPE_ESCO; /* Accept with all supported types */ 5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG1("TCS accept SCO: Packet Types 0x%04x", p_setup->packet_types); 5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_esco_conn_rsp(sco_inx, HCI_SUCCESS, p_sco->esco.data.bd_addr, p_setup); 5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_reject_sco_link(sco_inx); 5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_reject_sco_link 5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to respond to SCO connect indications 5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_reject_sco_link( UINT16 sco_inx ) 5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_esco_conn_rsp(sco_inx, HCI_ERR_HOST_REJECT_RESOURCES, 5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.sco_cb.sco_db[sco_inx].esco.data.bd_addr, NULL); 5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_CreateSco 5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to create an SCO connection. If the 5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** "is_orig" flag is TRUE, the connection will be originated, 5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** otherwise BTM will wait for the other side to connect. 5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** NOTE: If BTM_IGNORE_SCO_PKT_TYPE is passed in the pkt_types 5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** parameter the default packet types is used. 5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns BTM_UNKNOWN_ADDR if the ACL connection is not up 5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_BUSY if another SCO being set up to 5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the same BD address 5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_NO_RESOURCES if the max SCO limit has been reached 5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_CMD_STARTED if the connection establishment is started. 5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** In this case, "*p_sco_inx" is filled in 5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** with the sco index used for the connection. 5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_CreateSco (BD_ADDR remote_bda, BOOLEAN is_orig, UINT16 pkt_types, 5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 *p_sco_inx, tBTM_SCO_CB *p_conn_cb, 5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SCO_CB *p_disc_cb) 5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_MAX_SCO_LINKS > 0) 5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_ESCO_PARAMS *p_setup; 5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSCO_CONN *p = &btm_cb.sco_cb.sco_db[0]; 5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 xx; 5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 acl_handle = 0; 5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 temp_pkt_types; 5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tACL_CONN *p_acl; 5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_PWR_MGR_INCLUDED == TRUE) && (BTM_SCO_WAKE_PARKED_LINK == TRUE) 5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_PM_MODE md; 5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_PM_PWR_MD pm; 5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 mode; 5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_sco_inx = BTM_INVALID_SCO_INDEX; 5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If originating, ensure that there is an ACL connection to the BD Address */ 5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (is_orig) 5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((!remote_bda) || ((acl_handle = BTM_GetHCIConnHandle (remote_bda)) == 0xFFFF)) 5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BTM_UNKNOWN_ADDR); 5805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (remote_bda) 5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If any SCO is being established to the remote BD address, refuse this */ 5855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++) 5865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (((p->state == SCO_ST_CONNECTING) || (p->state == SCO_ST_LISTENING) 5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project || (p->state == SCO_ST_PEND_UNPARK)) 5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (!memcmp (p->esco.data.bd_addr, remote_bda, BD_ADDR_LEN))) 5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BTM_BUSY); 5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Support only 1 wildcard BD address at a time */ 5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++) 5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p->state == SCO_ST_LISTENING) && (!p->rem_bd_known)) 6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BTM_BUSY); 6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Now, try to find an unused control block, and kick off the SCO establishment */ 6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (xx = 0, p = &btm_cb.sco_cb.sco_db[0]; xx < BTM_MAX_SCO_LINKS; xx++, p++) 6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p->state == SCO_ST_UNUSED) 6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (remote_bda) 6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (is_orig) 6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* can not create SCO link if in park mode */ 6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_PWR_MGR_INCLUDED == TRUE) && (BTM_SCO_WAKE_PARKED_LINK == TRUE) 6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(BTM_ReadPowerMode(remote_bda, &md) == BTM_SUCCESS) 6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (md == BTM_PM_MD_PARK || md == BTM_PM_MD_SNIFF) 6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 620ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta memset( (void*)&pm, 0, sizeof(pm)); 6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pm.mode = BTM_PM_MD_ACTIVE; 6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SetPowerMode(BTM_PM_SET_ONLY_ID, remote_bda, &pm); 6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p->state = SCO_ST_PEND_UNPARK; 6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#elif BTM_PWR_MGR_INCLUDED == TRUE 6275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if( (BTM_ReadPowerMode(remote_bda, &mode) == BTM_SUCCESS) && (mode == BTM_PM_MD_PARK) ) 6285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BTM_WRONG_MODE); 6295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 6305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if( (BTM_ReadAclMode(remote_bda, &mode) == BTM_SUCCESS) && (mode == BTM_ACL_MODE_PARK) ) 6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BTM_WRONG_MODE); 6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (p->esco.data.bd_addr, remote_bda, BD_ADDR_LEN); 6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p->rem_bd_known = TRUE; 6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p->rem_bd_known = FALSE; 6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Link role is ignored in for this message */ 6415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (pkt_types == BTM_IGNORE_SCO_PKT_TYPE) 6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pkt_types = btm_cb.sco_cb.def_esco_parms.packet_types; 6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_setup = &p->esco.setup; 6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_setup = btm_cb.sco_cb.def_esco_parms; 6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_setup->packet_types = (btm_cb.sco_cb.desired_sco_mode == BTM_LINK_TYPE_SCO) 6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ? (pkt_types & BTM_SCO_LINK_ONLY_MASK) : pkt_types; 6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project temp_pkt_types = (p_setup->packet_types & BTM_SCO_SUPPORTED_PKTS_MASK & 6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.btm_sco_pkt_types_supported); 6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* OR in any exception packet types if at least 2.0 version of spec */ 6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.devcb.local_version.hci_version >= HCI_PROTO_VERSION_2_0) 6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.sco_cb.desired_sco_mode == HCI_LINK_TYPE_ESCO) 6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project temp_pkt_types |= ((p_setup->packet_types & BTM_SCO_EXCEPTION_PKTS_MASK) | 6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (btm_cb.btm_sco_pkt_types_supported & BTM_SCO_EXCEPTION_PKTS_MASK)); 6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else /* Only using SCO packet types; turn off EDR also */ 6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project temp_pkt_types |= BTM_SCO_EXCEPTION_PKTS_MASK; 6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_setup->packet_types = temp_pkt_types; 6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p->p_conn_cb = p_conn_cb; 6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p->p_disc_cb = p_disc_cb; 6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p->hci_handle = BTM_INVALID_HCI_HANDLE; 6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p->is_orig = is_orig; 6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if( p->state != SCO_ST_PEND_UNPARK ) 6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (is_orig) 6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If role change is in progress, do not proceed with SCO setup 6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Wait till role change is complete */ 6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_acl = btm_bda_to_acl(remote_bda); 6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_acl && p_acl->switch_role_state != BTM_ACL_SWKEY_STATE_IDLE) 6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_API1("Role Change is in progress for ACL handle 0x%04x",acl_handle); 6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p->state = SCO_ST_PEND_ROLECHANGE; 6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if( p->state != SCO_ST_PEND_UNPARK && p->state != SCO_ST_PEND_ROLECHANGE ) 6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (is_orig) 6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_API2("BTM_CreateSco -> (e)SCO Link for ACL handle 0x%04x, Desired Type %d", 6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project acl_handle, btm_cb.sco_cb.desired_sco_mode); 6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((btm_send_connect_request(acl_handle, p_setup)) != BTM_CMD_STARTED) 6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BTM_NO_RESOURCES); 6975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p->state = SCO_ST_CONNECTING; 6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p->state = SCO_ST_LISTENING; 7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_sco_inx = xx; 7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BTM_CMD_STARTED); 7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 7115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If here, all SCO blocks in use */ 7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BTM_NO_RESOURCES); 7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_PWR_MGR_INCLUDED == TRUE) && (BTM_SCO_WAKE_PARKED_LINK == TRUE) 7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sco_chk_pend_unpark 7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called by BTIF when there is a mode change 7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** event to see if there are SCO commands waiting for the unpark. 7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sco_chk_pend_unpark (UINT8 hci_status, UINT16 hci_handle) 7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_MAX_SCO_LINKS>0) 7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 xx; 7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 acl_handle; 7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSCO_CONN *p = &btm_cb.sco_cb.sco_db[0]; 7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++) 7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p->state == SCO_ST_PEND_UNPARK) && 7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ((acl_handle = BTM_GetHCIConnHandle (p->esco.data.bd_addr)) == hci_handle)) 7375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_API3("btm_sco_chk_pend_unpark -> (e)SCO Link for ACL handle 0x%04x, Desired Type %d, hci_status 0x%02x", 7405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project acl_handle, btm_cb.sco_cb.desired_sco_mode, hci_status); 7415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((btm_send_connect_request(acl_handle, &p->esco.setup)) == BTM_CMD_STARTED) 7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p->state = SCO_ST_CONNECTING; 7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 7475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 7515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sco_chk_pend_rolechange 7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called by BTIF when there is a role change 7555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** event to see if there are SCO commands waiting for the role change. 7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 7585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 7605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sco_chk_pend_rolechange (UINT16 hci_handle) 7615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_MAX_SCO_LINKS>0) 7635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 xx; 7645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 acl_handle; 7655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSCO_CONN *p = &btm_cb.sco_cb.sco_db[0]; 7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++) 7685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p->state == SCO_ST_PEND_ROLECHANGE) && 7705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ((acl_handle = BTM_GetHCIConnHandle (p->esco.data.bd_addr)) == hci_handle)) 7715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_API1("btm_sco_chk_pend_rolechange -> (e)SCO Link for ACL handle 0x%04x", acl_handle); 7745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((btm_send_connect_request(acl_handle, &p->esco.setup)) == BTM_CMD_STARTED) 7765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p->state = SCO_ST_CONNECTING; 7775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 7805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 7835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sco_conn_req 7855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called by BTIF when an SCO connection 7875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** request is received from a remote. 7885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 7905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 7925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sco_conn_req (BD_ADDR bda, DEV_CLASS dev_class, UINT8 link_type) 7935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_MAX_SCO_LINKS>0) 7955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSCO_CB *p_sco = &btm_cb.sco_cb; 7965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSCO_CONN *p = &p_sco->sco_db[0]; 7975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 xx; 7985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_ESCO_CONN_REQ_EVT_DATA evt_data; 7995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++) 8015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* 8035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * If the sco state is in the SCO_ST_CONNECTING state, we still need 8045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * to return accept sco to avoid race conditon for sco creation 8055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 8065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (((p->state == SCO_ST_LISTENING && p->rem_bd_known) || p->state == SCO_ST_CONNECTING) 8075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (!memcmp (p->esco.data.bd_addr, bda, BD_ADDR_LEN))) 8085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If this guy was a wildcard, he is not one any more */ 8105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p->rem_bd_known = TRUE; 8115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p->esco.data.link_type = link_type; 8125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p->state = SCO_ST_W4_CONN_RSP; 8135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (p->esco.data.bd_addr, bda, BD_ADDR_LEN); 8145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If no callback, auto-accept the connection if packet types match */ 8165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p->esco.p_esco_cback) 8175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If requesting eSCO reject if default parameters are SCO only */ 8195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((link_type == BTM_LINK_TYPE_ESCO 8205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && !(p_sco->def_esco_parms.packet_types & BTM_ESCO_LINK_ONLY_MASK) 8215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && ((p_sco->def_esco_parms.packet_types & BTM_SCO_EXCEPTION_PKTS_MASK) 8225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project == BTM_SCO_EXCEPTION_PKTS_MASK)) 8235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Reject request if SCO is desired but no SCO packets delected */ 8255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project || (link_type == BTM_LINK_TYPE_SCO 8265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && !(p_sco->def_esco_parms.packet_types & BTM_SCO_LINK_ONLY_MASK))) 8275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_esco_conn_rsp(xx, HCI_ERR_HOST_REJECT_RESOURCES, bda, NULL); 8295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else /* Accept the request */ 8315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_esco_conn_rsp(xx, HCI_SUCCESS, bda, NULL); 8335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else /* Notify upper layer of connect indication */ 8365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(evt_data.bd_addr, bda, BD_ADDR_LEN); 8385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(evt_data.dev_class, dev_class, DEV_CLASS_LEN); 8395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.link_type = link_type; 8405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.sco_inx = xx; 8415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p->esco.p_esco_cback(BTM_ESCO_CONN_REQ_EVT, (tBTM_ESCO_EVT_DATA *)&evt_data); 8425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 8455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* TCS usage */ 8495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.sco_cb.app_sco_ind_cb) 8505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Now, try to find an unused control block */ 8525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (xx = 0, p = &btm_cb.sco_cb.sco_db[0]; xx < BTM_MAX_SCO_LINKS; xx++, p++) 8535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p->state == SCO_ST_UNUSED) 8555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p->is_orig = FALSE; 8575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p->state = SCO_ST_LISTENING; 8585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p->esco.data.link_type = link_type; 8605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (p->esco.data.bd_addr, bda, BD_ADDR_LEN); 8615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p->rem_bd_known = TRUE; 8625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if( xx < BTM_MAX_SCO_LINKS) 8665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.sco_cb.app_sco_ind_cb(xx); 8685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 8695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 8735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If here, no one wants the SCO connection. Reject it */ 8745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_WARNING0("btm_sco_conn_req: No one wants this SCO connection; rejecting it"); 8755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_esco_conn_rsp(BTM_MAX_SCO_LINKS, HCI_ERR_HOST_REJECT_RESOURCES, bda, NULL); 8765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 8795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sco_connected 8815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called by BTIF when an (e)SCO connection 8835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** is connected. 8845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 8865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 8885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sco_connected (UINT8 hci_status, BD_ADDR bda, UINT16 hci_handle, 8895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_ESCO_DATA *p_esco_data) 8905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 8915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_MAX_SCO_LINKS>0) 8925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSCO_CONN *p = &btm_cb.sco_cb.sco_db[0]; 8935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 xx; 8945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN spt = FALSE; 8955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_CHG_ESCO_PARAMS parms; 8965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 8975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.sco_cb.sco_disc_reason = hci_status; 8995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_MAX_SCO_LINKS>0) 9015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++) 9025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (((p->state == SCO_ST_CONNECTING) || 9045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p->state == SCO_ST_LISTENING) || 9055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p->state == SCO_ST_W4_CONN_RSP)) 9065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p->rem_bd_known) 9075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (!bda || !memcmp (p->esco.data.bd_addr, bda, BD_ADDR_LEN))) 9085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (hci_status != HCI_SUCCESS) 9105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Report the error if originator, otherwise remain in Listen mode */ 9125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p->is_orig) 9135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If role switch is pending, we need try again after role switch is complete */ 9155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(hci_status == HCI_ERR_ROLE_SWITCH_PENDING) 9165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_API1("Role Change pending for HCI handle 0x%04x",hci_handle); 9185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p->state = SCO_ST_PEND_ROLECHANGE; 9195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* avoid calling disconnect callback because of sco creation race */ 9215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (hci_status != HCI_ERR_LMP_ERR_TRANS_COLLISION) 9225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p->state = SCO_ST_UNUSED; 9245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*p->p_disc_cb)(xx); 9255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 9285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Notify the upper layer that incoming sco connection has failed. */ 9305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p->state == SCO_ST_CONNECTING) 9315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p->state = SCO_ST_UNUSED; 9335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*p->p_disc_cb)(xx); 9345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 9365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p->state = SCO_ST_LISTENING; 9375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 9405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p->state == SCO_ST_LISTENING) 9435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project spt = TRUE; 9445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p->state = SCO_ST_CONNECTED; 9465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p->hci_handle = hci_handle; 9475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!btm_cb.sco_cb.esco_supported) 9495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p->esco.data.link_type = BTM_LINK_TYPE_SCO; 9515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (spt) 9525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project parms.packet_types = p->esco.setup.packet_types; 9545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Keep the other parameters the same for SCO */ 9555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project parms.max_latency = p->esco.setup.max_latency; 9565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project parms.retrans_effort = p->esco.setup.retrans_effort; 9575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_ChangeEScoLinkParms(xx, &parms); 9595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 9625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_esco_data) 9645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p->esco.data = *p_esco_data; 9655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*p->p_conn_cb)(xx); 9685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 9705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 9735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 9745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 9775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_find_scb_by_handle 9795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Look through all active SCO connection for a match based on the 9815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** HCI handle. 9825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns index to matched SCO connection CB, or BTM_MAX_SCO_LINKS if 9845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** no match. 9855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 9875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT16 btm_find_scb_by_handle (UINT16 handle) 9885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 9895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int xx; 9905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSCO_CONN *p = &btm_cb.sco_cb.sco_db[0]; 9915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++) 9935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p->state == SCO_ST_CONNECTED) && (p->hci_handle == handle)) 9955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (xx); 9975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If here, no match found */ 10015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (xx); 10025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 10055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_RemoveSco 10075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to remove a specific SCO connection. 10095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns status of the operation 10115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 10135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_RemoveSco (UINT16 sco_inx) 10145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 10155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_MAX_SCO_LINKS>0) 10165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSCO_CONN *p = &btm_cb.sco_cb.sco_db[sco_inx]; 10175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 tempstate; 10185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Validity check */ 10205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((sco_inx >= BTM_MAX_SCO_LINKS) || (p->state == SCO_ST_UNUSED)) 10215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BTM_UNKNOWN_ADDR); 10225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If no HCI handle, simply drop the connection and return */ 10245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p->hci_handle == BTM_INVALID_HCI_HANDLE || p->state == SCO_ST_PEND_UNPARK) 10255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p->hci_handle = BTM_INVALID_HCI_HANDLE; 10275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p->state = SCO_ST_UNUSED; 10285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p->esco.p_esco_cback = NULL; /* Deregister the eSCO event callback */ 10295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BTM_SUCCESS); 10305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tempstate = p->state; 10335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p->state = SCO_ST_DISCONNECTING; 10345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!btsnd_hcic_disconnect (p->hci_handle, HCI_ERR_PEER_USER)) 10365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p->state = tempstate; 10385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BTM_NO_RESOURCES); 10395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BTM_CMD_STARTED); 10425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 10435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BTM_NO_RESOURCES); 10445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 10455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 10485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_remove_sco_links 10505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to remove all sco links for an ACL link. 10525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 10545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 10565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_remove_sco_links (BD_ADDR bda) 10575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 10585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_MAX_SCO_LINKS>0) 10595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSCO_CONN *p = &btm_cb.sco_cb.sco_db[0]; 10605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 xx; 10615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++) 10635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p->rem_bd_known && (!memcmp (p->esco.data.bd_addr, bda, BD_ADDR_LEN))) 10655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_RemoveSco(xx); 10675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 10705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 10735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sco_removed 10755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called by BTIF when an SCO connection 10775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** is removed. 10785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 10805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 10825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sco_removed (UINT16 hci_handle, UINT8 reason) 10835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 10845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_MAX_SCO_LINKS>0) 10855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSCO_CONN *p = &btm_cb.sco_cb.sco_db[0]; 10865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 xx; 10875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 10885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.sco_cb.sco_disc_reason = reason; 10905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_MAX_SCO_LINKS>0) 10925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p = &btm_cb.sco_cb.sco_db[0]; 10935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++) 10945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p->state != SCO_ST_UNUSED) && (p->state != SCO_ST_LISTENING) && (p->hci_handle == hci_handle)) 10965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sco_flush_sco_data(xx); 10985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p->state = SCO_ST_UNUSED; 11005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p->hci_handle = BTM_INVALID_HCI_HANDLE; 11015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p->rem_bd_known = FALSE; 11025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p->esco.p_esco_cback = NULL; /* Deregister eSCO callback */ 11035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*p->p_disc_cb)(xx); 11045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 11065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 11095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 11105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 11135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sco_acl_removed 11155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when an ACL connection is 11175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** removed. If the BD address is NULL, it is assumed that 11185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the local device is down, and all SCO links are removed. 11195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** If a specific BD address is passed, only SCO connections 11205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** to that BD address are removed. 11215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 11235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 11255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sco_acl_removed (BD_ADDR bda) 11265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 11275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_MAX_SCO_LINKS>0) 11285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSCO_CONN *p = &btm_cb.sco_cb.sco_db[0]; 11295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 xx; 11305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++) 11325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p->state != SCO_ST_UNUSED) 11345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((!bda) || (!memcmp (p->esco.data.bd_addr, bda, BD_ADDR_LEN) && p->rem_bd_known)) 11365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sco_flush_sco_data(xx); 11385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p->state = SCO_ST_UNUSED; 11405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p->esco.p_esco_cback = NULL; /* Deregister eSCO callback */ 11415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*p->p_disc_cb)(xx); 11425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 11465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 11475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 11505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_SetScoPacketTypes 11525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to set the packet types used for 11545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** a specific SCO connection, 11555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters pkt_types - One or more of the following 11575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_SCO_PKT_TYPES_MASK_HV1 11585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_SCO_PKT_TYPES_MASK_HV2 11595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_SCO_PKT_TYPES_MASK_HV3 11605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_SCO_PKT_TYPES_MASK_EV3 11615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_SCO_PKT_TYPES_MASK_EV4 11625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_SCO_PKT_TYPES_MASK_EV5 11635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_SCO_PKT_TYPES_MASK_NO_2_EV3 11645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_SCO_PKT_TYPES_MASK_NO_3_EV3 11655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_SCO_PKT_TYPES_MASK_NO_2_EV5 11665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_SCO_PKT_TYPES_MASK_NO_3_EV5 11675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_SCO_LINK_ALL_MASK - enables all supported types 11695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns status of the operation 11715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 11735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_SetScoPacketTypes (UINT16 sco_inx, UINT16 pkt_types) 11745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 11755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_MAX_SCO_LINKS>0) 11765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_CHG_ESCO_PARAMS parms; 11775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSCO_CONN *p; 11785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Validity check */ 11805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (sco_inx >= BTM_MAX_SCO_LINKS) 11815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BTM_UNKNOWN_ADDR); 11825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p = &btm_cb.sco_cb.sco_db[sco_inx]; 11845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project parms.packet_types = pkt_types; 11855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Keep the other parameters the same for SCO */ 11875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project parms.max_latency = p->esco.setup.max_latency; 11885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project parms.retrans_effort = p->esco.setup.retrans_effort; 11895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BTM_ChangeEScoLinkParms(sco_inx, &parms)); 11915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 11925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BTM_UNKNOWN_ADDR); 11935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 11945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 11955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 11985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_ReadScoPacketTypes 12005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is read the packet types used for a specific 12025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** SCO connection. 12035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Packet types supported for the connection 12055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** One or more of the following (bitmask): 12065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_SCO_PKT_TYPES_MASK_HV1 12075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_SCO_PKT_TYPES_MASK_HV2 12085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_SCO_PKT_TYPES_MASK_HV3 12095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_SCO_PKT_TYPES_MASK_EV3 12105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_SCO_PKT_TYPES_MASK_EV4 12115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_SCO_PKT_TYPES_MASK_EV5 12125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_SCO_PKT_TYPES_MASK_NO_2_EV3 12135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_SCO_PKT_TYPES_MASK_NO_3_EV3 12145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_SCO_PKT_TYPES_MASK_NO_2_EV5 12155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_SCO_PKT_TYPES_MASK_NO_3_EV5 12165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 12185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT16 BTM_ReadScoPacketTypes (UINT16 sco_inx) 12195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 12205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_MAX_SCO_LINKS>0) 12215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSCO_CONN *p = &btm_cb.sco_cb.sco_db[sco_inx]; 12225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Validity check */ 12245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((sco_inx < BTM_MAX_SCO_LINKS) && (p->state == SCO_ST_CONNECTED)) 12255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (p->esco.setup.packet_types); 12265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 12275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (0); 12285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 12295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (0); 12305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 12315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 12325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 12345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_ReadScoDiscReason 12365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is returns the reason why an (e)SCO connection 12385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** has been removed. It contains the value until read, or until 12395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** another (e)SCO connection has disconnected. 12405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns HCI reason or BTM_INVALID_SCO_DISC_REASON if not set. 12425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 12445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT16 BTM_ReadScoDiscReason (void) 12455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 12465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 res = btm_cb.sco_cb.sco_disc_reason; 12475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.sco_cb.sco_disc_reason = BTM_INVALID_SCO_DISC_REASON; 12485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (res); 12495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 12505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 12525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_ReadDeviceScoPacketTypes 12545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is read the SCO packet types that 12565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the device supports. 12575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Packet types supported by the device. 12595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** One or more of the following (bitmask): 12605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_SCO_PKT_TYPES_MASK_HV1 12615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_SCO_PKT_TYPES_MASK_HV2 12625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_SCO_PKT_TYPES_MASK_HV3 12635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_SCO_PKT_TYPES_MASK_EV3 12645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_SCO_PKT_TYPES_MASK_EV4 12655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_SCO_PKT_TYPES_MASK_EV5 12665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_SCO_PKT_TYPES_MASK_NO_2_EV3 12675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_SCO_PKT_TYPES_MASK_NO_3_EV3 12685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_SCO_PKT_TYPES_MASK_NO_2_EV5 12695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_SCO_PKT_TYPES_MASK_NO_3_EV5 12705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 12725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT16 BTM_ReadDeviceScoPacketTypes (void) 12735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 12745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (btm_cb.btm_sco_pkt_types_supported); 12755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 12765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 12785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_ReadScoHandle 12805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is used to read the HCI handle used for a specific 12825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** SCO connection, 12835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns handle for the connection, or 0xFFFF if invalid SCO index. 12855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 12875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT16 BTM_ReadScoHandle (UINT16 sco_inx) 12885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 12895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_MAX_SCO_LINKS>0) 12905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSCO_CONN *p = &btm_cb.sco_cb.sco_db[sco_inx]; 12915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Validity check */ 12935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((sco_inx < BTM_MAX_SCO_LINKS) && (p->state == SCO_ST_CONNECTED)) 12945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (p->hci_handle); 12955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 12965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BTM_INVALID_HCI_HANDLE); 12975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 12985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BTM_INVALID_HCI_HANDLE); 12995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 13005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 13015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 13035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_ReadScoBdAddr 13055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is read the remote BD Address for a specific 13075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** SCO connection, 13085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns pointer to BD address or NULL if not known 13105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 13125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 *BTM_ReadScoBdAddr (UINT16 sco_inx) 13135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 13145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_MAX_SCO_LINKS>0) 13155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSCO_CONN *p = &btm_cb.sco_cb.sco_db[sco_inx]; 13165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Validity check */ 13185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((sco_inx < BTM_MAX_SCO_LINKS) && (p->rem_bd_known)) 13195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (p->esco.data.bd_addr); 13205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 13215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (NULL); 13225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 13235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (NULL); 13245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 13255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 13265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 13285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_SetEScoMode 13305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function sets up the negotiated parameters for SCO or 13325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** eSCO, and sets as the default mode used for outgoing calls to 13335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_CreateSco. It does not change any currently active (e)SCO links. 13345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Note: Incoming (e)SCO connections will always use packet types 13355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** supported by the controller. If eSCO is not desired the 13365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** feature should be disabled in the controller's feature mask. 13375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns BTM_SUCCESS if the successful. 13395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_BUSY if there are one or more active (e)SCO links. 13405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 13425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_SetEScoMode (tBTM_SCO_TYPE sco_mode, tBTM_ESCO_PARAMS *p_parms) 13435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 13445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSCO_CB *p_esco = &btm_cb.sco_cb; 13455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_ESCO_PARAMS *p_def = &p_esco->def_esco_parms; 13465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_esco->esco_supported) 13485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_parms) 13505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (sco_mode == BTM_LINK_TYPE_ESCO) 13525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_def = *p_parms; /* Save as the default parameters */ 13535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else /* Load only the SCO packet types */ 13545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_def->packet_types = p_parms->packet_types; 13565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_def->tx_bw = BTM_64KBITS_RATE; 13575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_def->rx_bw = BTM_64KBITS_RATE; 13585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_def->max_latency = 0x000a; 13595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_def->voice_contfmt = 0x0060; 13605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_def->retrans_effort = 0; 13615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* OR in any exception packet types if at least 2.0 version of spec */ 13635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.devcb.local_version.hci_version >= HCI_PROTO_VERSION_2_0) 13645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_def->packet_types |= BTM_SCO_EXCEPTION_PKTS_MASK; 13665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_esco->desired_sco_mode = sco_mode; 13705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_API1("BTM_SetEScoMode -> mode %d", sco_mode); 13715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 13735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_esco->desired_sco_mode = BTM_LINK_TYPE_SCO; 13755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_def->packet_types &= BTM_SCO_LINK_ONLY_MASK; 13765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_def->retrans_effort = 0; 13775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_API0("BTM_SetEScoMode -> mode SCO (eSCO not supported)"); 13785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG6(" txbw 0x%08x, rxbw 0x%08x, max_lat 0x%04x, voice 0x%04x, pkt 0x%04x, rtx effort 0x%02x", 13815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_def->tx_bw, p_def->rx_bw, p_def->max_latency, 13825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_def->voice_contfmt, p_def->packet_types, 13835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_def->retrans_effort); 13845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BTM_SUCCESS); 13865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 13875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 13915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_RegForEScoEvts 13935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function registers a SCO event callback with the 13955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** specified instance. It should be used to received 13965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** connection indication events and change of link parameter 13975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** events. 13985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns BTM_SUCCESS if the successful. 14005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_ILLEGAL_VALUE if there is an illegal sco_inx 14015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_MODE_UNSUPPORTED if controller version is not BT1.2 or 14025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** later or does not support eSCO. 14035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 14055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_RegForEScoEvts (UINT16 sco_inx, tBTM_ESCO_CBACK *p_esco_cback) 14065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 14075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_MAX_SCO_LINKS>0) 14085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!btm_cb.sco_cb.esco_supported) 14095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.sco_cb.sco_db[sco_inx].esco.p_esco_cback = NULL; 14115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BTM_MODE_UNSUPPORTED); 14125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (sco_inx < BTM_MAX_SCO_LINKS && 14155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.sco_cb.sco_db[sco_inx].state != SCO_ST_UNUSED) 14165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.sco_cb.sco_db[sco_inx].esco.p_esco_cback = p_esco_cback; 14185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BTM_SUCCESS); 14195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BTM_ILLEGAL_VALUE); 14215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 14225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BTM_MODE_UNSUPPORTED); 14235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 14245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 14255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 14275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_ReadEScoLinkParms 14295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function returns the current eSCO link parameters for 14315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the specified handle. This can be called anytime a connection 14325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** is active, but is typically called after receiving the SCO 14335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** opened callback. 14345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Note: If called over a 1.1 controller, only the packet types 14365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** field has meaning. 14375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns BTM_SUCCESS if returned data is valid connection. 14395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_WRONG_MODE if no connection with a peer device or bad sco_inx. 14405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 14425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_ReadEScoLinkParms (UINT16 sco_inx, tBTM_ESCO_DATA *p_parms) 14435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 14445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_MAX_SCO_LINKS>0) 1445ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta UINT8 index; 1446ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 14475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_API1("BTM_ReadEScoLinkParms -> sco_inx 0x%04x", sco_inx); 14485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (sco_inx < BTM_MAX_SCO_LINKS && 14505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.sco_cb.sco_db[sco_inx].state >= SCO_ST_CONNECTED) 14515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_parms = btm_cb.sco_cb.sco_db[sco_inx].esco.data; 14535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BTM_SUCCESS); 14545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1455ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1456ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (sco_inx == BTM_FIRST_ACTIVE_SCO_INDEX) 1457ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 1458ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta for (index = 0; index < BTM_MAX_SCO_LINKS; index++) 1459ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 1460ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (btm_cb.sco_cb.sco_db[index].state >= SCO_ST_CONNECTED) 1461ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 1462ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta BTM_TRACE_API1("BTM_ReadEScoLinkParms the first active SCO index is %d",index); 1463ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta *p_parms = btm_cb.sco_cb.sco_db[index].esco.data; 1464ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return (BTM_SUCCESS); 1465ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 1466ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 1467ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 1468ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 14695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 14705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1471ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta BTM_TRACE_API0("BTM_ReadEScoLinkParms cannot find the SCO index!"); 14725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(p_parms, 0, sizeof(tBTM_ESCO_DATA)); 14735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BTM_WRONG_MODE); 14745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 14755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 14775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_ChangeEScoLinkParms 14795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function requests renegotiation of the parameters on 14815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the current eSCO Link. If any of the changes are accepted 14825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** by the controllers, the BTM_ESCO_CHG_EVT event is sent in 14835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the tBTM_ESCO_CBACK function with the current settings of 14845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the link. The callback is registered through the call to 14855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_SetEScoMode. 14865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Note: If called over a SCO link (including 1.1 controller), 14885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** a change packet type request is sent out instead. 14895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns BTM_CMD_STARTED if command is successfully initiated. 14915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_NO_RESOURCES - not enough resources to initiate command. 14925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_WRONG_MODE if no connection with a peer device or bad sco_inx. 14935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 14955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_ChangeEScoLinkParms (UINT16 sco_inx, tBTM_CHG_ESCO_PARAMS *p_parms) 14965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 14975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_MAX_SCO_LINKS>0) 14985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_ESCO_PARAMS *p_setup; 14995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSCO_CONN *p_sco; 15005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 temp_pkt_types; 15015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Make sure sco handle is valid and on an active link */ 15035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (sco_inx >= BTM_MAX_SCO_LINKS || 15045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.sco_cb.sco_db[sco_inx].state != SCO_ST_CONNECTED) 15055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BTM_WRONG_MODE); 15065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco = &btm_cb.sco_cb.sco_db[sco_inx]; 15085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_setup = &p_sco->esco.setup; 15095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If SCO connection OR eSCO not supported just send change packet types */ 15115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_sco->esco.data.link_type == BTM_LINK_TYPE_SCO || 15125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project !btm_cb.sco_cb.esco_supported) 15135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_setup->packet_types = p_parms->packet_types & 15155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (btm_cb.btm_sco_pkt_types_supported & BTM_SCO_LINK_ONLY_MASK); 15165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_API2("BTM_ChangeEScoLinkParms -> SCO Link for handle 0x%04x, pkt 0x%04x", 15195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sco->hci_handle, p_setup->packet_types); 15205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!btsnd_hcic_change_conn_type (p_sco->hci_handle, 15225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_ESCO_2_SCO(p_setup->packet_types))) 15235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BTM_NO_RESOURCES); 15245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 15265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project temp_pkt_types = (p_parms->packet_types & BTM_SCO_SUPPORTED_PKTS_MASK & 15285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.btm_sco_pkt_types_supported); 15295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* OR in any exception packet types if at least 2.0 version of spec */ 15315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.devcb.local_version.hci_version >= HCI_PROTO_VERSION_2_0) 15325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project temp_pkt_types |= ((p_parms->packet_types & BTM_SCO_EXCEPTION_PKTS_MASK) | 15345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (btm_cb.btm_sco_pkt_types_supported & BTM_SCO_EXCEPTION_PKTS_MASK)); 15355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_API1("BTM_ChangeEScoLinkParms -> eSCO Link for handle 0x%04x", p_sco->hci_handle); 15385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_API6(" txbw 0x%x, rxbw 0x%x, lat 0x%x, voice 0x%x, retrans 0x%02x, pkt 0x%04x", 15395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_setup->tx_bw, p_setup->rx_bw, p_parms->max_latency, 15405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_setup->voice_contfmt, p_parms->retrans_effort, temp_pkt_types); 15415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* When changing an existing link, only change latency, retrans, and pkts */ 15435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!btsnd_hcic_setup_esco_conn(p_sco->hci_handle, p_setup->tx_bw, 15445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_setup->rx_bw, p_parms->max_latency, 15455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_setup->voice_contfmt, 15465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_parms->retrans_effort, 15475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project temp_pkt_types)) 15485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BTM_NO_RESOURCES); 15495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 15505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_parms->packet_types = temp_pkt_types; 15515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BTM_CMD_STARTED); 15545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 15555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BTM_WRONG_MODE); 15565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 15575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 15585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 15605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_EScoConnRsp 15625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called upon receipt of an (e)SCO connection 15645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** request event (BTM_ESCO_CONN_REQ_EVT) to accept or reject 15655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the request. Parameters used to negotiate eSCO links. 15665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** If p_parms is NULL, then values set through BTM_SetEScoMode 15675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** are used. 15685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** If the link type of the incoming request is SCO, then only 15695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the tx_bw, max_latency, content format, and packet_types are 15705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** valid. The hci_status parameter should be 15715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** ([0x0] to accept, [0x0d..0x0f] to reject) 15725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 15755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 15775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_EScoConnRsp (UINT16 sco_inx, UINT8 hci_status, tBTM_ESCO_PARAMS *p_parms) 15785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 15795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_MAX_SCO_LINKS>0) 15805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (sco_inx < BTM_MAX_SCO_LINKS && 15815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.sco_cb.sco_db[sco_inx].state == SCO_ST_W4_CONN_RSP) 15825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_esco_conn_rsp(sco_inx, hci_status, 15845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.sco_cb.sco_db[sco_inx].esco.data.bd_addr, 15855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_parms); 15865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 15885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 15895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 15915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_read_def_esco_mode 15935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function copies the current default esco settings into 15955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the return buffer. 15965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns tBTM_SCO_TYPE 15985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 16005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_SCO_TYPE btm_read_def_esco_mode (tBTM_ESCO_PARAMS *p_parms) 16015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 16025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_MAX_SCO_LINKS>0) 16035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_parms = btm_cb.sco_cb.def_esco_parms; 16045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return btm_cb.sco_cb.desired_sco_mode; 16055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 16065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BTM_LINK_TYPE_SCO; 16075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 16085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 16095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 16115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_esco_proc_conn_chg 16135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called by BTIF when an SCO connection 16155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** is changed. 16165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 16185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 16205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_esco_proc_conn_chg (UINT8 status, UINT16 handle, UINT8 tx_interval, 16215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 retrans_window, UINT16 rx_pkt_len, 16225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 tx_pkt_len) 16235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 16245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_MAX_SCO_LINKS>0) 16255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSCO_CONN *p = &btm_cb.sco_cb.sco_db[0]; 16265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_CHG_ESCO_EVT_DATA data; 16275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 xx; 16285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_EVENT2("btm_esco_proc_conn_chg -> handle 0x%04x, status 0x%02x", 16305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project handle, status); 16315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++) 16335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p->state == SCO_ST_CONNECTED && handle == p->hci_handle) 16355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If upper layer wants notification */ 16375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p->esco.p_esco_cback) 16385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(data.bd_addr, p->esco.data.bd_addr, BD_ADDR_LEN); 16405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project data.hci_status = status; 16415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project data.sco_inx = xx; 16425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project data.rx_pkt_len = p->esco.data.rx_pkt_len = rx_pkt_len; 16435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project data.tx_pkt_len = p->esco.data.tx_pkt_len = tx_pkt_len; 16445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project data.tx_interval = p->esco.data.tx_interval = tx_interval; 16455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project data.retrans_window = p->esco.data.retrans_window = retrans_window; 16465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*p->esco.p_esco_cback)(BTM_ESCO_CHG_EVT, 16485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (tBTM_ESCO_EVT_DATA *)&data); 16495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 16515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 16545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 16555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 16575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_is_sco_active 16595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to see if a SCO handle is already in 16615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** use. 16625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns BOOLEAN 16645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 16665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btm_is_sco_active (UINT16 handle) 16675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 16685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_MAX_SCO_LINKS>0) 16695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 xx; 16705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSCO_CONN *p = &btm_cb.sco_cb.sco_db[0]; 16715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++) 16735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (handle == p->hci_handle && p->state == SCO_ST_CONNECTED) 16755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (TRUE); 16765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 16785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (FALSE); 16795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 16805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 16825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_GetNumScoLinks 16845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function returns the number of active sco links. 16865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns UINT8 16885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 16905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 BTM_GetNumScoLinks (void) 16915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 16925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_MAX_SCO_LINKS>0) 16935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSCO_CONN *p = &btm_cb.sco_cb.sco_db[0]; 16945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 xx; 16955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 num_scos = 0; 16965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++) 16985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (p->state) 17005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 17015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case SCO_ST_W4_CONN_RSP: 17025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case SCO_ST_CONNECTING: 17035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case SCO_ST_CONNECTED: 17045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case SCO_ST_DISCONNECTING: 17055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case SCO_ST_PEND_UNPARK: 17065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project num_scos++; 17075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (num_scos); 17105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 17115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (0); 17125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 17135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 17145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 17175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_is_sco_active_by_bdaddr 17195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to see if a SCO active to a bd address. 17215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns BOOLEAN 17235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 17255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btm_is_sco_active_by_bdaddr (BD_ADDR remote_bda) 17265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 17275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_MAX_SCO_LINKS>0) 17285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 xx; 17295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSCO_CONN *p = &btm_cb.sco_cb.sco_db[0]; 17305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If any SCO is being established to the remote BD address, refuse this */ 17325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++) 17335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 17345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((!memcmp (p->esco.data.bd_addr, remote_bda, BD_ADDR_LEN)) && (p->state == SCO_ST_CONNECTED)) 17355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 17365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (TRUE); 17375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 17405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (FALSE); 17415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 17425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else /* SCO_EXCLUDED == TRUE (Link in stubs) */ 17435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_CreateSco (BD_ADDR remote_bda, BOOLEAN is_orig, 17455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 pkt_types, UINT16 *p_sco_inx, 17465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SCO_CB *p_conn_cb, 17475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SCO_CB *p_disc_cb) {return (BTM_NO_RESOURCES);} 17485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_RemoveSco (UINT16 sco_inx) {return (BTM_NO_RESOURCES);} 17495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_SetScoPacketTypes (UINT16 sco_inx, UINT16 pkt_types) {return (BTM_NO_RESOURCES);} 17505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT16 BTM_ReadScoPacketTypes (UINT16 sco_inx) {return (0);} 17515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT16 BTM_ReadDeviceScoPacketTypes (void) {return (0);} 17525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT16 BTM_ReadScoHandle (UINT16 sco_inx) {return (BTM_INVALID_HCI_HANDLE);} 17535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 *BTM_ReadScoBdAddr(UINT16 sco_inx) {return((UINT8 *) NULL);} 17545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT16 BTM_ReadScoDiscReason (void) {return (BTM_INVALID_SCO_DISC_REASON);} 17555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_SetEScoMode (tBTM_SCO_TYPE sco_mode, tBTM_ESCO_PARAMS *p_parms) {return (BTM_MODE_UNSUPPORTED);} 17565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_RegForEScoEvts (UINT16 sco_inx, tBTM_ESCO_CBACK *p_esco_cback) { return (BTM_ILLEGAL_VALUE);} 17575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_ReadEScoLinkParms (UINT16 sco_inx, tBTM_ESCO_DATA *p_parms) { return (BTM_MODE_UNSUPPORTED);} 17585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_ChangeEScoLinkParms (UINT16 sco_inx, tBTM_CHG_ESCO_PARAMS *p_parms) { return (BTM_MODE_UNSUPPORTED);} 17595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_EScoConnRsp (UINT16 sco_inx, UINT8 hci_status, tBTM_ESCO_PARAMS *p_parms) {} 17605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 BTM_GetNumScoLinks (void) {return (0);} 17615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* If SCO is being used */ 1763