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 module contains functions for port emulation entity and RFCOMM 225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * communications 235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h> 265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_target.h" 285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "gki.h" 295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "rfcdefs.h" 305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "port_api.h" 315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_int.h" 325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_api.h" 335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "port_int.h" 345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "rfc_int.h" 355cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen#include "bt_utils.h" 365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* 385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Local function definitions 395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*/ 405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT32 port_rfc_send_tx_data (tPORT *p_port); 415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid port_rfc_closed (tPORT *p_port, UINT8 res); 425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid port_get_credits (tPORT *p_port, UINT8 k); 435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function port_open_continue 485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called after security manager completes 505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** required security checks. 515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectint port_open_continue (tPORT *p_port) 565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tRFC_MCB *p_mcb; 585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 59d5bba906b0704cd60e824613bd2e438935ba5d89Sharvil Nanavati RFCOMM_TRACE_EVENT ("port_open_continue, p_port:%p", p_port); 605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check if multiplexer channel has already been established */ 625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_mcb = rfc_alloc_multiplexer_channel (p_port->bd_addr, TRUE)) == NULL) 635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 64d5bba906b0704cd60e824613bd2e438935ba5d89Sharvil Nanavati RFCOMM_TRACE_WARNING ("port_open_continue no mx channel"); 655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project port_release_port (p_port); 665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (PORT_NO_RESOURCES); 675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_port->rfc.p_mcb = p_mcb; 705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_mcb->port_inx[p_port->dlci] = p_port->inx; 725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Connection is up and we know local and remote features, select MTU */ 745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project port_select_mtu (p_port); 755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_mcb->state == RFC_MX_STATE_CONNECTED) 775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project RFCOMM_ParNegReq (p_mcb, p_port->dlci, p_port->mtu); 795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if ((p_mcb->state == RFC_MX_STATE_IDLE) 815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ||(p_mcb->state == RFC_MX_STATE_DISC_WAIT_UA)) 825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* In RFC_MX_STATE_IDLE state, MX state machine will create connection */ 845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* In RFC_MX_STATE_DISC_WAIT_UA state, MX state machine will recreate connection */ 855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* after disconnecting is completed */ 865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project RFCOMM_StartReq (p_mcb); 875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* MX state machine ignores RFC_MX_EVENT_START_REQ in these states */ 915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* When it enters RFC_MX_STATE_CONNECTED, it will check any openning ports */ 92d5bba906b0704cd60e824613bd2e438935ba5d89Sharvil Nanavati RFCOMM_TRACE_DEBUG ("port_open_continue: mx state(%d) mx channel is openning", p_mcb->state); 935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (PORT_SUCCESS); 955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function port_start_control 1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called in the BTU_TASK context to 1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** send control information 1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid port_start_control (tPORT *p_port) 1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tRFC_MCB *p_mcb = p_port->rfc.p_mcb; 1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_mcb == NULL) 1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project RFCOMM_ControlReq (p_mcb, p_port->dlci, &p_port->local_ctrl); 1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function port_start_par_neg 1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called in the BTU_TASK context to 1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** send configuration information 1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid port_start_par_neg (tPORT *p_port) 1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tRFC_MCB *p_mcb = p_port->rfc.p_mcb; 1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_mcb == NULL) 1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project RFCOMM_PortNegReq (p_mcb, p_port->dlci, &p_port->user_port_pars); 1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function port_start_close 1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called in the BTU_TASK context to 1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** release DLC 1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid port_start_close (tPORT *p_port) 1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tRFC_MCB *p_mcb = p_port->rfc.p_mcb; 1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 old_signals; 1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 events = 0; 1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* At first indicate to the user that signals on the connection were dropped */ 1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_port->line_status |= LINE_STATUS_FAILED; 1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project old_signals = p_port->peer_ctrl.modem_signal; 1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_port->peer_ctrl.modem_signal &= ~(PORT_DTRDSR_ON | PORT_CTSRTS_ON | PORT_DCD_ON); 1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project events |= port_get_signal_changes (p_port, old_signals, p_port->peer_ctrl.modem_signal); 1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_port->ev_mask & PORT_EV_CONNECT_ERR) 1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project events |= PORT_EV_CONNECT_ERR; 1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_port->ev_mask & PORT_EV_ERR) 1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project events |= PORT_EV_ERR; 1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_port->p_callback != NULL) && events) 1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_port->p_callback (events, p_port->inx); 1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check if RFCOMM side has been closed while the message was queued */ 1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_mcb == NULL) || (p_port->rfc.state == RFC_STATE_CLOSED)) 1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Call management callback function before calling port_release_port() to clear tPort */ 1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_port->p_mgmt_callback) 1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_port->p_mgmt_callback (PORT_CLOSED, p_port->inx); 1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project port_release_port (p_port); 1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project RFCOMM_DlcReleaseReq (p_mcb, p_port->dlci); 1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function PORT_StartCnf 1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called from the RFCOMM layer when 1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** establishing of the multiplexer channel is completed. 1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Continue establishing of the connection for all ports that 1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** are in the OPENING state 1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid PORT_StartCnf (tRFC_MCB *p_mcb, UINT16 result) 2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tPORT *p_port; 2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN no_ports_up = TRUE; 2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 206d5bba906b0704cd60e824613bd2e438935ba5d89Sharvil Nanavati RFCOMM_TRACE_EVENT ("PORT_StartCnf result:%d", result); 2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_port = &rfc_cb.port.port[0]; 2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < MAX_RFC_PORTS; i++, p_port++) 2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_port->rfc.p_mcb == p_mcb) 2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project no_ports_up = FALSE; 2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (result == RFCOMM_SUCCESS) 2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project RFCOMM_ParNegReq (p_mcb, p_port->dlci, p_port->mtu); 2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 219d5bba906b0704cd60e824613bd2e438935ba5d89Sharvil Nanavati RFCOMM_TRACE_WARNING ("PORT_StartCnf failed result:%d", result); 2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Warning: result is also set to 4 when l2cap connection 2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project fails due to l2cap connect cnf (no_resources) */ 2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if( result == HCI_ERR_PAGE_TIMEOUT ) 2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_port->error = PORT_PAGE_TIMEOUT; 2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_port->error = PORT_START_FAILED; 2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rfc_release_multiplexer_channel (p_mcb); 2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_port->rfc.p_mcb = NULL; 2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Send event to the application */ 2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_port->p_callback && (p_port->ev_mask & PORT_EV_CONNECT_ERR)) 2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_port->p_callback)(PORT_EV_CONNECT_ERR, p_port->inx); 2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_port->p_mgmt_callback) 2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_port->p_mgmt_callback (PORT_START_FAILED, p_port->inx); 2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project port_release_port (p_port); 2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* There can be a situation when after starting connection, user closes the */ 2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* port, we can catch it here to close multiplexor channel */ 2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (no_ports_up) 2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rfc_check_mcb_active (p_mcb); 2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 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 PORT_StartInd 2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called from the RFCOMM layer when 2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** some peer device wants to establish a multiplexer 2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** connection. Check if there are any ports open with this 2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** or not assigned multiplexer. 2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid PORT_StartInd (tRFC_MCB *p_mcb) 2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tPORT *p_port; 2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 267d5bba906b0704cd60e824613bd2e438935ba5d89Sharvil Nanavati RFCOMM_TRACE_EVENT ("PORT_StartInd"); 2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_port = &rfc_cb.port.port[0]; 2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < MAX_RFC_PORTS; i++, p_port++) 2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_port->rfc.p_mcb == NULL) 2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project || (p_port->rfc.p_mcb == p_mcb)) 2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 275d5bba906b0704cd60e824613bd2e438935ba5d89Sharvil Nanavati RFCOMM_TRACE_DEBUG("PORT_StartInd, RFCOMM_StartRsp RFCOMM_SUCCESS: p_mcb:%p", p_mcb); 2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project RFCOMM_StartRsp (p_mcb, RFCOMM_SUCCESS); 2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project RFCOMM_StartRsp (p_mcb, RFCOMM_ERROR); 2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function PORT_ParNegInd 2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called from the RFCOMM layer to change 2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** DLCI parameters (currently only MTU is negotiated). 2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** If can not find the port do not accept the request. 2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Otherwise save the MTU size supported by the peer. 2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid PORT_ParNegInd (tRFC_MCB *p_mcb, UINT8 dlci, UINT16 mtu, UINT8 cl, UINT8 k) 2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tPORT *p_port = port_find_mcb_dlci_port (p_mcb, dlci); 2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 our_cl; 2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 our_k; 2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 300d5bba906b0704cd60e824613bd2e438935ba5d89Sharvil Nanavati RFCOMM_TRACE_EVENT ("PORT_ParNegInd dlci:%d mtu:%d", dlci, mtu); 3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_port) 3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* This can be a first request for this port */ 3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_port = port_find_dlci_port (dlci); 3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_port) 3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If the port cannot be opened, send a DM. Per Errata 1205 */ 3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rfc_send_dm(p_mcb, dlci, FALSE); 3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* check if this is the last port open, some headsets have 3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project problem, they don't disconnect if we send DM */ 3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rfc_check_mcb_active( p_mcb ); 313d5bba906b0704cd60e824613bd2e438935ba5d89Sharvil Nanavati RFCOMM_TRACE_EVENT( "PORT_ParNegInd: port not found" ); 3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_mcb->port_inx[dlci] = p_port->inx; 3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (p_port->bd_addr, p_mcb->bd_addr, BD_ADDR_LEN); 3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Connection is up and we know local and remote features, select MTU */ 3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project port_select_mtu (p_port); 3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_port->rfc.p_mcb = p_mcb; 3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_port->mtu = (p_port->mtu < mtu) ? p_port->mtu : mtu; 3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_port->peer_mtu = p_port->mtu; 3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Negotiate the flow control mechanism. If flow control mechanism for */ 3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* mux has not been set yet, set it now. If either we or peer wants TS 07.10, */ 3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* use that. Otherwise both must want credit based, so use that. If flow is */ 3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* already defined for this mux, we respond with that value. */ 3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_mcb->flow == PORT_FC_UNDEFINED) 3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((PORT_FC_DEFAULT == PORT_FC_TS710) || (cl == RFCOMM_PN_CONV_LAYER_TYPE_1)) 3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_mcb->flow = PORT_FC_TS710; 3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_mcb->flow = PORT_FC_CREDIT; 3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Regardless of our flow control mechanism, if the PN cl is zero, we must */ 3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* respond with zero. "A responding implementation must set this field to 14 */ 3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if (and only if) the PN request was 15." This could happen if a PN is sent */ 3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* after the DLCI is already established-- the PN in that case must have cl = 0. */ 3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* See RFCOMM spec 5.5.3 */ 3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (cl == RFCOMM_PN_CONV_LAYER_TYPE_1) 3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project our_cl = RFCOMM_PN_CONV_LAYER_TYPE_1; 3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project our_k = 0; 3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (p_mcb->flow == PORT_FC_CREDIT) 3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* get credits */ 3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project port_get_credits (p_port, k); 3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Set convergence layer and number of credits (k) */ 3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project our_cl = RFCOMM_PN_CONV_LAYER_CBFC_R; 3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project our_k = (p_port->credit_rx_max < RFCOMM_K_MAX) ? p_port->credit_rx_max : RFCOMM_K_MAX; 3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_port->credit_rx = our_k; 3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* must not be using credit based flow control; use TS 7.10 */ 3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project our_cl = RFCOMM_PN_CONV_LAYER_TYPE_1; 3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project our_k = 0; 3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project RFCOMM_ParNegRsp (p_mcb, dlci, p_port->mtu, our_cl, our_k); 3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function PORT_ParNegCnf 3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called from the RFCOMM layer to change 3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** DLCI parameters (currently only MTU is negotiated). 3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Save the MTU size supported by the peer. 3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** If the confirmation is received during the port opening 3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** procedure send EstablishRequest to continue. 3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid PORT_ParNegCnf (tRFC_MCB *p_mcb, UINT8 dlci, UINT16 mtu, UINT8 cl, UINT8 k) 3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tPORT *p_port = port_find_mcb_dlci_port (p_mcb, dlci); 3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 389d5bba906b0704cd60e824613bd2e438935ba5d89Sharvil Nanavati RFCOMM_TRACE_EVENT ("PORT_ParNegCnf dlci:%d mtu:%d cl: %d k: %d", dlci, mtu, cl, k); 3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_port) 3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Flow control mechanism not set yet. Negotiate flow control mechanism. */ 3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_mcb->flow == PORT_FC_UNDEFINED) 3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Our stack is configured for TS07.10 and they responded with credit-based. */ 3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* This is illegal-- negotiation fails. */ 3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((PORT_FC_DEFAULT == PORT_FC_TS710) && (cl == RFCOMM_PN_CONV_LAYER_CBFC_R)) 4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rfc_send_disc (p_mcb, p_port->dlci); 4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rfc_port_closed (p_port); 4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Our stack is configured for credit-based and they responded with credit-based. */ 4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (cl == RFCOMM_PN_CONV_LAYER_CBFC_R) 4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_mcb->flow = PORT_FC_CREDIT; 4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* They responded with any other value. Treat this as negotiation to TS07.10. */ 4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_mcb->flow = PORT_FC_TS710; 4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If mux flow control mechanism set, we honor that setting regardless of */ 4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* the CL value in their response. This allows us to gracefully accept any */ 4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* illegal PN negotiation scenarios. */ 4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_port->mtu = (p_port->mtu < mtu) ? p_port->mtu : mtu; 4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_port->peer_mtu = p_port->mtu; 4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_mcb->flow == PORT_FC_CREDIT) 4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project port_get_credits (p_port, k); 4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_port->state == PORT_STATE_OPENING) 4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project RFCOMM_DlcEstablishReq (p_mcb, p_port->dlci, p_port->mtu); 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** Function PORT_DlcEstablishInd 4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called from the RFCOMM layer when peer 4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** device wants to establish a new DLC. If this is not the 4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** first message in the establishment procedure port_handle 4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** has a handle to the port control block otherwise the control 4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** block should be found based on the muliplexer channel and 4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** dlci. The block should be allocated allocated before 4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** meaning that application already made open. 4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid PORT_DlcEstablishInd (tRFC_MCB *p_mcb, UINT8 dlci, UINT16 mtu) 4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tPORT *p_port = port_find_mcb_dlci_port (p_mcb, dlci); 4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 450d5bba906b0704cd60e824613bd2e438935ba5d89Sharvil Nanavati RFCOMM_TRACE_DEBUG ("PORT_DlcEstablishInd p_mcb:%p, dlci:%d mtu:%di, p_port:%p", p_mcb, dlci, mtu, p_port); 451d5bba906b0704cd60e824613bd2e438935ba5d89Sharvil Nanavati RFCOMM_TRACE_DEBUG ("PORT_DlcEstablishInd p_mcb addr:%02x:%02x:%02x:%02x:%02x:%02x", 4529ac641d0a674333af57b85b367e64cf94dfae291Matthew Xie p_mcb->bd_addr[0], p_mcb->bd_addr[1], p_mcb->bd_addr[2], 4539ac641d0a674333af57b85b367e64cf94dfae291Matthew Xie p_mcb->bd_addr[3], p_mcb->bd_addr[4], p_mcb->bd_addr[5]); 4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_port) 4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* This can be a first request for this port */ 4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_port = port_find_dlci_port (dlci); 4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_port) 4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project RFCOMM_DlcEstablishRsp (p_mcb, dlci, 0, RFCOMM_ERROR); 4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_mcb->port_inx[dlci] = p_port->inx; 4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If L2CAP's mtu less then RFCOMM's take it */ 4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (mtu && (mtu < p_port->peer_mtu)) 4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_port->peer_mtu = mtu; 4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If there was an inactivity timer running for MCB stop it */ 4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rfc_timer_stop (p_mcb); 4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project RFCOMM_DlcEstablishRsp (p_mcb, dlci, p_port->mtu, RFCOMM_SUCCESS); 4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* This is the server side. If application wants to know when connection */ 4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* is established, thats the place */ 4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_port->p_callback && (p_port->ev_mask & PORT_EV_CONNECTED)) 4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_port->p_callback)(PORT_EV_CONNECTED, p_port->inx); 4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_port->p_mgmt_callback) 4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_port->p_mgmt_callback (PORT_SUCCESS, p_port->inx); 4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_port->state = PORT_STATE_OPENED; 4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function PORT_DlcEstablishCnf 4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called from the RFCOMM layer when peer 4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** acknowledges establish procedure (SABME/UA). Send reply 4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** to the user and set state to OPENED if result was 4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** successfull. 4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid PORT_DlcEstablishCnf (tRFC_MCB *p_mcb, UINT8 dlci, UINT16 mtu, UINT16 result) 4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tPORT *p_port = port_find_mcb_dlci_port (p_mcb, dlci); 5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 502d5bba906b0704cd60e824613bd2e438935ba5d89Sharvil Nanavati RFCOMM_TRACE_EVENT ("PORT_DlcEstablishCnf dlci:%d mtu:%d result:%d", dlci, mtu, result); 5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_port) 5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (result != RFCOMM_SUCCESS) 5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_port->error = PORT_START_FAILED; 5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project port_rfc_closed (p_port, PORT_START_FAILED); 5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If L2CAP's mtu less then RFCOMM's take it */ 5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (mtu && (mtu < p_port->peer_mtu)) 5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_port->peer_mtu = mtu; 5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If there was an inactivity timer running for MCB stop it */ 5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rfc_timer_stop (p_mcb); 5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_port->p_callback && (p_port->ev_mask & PORT_EV_CONNECTED)) 5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_port->p_callback)(PORT_EV_CONNECTED, p_port->inx); 5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_port->p_mgmt_callback) 5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_port->p_mgmt_callback (PORT_SUCCESS, p_port->inx); 5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_port->state = PORT_STATE_OPENED; 5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* RPN is required only if we want to tell DTE how the port should be opened */ 5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_port->uuid == UUID_SERVCLASS_DIALUP_NETWORKING) 5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project || (p_port->uuid == UUID_SERVCLASS_FAX)) 5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project RFCOMM_PortNegReq (p_port->rfc.p_mcb, p_port->dlci, NULL); 5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project RFCOMM_ControlReq (p_port->rfc.p_mcb, p_port->dlci, &p_port->local_ctrl); 5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function PORT_PortNegInd 5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called from the RFCOMM layer when peer 5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** device wants to set parameters of the port. As per the spec 5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** this message has to be sent before the first data packet 5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** and can be sent before establish. The block should be 5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** allocated before meaning that application already made open. 5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid PORT_PortNegInd (tRFC_MCB *p_mcb, UINT8 dlci, tPORT_STATE *p_pars, 5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 param_mask) 5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tPORT *p_port = port_find_mcb_dlci_port (p_mcb, dlci); 5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 554d5bba906b0704cd60e824613bd2e438935ba5d89Sharvil Nanavati RFCOMM_TRACE_EVENT ("PORT_PortNegInd"); 5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_port) 5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* This can be a first request for this port */ 5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_port = port_find_dlci_port (dlci); 5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_port) 5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project RFCOMM_PortNegRsp (p_mcb, dlci, p_pars, 0); 5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_mcb->port_inx[dlci] = p_port->inx; 5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check if the flow control is acceptable on local side */ 5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_port->peer_port_pars = *p_pars; 5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project RFCOMM_PortNegRsp (p_mcb, dlci, p_pars, param_mask); 5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function PORT_PortNegCnf 5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called from the RFCOMM layer to change 5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** state for the port. Propagate change to the user. 5805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 5825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid PORT_PortNegCnf (tRFC_MCB *p_mcb, UINT8 dlci, tPORT_STATE *p_pars, UINT16 result) 5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tPORT *p_port = port_find_mcb_dlci_port (p_mcb, dlci); 5855cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_pars); 5865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 587d5bba906b0704cd60e824613bd2e438935ba5d89Sharvil Nanavati RFCOMM_TRACE_EVENT ("PORT_PortNegCnf"); 5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_port) 5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 591d5bba906b0704cd60e824613bd2e438935ba5d89Sharvil Nanavati RFCOMM_TRACE_WARNING ("PORT_PortNegCnf no port"); 5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Port negotiation failed. Drop the connection */ 5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (result != RFCOMM_SUCCESS) 5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_port->error = PORT_PORT_NEG_FAILED; 5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project RFCOMM_DlcReleaseReq (p_mcb, p_port->dlci); 6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project port_rfc_closed (p_port, PORT_PORT_NEG_FAILED); 6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!(p_port->port_ctrl & PORT_CTRL_REQ_SENT)) 6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project RFCOMM_ControlReq (p_port->rfc.p_mcb, p_port->dlci, &p_port->local_ctrl); 6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 611d5bba906b0704cd60e824613bd2e438935ba5d89Sharvil Nanavati RFCOMM_TRACE_WARNING ("PORT_PortNegCnf Control Already sent"); 6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function PORT_ControlInd 6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called from the RFCOMM layer on the modem 6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** signal change. Propagate change to the user. 6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid PORT_ControlInd (tRFC_MCB *p_mcb, UINT8 dlci, tPORT_CTRL *p_pars) 6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tPORT *p_port = port_find_mcb_dlci_port (p_mcb, dlci); 6275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 event; 6285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 old_signals; 6295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 630d5bba906b0704cd60e824613bd2e438935ba5d89Sharvil Nanavati RFCOMM_TRACE_EVENT ("PORT_ControlInd"); 6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_port) 6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project old_signals = p_port->peer_ctrl.modem_signal; 6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project event = port_get_signal_changes (p_port, old_signals, p_pars->modem_signal); 6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_port->peer_ctrl = *p_pars; 6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!(p_port->port_ctrl & PORT_CTRL_REQ_SENT)) 6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project RFCOMM_ControlReq (p_port->rfc.p_mcb, p_port->dlci, &p_port->local_ctrl); 6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If this is the first time we received control RFCOMM is connected */ 6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!(p_port->port_ctrl & PORT_CTRL_IND_RECEIVED)) 6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project event |= (PORT_EV_CONNECTED & p_port->ev_mask); 6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_port->port_ctrl & PORT_CTRL_REQ_CONFIRMED) 6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project event |= port_rfc_send_tx_data(p_port); 6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_port->port_ctrl |= (PORT_CTRL_IND_RECEIVED | PORT_CTRL_IND_RESPONDED); 6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_pars->break_signal) 6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project event |= (PORT_EV_BREAK & p_port->ev_mask); 6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* execute call back function only if the application is registered for events */ 6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (event && p_port->p_callback) 6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_port->p_callback)(event, p_port->inx); 6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 666d5bba906b0704cd60e824613bd2e438935ba5d89Sharvil Nanavati RFCOMM_TRACE_EVENT ("PORT_ControlInd DTR_DSR : %d, RTS_CTS : %d, RI : %d, DCD : %d", 6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ((p_port->peer_ctrl.modem_signal & MODEM_SIGNAL_DTRDSR) ? 1 : 0), 6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ((p_port->peer_ctrl.modem_signal & MODEM_SIGNAL_RTSCTS) ? 1 : 0), 6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ((p_port->peer_ctrl.modem_signal & MODEM_SIGNAL_RI) ? 1 : 0), 6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ((p_port->peer_ctrl.modem_signal & MODEM_SIGNAL_DCD) ? 1 : 0)); 6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function PORT_ControlCnf 6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called from the RFCOMM layer when 6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** peer acknowleges change of the modem signals. 6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid PORT_ControlCnf (tRFC_MCB *p_mcb, UINT8 dlci, tPORT_CTRL *p_pars) 6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tPORT *p_port = port_find_mcb_dlci_port (p_mcb, dlci); 6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 event = 0; 6875cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_pars); 6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 689d5bba906b0704cd60e824613bd2e438935ba5d89Sharvil Nanavati RFCOMM_TRACE_EVENT ("PORT_ControlCnf"); 6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_port) 6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!(p_port->port_ctrl & PORT_CTRL_REQ_CONFIRMED)) 6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_port->port_ctrl |= PORT_CTRL_REQ_CONFIRMED; 6975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_port->port_ctrl & PORT_CTRL_IND_RECEIVED) 6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project event = (p_port->ev_mask & PORT_EV_CONNECTED); 7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_port->port_ctrl & PORT_CTRL_IND_RECEIVED) 7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project event |= port_rfc_send_tx_data(p_port); 7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* execute call back function only if the application is registered for events */ 7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (event && p_port->p_callback) 7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_port->p_callback)(event, p_port->inx); 7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function PORT_LineStatusInd 7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called from the RFCOMM layer when 7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** peer indicates change in the line status 7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid PORT_LineStatusInd (tRFC_MCB *p_mcb, UINT8 dlci, UINT8 line_status) 7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tPORT *p_port = port_find_mcb_dlci_port (p_mcb, dlci); 7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 event = 0; 7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 726d5bba906b0704cd60e824613bd2e438935ba5d89Sharvil Nanavati RFCOMM_TRACE_EVENT ("PORT_LineStatusInd"); 7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_port) 7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_port->line_status |= line_status; 7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (line_status & PORT_ERR_OVERRUN) 7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project event |= PORT_EV_OVERRUN; 7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (line_status & PORT_ERR_BREAK) 7375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project event |= PORT_EV_BREAK; 7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (line_status & ~(PORT_ERR_OVERRUN | PORT_ERR_BREAK)) 7405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project event |= PORT_EV_ERR; 7415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_port->p_callback != NULL) && (p_port->ev_mask & event)) 7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_port->p_callback ((p_port->ev_mask & event), p_port->inx); 7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 7485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function PORT_DlcReleaseInd 7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called from the RFCOMM layer when 7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** DLC connection is released. 7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 7555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid PORT_DlcReleaseInd (tRFC_MCB *p_mcb, UINT8 dlci) 7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tPORT *p_port = port_find_mcb_dlci_port (p_mcb, dlci); 7585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 759d5bba906b0704cd60e824613bd2e438935ba5d89Sharvil Nanavati RFCOMM_TRACE_EVENT ("PORT_DlcReleaseInd"); 7605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_port) 7625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 7635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project port_rfc_closed (p_port, PORT_CLOSED); 7655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function PORT_CloseInd 7715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called from the RFCOMM layer when 7735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** multiplexer connection is released. 7745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 7765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid PORT_CloseInd (tRFC_MCB *p_mcb) 7775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tPORT *p_port; 7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 7805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 781d5bba906b0704cd60e824613bd2e438935ba5d89Sharvil Nanavati RFCOMM_TRACE_EVENT ("PORT_CloseInd"); 7825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_port = &rfc_cb.port.port[0]; 7845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < MAX_RFC_PORTS; i++, p_port++) 7855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_port->rfc.p_mcb == p_mcb) 7875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project port_rfc_closed (p_port, PORT_PEER_CONNECTION_FAILED); 7895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rfc_release_multiplexer_channel (p_mcb); 7925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 7955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function Port_TimeOutCloseMux 7975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when RFCOMM timesout on a command 7995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** as a result multiplexer connection is closed. 8005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 8025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid Port_TimeOutCloseMux (tRFC_MCB *p_mcb) 8035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 8045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tPORT *p_port; 8055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 8065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 807d5bba906b0704cd60e824613bd2e438935ba5d89Sharvil Nanavati RFCOMM_TRACE_EVENT ("Port_TimeOutCloseMux"); 8085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_port = &rfc_cb.port.port[0]; 8105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < MAX_RFC_PORTS; i++, p_port++) 8115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_port->rfc.p_mcb == p_mcb) 8135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project port_rfc_closed (p_port, PORT_PEER_TIMEOUT); 8155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 8215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function PORT_DataInd 8235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called from the RFCOMM layer when data 8255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** buffer is received from the peer. 8265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 8285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid PORT_DataInd (tRFC_MCB *p_mcb, UINT8 dlci, BT_HDR *p_buf) 8295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 8305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tPORT *p_port = port_find_mcb_dlci_port (p_mcb, dlci); 8315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 rx_char1; 8325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 events = 0; 8335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p; 8345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 8355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 836d5bba906b0704cd60e824613bd2e438935ba5d89Sharvil Nanavati RFCOMM_TRACE_EVENT("PORT_DataInd with data length %d, p_mcb:%p,p_port:%p,dlci:%d", 8379ac641d0a674333af57b85b367e64cf94dfae291Matthew Xie p_buf->len, p_mcb, p_port, dlci); 8385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_port) 8395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_freebuf (p_buf); 8415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 8425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If client registered callout callback with flow control we can just deliver receive data */ 8445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_port->p_data_co_callback) 8455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Another packet is delivered to user. Send credits to peer if required */ 8475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_port->p_data_co_callback(p_port->inx, (UINT8*)p_buf, -1, DATA_CO_CALLBACK_TYPE_INCOMING)) 8495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project port_flow_control_peer(p_port, TRUE, 1); 8505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else port_flow_control_peer(p_port, FALSE, 0); 8515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project //GKI_freebuf (p_buf); 8525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 8535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 854d5bba906b0704cd60e824613bd2e438935ba5d89Sharvil Nanavati else RFCOMM_TRACE_ERROR("PORT_DataInd, p_port:%p, p_data_co_callback is null", p_port); 8555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If client registered callback we can just deliver receive data */ 8565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_port->p_data_callback) 8575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Another packet is delivered to user. Send credits to peer if required */ 8595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project port_flow_control_peer(p_port, TRUE, 1); 8605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_port->p_data_callback (p_port->inx, (UINT8 *)(p_buf + 1) + p_buf->offset, p_buf->len); 8625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_freebuf (p_buf); 8635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 8645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check if rx queue exceeds the limit */ 8675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_port->rx.queue_size + p_buf->len > PORT_RX_CRITICAL_WM) 8685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project || (p_port->rx.queue.count + 1 > p_port->rx_buf_critical)) 8695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 870d5bba906b0704cd60e824613bd2e438935ba5d89Sharvil Nanavati RFCOMM_TRACE_EVENT ("PORT_DataInd. Buffer over run. Dropping the buffer"); 8715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_freebuf (p_buf); 8725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project RFCOMM_LineStatusReq (p_mcb, dlci, LINE_STATUS_OVERRUN); 8745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 8755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If user registered to receive notification when a particular byte is */ 8785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* received we mast check all received bytes */ 8795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (((rx_char1 = p_port->user_port_pars.rx_char1) != 0) 8805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_port->ev_mask & PORT_EV_RXFLAG)) 8815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0, p = (UINT8 *)(p_buf + 1) + p_buf->offset; i < p_buf->len; i++) 8835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (*p++ == rx_char1) 8855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project events |= PORT_EV_RXFLAG; 8875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project PORT_SCHEDULE_LOCK; 8935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_enqueue (&p_port->rx.queue, p_buf); 8955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_port->rx.queue_size += p_buf->len; 8965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project PORT_SCHEDULE_UNLOCK; 8985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* perform flow control procedures if necessary */ 9005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project port_flow_control_peer(p_port, FALSE, 0); 9015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If user indicated flow control can not deliver any notifications to him */ 9035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_port->rx.user_fc) 9045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (events & PORT_EV_RXFLAG) 9065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_port->rx_flag_ev_pending = TRUE; 9075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 9095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project events |= PORT_EV_RXCHAR; 9125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Mask out all events that are not of interest to user */ 9145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project events &= p_port->ev_mask; 9155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_port->p_callback && events) 9175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_port->p_callback (events, p_port->inx); 9185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 9195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 9225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function PORT_FlowInd 9245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called from the RFCOMM layer on the flow 9265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** control signal change. Propagate change to the user. 9275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 9295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid PORT_FlowInd (tRFC_MCB *p_mcb, UINT8 dlci, BOOLEAN enable_data) 9305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 9315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tPORT *p_port = (tPORT *)NULL; 9325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 events = 0; 9335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 9345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 935d5bba906b0704cd60e824613bd2e438935ba5d89Sharvil Nanavati RFCOMM_TRACE_EVENT ("PORT_FlowInd fc:%d", enable_data); 9365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (dlci == 0) 9385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_mcb->peer_ready = enable_data; 9405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 9425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_port = port_find_mcb_dlci_port (p_mcb, dlci)) == NULL) 9445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 9455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_port->tx.peer_fc = !enable_data; 9475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < MAX_RFC_PORTS; i++) 9505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If DLCI is 0 event applies to all ports */ 9525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (dlci == 0) 9535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_port = &rfc_cb.port.port[i]; 9555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_port->in_use 9565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project || (p_port->rfc.p_mcb != p_mcb) 9575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project || (p_port->rfc.state != RFC_STATE_OPENED)) 9585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project continue; 9595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project events = 0; 9615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check if flow of data is still enabled */ 9635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project events |= port_flow_control_user (p_port); 9645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check if data can be sent and send it */ 9665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project events |= port_rfc_send_tx_data (p_port); 9675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Mask out all events that are not of interest to user */ 9695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project events &= p_port->ev_mask; 9705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Send event to the application */ 9725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_port->p_callback && events) 9735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_port->p_callback)(events, p_port->inx); 9745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If DLCI is not 0 event applies to one port only */ 9765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (dlci != 0) 9775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 9785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 9805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 9835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function port_rfc_send_tx_data 9855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is when forward data can be sent to the peer 9875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 9895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT32 port_rfc_send_tx_data (tPORT *p_port) 9905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 9915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 events = 0; 9925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_HDR *p_buf; 9935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if there is data to be sent */ 9955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_port->tx.queue_size > 0) 9965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* while the rfcomm peer is not flow controlling us, and peer is ready */ 9985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while (!p_port->tx.peer_fc && p_port->rfc.p_mcb && p_port->rfc.p_mcb->peer_ready) 9995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* get data from tx queue and send it */ 10015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project PORT_SCHEDULE_LOCK; 10025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_buf = (BT_HDR *)GKI_dequeue (&p_port->tx.queue)) != NULL) 10045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_port->tx.queue_size -= p_buf->len; 10065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project PORT_SCHEDULE_UNLOCK; 10085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1009d5bba906b0704cd60e824613bd2e438935ba5d89Sharvil Nanavati RFCOMM_TRACE_DEBUG ("Sending RFCOMM_DataReq tx.queue_size=%d", p_port->tx.queue_size); 10105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project RFCOMM_DataReq (p_port->rfc.p_mcb, p_port->dlci, p_buf); 10125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project events |= PORT_EV_TXCHAR; 10145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_port->tx.queue_size == 0) 10165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project events |= PORT_EV_TXEMPTY; 10185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* queue is empty-- all data sent */ 10225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 10235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project PORT_SCHEDULE_UNLOCK; 10255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project events |= PORT_EV_TXEMPTY; 10275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If we flow controlled user based on the queue size enable data again */ 10315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project events |= port_flow_control_user (p_port); 10325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (events & p_port->ev_mask); 10345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 10385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function port_rfc_closed 10405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function when RFCOMM side of port is closed 10425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 10445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid port_rfc_closed (tPORT *p_port, UINT8 res) 10455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 10465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 old_signals; 10475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 events = 0; 10485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tRFC_MCB *p_mcb = p_port->rfc.p_mcb; 10495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_port->state == PORT_STATE_OPENING) && (p_port->is_server)) 10515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* The servr side has not been informed that connection is up, ignore */ 1053d5bba906b0704cd60e824613bd2e438935ba5d89Sharvil Nanavati RFCOMM_TRACE_EVENT ("port_rfc_closed in OPENING state ignored"); 10545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rfc_port_timer_stop (p_port); 10565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_port->rfc.state = RFC_STATE_CLOSED; 10575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_mcb) 10595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_mcb->port_inx[p_port->dlci] = 0; 10615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If there are no more ports opened on this MCB release it */ 10635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rfc_check_mcb_active (p_mcb); 10645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_port->rfc.p_mcb = NULL; 10655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Need to restore DLCI to listening state 10685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * if the server was on the initiating RFC 10695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 10705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_port->dlci &= 0xfe; 10715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 10735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_port->state != PORT_STATE_CLOSING) && (p_port->state != PORT_STATE_CLOSED)) 10765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_port->line_status |= LINE_STATUS_FAILED; 10785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project old_signals = p_port->peer_ctrl.modem_signal; 10805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_port->peer_ctrl.modem_signal &= ~(PORT_DTRDSR_ON | PORT_CTSRTS_ON | PORT_DCD_ON); 10825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project events |= port_get_signal_changes (p_port, old_signals, p_port->peer_ctrl.modem_signal); 10845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_port->ev_mask & PORT_EV_CONNECT_ERR) 10865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project events |= PORT_EV_CONNECT_ERR; 10875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1088d5bba906b0704cd60e824613bd2e438935ba5d89Sharvil Nanavati RFCOMM_TRACE_EVENT ("port_rfc_closed state:%d sending events:%x", p_port->state, events); 10895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_port->p_callback != NULL) && events) 10915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_port->p_callback (events, p_port->inx); 10925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_port->p_mgmt_callback) 10945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_port->p_mgmt_callback (res, p_port->inx); 10955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_port->rfc.state = RFC_STATE_CLOSED; 10975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project port_release_port (p_port); 10995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 11005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 11035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function port_get_credits 11055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Set initial values for credits. 11075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Adjust max number of rx credits based on negotiated MTU. 11085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Check max allowed num of bytes, max allowed num buffers, 11095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** should be less then 255 11105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 11125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid port_get_credits (tPORT *p_port, UINT8 k) 11135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 11145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_port->credit_tx = k; 11155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_port->credit_tx == 0) 11165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_port->tx.peer_fc = TRUE; 11175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 11185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1121