15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************
25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Copyright (C) 2009-2012 Broadcom Corporation
45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Licensed under the Apache License, Version 2.0 (the "License");
65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  you may not use this file except in compliance with the License.
75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  You may obtain a copy of the License at:
85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  http://www.apache.org/licenses/LICENSE-2.0
105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  See the License for the specific language governing permissions and
155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  limitations under the License.
165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/
185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************
205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  This is the implementation file for the MCAP Control channel state
225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  machine.
235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/
255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h>
265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_target.h"
285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "mca_api.h"
295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "mca_defs.h"
305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "mca_int.h"
315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include  "btu.h"
325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** data channel state machine constants and types
355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*****************************************************************************/
365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectenum
375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    MCA_CCB_FREE_MSG,
395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    MCA_CCB_SND_REQ,
405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    MCA_CCB_SND_RSP,
415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    MCA_CCB_DO_DISCONN,
425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    MCA_CCB_CONG,
435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    MCA_CCB_HDL_REQ,
445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    MCA_CCB_HDL_RSP,
455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    MCA_CCB_LL_OPEN,
465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    MCA_CCB_DL_OPEN,
475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    MCA_CCB_DEALLOC,
485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    MCA_CCB_RSP_TOUT,
495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    MCA_CCB_NUM_ACTIONS
505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define MCA_CCB_IGNORE     MCA_CCB_NUM_ACTIONS
525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* action function list */
545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst tMCA_CCB_ACTION mca_ccb_action[] = {
555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    mca_ccb_free_msg,
565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    mca_ccb_snd_req,
575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    mca_ccb_snd_rsp,
585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    mca_ccb_do_disconn,
595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    mca_ccb_cong,
605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    mca_ccb_hdl_req,
615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    mca_ccb_hdl_rsp,
625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    mca_ccb_ll_open,
635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    mca_ccb_dl_open,
645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    mca_ccb_dealloc,
655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    mca_ccb_rsp_tout,
665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* state table information */
695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define MCA_CCB_ACTIONS            1       /* number of actions */
705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define MCA_CCB_ACT_COL            0       /* position of action function */
715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define MCA_CCB_NEXT_STATE         1       /* position of next state */
725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define MCA_CCB_NUM_COLS           2       /* number of columns in state tables */
735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* state table for opening state */
755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst UINT8 mca_ccb_st_opening[][MCA_CCB_NUM_COLS] = {
765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* Event                            Action              Next State */
775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* MCA_CCB_API_CONNECT_EVT    */   {MCA_CCB_IGNORE,     MCA_CCB_OPENING_ST},
785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* MCA_CCB_API_DISCONNECT_EVT */   {MCA_CCB_DO_DISCONN, MCA_CCB_CLOSING_ST},
795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* MCA_CCB_API_REQ_EVT        */   {MCA_CCB_FREE_MSG,   MCA_CCB_OPENING_ST},
805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* MCA_CCB_API_RSP_EVT        */   {MCA_CCB_IGNORE,     MCA_CCB_OPENING_ST},
815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* MCA_CCB_MSG_REQ_EVT        */   {MCA_CCB_FREE_MSG,   MCA_CCB_OPENING_ST},
825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* MCA_CCB_MSG_RSP_EVT        */   {MCA_CCB_FREE_MSG,   MCA_CCB_OPENING_ST},
835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* MCA_CCB_DL_OPEN_EVT        */   {MCA_CCB_IGNORE,     MCA_CCB_OPENING_ST},
845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* MCA_CCB_LL_OPEN_EVT        */   {MCA_CCB_LL_OPEN,    MCA_CCB_OPEN_ST},
855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* MCA_CCB_LL_CLOSE_EVT       */   {MCA_CCB_DEALLOC,    MCA_CCB_NULL_ST},
865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* MCA_CCB_LL_CONG_EVT        */   {MCA_CCB_CONG,       MCA_CCB_OPENING_ST},
875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* MCA_CCB_RSP_TOUT_EVT       */   {MCA_CCB_IGNORE,     MCA_CCB_OPENING_ST}
885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* state table for open state */
915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst UINT8 mca_ccb_st_open[][MCA_CCB_NUM_COLS] = {
925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* Event                            Action              Next State */
935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* MCA_CCB_API_CONNECT_EVT    */   {MCA_CCB_IGNORE,     MCA_CCB_OPEN_ST},
945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* MCA_CCB_API_DISCONNECT_EVT */   {MCA_CCB_DO_DISCONN, MCA_CCB_CLOSING_ST},
955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* MCA_CCB_API_REQ_EVT        */   {MCA_CCB_SND_REQ,    MCA_CCB_OPEN_ST},
965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* MCA_CCB_API_RSP_EVT        */   {MCA_CCB_SND_RSP,    MCA_CCB_OPEN_ST},
975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* MCA_CCB_MSG_REQ_EVT        */   {MCA_CCB_HDL_REQ,    MCA_CCB_OPEN_ST},
985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* MCA_CCB_MSG_RSP_EVT        */   {MCA_CCB_HDL_RSP,    MCA_CCB_OPEN_ST},
995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* MCA_CCB_DL_OPEN_EVT        */   {MCA_CCB_DL_OPEN,    MCA_CCB_OPEN_ST},
1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* MCA_CCB_LL_OPEN_EVT        */   {MCA_CCB_IGNORE,     MCA_CCB_OPEN_ST},
1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* MCA_CCB_LL_CLOSE_EVT       */   {MCA_CCB_DEALLOC,    MCA_CCB_NULL_ST},
1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* MCA_CCB_LL_CONG_EVT        */   {MCA_CCB_CONG,       MCA_CCB_OPEN_ST},
1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* MCA_CCB_RSP_TOUT_EVT       */   {MCA_CCB_RSP_TOUT,   MCA_CCB_OPEN_ST}
1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* state table for closing state */
1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst UINT8 mca_ccb_st_closing[][MCA_CCB_NUM_COLS] = {
1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* Event                            Action              Next State */
1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* MCA_CCB_API_CONNECT_EVT    */   {MCA_CCB_IGNORE,     MCA_CCB_CLOSING_ST},
1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* MCA_CCB_API_DISCONNECT_EVT */   {MCA_CCB_IGNORE,     MCA_CCB_CLOSING_ST},
1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* MCA_CCB_API_REQ_EVT        */   {MCA_CCB_FREE_MSG,   MCA_CCB_CLOSING_ST},
1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* MCA_CCB_API_RSP_EVT        */   {MCA_CCB_IGNORE,     MCA_CCB_CLOSING_ST},
1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* MCA_CCB_MSG_REQ_EVT        */   {MCA_CCB_FREE_MSG,   MCA_CCB_CLOSING_ST},
1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* MCA_CCB_MSG_RSP_EVT        */   {MCA_CCB_FREE_MSG,   MCA_CCB_CLOSING_ST},
1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* MCA_CCB_DL_OPEN_EVT        */   {MCA_CCB_IGNORE,     MCA_CCB_CLOSING_ST},
1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* MCA_CCB_LL_OPEN_EVT        */   {MCA_CCB_IGNORE,     MCA_CCB_CLOSING_ST},
1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* MCA_CCB_LL_CLOSE_EVT       */   {MCA_CCB_DEALLOC,    MCA_CCB_NULL_ST},
1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* MCA_CCB_LL_CONG_EVT        */   {MCA_CCB_IGNORE,     MCA_CCB_CLOSING_ST},
1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* MCA_CCB_RSP_TOUT_EVT       */   {MCA_CCB_IGNORE,     MCA_CCB_CLOSING_ST}
1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* type for state table */
1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projecttypedef const UINT8 (*tMCA_CCB_ST_TBL)[MCA_CCB_NUM_COLS];
1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* state table */
1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst tMCA_CCB_ST_TBL mca_ccb_st_tbl[] = {
1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    mca_ccb_st_opening,
1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    mca_ccb_st_open,
1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    mca_ccb_st_closing
1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE)
1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* verbose event strings for trace */
1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic const char * const mca_ccb_evt_str[] = {
1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    "API_CONNECT_EVT",
1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    "API_DISCONNECT_EVT",
1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    "API_REQ_EVT",
1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    "API_RSP_EVT",
1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    "MSG_REQ_EVT",
1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    "MSG_RSP_EVT",
1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    "DL_OPEN_EVT",
1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    "LL_OPEN_EVT",
1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    "LL_CLOSE_EVT",
1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    "LL_CONG_EVT",
1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    "RSP_TOUT_EVT"
1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* verbose state strings for trace */
1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic const char * const mca_ccb_st_str[] = {
1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    "NULL_ST",
1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    "OPENING_ST",
1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    "OPEN_ST",
1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    "CLOSING_ST"
1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         mca_stop_timer
1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is stop a MCAP timer
1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  This function is for use internal to MCAP only.
1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid mca_stop_timer(tMCA_CCB *p_ccb)
1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_ccb->timer_entry.event == BTU_TTYPE_MCA_CCB_RSP)
1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btu_stop_timer(&p_ccb->timer_entry);
1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb->timer_entry.event = 0;
1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         mca_ccb_event
1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is the CCB state machine main function.
1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  It uses the state and action function tables to execute
1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  action functions.
1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void.
1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid mca_ccb_event(tMCA_CCB *p_ccb, UINT8 event, tMCA_CCB_EVT *p_data)
1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tMCA_CCB_ST_TBL    state_table;
1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8              action;
1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE)
193b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    MCA_TRACE_EVENT("CCB ccb=%d event=%s state=%s", mca_ccb_to_hdl(p_ccb), mca_ccb_evt_str[event], mca_ccb_st_str[p_ccb->state]);
1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
195b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    MCA_TRACE_EVENT("CCB ccb=%d event=%d state=%d", mca_ccb_to_hdl(p_ccb), event, p_ccb->state);
1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* look up the state table for the current state */
1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    state_table = mca_ccb_st_tbl[p_ccb->state - 1];
2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* set next state */
2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_ccb->state = state_table[event][MCA_CCB_NEXT_STATE];
2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* execute action functions */
2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((action = state_table[event][MCA_CCB_ACT_COL]) != MCA_CCB_IGNORE)
2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*mca_ccb_action[action])(p_ccb, p_data);
2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         mca_ccb_by_bd
2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function looks up the CCB based on the BD address.
2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  It returns a pointer to the CCB.
2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  If no CCB is found it returns NULL.
2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void.
2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttMCA_CCB *mca_ccb_by_bd(tMCA_HANDLE handle, BD_ADDR bd_addr)
2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tMCA_CCB *p_ccb = NULL;
2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tMCA_RCB *p_rcb = mca_rcb_by_handle(handle);
2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tMCA_CCB *p_ccb_tmp;
2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int       i;
2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_rcb)
2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        i = handle-1;
2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb_tmp = &mca_cb.ccb[i*MCA_NUM_LINKS];
2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        for (i=0; i<MCA_NUM_LINKS; i++, p_ccb_tmp++)
2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_ccb_tmp->state != MCA_CCB_NULL_ST && memcmp(p_ccb_tmp->peer_addr, bd_addr, BD_ADDR_LEN) == 0)
2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_ccb = p_ccb_tmp;
2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return p_ccb;
2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         mca_ccb_alloc
2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function allocates a CCB and copies the BD address to
2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  the CCB.  It returns a pointer to the CCB.  If no CCB can
2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  be allocated it returns NULL.
2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void.
2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttMCA_CCB *mca_ccb_alloc(tMCA_HANDLE handle, BD_ADDR bd_addr)
2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tMCA_CCB *p_ccb = NULL;
2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tMCA_RCB *p_rcb = mca_rcb_by_handle(handle);
2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tMCA_CCB *p_ccb_tmp;
2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int       i;
2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
263b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    MCA_TRACE_DEBUG("mca_ccb_alloc handle:0x%x", handle);
2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_rcb)
2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        i = handle-1;
2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb_tmp = &mca_cb.ccb[i*MCA_NUM_LINKS];
2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        for (i=0; i<MCA_NUM_LINKS; i++, p_ccb_tmp++)
2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_ccb_tmp->state == MCA_CCB_NULL_ST)
2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_ccb_tmp->p_rcb = p_rcb;
2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_ccb_tmp->state = MCA_CCB_OPENING_ST;
2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_ccb_tmp->cong  = TRUE;
2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                memcpy(p_ccb_tmp->peer_addr, bd_addr, BD_ADDR_LEN);
2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_ccb = p_ccb_tmp;
2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return p_ccb;
2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         mca_ccb_dealloc
2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function deallocates a CCB.
2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void.
2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid mca_ccb_dealloc(tMCA_CCB *p_ccb, tMCA_CCB_EVT *p_data)
2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tMCA_CTRL   evt_data;
2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
298b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    MCA_TRACE_DEBUG("mca_ccb_dealloc ctrl_vpsm:0x%x", p_ccb->ctrl_vpsm);
2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    mca_dcb_close_by_mdl_id (p_ccb, MCA_ALL_MDL_ID);
3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_ccb->ctrl_vpsm)
3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        L2CA_Deregister (p_ccb->ctrl_vpsm);
3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_ccb->data_vpsm)
3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        L2CA_Deregister (p_ccb->data_vpsm);
3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    mca_free_buf ((void **)&p_ccb->p_rx_msg);
3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    mca_free_buf ((void **)&p_ccb->p_tx_req);
3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    mca_stop_timer(p_ccb);
3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_data)
3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* non-NULL -> an action function -> report disconnect event */
3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (evt_data.disconnect_ind.bd_addr, p_ccb->peer_addr, BD_ADDR_LEN);
3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        evt_data.disconnect_ind.reason = p_data->close.reason;
3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        mca_ccb_report_event(p_ccb, MCA_DISCONNECT_IND_EVT, &evt_data);
3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    mca_free_tc_tbl_by_lcid (p_ccb->lcid);
3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset (p_ccb, 0, sizeof (tMCA_CCB));
3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         mca_ccb_to_hdl
3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function converts a pointer to a CCB to a tMCA_CL
3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  and returns the value.
3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void.
3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttMCA_CL mca_ccb_to_hdl(tMCA_CCB *p_ccb)
3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (UINT8) (p_ccb - mca_cb.ccb + 1);
3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         mca_ccb_by_hdl
3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function converts an index value to a CCB.  It returns
3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  a pointer to the CCB.  If no valid CCB matches the index it
3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  returns NULL.
3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void.
3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttMCA_CCB *mca_ccb_by_hdl(tMCA_CL mcl)
3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tMCA_CCB * p_ccb = NULL;
3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (mcl && mcl <= MCA_NUM_CCBS && mca_cb.ccb[mcl-1].state)
3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb = &mca_cb.ccb[mcl-1];
3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return p_ccb;
3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         mca_ccb_uses_mdl_id
3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function checkes if a given mdl_id is in use.
3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE, if the given mdl_id is currently used in the MCL.
3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN mca_ccb_uses_mdl_id(tMCA_CCB *p_ccb, UINT16 mdl_id)
3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN uses = FALSE;
3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tMCA_DCB *p_dcb;
3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int       i;
3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    i = mca_ccb_to_hdl(p_ccb)-1;
3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dcb = &mca_cb.dcb[i*MCA_NUM_MDLS];
3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i=0; i<MCA_NUM_MDLS; i++, p_dcb++)
3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_dcb->state != MCA_DCB_NULL_ST && p_dcb->mdl_id == mdl_id)
3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            uses = TRUE;
3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return uses;
3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
386