16ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach/******************************************************************************
26ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *
36ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *  Copyright (C) 2000-2012 Broadcom Corporation
46ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *
56ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *  Licensed under the Apache License, Version 2.0 (the "License");
66ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *  you may not use this file except in compliance with the License.
76ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *  You may obtain a copy of the License at:
86ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *
96ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *  http://www.apache.org/licenses/LICENSE-2.0
106ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *
116ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *  Unless required by applicable law or agreed to in writing, software
126ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *  distributed under the License is distributed on an "AS IS" BASIS,
136ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
146ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *  See the License for the specific language governing permissions and
156ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *  limitations under the License.
166ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *
176ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach ******************************************************************************/
186ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach
196ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach/******************************************************************************
206ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *
216ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *  This file contains functions that handle SCO connections. This includes
226ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *  operations such as connect, disconnect, change supported packet types.
236ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *
246ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach ******************************************************************************/
25e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
26e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include <string.h>
27e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "bt_types.h"
28e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "bt_target.h"
29e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "gki.h"
30e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "bt_types.h"
31e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "hcimsgs.h"
32e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "btu.h"
33e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "btm_api.h"
34e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "btm_int.h"
35e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "hcidefs.h"
36e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
37e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if BTM_SCO_INCLUDED == TRUE
38e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
39e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/********************************************************************************/
40e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*                 L O C A L    D A T A    D E F I N I T I O N S                */
41e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/********************************************************************************/
42e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
43e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define SCO_ST_UNUSED           0
44e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define SCO_ST_LISTENING        1
45e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define SCO_ST_W4_CONN_RSP      2
46e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define SCO_ST_CONNECTING       3
47e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define SCO_ST_CONNECTED        4
48e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define SCO_ST_DISCONNECTING    5
49e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define SCO_ST_PEND_UNPARK      6
50e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define SCO_ST_PEND_ROLECHANGE  7
51e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
52e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/********************************************************************************/
53e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*              L O C A L    F U N C T I O N     P R O T O T Y P E S            */
54e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/********************************************************************************/
55e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
56e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic const tBTM_ESCO_PARAMS btm_esco_defaults =
57e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
58e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTM_64KBITS_RATE,               /* TX Bandwidth (64 kbits/sec)              */
59e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTM_64KBITS_RATE,               /* RX Bandwidth (64 kbits/sec)              */
60e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    0x000a,                         /* 10 ms (HS/HF can use EV3, 2-EV3, 3-EV3)  */
61e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    0x0060,                         /* Inp Linear, Air CVSD, 2s Comp, 16bit     */
62e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    (BTM_SCO_PKT_TYPES_MASK_HV1 +   /* Packet Types                             */
63e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach     BTM_SCO_PKT_TYPES_MASK_HV2 +
64e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach     BTM_SCO_PKT_TYPES_MASK_HV3 +
65e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach     BTM_SCO_PKT_TYPES_MASK_EV3 +
66e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach     BTM_SCO_PKT_TYPES_MASK_EV4 +
67e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach     BTM_SCO_PKT_TYPES_MASK_EV5),
68e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach     BTM_ESCO_RETRANS_POWER        /* Retransmission Effort (Power)   */
69e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach};
70e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
71e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
72e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
73e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         btm_sco_flush_sco_data
74e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
75e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      This function is called to flush the SCO data for this channel.
76e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
77e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          void
78e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
79e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
80e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid btm_sco_flush_sco_data(UINT16 sco_inx)
81e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
82e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if BTM_SCO_HCI_INCLUDED == TRUE
83e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (BTM_MAX_SCO_LINKS>0)
84e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    tSCO_CONN   *p ;
85e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BT_HDR      *p_buf;
86e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
87e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (sco_inx < BTM_MAX_SCO_LINKS)
88e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
89e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        p = &btm_cb.sco_cb.sco_db[sco_inx];
90e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        while (p->xmit_data_q.p_first)
91e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        {
926ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach            if ((p_buf = (BT_HDR *)GKI_dequeue (&p->xmit_data_q)) != NULL)
93e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                GKI_freebuf (p_buf);
94e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        }
95e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
96e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif
97e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif
98e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
99e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
100e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
101e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         btm_sco_init
102e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
103e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      This function is called at BTM startup to initialize
104e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
105e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          void
106e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
107e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
108e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid btm_sco_init (void)
109e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
110e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if 0  /* cleared in btm_init; put back in if called from anywhere else! */
111e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    memset (&btm_cb.sco_cb, 0, sizeof(tSCO_CB));
112e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif
113e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* Initialize nonzero defaults */
114e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    btm_cb.sco_cb.sco_disc_reason  = BTM_INVALID_SCO_DISC_REASON;
115e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
116e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    btm_cb.sco_cb.def_esco_parms = btm_esco_defaults; /* Initialize with defaults */
117e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    btm_cb.sco_cb.desired_sco_mode = BTM_DEFAULT_SCO_MODE;
118e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
119e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
120e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
121e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
122e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         btm_esco_conn_rsp
123e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
124e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      This function is called upon receipt of an (e)SCO connection
125e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  request event (BTM_ESCO_CONN_REQ_EVT) to accept or reject
126e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  the request. Parameters used to negotiate eSCO links.
127e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  If p_parms is NULL, then default values are used.
128e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  If the link type of the incoming request is SCO, then only
129e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  the tx_bw, max_latency, content format, and packet_types are
130e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  valid.  The hci_status parameter should be
131e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  ([0x0] to accept, [0x0d..0x0f] to reject)
1326ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach**
133e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          void
134e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
135e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
136e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void btm_esco_conn_rsp (UINT16 sco_inx, UINT8 hci_status, BD_ADDR bda,
137e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                               tBTM_ESCO_PARAMS *p_parms)
138e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
139e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (BTM_MAX_SCO_LINKS>0)
140e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    tSCO_CONN        *p_sco = NULL;
141e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    tBTM_ESCO_PARAMS *p_setup;
142e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    UINT16            temp_pkt_types;
143e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
144e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (sco_inx < BTM_MAX_SCO_LINKS)
145e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        p_sco = &btm_cb.sco_cb.sco_db[sco_inx];
146e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
147e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* Reject the connect request if refused by caller or wrong state */
148e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (hci_status != HCI_SUCCESS || p_sco == NULL)
149e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
150e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        if (p_sco)
151e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        {
152e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            p_sco->state = (p_sco->state == SCO_ST_W4_CONN_RSP) ? SCO_ST_LISTENING
153e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                                                                : SCO_ST_UNUSED;
154e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        }
155e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
156e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        if (!btm_cb.sco_cb.esco_supported)
157e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        {
158e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            if (!btsnd_hcic_reject_conn (bda, hci_status))
159e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
160e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                BTM_TRACE_ERROR0("Could not reject (e)SCO conn: No Buffer!!!");
161e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
162e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        }
163e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        else
164e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        {
165e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            if (!btsnd_hcic_reject_esco_conn (bda, hci_status))
166e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
167e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                BTM_TRACE_ERROR0("Could not reject (e)SCO conn: No Buffer!!!");
168e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
169e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        }
170e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
171e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    else    /* Connection is being accepted */
172e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
173e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        p_sco->state = SCO_ST_CONNECTING;
174e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        if (btm_cb.devcb.local_version.hci_version >= HCI_PROTO_VERSION_1_2)
175e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        {
176e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            p_setup = &p_sco->esco.setup;
177e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            /* If parameters not specified use the default */
178e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            if (p_parms)
179e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                *p_setup = *p_parms;
180e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            else /* Use the last setup passed thru BTM_SetEscoMode (or defaults) */
181e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
182e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                *p_setup = btm_cb.sco_cb.def_esco_parms;
183e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
184e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
185e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            temp_pkt_types = (p_setup->packet_types &
186e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                              BTM_SCO_SUPPORTED_PKTS_MASK &
187e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                              btm_cb.btm_sco_pkt_types_supported);
188e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
189e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            /* Make sure at least one eSCO packet type is sent, else might confuse peer */
190e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            /* Taking this out to confirm with BQB tests
191e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            ** Real application would like to include this though, as many devices
192e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            ** do not retry with SCO only if an eSCO connection fails.
193e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            if (!(temp_pkt_types & BTM_ESCO_LINK_ONLY_MASK))
194e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
195e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                temp_pkt_types |= BTM_SCO_PKT_TYPES_MASK_EV3;
196e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
197e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            */
198e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            /* If SCO request, remove eSCO packet types (conformance) */
199e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            if (p_sco->esco.data.link_type == BTM_LINK_TYPE_SCO)
200e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
201e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                temp_pkt_types &= BTM_SCO_LINK_ONLY_MASK;
2026ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach
203e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                if (btm_cb.devcb.local_version.hci_version >= HCI_PROTO_VERSION_2_0)
204e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                {
205e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    temp_pkt_types |= BTM_SCO_EXCEPTION_PKTS_MASK;
206e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                }
207e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
208e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach             /* OR in any exception packet types if at least 2.0 version of spec */
209e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            else if (btm_cb.devcb.local_version.hci_version >= HCI_PROTO_VERSION_2_0)
210e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
211e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                temp_pkt_types |= ((p_setup->packet_types & BTM_SCO_EXCEPTION_PKTS_MASK) |
212e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    (btm_cb.btm_sco_pkt_types_supported & BTM_SCO_EXCEPTION_PKTS_MASK));
213e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
214e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
215e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            if (btsnd_hcic_accept_esco_conn (bda, p_setup->tx_bw, p_setup->rx_bw,
216e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                                         p_setup->max_latency, p_setup->voice_contfmt,
217e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                                             p_setup->retrans_effort, temp_pkt_types))
218e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
219e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                p_setup->packet_types = temp_pkt_types;
220e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
221e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            else
222e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
223e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                BTM_TRACE_ERROR0("Could not accept SCO conn: No Buffer!!!");
224e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
225e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        }
226e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        else    /* Controller is version 1.1 or earlier */
227e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        {
228e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            btsnd_hcic_accept_conn (bda, 0);
229e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        }
230e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
231e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif
232e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
233e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
234e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
235e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if BTM_SCO_HCI_INCLUDED == TRUE
236e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
237e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
238e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         btm_sco_check_send_pkts
239e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
240e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      This function is called to check if it can send packets
241e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  to the Host Controller.
242e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
243e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          void
244e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
245e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
246e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid btm_sco_check_send_pkts (UINT16 sco_inx)
247e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
248e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BT_HDR  *p_buf;
249e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    tSCO_CB  *p_cb = &btm_cb.sco_cb;
250e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    tSCO_CONN   *p_ccb = &p_cb->sco_db[sco_inx];
251e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
252e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* If there is data to send, send it now */
253e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    while (p_ccb->xmit_data_q.p_first != NULL)
2546ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach    {
255e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        p_buf = NULL;
256e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
257e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if BTM_SCO_HCI_DEBUG
258e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        BTM_TRACE_DEBUG1 ("btm: [%d] buf in xmit_data_q", p_ccb->xmit_data_q.count );
259e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif
260e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        p_buf = (BT_HDR *)GKI_dequeue (&p_ccb->xmit_data_q);
261e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
262e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        HCI_SCO_DATA_TO_LOWER (p_buf);
263e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
264e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
265e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif /* BTM_SCO_HCI_INCLUDED == TRUE */
266e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
267e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
268e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
269e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         btm_route_sco_data
270e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
271e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      Route received SCO data.
272e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
273e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          void
274e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
275e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
276e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid  btm_route_sco_data(BT_HDR *p_msg)
277e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
278e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if BTM_SCO_HCI_INCLUDED == TRUE
2796ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach    UINT16      sco_inx, handle;
280e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    UINT8       *p = (UINT8 *)(p_msg + 1) + p_msg->offset;
281e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    UINT8       pkt_size = 0;
282e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    UINT8       pkt_status = 0;
283e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
284e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* Extract Packet_Status_Flag and handle */
285e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    STREAM_TO_UINT16 (handle, p);
2866ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach    pkt_status = HCID_GET_EVENT(handle);
287e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    handle   = HCID_GET_HANDLE (handle);
288e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
289e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    STREAM_TO_UINT8 (pkt_size, p);
290e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
291e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if ((sco_inx = btm_find_scb_by_handle(handle)) != BTM_MAX_SCO_LINKS )
292e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
293e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        /* send data callback */
294e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        if (!btm_cb.sco_cb.p_data_cb )
295e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            /* if no data callback registered,  just free the buffer  */
296e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            GKI_freebuf (p_msg);
2976ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach        else
2986ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach        {
299e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            (*btm_cb.sco_cb.p_data_cb)(sco_inx, p_msg, (tBTM_SCO_DATA_FLAG) pkt_status);
300e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        }
301e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
302e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    else /* no mapping handle SCO connection is active, free the buffer */
303e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
304e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        GKI_freebuf (p_msg);
305e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
306e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#else
307e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    GKI_freebuf(p_msg);
308e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif
309e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
310e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
311e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
312e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
313e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
314e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
315e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         BTM_WriteScoData
316e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
317e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      This function write SCO data to a specified instance. The data
3186ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach**                  to be written p_buf needs to carry an offset of
3196ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach**                  HCI_SCO_PREAMBLE_SIZE bytes, and the data length can not
320e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  exceed BTM_SCO_DATA_SIZE_MAX bytes, whose default value is set
3216ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach**                  to 60 and is configurable. Data longer than the maximum bytes
3226ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach**                  will be truncated.
323e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
324e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          BTM_SUCCESS: data write is successful
325e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  BTM_ILLEGAL_VALUE: SCO data contains illegal offset value.
3266ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach**                  BTM_SCO_BAD_LENGTH: SCO data length exceeds the max SCO packet
3276ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach**                                      size.
328e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  BTM_NO_RESOURCES: no resources.
329e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  BTM_UNKNOWN_ADDR: unknown SCO connection handle, or SCO is not
330e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                                    routed via HCI.
3316ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach**
332e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
333e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
334e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachtBTM_STATUS BTM_WriteScoData (UINT16 sco_inx, BT_HDR *p_buf)
335e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
336e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (BTM_SCO_HCI_INCLUDED == TRUE) && (BTM_MAX_SCO_LINKS>0)
337e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    tSCO_CONN   *p_ccb = &btm_cb.sco_cb.sco_db[sco_inx];
338e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    UINT8   *p;
339e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    tBTM_STATUS     status = BTM_SUCCESS;
340e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
341e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (sco_inx < BTM_MAX_SCO_LINKS && btm_cb.sco_cb.p_data_cb &&
342e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        p_ccb->state == SCO_ST_CONNECTED)
343e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
344e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        /* Ensure we have enough space in the buffer for the SCO and HCI headers */
345e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        if (p_buf->offset < HCI_SCO_PREAMBLE_SIZE)
346e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        {
347e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            BTM_TRACE_ERROR1 ("BTM SCO - cannot send buffer, offset: %d", p_buf->offset);
348e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            GKI_freebuf (p_buf);
349e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            status = BTM_ILLEGAL_VALUE;
350e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        }
351e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        else    /* write HCI header */
352e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        {
353e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            /* Step back 3 bytes to add the headers */
354e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            p_buf->offset -= HCI_SCO_PREAMBLE_SIZE;
355e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            /* Set the pointer to the beginning of the data */
356e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            p = (UINT8 *)(p_buf + 1) + p_buf->offset;
357e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            /* add HCI handle */
358e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            UINT16_TO_STREAM (p, p_ccb->hci_handle);
3596ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach            /* only sent the first BTM_SCO_DATA_SIZE_MAX bytes data if more than max,
360e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach               and set warning status */
361e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            if (p_buf->len > BTM_SCO_DATA_SIZE_MAX)
362e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
363e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                p_buf->len = BTM_SCO_DATA_SIZE_MAX;
364e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                status = BTM_SCO_BAD_LENGTH;
365e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
366e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
367e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            UINT8_TO_STREAM (p, (UINT8)p_buf->len);
368e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            p_buf->len += HCI_SCO_PREAMBLE_SIZE;
369e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
370e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            GKI_enqueue (&p_ccb->xmit_data_q, p_buf);
3716ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach
372e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            btm_sco_check_send_pkts (sco_inx);
373e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        }
374e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
375e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    else
376e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
377e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        GKI_freebuf(p_buf);
378e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
3796ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach        BTM_TRACE_WARNING2 ("BTM_WriteScoData, invalid sco index: %d at state [%d]",
380e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            sco_inx, btm_cb.sco_cb.sco_db[sco_inx].state);
381e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        status = BTM_UNKNOWN_ADDR;
382e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
383e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
384e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    return (status);
385e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
386e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#else
387e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    return (BTM_NO_RESOURCES);
388e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif
389e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
390e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
391e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (BTM_MAX_SCO_LINKS>0)
392e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
393e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
394e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         btm_send_connect_request
395e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
396e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      This function is called to respond to SCO connect indications
397e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
398e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          void
399e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
400e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
401e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic tBTM_STATUS btm_send_connect_request(UINT16 acl_handle,
402e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                                            tBTM_ESCO_PARAMS *p_setup)
403e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
404e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    UINT16 temp_pkt_types;
405e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    UINT8 xx;
406e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    tACL_CONN *p_acl;
407e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
408e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* Send connect request depending on version of spec */
409e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (!btm_cb.sco_cb.esco_supported)
410e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
411e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        if (!btsnd_hcic_add_SCO_conn (acl_handle, BTM_ESCO_2_SCO(p_setup->packet_types)))
412e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            return (BTM_NO_RESOURCES);
413e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
414e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    else
415e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
416e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        temp_pkt_types = (p_setup->packet_types & BTM_SCO_SUPPORTED_PKTS_MASK &
417e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                             btm_cb.btm_sco_pkt_types_supported);
418e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
419e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        /* OR in any exception packet types if at least 2.0 version of spec */
420e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        if (btm_cb.devcb.local_version.hci_version >= HCI_PROTO_VERSION_2_0)
421e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        {
422e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            temp_pkt_types |= ((p_setup->packet_types & BTM_SCO_EXCEPTION_PKTS_MASK) |
423e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                (btm_cb.btm_sco_pkt_types_supported & BTM_SCO_EXCEPTION_PKTS_MASK));
424e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        }
425e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
426e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        /* Finally, remove EDR eSCO if the remote device doesn't support it */
427e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        /* UPF25:  Only SCO was brought up in this case */
428e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        btm_handle_to_acl_index(acl_handle);
429e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        if ((xx = btm_handle_to_acl_index(acl_handle)) < MAX_L2CAP_LINKS)
430e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        {
431e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            p_acl = &btm_cb.acl_db[xx];
432e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            if (!HCI_EDR_ESCO_2MPS_SUPPORTED(p_acl->features))
433e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
434e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
435e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                BTM_TRACE_WARNING0("BTM Remote does not support 2-EDR eSCO");
436e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                temp_pkt_types |= (HCI_ESCO_PKT_TYPES_MASK_NO_2_EV3 |
437e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                                   HCI_ESCO_PKT_TYPES_MASK_NO_2_EV5);
438e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
439e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            if (!HCI_EDR_ESCO_3MPS_SUPPORTED(p_acl->features))
440e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
441e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
442e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                BTM_TRACE_WARNING0("BTM Remote does not support 3-EDR eSCO");
443e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                temp_pkt_types |= (HCI_ESCO_PKT_TYPES_MASK_NO_3_EV3 |
444e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                                   HCI_ESCO_PKT_TYPES_MASK_NO_3_EV5);
445e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
446e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        }
447e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
448e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
449e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        BTM_TRACE_API6("      txbw 0x%x, rxbw 0x%x, lat 0x%x, voice 0x%x, retrans 0x%02x, pkt 0x%04x",
450e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            p_setup->tx_bw, p_setup->rx_bw,
451e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            p_setup->max_latency, p_setup->voice_contfmt,
452e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            p_setup->retrans_effort, temp_pkt_types);
4536ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach
454e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        if (!btsnd_hcic_setup_esco_conn(acl_handle,
455e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                                        p_setup->tx_bw,
456e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                                        p_setup->rx_bw,
457e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                                        p_setup->max_latency,
458e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                                        p_setup->voice_contfmt,
459e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                                        p_setup->retrans_effort,
460e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                                        temp_pkt_types))
461e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            return (BTM_NO_RESOURCES);
462e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        else
463e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            p_setup->packet_types = temp_pkt_types;
464e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
465e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
466e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    return (BTM_CMD_STARTED);
467e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
468e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif
469e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
470e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
471e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
472e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         btm_set_sco_ind_cback
473e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
474e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      This function is called to register for TCS SCO connect
475e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  indications.
476e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
477e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          void
478e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
479e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
480e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid btm_set_sco_ind_cback( tBTM_SCO_IND_CBACK *sco_ind_cb )
481e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
482e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    btm_cb.sco_cb.app_sco_ind_cb = sco_ind_cb;
483e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
484e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
485e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
486e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
487e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         btm_accept_sco_link
488e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
489e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      This function is called to respond to TCS SCO connect
490e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  indications
491e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
492e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          void
493e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
494e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
495e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid btm_accept_sco_link(UINT16 sco_inx, tBTM_ESCO_PARAMS *p_setup,
496e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                         tBTM_SCO_CB *p_conn_cb, tBTM_SCO_CB *p_disc_cb)
497e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
498e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (BTM_MAX_SCO_LINKS>0)
499e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    tSCO_CONN        *p_sco;
500e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
501e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (sco_inx >= BTM_MAX_SCO_LINKS)
502e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
503e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        BTM_TRACE_ERROR1("btm_accept_sco_link: Invalid sco_inx(%d)", sco_inx);
504e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return;
505e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
506e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
507e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* Link role is ignored in for this message */
508e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    p_sco = &btm_cb.sco_cb.sco_db[sco_inx];
509e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    p_sco->p_conn_cb = p_conn_cb;
510e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    p_sco->p_disc_cb = p_disc_cb;
511e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    p_sco->esco.data.link_type = BTM_LINK_TYPE_ESCO; /* Accept with all supported types */
512e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
513e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTM_TRACE_DEBUG1("TCS accept SCO: Packet Types 0x%04x", p_setup->packet_types);
514e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
515e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    btm_esco_conn_rsp(sco_inx, HCI_SUCCESS, p_sco->esco.data.bd_addr, p_setup);
516e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#else
517e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    btm_reject_sco_link(sco_inx);
518e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif
519e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
520e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
521e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
522e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
523e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         btm_reject_sco_link
524e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
525e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      This function is called to respond to SCO connect indications
526e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
527e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          void
528e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
529e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
530e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid btm_reject_sco_link( UINT16 sco_inx )
531e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
532e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    btm_esco_conn_rsp(sco_inx, HCI_ERR_HOST_REJECT_RESOURCES,
533e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                      btm_cb.sco_cb.sco_db[sco_inx].esco.data.bd_addr, NULL);
534e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
535e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
536e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
537e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
538e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         BTM_CreateSco
539e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
540e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      This function is called to create an SCO connection. If the
541e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  "is_orig" flag is TRUE, the connection will be originated,
542e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  otherwise BTM will wait for the other side to connect.
543e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
544e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  NOTE:  If BTM_IGNORE_SCO_PKT_TYPE is passed in the pkt_types
545e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                      parameter the default packet types is used.
546e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
547e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          BTM_UNKNOWN_ADDR if the ACL connection is not up
548e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  BTM_BUSY         if another SCO being set up to
549e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                                   the same BD address
550e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  BTM_NO_RESOURCES if the max SCO limit has been reached
551e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  BTM_CMD_STARTED  if the connection establishment is started.
552e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                                   In this case, "*p_sco_inx" is filled in
553e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                                   with the sco index used for the connection.
554e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
555e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
556e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachtBTM_STATUS BTM_CreateSco (BD_ADDR remote_bda, BOOLEAN is_orig, UINT16 pkt_types,
557e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                           UINT16 *p_sco_inx, tBTM_SCO_CB *p_conn_cb,
558e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                           tBTM_SCO_CB *p_disc_cb)
559e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
560e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (BTM_MAX_SCO_LINKS > 0)
561e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    tBTM_ESCO_PARAMS *p_setup;
562e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    tSCO_CONN        *p = &btm_cb.sco_cb.sco_db[0];
563e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    UINT16            xx;
564e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    UINT16            acl_handle = 0;
565e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    UINT16            temp_pkt_types;
566e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    tACL_CONN        *p_acl;
567e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
568e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (BTM_PWR_MGR_INCLUDED == TRUE) && (BTM_SCO_WAKE_PARKED_LINK == TRUE)
569e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    tBTM_PM_MODE      md;
570e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    tBTM_PM_PWR_MD    pm;
571e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#else
572e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    UINT8             mode;
573e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif
574e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
575e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    *p_sco_inx = BTM_INVALID_SCO_INDEX;
576e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
577e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* If originating, ensure that there is an ACL connection to the BD Address */
578e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (is_orig)
579e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
580e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        if ((!remote_bda) || ((acl_handle = BTM_GetHCIConnHandle (remote_bda)) == 0xFFFF))
581e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            return (BTM_UNKNOWN_ADDR);
582e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
583e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
584e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (remote_bda)
585e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
586e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        /* If any SCO is being established to the remote BD address, refuse this */
587e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++)
588e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        {
589e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            if (((p->state == SCO_ST_CONNECTING) || (p->state == SCO_ST_LISTENING)
590e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                || (p->state == SCO_ST_PEND_UNPARK))
591e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                && (!memcmp (p->esco.data.bd_addr, remote_bda, BD_ADDR_LEN)))
592e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
593e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                return (BTM_BUSY);
594e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
595e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        }
596e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
597e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    else
598e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
599e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        /* Support only 1 wildcard BD address at a time */
600e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++)
601e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        {
602e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            if ((p->state == SCO_ST_LISTENING) && (!p->rem_bd_known))
603e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                return (BTM_BUSY);
604e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        }
605e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
606e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
607e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* Now, try to find an unused control block, and kick off the SCO establishment */
608e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    for (xx = 0, p = &btm_cb.sco_cb.sco_db[0]; xx < BTM_MAX_SCO_LINKS; xx++, p++)
609e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
610e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        if (p->state == SCO_ST_UNUSED)
611e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        {
612e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            if (remote_bda)
613e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
614e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                if (is_orig)
615e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                {
616e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    /* can not create SCO link if in park mode */
617e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (BTM_PWR_MGR_INCLUDED == TRUE) && (BTM_SCO_WAKE_PARKED_LINK == TRUE)
618e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    if(BTM_ReadPowerMode(remote_bda, &md) == BTM_SUCCESS)
619e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    {
620e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                        if (md == BTM_PM_MD_PARK || md == BTM_PM_MD_SNIFF)
621e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                        {
622e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/* Coverity: FALSE-POSITIVE error from Coverity tool. Please do NOT remove following comment. */
623e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/* coverity[uninit_use_in_call] False-positive: setting the mode to BTM_PM_MD_ACTIVE only uses settings.mode
624e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                                the other data members of tBTM_PM_PWR_MD are ignored
6256ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach*/
626e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                            pm.mode = BTM_PM_MD_ACTIVE;
627e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                            BTM_SetPowerMode(BTM_PM_SET_ONLY_ID, remote_bda, &pm);
628e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                            p->state = SCO_ST_PEND_UNPARK;
629e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                        }
630e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    }
631e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#elif BTM_PWR_MGR_INCLUDED == TRUE
632e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    if( (BTM_ReadPowerMode(remote_bda, &mode) == BTM_SUCCESS) && (mode == BTM_PM_MD_PARK) )
633e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                        return (BTM_WRONG_MODE);
634e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#else
635e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    if( (BTM_ReadAclMode(remote_bda, &mode) == BTM_SUCCESS) && (mode == BTM_ACL_MODE_PARK) )
636e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                        return (BTM_WRONG_MODE);
637e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif
638e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                }
639e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                memcpy (p->esco.data.bd_addr, remote_bda, BD_ADDR_LEN);
640e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                p->rem_bd_known = TRUE;
641e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
642e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            else
643e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                p->rem_bd_known = FALSE;
644e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
645e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            /* Link role is ignored in for this message */
646e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            if (pkt_types == BTM_IGNORE_SCO_PKT_TYPE)
647e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                pkt_types = btm_cb.sco_cb.def_esco_parms.packet_types;
648e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
649e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            p_setup = &p->esco.setup;
650e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            *p_setup = btm_cb.sco_cb.def_esco_parms;
651e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            p_setup->packet_types = (btm_cb.sco_cb.desired_sco_mode == BTM_LINK_TYPE_SCO)
652e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                ? (pkt_types & BTM_SCO_LINK_ONLY_MASK) : pkt_types;
653e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
654e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            temp_pkt_types = (p_setup->packet_types & BTM_SCO_SUPPORTED_PKTS_MASK &
655e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                             btm_cb.btm_sco_pkt_types_supported);
656e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
657e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            /* OR in any exception packet types if at least 2.0 version of spec */
658e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            if (btm_cb.devcb.local_version.hci_version >= HCI_PROTO_VERSION_2_0)
659e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
660e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                if (btm_cb.sco_cb.desired_sco_mode == HCI_LINK_TYPE_ESCO)
661e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                {
662e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    temp_pkt_types |= ((p_setup->packet_types & BTM_SCO_EXCEPTION_PKTS_MASK) |
663e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                        (btm_cb.btm_sco_pkt_types_supported & BTM_SCO_EXCEPTION_PKTS_MASK));
664e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                }
665e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                else    /* Only using SCO packet types; turn off EDR also */
666e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                {
667e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    temp_pkt_types |= BTM_SCO_EXCEPTION_PKTS_MASK;
668e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                }
669e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
670e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
671e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            p_setup->packet_types = temp_pkt_types;
672e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            p->p_conn_cb  = p_conn_cb;
673e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            p->p_disc_cb  = p_disc_cb;
674e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            p->hci_handle = BTM_INVALID_HCI_HANDLE;
675e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            p->is_orig = is_orig;
676e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
677e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            if( p->state != SCO_ST_PEND_UNPARK )
678e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
679e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                if (is_orig)
680e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                {
681e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    /* If role change is in progress, do not proceed with SCO setup
682e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                     * Wait till role change is complete */
683e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    p_acl = btm_bda_to_acl(remote_bda);
684e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    if (p_acl && p_acl->switch_role_state != BTM_ACL_SWKEY_STATE_IDLE)
685e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    {
686e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                        BTM_TRACE_API1("Role Change is in progress for ACL handle 0x%04x",acl_handle);
687e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                        p->state = SCO_ST_PEND_ROLECHANGE;
688e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
689e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    }
690e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                }
691e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
692e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
693e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            if( p->state != SCO_ST_PEND_UNPARK && p->state != SCO_ST_PEND_ROLECHANGE )
6946ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach            {
695e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                if (is_orig)
696e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                {
697e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    BTM_TRACE_API2("BTM_CreateSco -> (e)SCO Link for ACL handle 0x%04x, Desired Type %d",
698e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                                    acl_handle, btm_cb.sco_cb.desired_sco_mode);
699e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
700e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    if ((btm_send_connect_request(acl_handle, p_setup)) != BTM_CMD_STARTED)
701e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                        return (BTM_NO_RESOURCES);
702e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
703e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    p->state = SCO_ST_CONNECTING;
704e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                }
705e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                else
706e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    p->state = SCO_ST_LISTENING;
707e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
708e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
709e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            *p_sco_inx = xx;
710e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
711e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            return (BTM_CMD_STARTED);
712e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        }
713e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
714e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
715e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif
716e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* If here, all SCO blocks in use */
717e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    return (BTM_NO_RESOURCES);
718e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
719e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
720e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (BTM_PWR_MGR_INCLUDED == TRUE) && (BTM_SCO_WAKE_PARKED_LINK == TRUE)
721e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
722e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
723e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         btm_sco_chk_pend_unpark
724e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
725e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      This function is called by BTIF when there is a mode change
726e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  event to see if there are SCO commands waiting for the unpark.
727e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
728e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          void
729e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
730e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
731e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid btm_sco_chk_pend_unpark (UINT8 hci_status, UINT16 hci_handle)
732e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
733e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (BTM_MAX_SCO_LINKS>0)
734e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    UINT16      xx;
735e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    UINT16      acl_handle;
736e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    tSCO_CONN   *p = &btm_cb.sco_cb.sco_db[0];
737e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
738e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++)
739e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
740e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        if ((p->state == SCO_ST_PEND_UNPARK) &&
741e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            ((acl_handle = BTM_GetHCIConnHandle (p->esco.data.bd_addr)) == hci_handle))
742e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
743e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        {
744e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            BTM_TRACE_API3("btm_sco_chk_pend_unpark -> (e)SCO Link for ACL handle 0x%04x, Desired Type %d, hci_status 0x%02x",
745e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                                    acl_handle, btm_cb.sco_cb.desired_sco_mode, hci_status);
746e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
747e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            if ((btm_send_connect_request(acl_handle, &p->esco.setup)) == BTM_CMD_STARTED)
748e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                p->state = SCO_ST_CONNECTING;
749e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        }
750e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
751e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif
752e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
753e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif
754e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
755e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
756e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
757e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         btm_sco_chk_pend_rolechange
758e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
759e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      This function is called by BTIF when there is a role change
760e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  event to see if there are SCO commands waiting for the role change.
761e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
762e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          void
763e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
764e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
765e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid btm_sco_chk_pend_rolechange (UINT16 hci_handle)
766e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
767e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (BTM_MAX_SCO_LINKS>0)
768e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    UINT16      xx;
769e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    UINT16      acl_handle;
770e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    tSCO_CONN   *p = &btm_cb.sco_cb.sco_db[0];
771e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
772e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++)
773e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
7746ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach        if ((p->state == SCO_ST_PEND_ROLECHANGE) &&
775e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            ((acl_handle = BTM_GetHCIConnHandle (p->esco.data.bd_addr)) == hci_handle))
776e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
777e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        {
778e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            BTM_TRACE_API1("btm_sco_chk_pend_rolechange -> (e)SCO Link for ACL handle 0x%04x", acl_handle);
779e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
780e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            if ((btm_send_connect_request(acl_handle, &p->esco.setup)) == BTM_CMD_STARTED)
781e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                p->state = SCO_ST_CONNECTING;
782e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        }
783e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
784e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif
785e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
786e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
787e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
788e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
789e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         btm_sco_conn_req
790e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
791e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      This function is called by BTIF when an SCO connection
792e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  request is received from a remote.
793e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
794e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          void
795e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
796e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
797e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid btm_sco_conn_req (BD_ADDR bda,  DEV_CLASS dev_class, UINT8 link_type)
798e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
799e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (BTM_MAX_SCO_LINKS>0)
800e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    tSCO_CB     *p_sco = &btm_cb.sco_cb;
801e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    tSCO_CONN   *p = &p_sco->sco_db[0];
802e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    UINT16      xx;
803e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    tBTM_ESCO_CONN_REQ_EVT_DATA evt_data;
804e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
805e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++)
806e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
807e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        /*
808e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach         * If the sco state is in the SCO_ST_CONNECTING state, we still need
809e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach         * to return accept sco to avoid race conditon for sco creation
810e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach         */
811e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        if (((p->state == SCO_ST_LISTENING && p->rem_bd_known) || p->state == SCO_ST_CONNECTING)
812e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach         && (!memcmp (p->esco.data.bd_addr, bda, BD_ADDR_LEN)))
813e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        {
814e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            /* If this guy was a wildcard, he is not one any more */
815e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            p->rem_bd_known = TRUE;
816e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            p->esco.data.link_type = link_type;
817e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            p->state = SCO_ST_W4_CONN_RSP;
818e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            memcpy (p->esco.data.bd_addr, bda, BD_ADDR_LEN);
819e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
820e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            /* If no callback, auto-accept the connection if packet types match */
821e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            if (!p->esco.p_esco_cback)
822e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
823e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                /* If requesting eSCO reject if default parameters are SCO only */
824e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                if ((link_type == BTM_LINK_TYPE_ESCO
825e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    && !(p_sco->def_esco_parms.packet_types & BTM_ESCO_LINK_ONLY_MASK)
826e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    && ((p_sco->def_esco_parms.packet_types & BTM_SCO_EXCEPTION_PKTS_MASK)
827e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                       == BTM_SCO_EXCEPTION_PKTS_MASK))
828e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
829e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    /* Reject request if SCO is desired but no SCO packets delected */
830e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    || (link_type == BTM_LINK_TYPE_SCO
831e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    && !(p_sco->def_esco_parms.packet_types & BTM_SCO_LINK_ONLY_MASK)))
832e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                {
833e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    btm_esco_conn_rsp(xx, HCI_ERR_HOST_REJECT_RESOURCES, bda, NULL);
834e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                }
835e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                else    /* Accept the request */
836e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                {
837e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    btm_esco_conn_rsp(xx, HCI_SUCCESS, bda, NULL);
838e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                }
839e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
840e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            else    /* Notify upper layer of connect indication */
841e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
842e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                memcpy(evt_data.bd_addr, bda, BD_ADDR_LEN);
843e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                memcpy(evt_data.dev_class, dev_class, DEV_CLASS_LEN);
844e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                evt_data.link_type = link_type;
845e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                evt_data.sco_inx = xx;
846e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                p->esco.p_esco_cback(BTM_ESCO_CONN_REQ_EVT, (tBTM_ESCO_EVT_DATA *)&evt_data);
847e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
848e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
849e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            return;
850e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        }
851e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
852e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
853e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* TCS usage */
8546ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach    if (btm_cb.sco_cb.app_sco_ind_cb)
855e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
856e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        /* Now, try to find an unused control block */
857e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        for (xx = 0, p = &btm_cb.sco_cb.sco_db[0]; xx < BTM_MAX_SCO_LINKS; xx++, p++)
858e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        {
859e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            if (p->state == SCO_ST_UNUSED)
860e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
861e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                p->is_orig = FALSE;
862e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                p->state = SCO_ST_LISTENING;
863e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
864e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                p->esco.data.link_type = link_type;
865e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                memcpy (p->esco.data.bd_addr, bda, BD_ADDR_LEN);
866e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                p->rem_bd_known = TRUE;
867e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                break;
868e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
869e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        }
8706ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach        if( xx < BTM_MAX_SCO_LINKS)
8716ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach        {
872e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            btm_cb.sco_cb.app_sco_ind_cb(xx);
873e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            return;
874e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        }
875e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
876e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
877e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif
878e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* If here, no one wants the SCO connection. Reject it */
879e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTM_TRACE_WARNING0("btm_sco_conn_req: No one wants this SCO connection; rejecting it");
880e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    btm_esco_conn_rsp(BTM_MAX_SCO_LINKS, HCI_ERR_HOST_REJECT_RESOURCES, bda, NULL);
881e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
882e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
883e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
884e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
885e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         btm_sco_connected
886e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
887e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      This function is called by BTIF when an (e)SCO connection
888e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  is connected.
889e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
890e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          void
891e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
892e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
893e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid btm_sco_connected (UINT8 hci_status, BD_ADDR bda, UINT16 hci_handle,
894e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                        tBTM_ESCO_DATA *p_esco_data)
895e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
896e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (BTM_MAX_SCO_LINKS>0)
897e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    tSCO_CONN   *p = &btm_cb.sco_cb.sco_db[0];
898e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    UINT16      xx;
899e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BOOLEAN     spt = FALSE;
900e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    tBTM_CHG_ESCO_PARAMS parms;
901e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif
902e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
903e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    btm_cb.sco_cb.sco_disc_reason = hci_status;
904e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
905e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (BTM_MAX_SCO_LINKS>0)
906e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++)
907e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
908e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        if (((p->state == SCO_ST_CONNECTING) ||
909e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach             (p->state == SCO_ST_LISTENING)  ||
910e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach             (p->state == SCO_ST_W4_CONN_RSP))
911e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach         && (p->rem_bd_known)
912e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach         && (!bda || !memcmp (p->esco.data.bd_addr, bda, BD_ADDR_LEN)))
913e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        {
914e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            if (hci_status != HCI_SUCCESS)
915e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
916e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                /* Report the error if originator, otherwise remain in Listen mode */
917e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                if (p->is_orig)
918e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                {
919e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    /* If role switch is pending, we need try again after role switch is complete */
920e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    if(hci_status == HCI_ERR_ROLE_SWITCH_PENDING)
921e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    {
922e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                        BTM_TRACE_API1("Role Change pending for HCI handle 0x%04x",hci_handle);
923e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                        p->state = SCO_ST_PEND_ROLECHANGE;
924e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    }
925e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    /* avoid calling disconnect callback because of sco creation race */
926e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    else if (hci_status != HCI_ERR_LMP_ERR_TRANS_COLLISION)
927e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    {
928e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                        p->state = SCO_ST_UNUSED;
929e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                        (*p->p_disc_cb)(xx);
930e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    }
931e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                }
932e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                else
933e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                {
934e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    /* Notify the upper layer that incoming sco connection has failed. */
935e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    if (p->state == SCO_ST_CONNECTING)
936e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    {
937e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                        p->state = SCO_ST_UNUSED;
938e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                        (*p->p_disc_cb)(xx);
939e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    }
940e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    else
941e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                        p->state = SCO_ST_LISTENING;
942e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                }
943e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
944e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                return;
945e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
946e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
947e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            if (p->state == SCO_ST_LISTENING)
948e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                spt = TRUE;
949e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
950e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            p->state = SCO_ST_CONNECTED;
951e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            p->hci_handle = hci_handle;
952e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
953e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            if (!btm_cb.sco_cb.esco_supported)
954e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
955e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                p->esco.data.link_type = BTM_LINK_TYPE_SCO;
956e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                if (spt)
957e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                {
958e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    parms.packet_types = p->esco.setup.packet_types;
959e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    /* Keep the other parameters the same for SCO */
960e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    parms.max_latency = p->esco.setup.max_latency;
961e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    parms.retrans_effort = p->esco.setup.retrans_effort;
962e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
963e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    BTM_ChangeEScoLinkParms(xx, &parms);
964e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                }
965e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
966e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            else
967e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
968e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                if (p_esco_data)
969e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    p->esco.data = *p_esco_data;
970e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
971e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
972e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            (*p->p_conn_cb)(xx);
973e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
974e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            return;
975e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        }
976e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
977e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif
978e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
979e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
980e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
981e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
982e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
983e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         btm_find_scb_by_handle
984e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
985e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      Look through all active SCO connection for a match based on the
986e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  HCI handle.
987e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
9886ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Returns          index to matched SCO connection CB, or BTM_MAX_SCO_LINKS if
989e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  no match.
990e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
991e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
992e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachUINT16  btm_find_scb_by_handle (UINT16 handle)
993e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
994e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    int         xx;
995e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    tSCO_CONN    *p = &btm_cb.sco_cb.sco_db[0];
996e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
997e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++)
998e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
999e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        if ((p->state == SCO_ST_CONNECTED) && (p->hci_handle == handle))
1000e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        {
1001e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            return (xx);
1002e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        }
1003e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
1004e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1005e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* If here, no match found */
1006e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    return (xx);
1007e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
1008e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1009e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
1010e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1011e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         BTM_RemoveSco
1012e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1013e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      This function is called to remove a specific SCO connection.
1014e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1015e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          status of the operation
1016e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1017e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
1018e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachtBTM_STATUS BTM_RemoveSco (UINT16 sco_inx)
1019e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
1020e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (BTM_MAX_SCO_LINKS>0)
1021e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    tSCO_CONN   *p = &btm_cb.sco_cb.sco_db[sco_inx];
1022e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    UINT16       tempstate;
1023e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1024e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* Validity check */
1025e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if ((sco_inx >= BTM_MAX_SCO_LINKS) || (p->state == SCO_ST_UNUSED))
1026e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return (BTM_UNKNOWN_ADDR);
1027e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1028e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* If no HCI handle, simply drop the connection and return */
1029e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (p->hci_handle == BTM_INVALID_HCI_HANDLE || p->state == SCO_ST_PEND_UNPARK)
1030e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
1031e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        p->hci_handle = BTM_INVALID_HCI_HANDLE;
1032e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        p->state = SCO_ST_UNUSED;
1033e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        p->esco.p_esco_cback = NULL;    /* Deregister the eSCO event callback */
1034e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return (BTM_SUCCESS);
1035e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
1036e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1037e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    tempstate = p->state;
1038e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    p->state = SCO_ST_DISCONNECTING;
1039e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1040e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (!btsnd_hcic_disconnect (p->hci_handle, HCI_ERR_PEER_USER))
1041e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
1042e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        p->state = tempstate;
1043e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return (BTM_NO_RESOURCES);
1044e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
1045e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1046e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    return (BTM_CMD_STARTED);
1047e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#else
1048e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    return (BTM_NO_RESOURCES);
1049e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif
1050e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
1051e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1052e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
1053e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1054e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         btm_remove_sco_links
1055e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1056e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      This function is called to remove all sco links for an ACL link.
1057e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1058e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          void
1059e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1060e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
1061e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid btm_remove_sco_links (BD_ADDR bda)
1062e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
1063e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (BTM_MAX_SCO_LINKS>0)
1064e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    tSCO_CONN   *p = &btm_cb.sco_cb.sco_db[0];
1065e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    UINT16       xx;
1066e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1067e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++)
1068e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
1069e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        if (p->rem_bd_known && (!memcmp (p->esco.data.bd_addr, bda, BD_ADDR_LEN)))
1070e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        {
1071e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            BTM_RemoveSco(xx);
1072e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        }
1073e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
1074e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif
1075e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
1076e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1077e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
1078e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1079e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         btm_sco_removed
1080e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1081e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      This function is called by BTIF when an SCO connection
10826ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach**                  is removed.
1083e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1084e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          void
1085e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1086e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
1087e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid btm_sco_removed (UINT16 hci_handle, UINT8 reason)
1088e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
1089e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (BTM_MAX_SCO_LINKS>0)
1090e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    tSCO_CONN   *p = &btm_cb.sco_cb.sco_db[0];
1091e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    UINT16      xx;
1092e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif
1093e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1094e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    btm_cb.sco_cb.sco_disc_reason = reason;
1095e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1096e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (BTM_MAX_SCO_LINKS>0)
1097e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    p = &btm_cb.sco_cb.sco_db[0];
1098e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++)
1099e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
1100e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        if ((p->state != SCO_ST_UNUSED) && (p->state != SCO_ST_LISTENING) && (p->hci_handle == hci_handle))
1101e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        {
1102e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            btm_sco_flush_sco_data(xx);
1103e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1104e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            p->state = SCO_ST_UNUSED;
1105e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            p->hci_handle = BTM_INVALID_HCI_HANDLE;
1106e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            p->rem_bd_known = FALSE;
1107e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            p->esco.p_esco_cback = NULL;    /* Deregister eSCO callback */
1108e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            (*p->p_disc_cb)(xx);
1109e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1110e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            return;
1111e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        }
1112e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
1113e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif
1114e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
1115e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1116e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1117e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
1118e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1119e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         btm_sco_acl_removed
1120e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1121e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      This function is called when an ACL connection is
1122e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  removed. If the BD address is NULL, it is assumed that
1123e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  the local device is down, and all SCO links are removed.
1124e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  If a specific BD address is passed, only SCO connections
1125e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  to that BD address are removed.
1126e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1127e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          void
1128e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1129e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
1130e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid btm_sco_acl_removed (BD_ADDR bda)
1131e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
1132e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (BTM_MAX_SCO_LINKS>0)
1133e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    tSCO_CONN   *p = &btm_cb.sco_cb.sco_db[0];
1134e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    UINT16      xx;
1135e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1136e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++)
1137e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
1138e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        if (p->state != SCO_ST_UNUSED)
1139e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        {
1140e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            if ((!bda) || (!memcmp (p->esco.data.bd_addr, bda, BD_ADDR_LEN) && p->rem_bd_known))
1141e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
1142e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                btm_sco_flush_sco_data(xx);
11436ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach
1144e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                p->state = SCO_ST_UNUSED;
1145e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                p->esco.p_esco_cback = NULL;    /* Deregister eSCO callback */
1146e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                (*p->p_disc_cb)(xx);
1147e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
1148e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        }
1149e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
1150e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif
1151e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
1152e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1153e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1154e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
1155e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1156e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         BTM_SetScoPacketTypes
1157e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1158e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      This function is called to set the packet types used for
1159e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  a specific SCO connection,
1160e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1161e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Parameters       pkt_types - One or more of the following
1162e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  BTM_SCO_PKT_TYPES_MASK_HV1
1163e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  BTM_SCO_PKT_TYPES_MASK_HV2
1164e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  BTM_SCO_PKT_TYPES_MASK_HV3
1165e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  BTM_SCO_PKT_TYPES_MASK_EV3
1166e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  BTM_SCO_PKT_TYPES_MASK_EV4
1167e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  BTM_SCO_PKT_TYPES_MASK_EV5
1168e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  BTM_SCO_PKT_TYPES_MASK_NO_2_EV3
1169e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  BTM_SCO_PKT_TYPES_MASK_NO_3_EV3
1170e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  BTM_SCO_PKT_TYPES_MASK_NO_2_EV5
1171e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  BTM_SCO_PKT_TYPES_MASK_NO_3_EV5
1172e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1173e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  BTM_SCO_LINK_ALL_MASK   - enables all supported types
1174e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1175e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          status of the operation
1176e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1177e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
1178e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachtBTM_STATUS BTM_SetScoPacketTypes (UINT16 sco_inx, UINT16 pkt_types)
1179e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
1180e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (BTM_MAX_SCO_LINKS>0)
1181e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    tBTM_CHG_ESCO_PARAMS parms;
1182e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    tSCO_CONN           *p;
1183e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1184e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* Validity check */
1185e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (sco_inx >= BTM_MAX_SCO_LINKS)
1186e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return (BTM_UNKNOWN_ADDR);
1187e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1188e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    p = &btm_cb.sco_cb.sco_db[sco_inx];
1189e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    parms.packet_types = pkt_types;
1190e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1191e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* Keep the other parameters the same for SCO */
1192e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    parms.max_latency = p->esco.setup.max_latency;
1193e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    parms.retrans_effort = p->esco.setup.retrans_effort;
1194e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1195e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    return (BTM_ChangeEScoLinkParms(sco_inx, &parms));
1196e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#else
1197e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    return (BTM_UNKNOWN_ADDR);
1198e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif
1199e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
1200e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1201e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1202e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
1203e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1204e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         BTM_ReadScoPacketTypes
1205e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1206e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      This function is read the packet types used for a specific
1207e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  SCO connection.
1208e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1209e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          Packet types supported for the connection
1210e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  One or more of the following (bitmask):
1211e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  BTM_SCO_PKT_TYPES_MASK_HV1
1212e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  BTM_SCO_PKT_TYPES_MASK_HV2
1213e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  BTM_SCO_PKT_TYPES_MASK_HV3
1214e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  BTM_SCO_PKT_TYPES_MASK_EV3
1215e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  BTM_SCO_PKT_TYPES_MASK_EV4
1216e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  BTM_SCO_PKT_TYPES_MASK_EV5
1217e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  BTM_SCO_PKT_TYPES_MASK_NO_2_EV3
1218e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  BTM_SCO_PKT_TYPES_MASK_NO_3_EV3
1219e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  BTM_SCO_PKT_TYPES_MASK_NO_2_EV5
1220e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  BTM_SCO_PKT_TYPES_MASK_NO_3_EV5
1221e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1222e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
1223e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachUINT16 BTM_ReadScoPacketTypes (UINT16 sco_inx)
1224e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
1225e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (BTM_MAX_SCO_LINKS>0)
1226e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    tSCO_CONN *p = &btm_cb.sco_cb.sco_db[sco_inx];
1227e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1228e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* Validity check */
1229e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if ((sco_inx < BTM_MAX_SCO_LINKS) && (p->state == SCO_ST_CONNECTED))
1230e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return (p->esco.setup.packet_types);
1231e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    else
1232e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return (0);
1233e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#else
1234e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    return (0);
1235e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif
1236e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
1237e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1238e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
1239e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1240e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         BTM_ReadScoDiscReason
1241e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1242e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      This function is returns the reason why an (e)SCO connection
1243e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  has been removed. It contains the value until read, or until
1244e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  another (e)SCO connection has disconnected.
1245e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1246e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          HCI reason or BTM_INVALID_SCO_DISC_REASON if not set.
1247e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1248e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
1249e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachUINT16 BTM_ReadScoDiscReason (void)
1250e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
1251e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    UINT16 res = btm_cb.sco_cb.sco_disc_reason;
1252e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    btm_cb.sco_cb.sco_disc_reason = BTM_INVALID_SCO_DISC_REASON;
1253e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    return (res);
1254e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
1255e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1256e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
1257e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1258e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         BTM_ReadDeviceScoPacketTypes
1259e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1260e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      This function is read the SCO packet types that
1261e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  the device supports.
1262e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1263e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          Packet types supported by the device.
1264e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  One or more of the following (bitmask):
1265e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  BTM_SCO_PKT_TYPES_MASK_HV1
1266e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  BTM_SCO_PKT_TYPES_MASK_HV2
1267e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  BTM_SCO_PKT_TYPES_MASK_HV3
1268e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  BTM_SCO_PKT_TYPES_MASK_EV3
1269e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  BTM_SCO_PKT_TYPES_MASK_EV4
1270e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  BTM_SCO_PKT_TYPES_MASK_EV5
1271e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  BTM_SCO_PKT_TYPES_MASK_NO_2_EV3
1272e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  BTM_SCO_PKT_TYPES_MASK_NO_3_EV3
1273e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  BTM_SCO_PKT_TYPES_MASK_NO_2_EV5
1274e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  BTM_SCO_PKT_TYPES_MASK_NO_3_EV5
1275e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1276e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
1277e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachUINT16 BTM_ReadDeviceScoPacketTypes (void)
1278e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
1279e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    return (btm_cb.btm_sco_pkt_types_supported);
1280e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
1281e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1282e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
1283e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1284e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         BTM_ReadScoHandle
1285e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1286e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      This function is used to read the HCI handle used for a specific
1287e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  SCO connection,
1288e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1289e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          handle for the connection, or 0xFFFF if invalid SCO index.
1290e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1291e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
1292e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachUINT16 BTM_ReadScoHandle (UINT16 sco_inx)
1293e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
1294e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (BTM_MAX_SCO_LINKS>0)
1295e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    tSCO_CONN   *p = &btm_cb.sco_cb.sco_db[sco_inx];
1296e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1297e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* Validity check */
1298e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if ((sco_inx < BTM_MAX_SCO_LINKS) && (p->state == SCO_ST_CONNECTED))
1299e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return (p->hci_handle);
1300e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    else
1301e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return (BTM_INVALID_HCI_HANDLE);
1302e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#else
1303e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    return (BTM_INVALID_HCI_HANDLE);
1304e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif
1305e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
1306e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1307e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
1308e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1309e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         BTM_ReadScoBdAddr
1310e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1311e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      This function is read the remote BD Address for a specific
1312e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  SCO connection,
1313e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1314e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          pointer to BD address or NULL if not known
1315e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1316e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
1317e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachUINT8 *BTM_ReadScoBdAddr (UINT16 sco_inx)
1318e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
1319e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (BTM_MAX_SCO_LINKS>0)
1320e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    tSCO_CONN   *p = &btm_cb.sco_cb.sco_db[sco_inx];
1321e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1322e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* Validity check */
1323e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if ((sco_inx < BTM_MAX_SCO_LINKS) && (p->rem_bd_known))
1324e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return (p->esco.data.bd_addr);
1325e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    else
1326e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return (NULL);
1327e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#else
1328e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    return (NULL);
1329e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif
1330e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
1331e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1332e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
1333e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1334e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         BTM_SetEScoMode
1335e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1336e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      This function sets up the negotiated parameters for SCO or
1337e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  eSCO, and sets as the default mode used for outgoing calls to
1338e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  BTM_CreateSco.  It does not change any currently active (e)SCO links.
1339e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  Note:  Incoming (e)SCO connections will always use packet types
1340e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                      supported by the controller.  If eSCO is not desired the
1341e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                      feature should be disabled in the controller's feature mask.
1342e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1343e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          BTM_SUCCESS if the successful.
1344e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  BTM_BUSY if there are one or more active (e)SCO links.
1345e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1346e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
1347e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachtBTM_STATUS BTM_SetEScoMode (tBTM_SCO_TYPE sco_mode, tBTM_ESCO_PARAMS *p_parms)
1348e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
1349e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    tSCO_CB          *p_esco = &btm_cb.sco_cb;
1350e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    tBTM_ESCO_PARAMS *p_def = &p_esco->def_esco_parms;
1351e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1352e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (p_esco->esco_supported)
1353e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
1354e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        if (p_parms)
1355e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        {
1356e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            if (sco_mode == BTM_LINK_TYPE_ESCO)
1357e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                *p_def = *p_parms;  /* Save as the default parameters */
1358e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            else    /* Load only the SCO packet types */
1359e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
1360e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                p_def->packet_types = p_parms->packet_types;
1361e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                p_def->tx_bw            = BTM_64KBITS_RATE;
1362e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                p_def->rx_bw            = BTM_64KBITS_RATE;
1363e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                p_def->max_latency      = 0x000a;
1364e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                p_def->voice_contfmt    = 0x0060;
1365e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                p_def->retrans_effort   = 0;
1366e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1367e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                /* OR in any exception packet types if at least 2.0 version of spec */
1368e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                if (btm_cb.devcb.local_version.hci_version >= HCI_PROTO_VERSION_2_0)
1369e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                {
1370e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    p_def->packet_types |= BTM_SCO_EXCEPTION_PKTS_MASK;
1371e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                }
1372e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
1373e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        }
1374e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        p_esco->desired_sco_mode = sco_mode;
1375e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        BTM_TRACE_API1("BTM_SetEScoMode -> mode %d",  sco_mode);
1376e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
1377e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    else
1378e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
1379e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        p_esco->desired_sco_mode = BTM_LINK_TYPE_SCO;
1380e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        p_def->packet_types &= BTM_SCO_LINK_ONLY_MASK;
1381e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        p_def->retrans_effort = 0;
1382e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        BTM_TRACE_API0("BTM_SetEScoMode -> mode SCO (eSCO not supported)");
1383e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
1384e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1385e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTM_TRACE_DEBUG6("    txbw 0x%08x, rxbw 0x%08x, max_lat 0x%04x, voice 0x%04x, pkt 0x%04x, rtx effort 0x%02x",
1386e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                     p_def->tx_bw, p_def->rx_bw, p_def->max_latency,
1387e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                     p_def->voice_contfmt, p_def->packet_types,
1388e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                     p_def->retrans_effort);
1389e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1390e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    return (BTM_SUCCESS);
1391e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
1392e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1393e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1394e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1395e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
1396e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1397e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         BTM_RegForEScoEvts
1398e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1399e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      This function registers a SCO event callback with the
14006ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach**                  specified instance.  It should be used to received
1401e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  connection indication events and change of link parameter
14026ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach**                  events.
1403e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1404e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          BTM_SUCCESS if the successful.
1405e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  BTM_ILLEGAL_VALUE if there is an illegal sco_inx
14066ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach**                  BTM_MODE_UNSUPPORTED if controller version is not BT1.2 or
1407e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                          later or does not support eSCO.
1408e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1409e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
1410e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachtBTM_STATUS BTM_RegForEScoEvts (UINT16 sco_inx, tBTM_ESCO_CBACK *p_esco_cback)
1411e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
1412e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (BTM_MAX_SCO_LINKS>0)
1413e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (!btm_cb.sco_cb.esco_supported)
1414e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
1415e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        btm_cb.sco_cb.sco_db[sco_inx].esco.p_esco_cback = NULL;
1416e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return (BTM_MODE_UNSUPPORTED);
1417e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
1418e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1419e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (sco_inx < BTM_MAX_SCO_LINKS &&
1420e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        btm_cb.sco_cb.sco_db[sco_inx].state != SCO_ST_UNUSED)
1421e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
1422e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        btm_cb.sco_cb.sco_db[sco_inx].esco.p_esco_cback = p_esco_cback;
1423e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return (BTM_SUCCESS);
1424e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
1425e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    return (BTM_ILLEGAL_VALUE);
1426e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#else
1427e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    return (BTM_MODE_UNSUPPORTED);
1428e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif
1429e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
1430e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1431e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
1432e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1433e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         BTM_ReadEScoLinkParms
1434e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1435e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      This function returns the current eSCO link parameters for
1436e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  the specified handle.  This can be called anytime a connection
1437e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  is active, but is typically called after receiving the SCO
1438e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  opened callback.
1439e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1440e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  Note: If called over a 1.1 controller, only the packet types
1441e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                        field has meaning.
1442e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1443e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          BTM_SUCCESS if returned data is valid connection.
1444e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  BTM_WRONG_MODE if no connection with a peer device or bad sco_inx.
1445e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1446e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
1447e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachtBTM_STATUS BTM_ReadEScoLinkParms (UINT16 sco_inx, tBTM_ESCO_DATA *p_parms)
1448e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
1449e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (BTM_MAX_SCO_LINKS>0)
1450e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTM_TRACE_API1("BTM_ReadEScoLinkParms -> sco_inx 0x%04x", sco_inx);
1451e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
14526ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach    if (sco_inx < BTM_MAX_SCO_LINKS &&
1453e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        btm_cb.sco_cb.sco_db[sco_inx].state >= SCO_ST_CONNECTED)
1454e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
1455e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        *p_parms = btm_cb.sco_cb.sco_db[sco_inx].esco.data;
1456e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return (BTM_SUCCESS);
1457e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
1458e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif
1459e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1460e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    memset(p_parms, 0, sizeof(tBTM_ESCO_DATA));
1461e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    return (BTM_WRONG_MODE);
1462e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
1463e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1464e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
1465e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1466e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         BTM_ChangeEScoLinkParms
1467e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1468e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      This function requests renegotiation of the parameters on
1469e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  the current eSCO Link.  If any of the changes are accepted
1470e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  by the controllers, the BTM_ESCO_CHG_EVT event is sent in
1471e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  the tBTM_ESCO_CBACK function with the current settings of
1472e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  the link. The callback is registered through the call to
1473e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  BTM_SetEScoMode.
1474e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1475e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  Note: If called over a SCO link (including 1.1 controller),
1476e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                        a change packet type request is sent out instead.
1477e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1478e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          BTM_CMD_STARTED if command is successfully initiated.
1479e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  BTM_NO_RESOURCES - not enough resources to initiate command.
1480e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  BTM_WRONG_MODE if no connection with a peer device or bad sco_inx.
1481e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1482e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
1483e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachtBTM_STATUS BTM_ChangeEScoLinkParms (UINT16 sco_inx, tBTM_CHG_ESCO_PARAMS *p_parms)
1484e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
1485e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (BTM_MAX_SCO_LINKS>0)
1486e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    tBTM_ESCO_PARAMS *p_setup;
1487e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    tSCO_CONN        *p_sco;
1488e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    UINT16            temp_pkt_types;
14896ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach
1490e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* Make sure sco handle is valid and on an active link */
14916ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach    if (sco_inx >= BTM_MAX_SCO_LINKS ||
1492e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        btm_cb.sco_cb.sco_db[sco_inx].state != SCO_ST_CONNECTED)
1493e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return (BTM_WRONG_MODE);
14946ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach
1495e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    p_sco = &btm_cb.sco_cb.sco_db[sco_inx];
1496e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    p_setup = &p_sco->esco.setup;
1497e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1498e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* If SCO connection OR eSCO not supported just send change packet types */
1499e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (p_sco->esco.data.link_type == BTM_LINK_TYPE_SCO ||
1500e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        !btm_cb.sco_cb.esco_supported)
1501e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
15026ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach        p_setup->packet_types = p_parms->packet_types &
1503e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            (btm_cb.btm_sco_pkt_types_supported & BTM_SCO_LINK_ONLY_MASK);
15046ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach
1505e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1506e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        BTM_TRACE_API2("BTM_ChangeEScoLinkParms -> SCO Link for handle 0x%04x, pkt 0x%04x",
1507e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                         p_sco->hci_handle, p_setup->packet_types);
1508e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1509e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        if (!btsnd_hcic_change_conn_type (p_sco->hci_handle,
1510e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                                     BTM_ESCO_2_SCO(p_setup->packet_types)))
1511e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            return (BTM_NO_RESOURCES);
1512e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
1513e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    else
1514e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
1515e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        temp_pkt_types = (p_parms->packet_types & BTM_SCO_SUPPORTED_PKTS_MASK &
1516e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                             btm_cb.btm_sco_pkt_types_supported);
1517e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1518e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        /* OR in any exception packet types if at least 2.0 version of spec */
1519e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        if (btm_cb.devcb.local_version.hci_version >= HCI_PROTO_VERSION_2_0)
1520e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        {
1521e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            temp_pkt_types |= ((p_parms->packet_types & BTM_SCO_EXCEPTION_PKTS_MASK) |
1522e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                (btm_cb.btm_sco_pkt_types_supported & BTM_SCO_EXCEPTION_PKTS_MASK));
1523e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        }
1524e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1525e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        BTM_TRACE_API1("BTM_ChangeEScoLinkParms -> eSCO Link for handle 0x%04x", p_sco->hci_handle);
1526e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        BTM_TRACE_API6("      txbw 0x%x, rxbw 0x%x, lat 0x%x, voice 0x%x, retrans 0x%02x, pkt 0x%04x",
1527e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                         p_setup->tx_bw, p_setup->rx_bw, p_parms->max_latency,
1528e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                         p_setup->voice_contfmt, p_parms->retrans_effort, temp_pkt_types);
1529e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1530e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        /* When changing an existing link, only change latency, retrans, and pkts */
1531e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        if (!btsnd_hcic_setup_esco_conn(p_sco->hci_handle, p_setup->tx_bw,
1532e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                                        p_setup->rx_bw, p_parms->max_latency,
1533e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                                        p_setup->voice_contfmt,
1534e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                                        p_parms->retrans_effort,
1535e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                                        temp_pkt_types))
1536e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            return (BTM_NO_RESOURCES);
1537e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        else
1538e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            p_parms->packet_types = temp_pkt_types;
1539e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
1540e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1541e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    return (BTM_CMD_STARTED);
1542e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#else
1543e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    return (BTM_WRONG_MODE);
1544e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif
1545e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
1546e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1547e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
1548e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1549e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         BTM_EScoConnRsp
1550e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1551e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      This function is called upon receipt of an (e)SCO connection
1552e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  request event (BTM_ESCO_CONN_REQ_EVT) to accept or reject
1553e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  the request. Parameters used to negotiate eSCO links.
1554e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  If p_parms is NULL, then values set through BTM_SetEScoMode
1555e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  are used.
1556e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  If the link type of the incoming request is SCO, then only
1557e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  the tx_bw, max_latency, content format, and packet_types are
1558e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  valid.  The hci_status parameter should be
1559e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  ([0x0] to accept, [0x0d..0x0f] to reject)
15606ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach**
1561e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1562e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          void
1563e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1564e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
1565e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid BTM_EScoConnRsp (UINT16 sco_inx, UINT8 hci_status, tBTM_ESCO_PARAMS *p_parms)
1566e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
1567e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (BTM_MAX_SCO_LINKS>0)
1568e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (sco_inx < BTM_MAX_SCO_LINKS &&
1569e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        btm_cb.sco_cb.sco_db[sco_inx].state == SCO_ST_W4_CONN_RSP)
1570e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
1571e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        btm_esco_conn_rsp(sco_inx, hci_status,
1572e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                          btm_cb.sco_cb.sco_db[sco_inx].esco.data.bd_addr,
1573e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                          p_parms);
1574e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
1575e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif
1576e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
1577e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1578e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
1579e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1580e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         btm_read_def_esco_mode
1581e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
15826ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Description      This function copies the current default esco settings into
1583e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  the return buffer.
15846ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach**
1585e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          tBTM_SCO_TYPE
1586e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1587e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
1588e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachtBTM_SCO_TYPE btm_read_def_esco_mode (tBTM_ESCO_PARAMS *p_parms)
1589e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
1590e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (BTM_MAX_SCO_LINKS>0)
1591e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    *p_parms = btm_cb.sco_cb.def_esco_parms;
1592e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    return btm_cb.sco_cb.desired_sco_mode;
1593e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#else
1594e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    return BTM_LINK_TYPE_SCO;
1595e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif
1596e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
1597e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1598e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
1599e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1600e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         btm_esco_proc_conn_chg
1601e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1602e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      This function is called by BTIF when an SCO connection
16036ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach**                  is changed.
1604e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1605e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          void
1606e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1607e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
1608e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid btm_esco_proc_conn_chg (UINT8 status, UINT16 handle, UINT8 tx_interval,
1609e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                             UINT8 retrans_window, UINT16 rx_pkt_len,
1610e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                             UINT16 tx_pkt_len)
1611e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
1612e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (BTM_MAX_SCO_LINKS>0)
1613e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    tSCO_CONN               *p = &btm_cb.sco_cb.sco_db[0];
1614e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    tBTM_CHG_ESCO_EVT_DATA   data;
1615e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    UINT16                   xx;
1616e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1617e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTM_TRACE_EVENT2("btm_esco_proc_conn_chg -> handle 0x%04x, status 0x%02x",
1618e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                      handle, status);
1619e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1620e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++)
1621e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
1622e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        if (p->state == SCO_ST_CONNECTED && handle == p->hci_handle)
1623e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        {
1624e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            /* If upper layer wants notification */
1625e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            if (p->esco.p_esco_cback)
1626e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
1627e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                memcpy(data.bd_addr, p->esco.data.bd_addr, BD_ADDR_LEN);
1628e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                data.hci_status = status;
1629e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                data.sco_inx = xx;
1630e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                data.rx_pkt_len = p->esco.data.rx_pkt_len = rx_pkt_len;
1631e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                data.tx_pkt_len = p->esco.data.tx_pkt_len = tx_pkt_len;
1632e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                data.tx_interval = p->esco.data.tx_interval = tx_interval;
1633e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                data.retrans_window = p->esco.data.retrans_window = retrans_window;
1634e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1635e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                (*p->esco.p_esco_cback)(BTM_ESCO_CHG_EVT,
1636e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                                        (tBTM_ESCO_EVT_DATA *)&data);
1637e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
1638e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            return;
1639e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        }
1640e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
1641e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif
1642e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
1643e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1644e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
1645e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1646e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         btm_is_sco_active
1647e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
16486ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Description      This function is called to see if a SCO handle is already in
1649e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  use.
1650e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1651e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          BOOLEAN
1652e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1653e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
1654e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachBOOLEAN btm_is_sco_active (UINT16 handle)
1655e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
1656e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (BTM_MAX_SCO_LINKS>0)
1657e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    UINT16     xx;
1658e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    tSCO_CONN *p = &btm_cb.sco_cb.sco_db[0];
1659e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1660e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++)
1661e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
1662e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        if (handle == p->hci_handle && p->state == SCO_ST_CONNECTED)
1663e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            return (TRUE);
1664e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
1665e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif
1666e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    return (FALSE);
1667e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
1668e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1669e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
1670e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1671e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         BTM_GetNumScoLinks
1672e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1673e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      This function returns the number of active sco links.
1674e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1675e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          UINT8
1676e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1677e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
1678e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachUINT8 BTM_GetNumScoLinks (void)
1679e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
1680e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (BTM_MAX_SCO_LINKS>0)
1681e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    tSCO_CONN *p = &btm_cb.sco_cb.sco_db[0];
1682e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    UINT16     xx;
1683e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    UINT8      num_scos = 0;
1684e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1685e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++)
1686e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
1687e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        switch (p->state)
1688e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        {
1689e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        case SCO_ST_W4_CONN_RSP:
1690e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        case SCO_ST_CONNECTING:
1691e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        case SCO_ST_CONNECTED:
1692e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        case SCO_ST_DISCONNECTING:
1693e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        case SCO_ST_PEND_UNPARK:
1694e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            num_scos++;
1695e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        }
1696e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
1697e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    return (num_scos);
1698e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#else
1699e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    return (0);
1700e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif
1701e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
1702e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1703e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1704e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
1705e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1706e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         btm_is_sco_active_by_bdaddr
1707e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1708e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      This function is called to see if a SCO active to a bd address.
1709e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1710e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          BOOLEAN
1711e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1712e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
1713e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachBOOLEAN btm_is_sco_active_by_bdaddr (BD_ADDR remote_bda)
1714e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
1715e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (BTM_MAX_SCO_LINKS>0)
1716e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    UINT8 xx;
1717e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    tSCO_CONN *p = &btm_cb.sco_cb.sco_db[0];
1718e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1719e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* If any SCO is being established to the remote BD address, refuse this */
1720e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    for (xx = 0; xx < BTM_MAX_SCO_LINKS; xx++, p++)
1721e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
1722e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        if ((!memcmp (p->esco.data.bd_addr, remote_bda, BD_ADDR_LEN)) && (p->state == SCO_ST_CONNECTED))
1723e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        {
1724e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            return (TRUE);
1725e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        }
1726e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
1727e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif
1728e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    return (FALSE);
1729e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
1730e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#else   /* SCO_EXCLUDED == TRUE (Link in stubs) */
1731e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1732e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachtBTM_STATUS BTM_CreateSco (BD_ADDR remote_bda, BOOLEAN is_orig,
1733e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                           UINT16 pkt_types, UINT16 *p_sco_inx,
1734e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                           tBTM_SCO_CB *p_conn_cb,
1735e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                           tBTM_SCO_CB *p_disc_cb) {return (BTM_NO_RESOURCES);}
1736e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachtBTM_STATUS BTM_RemoveSco (UINT16 sco_inx) {return (BTM_NO_RESOURCES);}
1737e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachtBTM_STATUS BTM_SetScoPacketTypes (UINT16 sco_inx, UINT16 pkt_types) {return (BTM_NO_RESOURCES);}
1738e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachUINT16 BTM_ReadScoPacketTypes (UINT16 sco_inx) {return (0);}
1739e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachUINT16 BTM_ReadDeviceScoPacketTypes (void) {return (0);}
1740e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachUINT16 BTM_ReadScoHandle (UINT16 sco_inx) {return (BTM_INVALID_HCI_HANDLE);}
1741e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachUINT8 *BTM_ReadScoBdAddr(UINT16 sco_inx) {return((UINT8 *) NULL);}
1742e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachUINT16 BTM_ReadScoDiscReason (void) {return (BTM_INVALID_SCO_DISC_REASON);}
1743e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachtBTM_STATUS BTM_SetEScoMode (tBTM_SCO_TYPE sco_mode, tBTM_ESCO_PARAMS *p_parms) {return (BTM_MODE_UNSUPPORTED);}
1744e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachtBTM_STATUS BTM_RegForEScoEvts (UINT16 sco_inx, tBTM_ESCO_CBACK *p_esco_cback) { return (BTM_ILLEGAL_VALUE);}
1745e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachtBTM_STATUS BTM_ReadEScoLinkParms (UINT16 sco_inx, tBTM_ESCO_DATA *p_parms) { return (BTM_MODE_UNSUPPORTED);}
1746e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachtBTM_STATUS BTM_ChangeEScoLinkParms (UINT16 sco_inx, tBTM_CHG_ESCO_PARAMS *p_parms) { return (BTM_MODE_UNSUPPORTED);}
1747e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid BTM_EScoConnRsp (UINT16 sco_inx, UINT8 hci_status, tBTM_ESCO_PARAMS *p_parms) {}
1748e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachUINT8 BTM_GetNumScoLinks (void)  {return (0);}
1749e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1750e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif /* If SCO is being used */
1751