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