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 Main Control Block and
225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Utility functions.
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 "gki.h"
295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "mca_api.h"
305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "mca_defs.h"
315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "mca_int.h"
325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "wcassert.h"
335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "l2c_api.h"
345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* Main Control block for MCA */
365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if MCA_DYNAMIC_MEMORY == FALSE
375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttMCA_CB mca_cb;
385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** constants
425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*****************************************************************************/
435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* table of standard opcode message size */
455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst UINT8 mca_std_msg_len[MCA_NUM_STANDARD_OPCODE] = {
465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    4,          /* MCA_OP_ERROR_RSP         */
475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    5,          /* MCA_OP_MDL_CREATE_REQ    */
485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    5,          /* MCA_OP_MDL_CREATE_RSP    */
495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    3,          /* MCA_OP_MDL_RECONNECT_REQ */
505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    4,          /* MCA_OP_MDL_RECONNECT_RSP */
515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    3,          /* MCA_OP_MDL_ABORT_REQ     */
525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    4,          /* MCA_OP_MDL_ABORT_RSP     */
535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    3,          /* MCA_OP_MDL_DELETE_REQ    */
545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    4           /* MCA_OP_MDL_DELETE_RSP    */
555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         mca_handle_by_cpsm
615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function returns the handle for the given control
635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  channel PSM. 0, if not found.
645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          the MCA handle.
665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttMCA_HANDLE mca_handle_by_cpsm(UINT16 psm)
695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int     i;
715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tMCA_HANDLE handle = 0;
725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tMCA_RCB *p_rcb = &mca_cb.rcb[0];
735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i=0; i<MCA_NUM_REGS; i++, p_rcb++)
755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_rcb->p_cback && p_rcb->reg.ctrl_psm == psm)
775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            handle = i+1;
795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return handle;
835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         mca_handle_by_dpsm
885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function returns the handle for the given data
905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  channel PSM. 0, if not found.
915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          the MCA handle.
935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttMCA_HANDLE mca_handle_by_dpsm(UINT16 psm)
965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int     i;
985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tMCA_HANDLE handle = 0;
995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tMCA_RCB *p_rcb = &mca_cb.rcb[0];
1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i=0; i<MCA_NUM_REGS; i++, p_rcb++)
1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_rcb->p_cback && p_rcb->reg.data_psm == psm)
1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            handle = i+1;
1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return handle;
1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         mca_tc_tbl_calloc
1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function allocates a transport table for the given
1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  control channel.
1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          The tranport table.
1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttMCA_TC_TBL * mca_tc_tbl_calloc(tMCA_CCB *p_ccb)
1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tMCA_TC_TBL *p_tbl = mca_cb.tc.tc_tbl;
1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int             i;
1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* find next free entry in tc table */
1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; i < MCA_NUM_TC_TBL; i++, p_tbl++)
1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_tbl->state == MCA_TC_ST_UNUSED)
1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* sanity check */
1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    WC_ASSERT(i != MCA_NUM_TC_TBL);
1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* initialize entry */
1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_tbl->peer_mtu = L2CAP_DEFAULT_MTU;
1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_tbl->cfg_flags= 0;
1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_tbl->cb_idx   = mca_ccb_to_hdl(p_ccb);
1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_tbl->tcid     = MCA_CTRL_TCID;
1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_tbl->my_mtu   = MCA_CTRL_MTU;
1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_tbl->state    = MCA_TC_ST_IDLE;
1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_tbl->lcid     = p_ccb->lcid;
1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    mca_cb.tc.lcid_tbl[p_ccb->lcid - L2CAP_BASE_APPL_CID] = i;
148b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    MCA_TRACE_DEBUG("mca_tc_tbl_calloc cb_idx: %d", p_tbl->cb_idx);
1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return p_tbl;
1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         mca_tc_tbl_dalloc
1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function allocates a transport table for the given
1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  data channel.
1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          The tranport table.
1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttMCA_TC_TBL * mca_tc_tbl_dalloc(tMCA_DCB *p_dcb)
1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tMCA_TC_TBL *p_tbl = mca_cb.tc.tc_tbl;
1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int             i;
1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* find next free entry in tc table */
1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; i < MCA_NUM_TC_TBL; i++, p_tbl++)
1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_tbl->state == MCA_TC_ST_UNUSED)
1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* sanity check */
1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    WC_ASSERT(i != MCA_NUM_TC_TBL);
1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* initialize entry */
1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_tbl->peer_mtu = L2CAP_DEFAULT_MTU;
1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_tbl->cfg_flags= 0;
1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_tbl->cb_idx   = mca_dcb_to_hdl(p_dcb);
1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_tbl->tcid     = p_dcb->p_cs->type + 1;
1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_tbl->my_mtu   = p_dcb->p_chnl_cfg->data_mtu;
1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_tbl->state    = MCA_TC_ST_IDLE;
1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_tbl->lcid     = p_dcb->lcid;
1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    mca_cb.tc.lcid_tbl[p_dcb->lcid - L2CAP_BASE_APPL_CID] = i;
189b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    MCA_TRACE_DEBUG("mca_tc_tbl_dalloc tcid: %d, cb_idx: %d", p_tbl->tcid, p_tbl->cb_idx);
1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return p_tbl;
1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         mca_tc_tbl_by_lcid
1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Find the transport channel table entry by LCID.
1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          The tranport table.
2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttMCA_TC_TBL *mca_tc_tbl_by_lcid(UINT16 lcid)
2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 idx;
2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (lcid)
2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        idx = mca_cb.tc.lcid_tbl[lcid - L2CAP_BASE_APPL_CID];
2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (idx < MCA_NUM_TC_TBL)
2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return &mca_cb.tc.tc_tbl[idx];
2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return NULL;
2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         mca_free_tc_tbl_by_lcid
2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Find the  transport table entry by LCID
2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  and free the tc_tbl
2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void.
2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid mca_free_tc_tbl_by_lcid(UINT16 lcid)
2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 idx;
2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (lcid)
2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        idx = mca_cb.tc.lcid_tbl[lcid - L2CAP_BASE_APPL_CID];
2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (idx < MCA_NUM_TC_TBL)
2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            mca_cb.tc.tc_tbl[idx].state = MCA_TC_ST_UNUSED;
2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
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**
2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         mca_set_cfg_by_tbl
2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Set the L2CAP configuration information
2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          none.
2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid mca_set_cfg_by_tbl(tL2CAP_CFG_INFO *p_cfg, tMCA_TC_TBL *p_tbl)
2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tMCA_DCB   *p_dcb;
2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    const tL2CAP_FCR_OPTS *p_opt;
2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tMCA_FCS_OPT    fcs = MCA_FCS_NONE;
2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_tbl->tcid == MCA_CTRL_TCID)
2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_opt = &mca_l2c_fcr_opts_def;
2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dcb = mca_dcb_by_hdl(p_tbl->cb_idx);
2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_opt = &p_dcb->p_chnl_cfg->fcr_opt;
2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        fcs   = p_dcb->p_chnl_cfg->fcs;
2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset(p_cfg, 0, sizeof(tL2CAP_CFG_INFO));
2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cfg->mtu_present = TRUE;
2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cfg->mtu = p_tbl->my_mtu;
2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cfg->fcr_present = TRUE;
2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy(&p_cfg->fcr, p_opt, sizeof (tL2CAP_FCR_OPTS));
2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (fcs & MCA_FCS_PRESNT_MASK)
2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_cfg->fcs_present = TRUE;
2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_cfg->fcs = (fcs & MCA_FCS_USE_MASK);
2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         mca_tc_close_ind
2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called by the L2CAP interface when the
2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  L2CAP channel is closed.  It looks up the CCB or DCB for
2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  the channel and sends it a close event.  The reason
2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  parameter is the same value passed by the L2CAP
2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  callback function.
2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Nothing.
2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid mca_tc_close_ind(tMCA_TC_TBL *p_tbl, UINT16 reason)
2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tMCA_CCB   *p_ccb;
2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tMCA_DCB   *p_dcb;
3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tMCA_CLOSE  close;
3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    close.param  = MCA_ACP;
3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    close.reason = reason;
3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    close.lcid   = p_tbl->lcid;
3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
306b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    MCA_TRACE_DEBUG("mca_tc_close_ind tcid: %d, cb_idx:%d, old: %d",
3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                     p_tbl->tcid, p_tbl->cb_idx, p_tbl->state);
3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Check if the transport channel is in use */
3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_tbl->state == MCA_TC_ST_UNUSED)
3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* clear mca_tc_tbl entry */
3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_tbl->cfg_flags&MCA_L2C_CFG_DISCN_INT)
3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        close.param = MCA_INT;
3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_tbl->cfg_flags = 0;
3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_tbl->peer_mtu = L2CAP_DEFAULT_MTU;
3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if control channel, notify ccb that channel close */
3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_tbl->tcid == MCA_CTRL_TCID)
3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb = mca_ccb_by_hdl((tMCA_CL)p_tbl->cb_idx);
3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        mca_ccb_event(p_ccb, MCA_CCB_LL_CLOSE_EVT, (tMCA_CCB_EVT *)&close);
3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* notify dcb that channel close */
3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* look up dcb  */
3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dcb = mca_dcb_by_hdl(p_tbl->cb_idx);
3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_dcb != NULL)
3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            mca_dcb_event(p_dcb, MCA_DCB_TC_CLOSE_EVT, (tMCA_DCB_EVT *) &close);
3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_tbl->state = MCA_TC_ST_UNUSED;
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_tc_open_ind
3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called by the L2CAP interface when
3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  the L2CAP channel is opened.  It looks up the CCB or DCB
3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  for the channel and sends it an open event.
3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Nothing.
3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid mca_tc_open_ind(tMCA_TC_TBL *p_tbl)
3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tMCA_CCB   *p_ccb;
3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tMCA_DCB   *p_dcb;
3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tMCA_OPEN  open;
3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
355b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    MCA_TRACE_DEBUG("mca_tc_open_ind tcid: %d, cb_idx: %d", p_tbl->tcid, p_tbl->cb_idx);
3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_tbl->state = MCA_TC_ST_OPEN;
3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    open.peer_mtu = p_tbl->peer_mtu;
3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    open.lcid = p_tbl->lcid;
3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* use param to indicate the role of connection.
3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project     * MCA_ACP, if ACP */
3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    open.param = MCA_INT;
3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_tbl->cfg_flags & MCA_L2C_CFG_CONN_ACP)
3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        open.param = MCA_ACP;
3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if control channel, notify ccb that channel open */
3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_tbl->tcid == MCA_CTRL_TCID)
3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb = mca_ccb_by_hdl((tMCA_CL)p_tbl->cb_idx);
3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        mca_ccb_event(p_ccb, MCA_CCB_LL_OPEN_EVT, (tMCA_CCB_EVT *)&open);
3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* must be data channel, notify dcb that channel open */
3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* look up dcb */
3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dcb = mca_dcb_by_hdl(p_tbl->cb_idx);
3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* put lcid in event data */
3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_dcb != NULL)
3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            mca_dcb_event(p_dcb, MCA_DCB_TC_OPEN_EVT, (tMCA_DCB_EVT *) &open);
3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         mca_tc_cong_ind
3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called by the L2CAP interface layer when
3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  L2CAP calls the congestion callback.  It looks up the CCB
3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  or DCB for the channel and sends it a congestion event.
3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  The is_congested parameter is the same value passed by
3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  the L2CAP callback function.
3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Nothing.
4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid mca_tc_cong_ind(tMCA_TC_TBL *p_tbl, BOOLEAN is_congested)
4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tMCA_CCB   *p_ccb;
4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tMCA_DCB   *p_dcb;
4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
409b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    MCA_TRACE_DEBUG("mca_tc_cong_ind tcid: %d, cb_idx: %d", p_tbl->tcid, p_tbl->cb_idx);
4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if control channel, notify ccb of congestion */
4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_tbl->tcid == MCA_CTRL_TCID)
4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb = mca_ccb_by_hdl((tMCA_CL)p_tbl->cb_idx);
4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        mca_ccb_event(p_ccb, MCA_CCB_LL_CONG_EVT, (tMCA_CCB_EVT *) &is_congested);
4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* notify dcb that channel open */
4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* look up dcb by cb_idx */
4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dcb = mca_dcb_by_hdl(p_tbl->cb_idx);
4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_dcb != NULL)
4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            mca_dcb_event(p_dcb, MCA_DCB_TC_CONG_EVT, (tMCA_DCB_EVT *) &is_congested);
4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         mca_tc_data_ind
4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called by the L2CAP interface layer when
4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  incoming data is received from L2CAP.  It looks up the CCB
4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  or DCB for the channel and routes the data accordingly.
4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Nothing.
4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid mca_tc_data_ind(tMCA_TC_TBL *p_tbl, BT_HDR *p_buf)
4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tMCA_CCB   *p_ccb;
4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tMCA_DCB   *p_dcb;
4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8       event = MCA_CCB_MSG_RSP_EVT;
4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8       *p;
4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8       rej_rsp_code = MCA_RSP_SUCCESS;
4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
448b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    MCA_TRACE_DEBUG("mca_tc_data_ind tcid: %d, cb_idx: %d", p_tbl->tcid, p_tbl->cb_idx);
4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if control channel, handle control message */
4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_tbl->tcid == MCA_CTRL_TCID)
4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb = mca_ccb_by_hdl((tMCA_CL)p_tbl->cb_idx);
4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_ccb)
4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p = (UINT8*)(p_buf+1) + p_buf->offset;
4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* all the request opcode has bit 0 set. response code has bit 0 clear */
4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ((*p) & 0x01)
4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                event = MCA_CCB_MSG_REQ_EVT;
4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (*p < MCA_NUM_STANDARD_OPCODE)
4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (p_buf->len != mca_std_msg_len[*p])
4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
466b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati                    MCA_TRACE_ERROR ("opcode: %d required len:%d, got len:%d", *p, mca_std_msg_len[*p], p_buf->len);
4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    rej_rsp_code = MCA_RSP_BAD_PARAM;
4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else if ((*p >= MCA_FIRST_SYNC_OP) && (*p <= MCA_LAST_SYNC_OP))
4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
472b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati                MCA_TRACE_ERROR ("unsupported SYNC opcode: %d len:%d", *p, p_buf->len);
4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* reject unsupported request */
4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                rej_rsp_code = MCA_RSP_NO_SUPPORT;
4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
478b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati                MCA_TRACE_ERROR ("bad opcode: %d len:%d", *p, p_buf->len);
4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* reject unsupported request */
4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                rej_rsp_code = MCA_RSP_BAD_OPCODE;
4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_buf->layer_specific = rej_rsp_code;
4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* forward the request/response to state machine */
4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            mca_ccb_event(p_ccb, event, (tMCA_CCB_EVT *) p_buf);
4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        } /* got a valid ccb */
4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            GKI_freebuf(p_buf);
4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* else send event to dcb */
4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dcb = mca_dcb_by_hdl(p_tbl->cb_idx);
4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_dcb != NULL)
4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            mca_dcb_event(p_dcb, MCA_DCB_TC_DATA_EVT, (tMCA_DCB_EVT *) p_buf);
4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            GKI_freebuf(p_buf);
5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         mca_rcb_alloc
5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function allocates a registration control block.
5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  If no free RCB is available, it returns NULL.
5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          tMCA_RCB *
5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttMCA_RCB * mca_rcb_alloc(tMCA_REG *p_reg)
5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int     i;
5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tMCA_RCB *p_rcb = NULL;
5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i=0; i<MCA_NUM_REGS; i++)
5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (mca_cb.rcb[i].p_cback == NULL)
5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_rcb = &mca_cb.rcb[i];
5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memcpy (&p_rcb->reg, p_reg, sizeof(tMCA_REG));
5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return p_rcb;
5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         mca_rcb_dealloc
5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function deallocates the RCB with the given handle.
5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void.
5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid mca_rcb_dealloc(tMCA_HANDLE handle)
5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int      i;
5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN  done = TRUE;
5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tMCA_RCB *p_rcb;
5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tMCA_CCB *p_ccb;
5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (handle && (handle<=MCA_NUM_REGS))
5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        handle--;
5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_rcb = &mca_cb.rcb[handle];
5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_rcb->p_cback)
5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_ccb = &mca_cb.ccb[handle*MCA_NUM_LINKS];
5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* check if all associated CCB are disconnected */
5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            for (i=0; i<MCA_NUM_LINKS; i++, p_ccb++)
5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (p_ccb->p_rcb)
5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    done = FALSE;
5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    mca_ccb_event (p_ccb, MCA_CCB_API_DISCONNECT_EVT, NULL);
5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (done)
5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                memset (p_rcb, 0, sizeof(tMCA_RCB));
566b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati                MCA_TRACE_DEBUG("Reset MCA_RCB index=%d",handle);
5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         mca_rcb_to_handle
5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function converts a pointer to an RCB to
5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  a handle (tMCA_HANDLE).  It returns the handle.
5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void.
5805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttMCA_HANDLE mca_rcb_to_handle(tMCA_RCB *p_rcb)
5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(UINT8) (p_rcb - mca_cb.rcb + 1);
5855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         mca_rcb_by_handle
5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function finds the RCB for a handle (tMCA_HANDLE).
5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  It returns a pointer to the RCB.  If no RCB matches the
5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  handle it returns NULL.
5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          tMCA_RCB *
5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttMCA_RCB *mca_rcb_by_handle(tMCA_HANDLE handle)
5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tMCA_RCB *p_rcb = NULL;
6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (handle && (handle<=MCA_NUM_REGS) && mca_cb.rcb[handle-1].p_cback)
6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_rcb = &mca_cb.rcb[handle-1];
6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return p_rcb;
6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         mca_is_valid_dep_id
6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function checks if the given dep_id is valid.
6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE, if this is a valid local dep_id
6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN mca_is_valid_dep_id(tMCA_RCB *p_rcb, tMCA_DEP dep)
6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN valid = FALSE;
6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (dep < MCA_NUM_DEPS && p_rcb->dep[dep].p_data_cback)
6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        valid = TRUE;
6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return valid;
6265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         mca_free_buf
6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      free memory for specified GKI packet
6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid mca_free_buf (void **p_buf)
6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_buf && *p_buf)
6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        GKI_freebuf(*p_buf);
6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *p_buf = NULL;
6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
645