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 Data chahnel state machine. 225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h> 255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_target.h" 275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "mca_api.h" 285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "mca_defs.h" 295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "mca_int.h" 305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** data channel state machine constants and types 335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*****************************************************************************/ 345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectenum 355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project MCA_DCB_TC_OPEN, 375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project MCA_DCB_CONG, 385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project MCA_DCB_FREE_DATA, 395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project MCA_DCB_DEALLOC, 405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project MCA_DCB_DO_DISCONN, 415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project MCA_DCB_SND_DATA, 425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project MCA_DCB_HDL_DATA, 435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project MCA_DCB_NUM_ACTIONS 445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define MCA_DCB_IGNORE MCA_DCB_NUM_ACTIONS 465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* action function list */ 485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst tMCA_DCB_ACTION mca_dcb_action[] = { 495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project mca_dcb_tc_open, 505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project mca_dcb_cong, 515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project mca_dcb_free_data, 525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project mca_dcb_dealloc, 535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project mca_dcb_do_disconn, 545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project mca_dcb_snd_data, 555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project mca_dcb_hdl_data 565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* state table information */ 595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define MCA_DCB_ACTIONS 1 /* number of actions */ 605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define MCA_DCB_ACT_COL 0 /* position of action function */ 615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define MCA_DCB_NEXT_STATE 1 /* position of next state */ 625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define MCA_DCB_NUM_COLS 2 /* number of columns in state tables */ 635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* state table for opening state */ 655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst UINT8 mca_dcb_st_opening[][MCA_DCB_NUM_COLS] = { 665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* Event Action Next State */ 675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* MCA_DCB_API_CLOSE_EVT */ {MCA_DCB_DO_DISCONN, MCA_DCB_CLOSING_ST}, 685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* MCA_DCB_API_WRITE_EVT */ {MCA_DCB_IGNORE, MCA_DCB_OPENING_ST}, 695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* MCA_DCB_TC_OPEN_EVT */ {MCA_DCB_TC_OPEN, MCA_DCB_OPEN_ST}, 705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* MCA_DCB_TC_CLOSE_EVT */ {MCA_DCB_DEALLOC, MCA_DCB_NULL_ST}, 715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* MCA_DCB_TC_CONG_EVT */ {MCA_DCB_CONG, MCA_DCB_OPENING_ST}, 725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* MCA_DCB_TC_DATA_EVT */ {MCA_DCB_FREE_DATA, MCA_DCB_OPENING_ST} 735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* state table for open state */ 765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst UINT8 mca_dcb_st_open[][MCA_DCB_NUM_COLS] = { 775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* Event Action Next State */ 785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* MCA_DCB_API_CLOSE_EVT */ {MCA_DCB_DO_DISCONN, MCA_DCB_CLOSING_ST}, 795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* MCA_DCB_API_WRITE_EVT */ {MCA_DCB_SND_DATA, MCA_DCB_OPEN_ST}, 805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* MCA_DCB_TC_OPEN_EVT */ {MCA_DCB_IGNORE, MCA_DCB_OPEN_ST}, 815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* MCA_DCB_TC_CLOSE_EVT */ {MCA_DCB_DEALLOC, MCA_DCB_NULL_ST}, 825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* MCA_DCB_TC_CONG_EVT */ {MCA_DCB_CONG, MCA_DCB_OPEN_ST}, 835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* MCA_DCB_TC_DATA_EVT */ {MCA_DCB_HDL_DATA, MCA_DCB_OPEN_ST} 845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* state table for closing state */ 875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst UINT8 mca_dcb_st_closing[][MCA_DCB_NUM_COLS] = { 885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* Event Action Next State */ 895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* MCA_DCB_API_CLOSE_EVT */ {MCA_DCB_IGNORE, MCA_DCB_CLOSING_ST}, 905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* MCA_DCB_API_WRITE_EVT */ {MCA_DCB_IGNORE, MCA_DCB_CLOSING_ST}, 915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* MCA_DCB_TC_OPEN_EVT */ {MCA_DCB_TC_OPEN, MCA_DCB_OPEN_ST}, 925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* MCA_DCB_TC_CLOSE_EVT */ {MCA_DCB_DEALLOC, MCA_DCB_NULL_ST}, 935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* MCA_DCB_TC_CONG_EVT */ {MCA_DCB_IGNORE, MCA_DCB_CLOSING_ST}, 945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* MCA_DCB_TC_DATA_EVT */ {MCA_DCB_FREE_DATA, MCA_DCB_CLOSING_ST} 955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* type for state table */ 985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projecttypedef const UINT8 (*tMCA_DCB_ST_TBL)[MCA_DCB_NUM_COLS]; 995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* state table */ 1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst tMCA_DCB_ST_TBL mca_dcb_st_tbl[] = { 1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project mca_dcb_st_opening, 1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project mca_dcb_st_open, 1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project mca_dcb_st_closing 1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE) 1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* verbose event strings for trace */ 1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst char * const mca_dcb_evt_str[] = { 1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project "API_CLOSE_EVT", 1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project "API_WRITE_EVT", 1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project "TC_OPEN_EVT", 1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project "TC_CLOSE_EVT", 1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project "TC_CONG_EVT", 1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project "TC_DATA_EVT" 1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* verbose state strings for trace */ 1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst char * const mca_dcb_st_str[] = { 1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project "NULL_ST", 1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project "OPENING_ST", 1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project "OPEN_ST", 1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project "CLOSING_ST" 1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function mca_dcb_event 1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is the DCB state machine main function. 1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** It uses the state and action function tables to execute 1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** action functions. 1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void. 1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid mca_dcb_event(tMCA_DCB *p_dcb, UINT8 event, tMCA_DCB_EVT *p_data) 1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tMCA_DCB_ST_TBL state_table; 1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 action; 1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dcb == NULL) 1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE) 145b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati MCA_TRACE_EVENT("DCB dcb=%d event=%s state=%s", mca_dcb_to_hdl(p_dcb), mca_dcb_evt_str[event], mca_dcb_st_str[p_dcb->state]); 1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 147b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati MCA_TRACE_EVENT("DCB dcb=%d event=%d state=%d", mca_dcb_to_hdl(p_dcb), event, p_dcb->state); 1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* look up the state table for the current state */ 1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project state_table = mca_dcb_st_tbl[p_dcb->state - 1]; 1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* set next state */ 1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dcb->state = state_table[event][MCA_DCB_NEXT_STATE]; 1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* execute action functions */ 1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((action = state_table[event][MCA_DCB_ACT_COL]) != MCA_DCB_IGNORE) 1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*mca_dcb_action[action])(p_dcb, p_data); 1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function mca_dcb_alloc 1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to allocate an DCB. 1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** It initializes the DCB with the data passed to the function. 1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns tMCA_DCB * 1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttMCA_DCB *mca_dcb_alloc(tMCA_CCB*p_ccb, tMCA_DEP dep) 1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tMCA_DCB *p_dcb = NULL, *p_dcb_tmp; 1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tMCA_RCB *p_rcb = p_ccb->p_rcb; 1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tMCA_CS *p_cs; 1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i, max; 1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (dep < MCA_NUM_DEPS) 1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cs = &p_rcb->dep[dep]; 1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project i = mca_ccb_to_hdl(p_ccb)-1; 1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dcb_tmp = &mca_cb.dcb[i*MCA_NUM_MDLS]; 1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* make sure p_cs->max_mdl is smaller than MCA_NUM_MDLS at MCA_CreateDep */ 1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project max = p_cs->max_mdl; 1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i=0; i<max; i++, p_dcb_tmp++) 1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dcb_tmp->state == MCA_DCB_NULL_ST) 1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dcb_tmp->p_ccb = p_ccb; 1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dcb_tmp->state = MCA_DCB_OPENING_ST; 1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dcb_tmp->cong = TRUE; 1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dcb_tmp->p_cs = p_cs; 1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dcb = p_dcb_tmp; 1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return p_dcb; 2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function mca_dep_free_mdl 2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to check the number of free mdl for 2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the given dep. 2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns the number of free mdl for the given dep 2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 mca_dep_free_mdl(tMCA_CCB *p_ccb, tMCA_DEP dep) 2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tMCA_DCB *p_dcb; 2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tMCA_RCB *p_rcb = p_ccb->p_rcb; 2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tMCA_CS *p_cs; 2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i, max; 2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 count = 0; 2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 left; 2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (dep < MCA_NUM_DEPS) 2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cs = &p_rcb->dep[dep]; 2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project i = mca_ccb_to_hdl(p_ccb)-1; 2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dcb = &mca_cb.dcb[i * MCA_NUM_MDLS]; 2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* make sure p_cs->max_mdl is smaller than MCA_NUM_MDLS at MCA_CreateDep */ 2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project max = p_cs->max_mdl; 2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i=0; i<max; i++, p_dcb++) 2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_dcb->state != MCA_DCB_NULL_ST) && (p_dcb->p_cs == p_cs)) 2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project count++; 2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project max = 0; 241b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati MCA_TRACE_WARNING("Invalid Dep ID"); 2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project left = max - count; 2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return left; 2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function mca_dcb_dealloc 2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function deallocates an DCB. 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 Projectvoid mca_dcb_dealloc(tMCA_DCB *p_dcb, tMCA_DCB_EVT *p_data) 2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tMCA_CCB *p_ccb = p_dcb->p_ccb; 2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 event = MCA_CLOSE_IND_EVT; 2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tMCA_CTRL evt_data; 2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 262b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati MCA_TRACE_DEBUG("mca_dcb_dealloc"); 2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project mca_free_buf ((void **)&p_dcb->p_data); 2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_data) 2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* non-NULL -> an action function -> report disconnect event */ 2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.close_cfm.mdl = mca_dcb_to_hdl(p_dcb); 2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.close_cfm.reason = p_data->close.reason; 2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.close_cfm.mdl_id = p_dcb->mdl_id; 2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_data->close.param == MCA_INT) 2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project event = MCA_CLOSE_CFM_EVT; 2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_data->close.lcid) 2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project mca_ccb_report_event(p_ccb, event, &evt_data); 2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project mca_free_tc_tbl_by_lcid (p_dcb->lcid); 2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset (p_dcb, 0, sizeof (tMCA_DCB)); 2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function mca_dcb_to_hdl 2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function converts a pointer to an DCB to a handle (tMCA_DL). 2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** It returns the handle. 2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns tMCA_DL. 2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttMCA_DL mca_dcb_to_hdl(tMCA_DCB *p_dcb) 2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (UINT8) (p_dcb - mca_cb.dcb + 1); 2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function mca_dcb_by_hdl 2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function finds the DCB for a handle (tMCA_DL). 2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** It returns a pointer to the DCB. 3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** If no DCB matches the handle it returns NULL. 3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns tMCA_DCB * 3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttMCA_DCB *mca_dcb_by_hdl(tMCA_DL hdl) 3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tMCA_DCB * p_dcb = NULL; 3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (hdl && hdl <= MCA_NUM_DCBS && mca_cb.dcb[hdl-1].state) 3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dcb = &mca_cb.dcb[hdl-1]; 3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return p_dcb; 3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function mca_dcb_close_by_mdl_id 3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function finds the DCB for a mdl_id and 3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** disconnect the mdl 3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid mca_dcb_close_by_mdl_id(tMCA_CCB*p_ccb, UINT16 mdl_id) 3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tMCA_DCB *p_dcb; 3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 328b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati MCA_TRACE_DEBUG("mca_dcb_close_by_mdl_id mdl_id=%d", mdl_id); 3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project i = mca_ccb_to_hdl(p_ccb)-1; 3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dcb = &mca_cb.dcb[i*MCA_NUM_MDLS]; 3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i=0; i<MCA_NUM_MDLS; i++, p_dcb++) 3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dcb->state) 3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dcb->mdl_id == mdl_id) 3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project mca_dcb_event(p_dcb, MCA_DCB_API_CLOSE_EVT, NULL); 3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (mdl_id == MCA_ALL_MDL_ID) 3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project mca_dcb_event(p_dcb, MCA_DCB_API_CLOSE_EVT, NULL); 3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 347