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