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