/******************************************************************************* ** ** Function hidh_conn_disconnect ** ** Description This function disconnects a connection. ** ** Returns TRUE if disconnect started, FALSE if already disconnected ** *******************************************************************************/ tHID_STATUS hidh_conn_disconnect (UINT8 dhandle) { tHID_CONN *p_hcon = &hh_cb.devices[dhandle].conn; HIDH_TRACE_EVENT ("HID-Host disconnect"); if ((p_hcon->ctrl_cid != 0) || (p_hcon->intr_cid != 0)) { p_hcon->conn_state = HID_CONN_STATE_DISCONNECTING; /* Set l2cap idle timeout to 0 (so ACL link is disconnected * immediately after last channel is closed) */ L2CA_SetIdleTimeoutByBdAddr(hh_cb.devices[dhandle].addr, 0, BT_TRANSPORT_BR_EDR); /* Disconnect both interrupt and control channels */ if (p_hcon->intr_cid) L2CA_DisconnectReq (p_hcon->intr_cid); else if (p_hcon->ctrl_cid) L2CA_DisconnectReq (p_hcon->ctrl_cid); } else { p_hcon->conn_state = HID_CONN_STATE_UNUSED; } return (HID_SUCCESS); }
/******************************************************************************* ** ** Function bta_hf_client_start_close ** ** Description Start the process of closing SCO and RFCOMM connection. ** ** ** Returns void ** *******************************************************************************/ void bta_hf_client_start_close(tBTA_HF_CLIENT_DATA *p_data) { /* Take the link out of sniff and set L2C idle time to 0 */ bta_dm_pm_active(bta_hf_client_cb.scb.peer_addr); L2CA_SetIdleTimeoutByBdAddr(bta_hf_client_cb.scb.peer_addr, 0, BT_TRANSPORT_BR_EDR); /* if SCO is open close SCO and wait on RFCOMM close */ if (bta_hf_client_cb.scb.sco_state == BTA_HF_CLIENT_SCO_OPEN_ST) { bta_hf_client_cb.scb.sco_close_rfc = TRUE; } else { bta_hf_client_rfc_do_close(p_data); } /* always do SCO shutdown to handle all SCO corner cases */ bta_hf_client_sco_shutdown(NULL); }
/******************************************************************************* ** ** Function bta_ag_start_close ** ** Description Start the process of closing SCO and RFCOMM connection. ** ** ** Returns void ** *******************************************************************************/ void bta_ag_start_close(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data) { /* Take the link out of sniff and set L2C idle time to 0 */ bta_dm_pm_active(p_scb->peer_addr); L2CA_SetIdleTimeoutByBdAddr(p_scb->peer_addr, 0); /* if SCO is open close SCO and wait on RFCOMM close */ if (bta_ag_sco_is_open(p_scb)) { p_scb->post_sco = BTA_AG_POST_SCO_CLOSE_RFC; } else { p_scb->post_sco = BTA_AG_POST_SCO_NONE; bta_ag_rfc_do_close(p_scb, p_data); } /* always do SCO shutdown to handle all SCO corner cases */ bta_ag_sco_shutdown(p_scb, p_data); }
static BOOLEAN L2cap_SetIdleTimeoutByBdAddr(BD_ADDR bd_addr, UINT16 timeout) { BTIF_TRACE_DEBUG("L2cap_SetIdleTimeoutByBdAddr:: Invoked"); return L2CA_SetIdleTimeoutByBdAddr(bd_addr, timeout); }