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