16ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach/****************************************************************************** 26ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * 36ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * Copyright (C) 2009-2012 Broadcom Corporation 46ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * 56ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * Licensed under the Apache License, Version 2.0 (the "License"); 66ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * you may not use this file except in compliance with the License. 76ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * You may obtain a copy of the License at: 86ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * 96ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * http://www.apache.org/licenses/LICENSE-2.0 106ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * 116ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * Unless required by applicable law or agreed to in writing, software 126ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * distributed under the License is distributed on an "AS IS" BASIS, 136ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 146ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * See the License for the specific language governing permissions and 156ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * limitations under the License. 166ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * 176ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach ******************************************************************************/ 186ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 196ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach/****************************************************************************** 206ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * 216ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * This is the implementation file for the MCAP Data chahnel state machine. 226ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * 236ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach ******************************************************************************/ 24e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include <string.h> 25e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 26e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "bt_target.h" 27e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "mca_api.h" 28e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "mca_defs.h" 29e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "mca_int.h" 30e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 31e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/***************************************************************************** 32e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** data channel state machine constants and types 33e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*****************************************************************************/ 34e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachenum 35e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 36e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach MCA_DCB_TC_OPEN, 37e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach MCA_DCB_CONG, 38e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach MCA_DCB_FREE_DATA, 39e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach MCA_DCB_DEALLOC, 40e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach MCA_DCB_DO_DISCONN, 41e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach MCA_DCB_SND_DATA, 42e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach MCA_DCB_HDL_DATA, 43e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach MCA_DCB_NUM_ACTIONS 44e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}; 45e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define MCA_DCB_IGNORE MCA_DCB_NUM_ACTIONS 46e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 47e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/* action function list */ 48e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachconst tMCA_DCB_ACTION mca_dcb_action[] = { 49e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach mca_dcb_tc_open, 50e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach mca_dcb_cong, 51e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach mca_dcb_free_data, 52e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach mca_dcb_dealloc, 53e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach mca_dcb_do_disconn, 54e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach mca_dcb_snd_data, 55e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach mca_dcb_hdl_data 56e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}; 57e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 58e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/* state table information */ 59e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define MCA_DCB_ACTIONS 1 /* number of actions */ 60e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define MCA_DCB_ACT_COL 0 /* position of action function */ 61e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define MCA_DCB_NEXT_STATE 1 /* position of next state */ 62e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define MCA_DCB_NUM_COLS 2 /* number of columns in state tables */ 63e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 64e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/* state table for opening state */ 65e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachconst UINT8 mca_dcb_st_opening[][MCA_DCB_NUM_COLS] = { 66e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/* Event Action Next State */ 67e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/* MCA_DCB_API_CLOSE_EVT */ {MCA_DCB_DO_DISCONN, MCA_DCB_CLOSING_ST}, 68e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/* MCA_DCB_API_WRITE_EVT */ {MCA_DCB_IGNORE, MCA_DCB_OPENING_ST}, 69e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/* MCA_DCB_TC_OPEN_EVT */ {MCA_DCB_TC_OPEN, MCA_DCB_OPEN_ST}, 70e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/* MCA_DCB_TC_CLOSE_EVT */ {MCA_DCB_DEALLOC, MCA_DCB_NULL_ST}, 71e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/* MCA_DCB_TC_CONG_EVT */ {MCA_DCB_CONG, MCA_DCB_OPENING_ST}, 72e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/* MCA_DCB_TC_DATA_EVT */ {MCA_DCB_FREE_DATA, MCA_DCB_OPENING_ST} 73e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}; 74e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 75e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/* state table for open state */ 76e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachconst UINT8 mca_dcb_st_open[][MCA_DCB_NUM_COLS] = { 77e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/* Event Action Next State */ 78e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/* MCA_DCB_API_CLOSE_EVT */ {MCA_DCB_DO_DISCONN, MCA_DCB_CLOSING_ST}, 79e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/* MCA_DCB_API_WRITE_EVT */ {MCA_DCB_SND_DATA, MCA_DCB_OPEN_ST}, 80e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/* MCA_DCB_TC_OPEN_EVT */ {MCA_DCB_IGNORE, MCA_DCB_OPEN_ST}, 81e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/* MCA_DCB_TC_CLOSE_EVT */ {MCA_DCB_DEALLOC, MCA_DCB_NULL_ST}, 82e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/* MCA_DCB_TC_CONG_EVT */ {MCA_DCB_CONG, MCA_DCB_OPEN_ST}, 83e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/* MCA_DCB_TC_DATA_EVT */ {MCA_DCB_HDL_DATA, MCA_DCB_OPEN_ST} 84e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}; 85e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 86e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/* state table for closing state */ 87e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachconst UINT8 mca_dcb_st_closing[][MCA_DCB_NUM_COLS] = { 88e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/* Event Action Next State */ 89e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/* MCA_DCB_API_CLOSE_EVT */ {MCA_DCB_IGNORE, MCA_DCB_CLOSING_ST}, 90e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/* MCA_DCB_API_WRITE_EVT */ {MCA_DCB_IGNORE, MCA_DCB_CLOSING_ST}, 91e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/* MCA_DCB_TC_OPEN_EVT */ {MCA_DCB_TC_OPEN, MCA_DCB_OPEN_ST}, 92e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/* MCA_DCB_TC_CLOSE_EVT */ {MCA_DCB_DEALLOC, MCA_DCB_NULL_ST}, 93e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/* MCA_DCB_TC_CONG_EVT */ {MCA_DCB_IGNORE, MCA_DCB_CLOSING_ST}, 94e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/* MCA_DCB_TC_DATA_EVT */ {MCA_DCB_FREE_DATA, MCA_DCB_CLOSING_ST} 95e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}; 96e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 97e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/* type for state table */ 98e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachtypedef const UINT8 (*tMCA_DCB_ST_TBL)[MCA_DCB_NUM_COLS]; 99e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 100e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/* state table */ 101e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachconst tMCA_DCB_ST_TBL mca_dcb_st_tbl[] = { 102e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach mca_dcb_st_opening, 103e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach mca_dcb_st_open, 104e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach mca_dcb_st_closing 105e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}; 106e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 107e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (BT_TRACE_VERBOSE == TRUE) 108e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/* verbose event strings for trace */ 109e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachconst char * const mca_dcb_evt_str[] = { 110e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach "API_CLOSE_EVT", 111e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach "API_WRITE_EVT", 112e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach "TC_OPEN_EVT", 113e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach "TC_CLOSE_EVT", 114e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach "TC_CONG_EVT", 115e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach "TC_DATA_EVT" 116e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}; 117e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/* verbose state strings for trace */ 118e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachconst char * const mca_dcb_st_str[] = { 119e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach "NULL_ST", 120e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach "OPENING_ST", 121e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach "OPEN_ST", 122e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach "CLOSING_ST" 123e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}; 124e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 125e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 126e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 127e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 128e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function mca_dcb_event 129e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 130e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description This function is the DCB state machine main function. 131e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** It uses the state and action function tables to execute 132e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** action functions. 133e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 134e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns void. 135e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 136e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 137e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid mca_dcb_event(tMCA_DCB *p_dcb, UINT8 event, tMCA_DCB_EVT *p_data) 138e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 139e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tMCA_DCB_ST_TBL state_table; 140e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 action; 141e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 142e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_dcb == NULL) 143e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return; 144e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (BT_TRACE_VERBOSE == TRUE) 145e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach MCA_TRACE_EVENT3("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]); 146e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#else 147e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach MCA_TRACE_EVENT3("DCB dcb=%d event=%d state=%d", mca_dcb_to_hdl(p_dcb), event, p_dcb->state); 148e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 149e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 150e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* look up the state table for the current state */ 151e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach state_table = mca_dcb_st_tbl[p_dcb->state - 1]; 152e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 153e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* set next state */ 154e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_dcb->state = state_table[event][MCA_DCB_NEXT_STATE]; 155e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 156e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* execute action functions */ 157e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((action = state_table[event][MCA_DCB_ACT_COL]) != MCA_DCB_IGNORE) 158e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 159e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach (*mca_dcb_action[action])(p_dcb, p_data); 160e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 161e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 162e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 163e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 164e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 165e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function mca_dcb_alloc 166e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 167e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description This function is called to allocate an DCB. 168e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** It initializes the DCB with the data passed to the function. 169e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 170e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns tMCA_DCB * 171e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 172e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 173e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachtMCA_DCB *mca_dcb_alloc(tMCA_CCB*p_ccb, tMCA_DEP dep) 174e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 175e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tMCA_DCB *p_dcb = NULL, *p_dcb_tmp; 176e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tMCA_RCB *p_rcb = p_ccb->p_rcb; 177e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tMCA_CS *p_cs; 178e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach int i, max; 179e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 180e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (dep < MCA_NUM_DEPS) 181e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 182e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_cs = &p_rcb->dep[dep]; 183e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach i = mca_ccb_to_hdl(p_ccb)-1; 184e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_dcb_tmp = &mca_cb.dcb[i*MCA_NUM_MDLS]; 185e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* make sure p_cs->max_mdl is smaller than MCA_NUM_MDLS at MCA_CreateDep */ 186e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach max = p_cs->max_mdl; 187e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach for (i=0; i<max; i++, p_dcb_tmp++) 188e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 189e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_dcb_tmp->state == MCA_DCB_NULL_ST) 190e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 191e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_dcb_tmp->p_ccb = p_ccb; 192e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_dcb_tmp->state = MCA_DCB_OPENING_ST; 193e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_dcb_tmp->cong = TRUE; 194e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_dcb_tmp->p_cs = p_cs; 195e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_dcb = p_dcb_tmp; 196e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach break; 197e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 198e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 199e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 200e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return p_dcb; 201e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 202e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 203e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 204e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 205e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function mca_dep_free_mdl 206e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 207e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description This function is called to check the number of free mdl for 208e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** the given dep. 209e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 210e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns the number of free mdl for the given dep 211e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 212e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 213e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachUINT8 mca_dep_free_mdl(tMCA_CCB *p_ccb, tMCA_DEP dep) 214e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 215e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tMCA_DCB *p_dcb; 216e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tMCA_RCB *p_rcb = p_ccb->p_rcb; 217e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tMCA_CS *p_cs; 218e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach int i, max; 219e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 count = 0; 220e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 left; 221e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 222e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (dep < MCA_NUM_DEPS) 223e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 224e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_cs = &p_rcb->dep[dep]; 225e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach i = mca_ccb_to_hdl(p_ccb)-1; 226e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_dcb = &mca_cb.dcb[i * MCA_NUM_MDLS]; 227e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* make sure p_cs->max_mdl is smaller than MCA_NUM_MDLS at MCA_CreateDep */ 228e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach max = p_cs->max_mdl; 229e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach for (i=0; i<max; i++, p_dcb++) 230e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 231e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((p_dcb->state != MCA_DCB_NULL_ST) && (p_dcb->p_cs == p_cs)) 232e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 233e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach count++; 234e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach break; 235e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 236e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 237e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 238e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 239e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 240e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach max = 0; 241e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach MCA_TRACE_WARNING0("Invalid Dep ID"); 242e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 243e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach left = max - count; 244e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return left; 245e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 246e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 247e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 248e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 249e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function mca_dcb_dealloc 250e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 251e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description This function deallocates an DCB. 252e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 253e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns void. 254e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 255e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 256e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid mca_dcb_dealloc(tMCA_DCB *p_dcb, tMCA_DCB_EVT *p_data) 257e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 258e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tMCA_CCB *p_ccb = p_dcb->p_ccb; 259e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 event = MCA_CLOSE_IND_EVT; 260e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tMCA_CTRL evt_data; 261e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 262e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach MCA_TRACE_DEBUG0("mca_dcb_dealloc"); 263e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach mca_free_buf ((void **)&p_dcb->p_data); 264e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_data) 265e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 266e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* non-NULL -> an action function -> report disconnect event */ 267e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach evt_data.close_cfm.mdl = mca_dcb_to_hdl(p_dcb); 268e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach evt_data.close_cfm.reason = p_data->close.reason; 269e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach evt_data.close_cfm.mdl_id = p_dcb->mdl_id; 270e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_data->close.param == MCA_INT) 271e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach event = MCA_CLOSE_CFM_EVT; 272e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_data->close.lcid) 273e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach mca_ccb_report_event(p_ccb, event, &evt_data); 274e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 275e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach mca_free_tc_tbl_by_lcid (p_dcb->lcid); 276e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memset (p_dcb, 0, sizeof (tMCA_DCB)); 277e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 278e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 279e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 280e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 281e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function mca_dcb_to_hdl 282e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 283e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description This function converts a pointer to an DCB to a handle (tMCA_DL). 284e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** It returns the handle. 285e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 286e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns tMCA_DL. 287e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 288e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 289e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachtMCA_DL mca_dcb_to_hdl(tMCA_DCB *p_dcb) 290e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 291e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return (UINT8) (p_dcb - mca_cb.dcb + 1); 292e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 293e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 294e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 295e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 296e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function mca_dcb_by_hdl 297e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 298e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description This function finds the DCB for a handle (tMCA_DL). 299e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** It returns a pointer to the DCB. 300e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** If no DCB matches the handle it returns NULL. 301e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 302e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns tMCA_DCB * 303e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 304e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 305e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachtMCA_DCB *mca_dcb_by_hdl(tMCA_DL hdl) 306e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 307e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tMCA_DCB * p_dcb = NULL; 308e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (hdl && hdl <= MCA_NUM_DCBS && mca_cb.dcb[hdl-1].state) 309e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_dcb = &mca_cb.dcb[hdl-1]; 310e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return p_dcb; 311e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 312e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 313e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 314e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 315e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function mca_dcb_close_by_mdl_id 316e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 317e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description This function finds the DCB for a mdl_id and 318e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** disconnect the mdl 319e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 320e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns void 321e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 322e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 323e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid mca_dcb_close_by_mdl_id(tMCA_CCB*p_ccb, UINT16 mdl_id) 324e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 325e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tMCA_DCB *p_dcb; 326e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach int i; 327e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 328e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach MCA_TRACE_DEBUG1("mca_dcb_close_by_mdl_id mdl_id=%d", mdl_id); 329e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach i = mca_ccb_to_hdl(p_ccb)-1; 330e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_dcb = &mca_cb.dcb[i*MCA_NUM_MDLS]; 331e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach for (i=0; i<MCA_NUM_MDLS; i++, p_dcb++) 332e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 333e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_dcb->state) 334e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 335e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_dcb->mdl_id == mdl_id) 336e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 337e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach mca_dcb_event(p_dcb, MCA_DCB_API_CLOSE_EVT, NULL); 338e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach break; 339e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 340e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else if (mdl_id == MCA_ALL_MDL_ID) 341e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 342e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach mca_dcb_event(p_dcb, MCA_DCB_API_CLOSE_EVT, NULL); 343e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 344e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 345e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 346e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 347