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