From 8f4fb27a66a83cc65eb7923b6912d0aaba279a8b Mon Sep 17 00:00:00 2001 From: Mallikarjuna GB Date: Thu, 21 May 2015 20:04:46 +0530 Subject: [PATCH] Create listen SCO for HS1 if HS2 disconnects during SCO xfer During SCO transfer process from HS1 to HS2, firstly active SCO for HS1 is disconnected. However, if suddenly HS2 disconnects even before SCO transfer is complete, listen SCO for HS1 is not created. This causes further incoming SCO connections from HS1 to be rejected. The change creates listen SCO for HS1 and moves SCO state properly to LISTEN. Change-Id: I0993c1ba1c24b3b7e9c243d179a913d7a0c40446 --- bta/ag/bta_ag_int.h | 1 + bta/ag/bta_ag_main.c | 20 ++++++++++++++++++++ bta/ag/bta_ag_sco.c | 9 +++++++++ 3 files changed, 30 insertions(+) diff --git a/bta/ag/bta_ag_int.h b/bta/ag/bta_ag_int.h index b2d9fb0c6..73c972b61 100644 --- a/bta/ag/bta_ag_int.h +++ b/bta/ag/bta_ag_int.h @@ -354,6 +354,7 @@ extern tBTA_AG_SCB *bta_ag_scb_by_idx(UINT16 idx); extern UINT8 bta_ag_service_to_idx(tBTA_SERVICE_MASK services); extern UINT16 bta_ag_idx_by_bdaddr(BD_ADDR peer_addr); extern BOOLEAN bta_ag_other_scb_open(tBTA_AG_SCB *p_curr_scb); +extern BOOLEAN bta_ag_scb_open(tBTA_AG_SCB *p_curr_scb); extern tBTA_AG_SCB *bta_ag_get_other_idle_scb (tBTA_AG_SCB *p_curr_scb); extern void bta_ag_sm_execute(tBTA_AG_SCB *p_scb, UINT16 event, tBTA_AG_DATA *p_data); extern BOOLEAN bta_ag_hdl_event(BT_HDR *p_msg); diff --git a/bta/ag/bta_ag_main.c b/bta/ag/bta_ag_main.c index 97faafddc..c7dc6d26a 100644 --- a/bta/ag/bta_ag_main.c +++ b/bta/ag/bta_ag_main.c @@ -519,6 +519,26 @@ BOOLEAN bta_ag_other_scb_open(tBTA_AG_SCB *p_curr_scb) /******************************************************************************* ** +** Function bta_ag_scb_open +** +** Description Check whether given scb is in open state. +** +** +** Returns TRUE if scb is in open state, FALSE otherwise. +** +*******************************************************************************/ +BOOLEAN bta_ag_scb_open(tBTA_AG_SCB *p_curr_scb) +{ + if (p_curr_scb && p_curr_scb->in_use && p_curr_scb->state == BTA_AG_OPEN_ST) + { + return TRUE; + } + + return FALSE; +} + +/******************************************************************************* +** ** Function bta_ag_get_other_idle_scb ** ** Description Return other scb if it is in INIT st. diff --git a/bta/ag/bta_ag_sco.c b/bta/ag/bta_ag_sco.c index 42fd82f77..38f90cc12 100644 --- a/bta/ag/bta_ag_sco.c +++ b/bta/ag/bta_ag_sco.c @@ -1226,6 +1226,15 @@ static void bta_ag_sco_event(tBTA_AG_SCB *p_scb, UINT8 event) p_sco->state = BTA_AG_SCO_LISTEN_ST; } + /* If SCO closed for other HS which is not being disconnected, + then create listen sco connection for it as scb still open */ + if (bta_ag_scb_open(p_scb)) + { + APPL_TRACE_DEBUG0("create sco listen connection if scb still open"); + bta_ag_create_sco(p_scb, FALSE); + p_sco->state = BTA_AG_SCO_LISTEN_ST; + } + if (p_scb == p_sco->p_curr_scb) { p_sco->p_curr_scb->sco_idx = BTM_INVALID_SCO_INDEX; -- 2.11.0