15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Copyright (C) 2003-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 module contains functions which operate on the AVCTP connection 225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * control block. 235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h> 275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "data_types.h" 285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_target.h" 295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "avct_api.h" 305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "avct_int.h" 315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function avct_ccb_alloc 355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Allocate a connection control block; copy parameters to ccb. 375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns pointer to the ccb, or NULL if none could be allocated. 405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttAVCT_CCB *avct_ccb_alloc(tAVCT_CC *p_cc) 435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVCT_CCB *p_ccb = &avct_cb.ccb[0]; 455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < AVCT_NUM_CONN; i++, p_ccb++) 485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_ccb->allocated) 505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_ccb->allocated = AVCT_ALOC_LCB; 525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(&p_ccb->cc, p_cc, sizeof(tAVCT_CC)); 53158084e065230a10ffeba6b24ab2fd22b422baedSharvil Nanavati AVCT_TRACE_DEBUG("avct_ccb_alloc %d", i); 545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (i == AVCT_NUM_CONN) 595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* out of ccbs */ 615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_ccb = NULL; 62158084e065230a10ffeba6b24ab2fd22b422baedSharvil Nanavati AVCT_TRACE_WARNING("Out of ccbs"); 635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return p_ccb; 655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function avct_ccb_dealloc 705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Deallocate a connection control block and call application 725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** callback. 735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void. 765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid avct_ccb_dealloc(tAVCT_CCB *p_ccb, UINT8 event, UINT16 result, BD_ADDR bd_addr) 795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVCT_CTRL_CBACK *p_cback = p_ccb->cc.p_ctrl_cback; 815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 82158084e065230a10ffeba6b24ab2fd22b422baedSharvil Nanavati AVCT_TRACE_DEBUG("avct_ccb_dealloc %d", avct_ccb_to_idx(p_ccb)); 835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (AVCT_BROWSE_INCLUDED == TRUE) 845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_ccb->p_bcb == NULL) 855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(p_ccb, 0, sizeof(tAVCT_CCB)); 865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* control channel is down, but the browsing channel is still connected 0 disconnect it now */ 895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project avct_bcb_event(p_ccb->p_bcb, AVCT_LCB_UL_UNBIND_EVT, (tAVCT_LCB_EVT *) &p_ccb); 905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_ccb->p_lcb = NULL; 915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(p_ccb, 0, sizeof(tAVCT_CCB)); 945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (event != AVCT_NO_EVT) 975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*p_cback)(avct_ccb_to_idx(p_ccb), event, result, bd_addr); 995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function avct_ccb_to_idx 1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Given a pointer to an ccb, return its index. 1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Index of ccb. 1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 avct_ccb_to_idx(tAVCT_CCB *p_ccb) 1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* use array arithmetic to determine index */ 1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (UINT8) (p_ccb - avct_cb.ccb); 1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function avct_ccb_by_idx 1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Return ccb pointer based on ccb index (or handle). 1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns pointer to the ccb, or NULL if none found. 1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttAVCT_CCB *avct_ccb_by_idx(UINT8 idx) 1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVCT_CCB *p_ccb; 1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* verify index */ 1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (idx < AVCT_NUM_CONN) 1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_ccb = &avct_cb.ccb[idx]; 1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* verify ccb is allocated */ 1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_ccb->allocated) 1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_ccb = NULL; 141158084e065230a10ffeba6b24ab2fd22b422baedSharvil Nanavati AVCT_TRACE_WARNING("ccb %d not allocated", idx); 1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_ccb = NULL; 147158084e065230a10ffeba6b24ab2fd22b422baedSharvil Nanavati AVCT_TRACE_WARNING("No ccb for idx %d", idx); 1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return p_ccb; 1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 151