15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************
25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Copyright (C) 1999-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 file contains collection of utility functions used the RFCOMM unit
225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *****************************************************************************/
245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_target.h"
265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "gki.h"
275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_api.h"
295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_int.h"
305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "rfcdefs.h"
315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "port_api.h"
325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "port_ext.h"
335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "port_int.h"
345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "rfc_int.h"
355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btu.h"
365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h>
385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         rfc_calc_fcs
425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Reversed CRC Table , 8-bit, poly=0x07
445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  (GSM 07.10 TS 101 369 V6.3.0)
455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic const UINT8 rfc_crctable[] =
475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    0x00, 0x91, 0xE3, 0x72, 0x07, 0x96, 0xE4, 0x75,  0x0E, 0x9F, 0xED, 0x7C, 0x09, 0x98, 0xEA, 0x7B,
495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    0x1C, 0x8D, 0xFF, 0x6E, 0x1B, 0x8A, 0xF8, 0x69,  0x12, 0x83, 0xF1, 0x60, 0x15, 0x84, 0xF6, 0x67,
505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    0x38, 0xA9, 0xDB, 0x4A, 0x3F, 0xAE, 0xDC, 0x4D,  0x36, 0xA7, 0xD5, 0x44, 0x31, 0xA0, 0xD2, 0x43,
515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    0x24, 0xB5, 0xC7, 0x56, 0x23, 0xB2, 0xC0, 0x51,  0x2A, 0xBB, 0xC9, 0x58, 0x2D, 0xBC, 0xCE, 0x5F,
525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    0x70, 0xE1, 0x93, 0x02, 0x77, 0xE6, 0x94, 0x05,  0x7E, 0xEF, 0x9D, 0x0C, 0x79, 0xE8, 0x9A, 0x0B,
545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    0x6C, 0xFD, 0x8F, 0x1E, 0x6B, 0xFA, 0x88, 0x19,  0x62, 0xF3, 0x81, 0x10, 0x65, 0xF4, 0x86, 0x17,
555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    0x48, 0xD9, 0xAB, 0x3A, 0x4F, 0xDE, 0xAC, 0x3D,  0x46, 0xD7, 0xA5, 0x34, 0x41, 0xD0, 0xA2, 0x33,
565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    0x54, 0xC5, 0xB7, 0x26, 0x53, 0xC2, 0xB0, 0x21,  0x5A, 0xCB, 0xB9, 0x28, 0x5D, 0xCC, 0xBE, 0x2F,
575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    0xE0, 0x71, 0x03, 0x92, 0xE7, 0x76, 0x04, 0x95,  0xEE, 0x7F, 0x0D, 0x9C, 0xE9, 0x78, 0x0A, 0x9B,
595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    0xFC, 0x6D, 0x1F, 0x8E, 0xFB, 0x6A, 0x18, 0x89,  0xF2, 0x63, 0x11, 0x80, 0xF5, 0x64, 0x16, 0x87,
605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    0xD8, 0x49, 0x3B, 0xAA, 0xDF, 0x4E, 0x3C, 0xAD,  0xD6, 0x47, 0x35, 0xA4, 0xD1, 0x40, 0x32, 0xA3,
615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    0xC4, 0x55, 0x27, 0xB6, 0xC3, 0x52, 0x20, 0xB1,  0xCA, 0x5B, 0x29, 0xB8, 0xCD, 0x5C, 0x2E, 0xBF,
625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    0x90, 0x01, 0x73, 0xE2, 0x97, 0x06, 0x74, 0xE5,  0x9E, 0x0F, 0x7D, 0xEC, 0x99, 0x08, 0x7A, 0xEB,
645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    0x8C, 0x1D, 0x6F, 0xFE, 0x8B, 0x1A, 0x68, 0xF9,  0x82, 0x13, 0x61, 0xF0, 0x85, 0x14, 0x66, 0xF7,
655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    0xA8, 0x39, 0x4B, 0xDA, 0xAF, 0x3E, 0x4C, 0xDD,  0xA6, 0x37, 0x45, 0xD4, 0xA1, 0x30, 0x42, 0xD3,
665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    0xB4, 0x25, 0x57, 0xC6, 0xB3, 0x22, 0x50, 0xC1,  0xBA, 0x2B, 0x59, 0xC8, 0xBD, 0x2C, 0x5E, 0xCF
675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         rfc_calc_fcs
735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function calculate FCS for the RFCOMM frame
755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  (GSM 07.10 TS 101 369 V6.3.0)
765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Input            len - number of bytes in the message
785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p   - points to message
795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 rfc_calc_fcs (UINT16 len, UINT8 *p)
825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8  fcs = 0xFF;
845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    while (len--)
865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        fcs = rfc_crctable[fcs ^ *p++];
885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Ones compliment */
915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (0xFF - fcs);
925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         rfc_check_fcs
985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function checks FCS for the RFCOMM frame
1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  (GSM 07.10 TS 101 369 V6.3.0)
1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Input            len          - number of bytes in the message
1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p            - points to message
1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  received_fcs - received FCS
1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN rfc_check_fcs (UINT16 len, UINT8 *p, UINT8 received_fcs)
1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8  fcs = 0xFF;
1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    while (len--)
1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        fcs = rfc_crctable[fcs ^ *p++];
1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Ones compliment */
1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    fcs = rfc_crctable[fcs ^ received_fcs];
1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /*0xCF is the reversed order of 11110011.*/
1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (fcs == 0xCF);
1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         rfc_alloc_multiplexer_channel
1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function returns existing or new control block for
1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  the BD_ADDR.
1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttRFC_MCB *rfc_alloc_multiplexer_channel (BD_ADDR bd_addr, BOOLEAN is_initiator)
1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int i, j;
1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tRFC_MCB *p_mcb = NULL;
1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; i < MAX_BD_CONNECTIONS; i++)
1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((rfc_cb.port.rfc_mcb[i].state != RFC_MX_STATE_IDLE)
1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         && (!memcmp (rfc_cb.port.rfc_mcb[i].bd_addr, bd_addr, BD_ADDR_LEN)))
1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Multiplexer channel found do not change anything */
1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* If there was an inactivity timer running stop it now */
1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (rfc_cb.port.rfc_mcb[i].state == RFC_MX_STATE_CONNECTED)
1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                rfc_timer_stop (&rfc_cb.port.rfc_mcb[i]);
1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return (&rfc_cb.port.rfc_mcb[i]);
1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* connection with bd_addr does not exist */
1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0, j = rfc_cb.rfc.last_mux + 1; i < MAX_BD_CONNECTIONS; i++, j++)
1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (j >= MAX_BD_CONNECTIONS)
1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            j = 0;
1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_mcb = &rfc_cb.port.rfc_mcb[j];
1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (rfc_cb.port.rfc_mcb[j].state == RFC_MX_STATE_IDLE)
1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* New multiplexer control block */
1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memset (p_mcb, 0, sizeof (tRFC_MCB));
1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memcpy (p_mcb->bd_addr, bd_addr, BD_ADDR_LEN);
1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            GKI_init_q(&p_mcb->cmd_q);
1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_mcb->is_initiator = is_initiator;
1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            rfc_timer_start (p_mcb, RFC_MCB_INIT_INACT_TIMER);
1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            rfc_cb.rfc.last_mux = (UINT8) j;
1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return (p_mcb);
1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (NULL);
1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         rfc_release_multiplexer_channel
1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function returns existing or new control block for
1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  the BD_ADDR.
1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid rfc_release_multiplexer_channel (tRFC_MCB *p_mcb)
1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    void    *p_buf;
1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    rfc_timer_stop (p_mcb);
1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    while ((p_buf = GKI_dequeue(&p_mcb->cmd_q)) != NULL)
1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        GKI_freebuf(p_buf);
1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset (p_mcb, 0, sizeof (tRFC_MCB));
1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_mcb->state = RFC_MX_STATE_IDLE;
1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         rfc_timer_start
2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Start RFC Timer
2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid rfc_timer_start (tRFC_MCB *p_mcb, UINT16 timeout)
2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    TIMER_LIST_ENT *p_tle = &p_mcb->tle;
2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    RFCOMM_TRACE_EVENT1 ("rfc_timer_start - timeout:%d", timeout);
2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_tle->param = (UINT32)p_mcb;
2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_start_timer (p_tle, BTU_TTYPE_RFCOMM_MFC, timeout);
2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         rfc_timer_stop
2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Stop RFC Timer
2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid rfc_timer_stop (tRFC_MCB *p_mcb)
2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    RFCOMM_TRACE_EVENT0 ("rfc_timer_stop");
2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_stop_timer (&p_mcb->tle);
2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         rfc_port_timer_start
2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Start RFC Timer
2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid rfc_port_timer_start (tPORT *p_port, UINT16 timeout)
2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    TIMER_LIST_ENT *p_tle = &p_port->rfc.tle;
2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    RFCOMM_TRACE_EVENT1 ("rfc_port_timer_start - timeout:%d", timeout);
2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_tle->param = (UINT32)p_port;
2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_start_timer (p_tle, BTU_TTYPE_RFCOMM_PORT, timeout);
2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         rfc_port_timer_stop
2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Stop RFC Timer
2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid rfc_port_timer_stop (tPORT *p_port)
2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    RFCOMM_TRACE_EVENT0 ("rfc_port_timer_stop");
2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_stop_timer (&p_port->rfc.tle);
2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         rfc_check_mcb_active
2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Check if there are any opened ports on the MCB if not
2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  start MCB Inact timer.
2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid rfc_check_mcb_active (tRFC_MCB *p_mcb)
2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16 i;
2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; i < RFCOMM_MAX_DLCI; i++)
2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_mcb->port_inx[i] != 0)
2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_mcb->is_disc_initiator = FALSE;
2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* The last port was DISCed.  On the client side start disconnecting Mx */
2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* On the server side start inactivity timer */
2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_mcb->is_disc_initiator)
2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_mcb->is_disc_initiator = FALSE;
2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        rfc_mx_sm_execute (p_mcb, RFC_MX_EVENT_CLOSE_REQ, NULL);
2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        rfc_timer_start (p_mcb, RFC_MCB_RELEASE_INACT_TIMER);
2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         rfcomm_process_timeout
3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      The function called every second to check RFCOMM timers
3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid rfcomm_process_timeout (TIMER_LIST_ENT  *p_tle)
3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (p_tle->event)
3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTU_TTYPE_RFCOMM_MFC:
3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        rfc_mx_sm_execute ((tRFC_MCB *)p_tle->param, RFC_EVENT_TIMEOUT, NULL);
3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTU_TTYPE_RFCOMM_PORT:
3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        rfc_port_sm_execute ((tPORT *)p_tle->param, RFC_EVENT_TIMEOUT, NULL);
3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    default:
3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         rfc_sec_check_complete
3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      The function called when Security Manager finishes
3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  verification of the service side connection
3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid rfc_sec_check_complete (BD_ADDR bd_addr, void *p_ref_data, UINT8 res)
3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tPORT *p_port = (tPORT *)p_ref_data;
3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Verify that PORT is still waiting for Security to complete */
3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_port->in_use
3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project     || ((p_port->rfc.state != RFC_STATE_ORIG_WAIT_SEC_CHECK)
3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project      && (p_port->rfc.state != RFC_STATE_TERM_WAIT_SEC_CHECK)))
3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    rfc_port_sm_execute ((tPORT *)p_ref_data, RFC_EVENT_SEC_COMPLETE, &res);
3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         rfc_port_closed
3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      The function is called when port is released based on the
3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  event received from the lower layer, typically L2CAP
3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  connection down, DISC, or DM frame.
3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid rfc_port_closed (tPORT *p_port)
3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tRFC_MCB *p_mcb = p_port->rfc.p_mcb;
3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    RFCOMM_TRACE_DEBUG0 ("rfc_port_closed");
3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    rfc_port_timer_stop (p_port);
3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_port->rfc.state = RFC_STATE_CLOSED;
3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If multiplexer channel was up mark it as down */
3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_mcb)
3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_mcb->port_inx[p_port->dlci] = 0;
3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If there are no more ports opened on this MCB release it */
3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        rfc_check_mcb_active (p_mcb);
3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Notify port that RFC connection is gone */
3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    port_rfc_closed (p_port, PORT_CLOSED);
3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         rfc_inc_credit
3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      The function is called when a credit is received in a UIH
3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  frame.  It increments the TX credit count, and if data
3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  flow had halted, it restarts it.
3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid rfc_inc_credit (tPORT *p_port, UINT8 credit)
3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_port->rfc.p_mcb->flow == PORT_FC_CREDIT)
4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_port->credit_tx += credit;
4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        RFCOMM_TRACE_EVENT1 ("rfc_inc_credit:%d", p_port->credit_tx);
4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_port->tx.peer_fc == TRUE)
4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            PORT_FlowInd(p_port->rfc.p_mcb, p_port->dlci, TRUE);
4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         rfc_dec_credit
4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      The function is called when a UIH frame of user data is
4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  sent.  It decrements the credit count.  If credit count
4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  Reaches zero, peer_fc is set.
4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid rfc_dec_credit (tPORT *p_port)
4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_port->rfc.p_mcb->flow == PORT_FC_CREDIT)
4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_port->credit_tx > 0)
4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_port->credit_tx--;
4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_port->credit_tx == 0)
4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_port->tx.peer_fc = TRUE;
4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         rfc_check_send_cmd
4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to send an RFCOMM command message
4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  or to handle the RFCOMM command message queue.
4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid rfc_check_send_cmd(tRFC_MCB *p_mcb, BT_HDR *p_buf)
4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR  *p;
4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if passed a buffer queue it */
4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_buf != NULL)
4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        GKI_enqueue(&p_mcb->cmd_q, p_buf);
4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* handle queue if L2CAP not congested */
4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    while (p_mcb->l2cap_congested == FALSE)
4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p = (BT_HDR *) GKI_dequeue(&p_mcb->cmd_q)) == NULL)
4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        L2CA_DataWrite (p_mcb->lcid, p);
4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
468