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