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