15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************
25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Copyright (C) 2002-2012 Broadcom Corporation
45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Licensed under the Apache License, Version 2.0 (the "License");
65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  you may not use this file except in compliance with the License.
75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  You may obtain a copy of the License at:
85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  http://www.apache.org/licenses/LICENSE-2.0
105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  See the License for the specific language governing permissions and
155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  limitations under the License.
165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/
185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************
205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  this file contains the connection interface functions
225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/
245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <stdlib.h>
265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h>
275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <stdio.h>
285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30258c2538e3b62a8cdb403f2730c45d721e5292b4Pavlin Radoslavov#include "bt_common.h"
315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_types.h"
325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "l2cdefs.h"
345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "l2c_api.h"
355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btu.h"
375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_api.h"
385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_int.h"
395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "hiddefs.h"
415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "hidh_api.h"
435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "hidh_int.h"
445cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen#include "bt_utils.h"
455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46bb95452741bfd65723ea417c25dbd326c7568ab7Arman Uguray#include "osi/include/osi.h"
47bb95452741bfd65723ea417c25dbd326c7568ab7Arman Uguray
4878bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov
4978bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavovextern fixed_queue_t *btu_general_alarm_queue;
5078bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov
515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic UINT8 find_conn_by_cid (UINT16 cid);
525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void hidh_conn_retry (UINT8 dhandle);
535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/********************************************************************************/
555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*              L O C A L    F U N C T I O N     P R O T O T Y P E S            */
565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/********************************************************************************/
575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void hidh_l2cif_connect_ind (BD_ADDR  bd_addr, UINT16 l2cap_cid,
585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                    UINT16 psm, UINT8 l2cap_id);
595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void hidh_l2cif_connect_cfm (UINT16 l2cap_cid, UINT16 result);
605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void hidh_l2cif_config_ind (UINT16 l2cap_cid, tL2CAP_CFG_INFO *p_cfg);
615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void hidh_l2cif_config_cfm (UINT16 l2cap_cid, tL2CAP_CFG_INFO *p_cfg);
625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void hidh_l2cif_disconnect_ind (UINT16 l2cap_cid, BOOLEAN ack_needed);
635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void hidh_l2cif_data_ind (UINT16 l2cap_cid, BT_HDR *p_msg);
645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void hidh_l2cif_disconnect_cfm (UINT16 l2cap_cid, UINT16 result);
655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void hidh_l2cif_cong_ind (UINT16 l2cap_cid, BOOLEAN congested);
665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic const tL2CAP_APPL_INFO hst_reg_info =
685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    hidh_l2cif_connect_ind,
705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    hidh_l2cif_connect_cfm,
715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    NULL,
725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    hidh_l2cif_config_ind,
735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    hidh_l2cif_config_cfm,
745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    hidh_l2cif_disconnect_ind,
755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    hidh_l2cif_disconnect_cfm,
765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    NULL,
775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    hidh_l2cif_data_ind,
785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    hidh_l2cif_cong_ind,
795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    NULL                        /* tL2CA_TX_COMPLETE_CB */
805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         hidh_l2cif_reg
855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function initializes the SDP unit.
875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttHID_STATUS hidh_conn_reg (void)
925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int xx;
945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Initialize the L2CAP configuration. We only care about MTU and flush */
965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset(&hh_cb.l2cap_cfg, 0, sizeof(tL2CAP_CFG_INFO));
975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    hh_cb.l2cap_cfg.mtu_present          = TRUE;
995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    hh_cb.l2cap_cfg.mtu                  = HID_HOST_MTU;
1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    hh_cb.l2cap_cfg.flush_to_present     = TRUE;
1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    hh_cb.l2cap_cfg.flush_to             = HID_HOST_FLUSH_TO;
1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Now, register with L2CAP */
1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!L2CA_Register (HID_PSM_CONTROL, (tL2CAP_APPL_INFO *) &hst_reg_info))
1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
106d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati        HIDH_TRACE_ERROR ("HID-Host Control Registration failed");
1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (HID_ERR_L2CAP_FAILED) ;
1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!L2CA_Register (HID_PSM_INTERRUPT, (tL2CAP_APPL_INFO *) &hst_reg_info))
1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        L2CA_Deregister( HID_PSM_CONTROL ) ;
112d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati        HIDH_TRACE_ERROR ("HID-Host Interrupt Registration failed");
1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (HID_ERR_L2CAP_FAILED) ;
1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (xx = 0; xx < HID_HOST_MAX_DEVICES; xx++)
1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        hh_cb.devices[xx].in_use = FALSE ;
1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        hh_cb.devices[xx].conn.conn_state = HID_CONN_STATE_UNUSED;
1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (HID_SUCCESS);
1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         hidh_conn_disconnect
1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function disconnects a connection.
1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if disconnect started, FALSE if already disconnected
1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttHID_STATUS hidh_conn_disconnect (UINT8 dhandle)
1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tHID_CONN *p_hcon = &hh_cb.devices[dhandle].conn;
1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
138d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati    HIDH_TRACE_EVENT ("HID-Host disconnect");
1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_hcon->ctrl_cid != 0) || (p_hcon->intr_cid != 0))
1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_hcon->conn_state = HID_CONN_STATE_DISCONNECTING;
1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1441747956ba052b1538c29fe7793403dc4f13ba525Hemant Gupta        /* Set l2cap idle timeout to 0 (so ACL link is disconnected
1451747956ba052b1538c29fe7793403dc4f13ba525Hemant Gupta         * immediately after last channel is closed) */
146444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        L2CA_SetIdleTimeoutByBdAddr(hh_cb.devices[dhandle].addr, 0, BT_TRANSPORT_BR_EDR);
1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Disconnect both interrupt and control channels */
1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_hcon->intr_cid)
1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            L2CA_DisconnectReq (p_hcon->intr_cid);
150bf51271f145204a0489597ccd9c851daa7ee0ad7Hemant Gupta        else if (p_hcon->ctrl_cid)
1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            L2CA_DisconnectReq (p_hcon->ctrl_cid);
1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_hcon->conn_state = HID_CONN_STATE_UNUSED;
1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (HID_SUCCESS);
1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         hidh_sec_check_complete_term
1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      HID security check complete callback function.
1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Send L2CA_ConnectRsp OK if secutiry check succeed; otherwise
1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  send security block L2C connection response.
1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1718fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Battavoid hidh_sec_check_complete_term (BD_ADDR bd_addr, tBT_TRANSPORT transport, void *p_ref_data, UINT8 res)
1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tHID_HOST_DEV_CTB *p_dev= (tHID_HOST_DEV_CTB *) p_ref_data;
1745cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(bd_addr);
1758fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta    UNUSED (transport);
1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if( res == BTM_SUCCESS && p_dev->conn.conn_state == HID_CONN_STATE_SECURITY )
1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev->conn.disc_reason = HID_SUCCESS;  /* Authentication passed. Reset disc_reason (from HID_ERR_AUTH_FAILED) */
1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev->conn.conn_state = HID_CONN_STATE_CONNECTING_INTR;
1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Send response to the L2CAP layer. */
1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        L2CA_ConnectRsp (p_dev->addr, p_dev->conn.ctrl_id, p_dev->conn.ctrl_cid, L2CAP_CONN_OK, L2CAP_CONN_OK);
1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Send a Configuration Request. */
1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        L2CA_ConfigReq (p_dev->conn.ctrl_cid, &hh_cb.l2cap_cfg);
1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* security check fail */
1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if (res != BTM_SUCCESS)
1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev->conn.disc_reason = HID_ERR_AUTH_FAILED;      /* Save reason for disconnecting */
1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev->conn.conn_state = HID_CONN_STATE_UNUSED;
1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        L2CA_ConnectRsp (p_dev->addr, p_dev->conn.ctrl_id, p_dev->conn.ctrl_cid, L2CAP_CONN_SECURITY_BLOCK, L2CAP_CONN_OK);
1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         hidh_l2cif_connect_ind
2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function handles an inbound connection indication
2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  from L2CAP. This is the case where we are acting as a
2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  server.
2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void hidh_l2cif_connect_ind (BD_ADDR  bd_addr, UINT16 l2cap_cid, UINT16 psm, UINT8 l2cap_id)
2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tHID_CONN    *p_hcon;
2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN      bAccept = TRUE;
2142e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    UINT8        i = HID_HOST_MAX_DEVICES;
2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tHID_HOST_DEV_CTB *p_dev;
2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
217d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati    HIDH_TRACE_EVENT ("HID-Host Rcvd L2CAP conn ind, PSM: 0x%04x  CID 0x%x", psm, l2cap_cid);
2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2192e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    /* always add incoming connection device into HID database by default */
2202e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (HID_HostAddDev(bd_addr, HID_SEC_REQUIRED, &i) != HID_SUCCESS)
2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        L2CA_ConnectRsp (bd_addr, l2cap_id, l2cap_cid, L2CAP_CONN_SECURITY_BLOCK, 0);
2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_hcon = &hh_cb.devices[i].conn;
2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev  = &hh_cb.devices[i];
2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Check we are in the correct state for this */
2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (psm == HID_PSM_INTERRUPT)
2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_hcon->ctrl_cid == 0)
2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
234d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati            HIDH_TRACE_WARNING ("HID-Host Rcvd INTR L2CAP conn ind, but no CTL channel");
2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bAccept = FALSE;
2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_hcon->conn_state != HID_CONN_STATE_CONNECTING_INTR)
2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
239d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati            HIDH_TRACE_WARNING ("HID-Host Rcvd INTR L2CAP conn ind, wrong state: %d",
2402e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                 p_hcon->conn_state);
2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bAccept = FALSE;
2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else /* CTRL channel */
2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if defined(HID_HOST_ACPT_NEW_CONN) && (HID_HOST_ACPT_NEW_CONN == TRUE)
2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_hcon->ctrl_cid = p_hcon->intr_cid = 0;
2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_hcon->conn_state = HID_CONN_STATE_UNUSED;
2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_hcon->conn_state != HID_CONN_STATE_UNUSED)
2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
252d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati            HIDH_TRACE_WARNING ("HID-Host - Rcvd CTL L2CAP conn ind, wrong state: %d",
2532e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                 p_hcon->conn_state);
2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bAccept = FALSE;
2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!bAccept)
2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        L2CA_ConnectRsp (bd_addr, l2cap_id, l2cap_cid, L2CAP_CONN_NO_RESOURCES, 0);
2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (psm == HID_PSM_CONTROL)
2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_hcon->conn_flags = 0;
2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_hcon->ctrl_cid   = l2cap_cid;
2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_hcon->ctrl_id    = l2cap_id;
2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_hcon->disc_reason = HID_L2CAP_CONN_FAIL;  /* In case disconnection occurs before security is completed, then set CLOSE_EVT reason code to 'connection failure' */
2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_hcon->conn_state = HID_CONN_STATE_SECURITY;
2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if(btm_sec_mx_access_request (p_dev->addr, HID_PSM_CONTROL,
2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            FALSE, BTM_SEC_PROTO_HID,
2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (p_dev->attr_mask & HID_SEC_REQUIRED) ? HID_SEC_CHN : HID_NOSEC_CHN,
2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            &hidh_sec_check_complete_term, p_dev) == BTM_CMD_STARTED)
2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            L2CA_ConnectRsp (bd_addr, l2cap_id, l2cap_cid, L2CAP_CONN_PENDING, L2CAP_CONN_OK);
2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Transition to the next appropriate state, configuration */
2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_hcon->conn_state = HID_CONN_STATE_CONFIG;
2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_hcon->intr_cid   = l2cap_cid;
2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Send response to the L2CAP layer. */
2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    L2CA_ConnectRsp (bd_addr, l2cap_id, l2cap_cid, L2CAP_CONN_OK, L2CAP_CONN_OK);
2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Send a Configuration Request. */
2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    L2CA_ConfigReq (l2cap_cid, &hh_cb.l2cap_cfg);
2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
294d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati    HIDH_TRACE_EVENT ("HID-Host Rcvd L2CAP conn ind, sent config req, PSM: 0x%04x  CID 0x%x",
2952e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                       psm, l2cap_cid);
2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29878bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavovvoid hidh_process_repage_timer_timeout(void *data)
29978bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov{
30078bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov  uint8_t dhandle = PTR_TO_UINT(data);
30178bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov  hidh_try_repage(dhandle);
30278bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov}
30378bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov
3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
30678bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov** Function         hidh_try_repage
3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
30878bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov** Description      This function processes timeout (to page device).
3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
31378bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavovvoid hidh_try_repage(UINT8 dhandle)
3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
315bb95452741bfd65723ea417c25dbd326c7568ab7Arman Uguray    tHID_HOST_DEV_CTB *device;
316bb95452741bfd65723ea417c25dbd326c7568ab7Arman Uguray
317bb95452741bfd65723ea417c25dbd326c7568ab7Arman Uguray    hidh_conn_initiate(dhandle);
318bb95452741bfd65723ea417c25dbd326c7568ab7Arman Uguray
319bb95452741bfd65723ea417c25dbd326c7568ab7Arman Uguray    device = &hh_cb.devices[dhandle];
320bb95452741bfd65723ea417c25dbd326c7568ab7Arman Uguray    device->conn_tries++;
321bb95452741bfd65723ea417c25dbd326c7568ab7Arman Uguray
322bb95452741bfd65723ea417c25dbd326c7568ab7Arman Uguray    hh_cb.callback(dhandle, device->addr, HID_HDEV_EVT_RETRYING,
323bb95452741bfd65723ea417c25dbd326c7568ab7Arman Uguray                   device->conn_tries, NULL ) ;
3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         hidh_sec_check_complete_orig
3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function checks to see if security procedures are being
3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  carried out or not..
3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3368fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Battavoid hidh_sec_check_complete_orig (BD_ADDR bd_addr, tBT_TRANSPORT transport, void *p_ref_data, UINT8 res)
3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tHID_HOST_DEV_CTB *p_dev = (tHID_HOST_DEV_CTB *) p_ref_data;
3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 dhandle;
3405cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(bd_addr);
3418fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta    UNUSED (transport);
3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
343bb95452741bfd65723ea417c25dbd326c7568ab7Arman Uguray    // TODO(armansito): This kind of math to determine a device handle is way
344bb95452741bfd65723ea417c25dbd326c7568ab7Arman Uguray    // too dirty and unnecessary. Why can't |p_dev| store it's handle?
345bb95452741bfd65723ea417c25dbd326c7568ab7Arman Uguray    dhandle = (PTR_TO_UINT(p_dev) - PTR_TO_UINT(&(hh_cb.devices[0])))/ sizeof(tHID_HOST_DEV_CTB);
3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if( res == BTM_SUCCESS && p_dev->conn.conn_state == HID_CONN_STATE_SECURITY )
3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
348d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati        HIDH_TRACE_EVENT ("HID-Host Originator security pass.");
3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev->conn.disc_reason = HID_SUCCESS;  /* Authentication passed. Reset disc_reason (from HID_ERR_AUTH_FAILED) */
3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3517f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta        /* Transition to the next appropriate state, configuration */
3527f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta        p_dev->conn.conn_state = HID_CONN_STATE_CONFIG;
3537f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta        L2CA_ConfigReq (p_dev->conn.ctrl_cid, &hh_cb.l2cap_cfg);
354d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati        HIDH_TRACE_EVENT ("HID-Host Got Control conn cnf, sent cfg req, CID: 0x%x", p_dev->conn.ctrl_cid);
3557f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta
3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if( res != BTM_SUCCESS && p_dev->conn.conn_state == HID_CONN_STATE_SECURITY )
3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (HID_HOST_MAX_CONN_RETRY > 0)
3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if( res == BTM_DEVICE_TIMEOUT )
3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if( p_dev->conn_tries <= HID_HOST_MAX_CONN_RETRY )
3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                hidh_conn_retry (dhandle);
3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return;
3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev->conn.disc_reason = HID_ERR_AUTH_FAILED;      /* Save reason for disconnecting */
3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        hidh_conn_disconnect(dhandle);
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/*******************************************************************************
3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         hidh_l2cif_connect_cfm
3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function handles the connect confirm events
3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  from L2CAP. This is the case when we are acting as a
3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  client and have sent a connect request.
3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void hidh_l2cif_connect_cfm (UINT16 l2cap_cid, UINT16 result)
3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 dhandle;
3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tHID_CONN    *p_hcon = NULL;
3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT32  reason;
3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tHID_HOST_DEV_CTB *p_dev = NULL;
3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Find CCB based on CID, and verify we are in a state to accept this message */
3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if( (dhandle = find_conn_by_cid(l2cap_cid)) < HID_HOST_MAX_DEVICES )
3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev = &hh_cb.devices[dhandle];
3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_hcon = &hh_cb.devices[dhandle].conn;
3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_hcon == NULL)
4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project     || (!(p_hcon->conn_flags & HID_CONN_FLAGS_IS_ORIG))
4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project     || ((l2cap_cid == p_hcon->ctrl_cid) && (p_hcon->conn_state != HID_CONN_STATE_CONNECTING_CTRL))
404742d9fa575cd1ea12c7d4413f1bec62863b07cabHemant Gupta     || ((l2cap_cid == p_hcon->intr_cid) && (p_hcon->conn_state != HID_CONN_STATE_CONNECTING_INTR)
405742d9fa575cd1ea12c7d4413f1bec62863b07cabHemant Gupta     && (p_hcon->conn_state != HID_CONN_STATE_DISCONNECTING)))
4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
407d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati        HIDH_TRACE_WARNING ("HID-Host Rcvd unexpected conn cnf, CID 0x%x ", l2cap_cid);
4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (result != L2CAP_CONN_OK)
4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (l2cap_cid == p_hcon->ctrl_cid)
4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_hcon->ctrl_cid = 0;
4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_hcon->intr_cid = 0;
4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        hidh_conn_disconnect(dhandle);
4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (HID_HOST_MAX_CONN_RETRY > 0)
4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if( (hh_cb.devices[dhandle].conn_tries <= HID_HOST_MAX_CONN_RETRY) &&
4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (result == HCI_ERR_CONNECTION_TOUT || result == HCI_ERR_UNSPECIFIED ||
4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             result == HCI_ERR_PAGE_TIMEOUT) )
4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            hidh_conn_retry(dhandle);
4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            reason = HID_L2CAP_CONN_FAIL | (UINT32) result ;
4312e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            hh_cb.callback( dhandle, hh_cb.devices[dhandle].addr, HID_HDEV_EVT_CLOSE, reason, NULL ) ;
4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* receive Control Channel connect confirmation */
4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (l2cap_cid == p_hcon->ctrl_cid)
4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* check security requirement */
4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_hcon->conn_state = HID_CONN_STATE_SECURITY;
4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_hcon->disc_reason = HID_L2CAP_CONN_FAIL;  /* In case disconnection occurs before security is completed, then set CLOSE_EVT reason code to "connection failure" */
4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_mx_access_request (p_dev->addr, HID_PSM_CONTROL,
4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            TRUE, BTM_SEC_PROTO_HID,
4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (p_dev->attr_mask & HID_SEC_REQUIRED) ? HID_SEC_CHN : HID_NOSEC_CHN,
4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            &hidh_sec_check_complete_orig, p_dev);
4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_hcon->conn_state = HID_CONN_STATE_CONFIG;
4507f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta        /* Send a Configuration Request. */
4517f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta        L2CA_ConfigReq (l2cap_cid, &hh_cb.l2cap_cfg);
452d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati        HIDH_TRACE_EVENT ("HID-Host got Interrupt conn cnf, sent cfg req, CID: 0x%x", l2cap_cid);
4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return;
4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         hidh_l2cif_config_ind
4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function processes the L2CAP configuration indication
4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  event.
4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void hidh_l2cif_config_ind (UINT16 l2cap_cid, tL2CAP_CFG_INFO *p_cfg)
4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 dhandle;
4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tHID_CONN    *p_hcon = NULL;
4727f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta    UINT32  reason;
4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Find CCB based on CID */
4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if( (dhandle = find_conn_by_cid(l2cap_cid)) < HID_HOST_MAX_DEVICES )
4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_hcon = &hh_cb.devices[dhandle].conn;
4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_hcon == NULL)
4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
482d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati        HIDH_TRACE_WARNING ("HID-Host Rcvd L2CAP cfg ind, unknown CID: 0x%x", l2cap_cid);
4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
486d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati    HIDH_TRACE_EVENT ("HID-Host Rcvd cfg ind, sent cfg cfm, CID: 0x%x", l2cap_cid);
4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Remember the remote MTU size */
4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((!p_cfg->mtu_present) || (p_cfg->mtu > HID_HOST_MTU))
4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_hcon->rem_mtu_size = HID_HOST_MTU;
4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_hcon->rem_mtu_size = p_cfg->mtu;
4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* For now, always accept configuration from the other side */
4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cfg->flush_to_present = FALSE;
4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cfg->mtu_present      = FALSE;
4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cfg->result           = L2CAP_CFG_OK;
4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    L2CA_ConfigRsp (l2cap_cid, p_cfg);
5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (l2cap_cid == p_hcon->ctrl_cid)
5027f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta    {
5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_hcon->conn_flags |= HID_CONN_FLAGS_HIS_CTRL_CFG_DONE;
5047f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta        if ((p_hcon->conn_flags & HID_CONN_FLAGS_IS_ORIG) &&
5057f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta           (p_hcon->conn_flags & HID_CONN_FLAGS_MY_CTRL_CFG_DONE))
5067f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta        {
5077f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta            /* Connect interrupt channel */
5087f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta            p_hcon->disc_reason = HID_L2CAP_CONN_FAIL;	/* Reset initial reason for CLOSE_EVT: Connection Attempt was made but failed */
5097f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta            if ((p_hcon->intr_cid = L2CA_ConnectReq (HID_PSM_INTERRUPT, hh_cb.devices[dhandle].addr)) == 0)
5107f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta            {
511d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati                HIDH_TRACE_WARNING ("HID-Host INTR Originate failed");
5127f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta                reason = HID_L2CAP_REQ_FAIL ;
5137f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta                p_hcon->conn_state = HID_CONN_STATE_UNUSED;
5147f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta                hidh_conn_disconnect (dhandle);
5157f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta                hh_cb.callback( dhandle, hh_cb.devices[dhandle].addr, HID_HDEV_EVT_CLOSE, reason, NULL ) ;
5167f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta                return;
5177f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta            }
5187f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta            else
5197f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta            {
5207f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta                /* Transition to the next appropriate state, waiting for connection confirm on interrupt channel. */
5217f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta                p_hcon->conn_state = HID_CONN_STATE_CONNECTING_INTR;
5227f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta            }
5237f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta        }
5247f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta    }
5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_hcon->conn_flags |= HID_CONN_FLAGS_HIS_INTR_CFG_DONE;
5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If all configuration is complete, change state and tell management we are up */
5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (((p_hcon->conn_flags & HID_CONN_FLAGS_ALL_CONFIGURED) == HID_CONN_FLAGS_ALL_CONFIGURED)
5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project     && (p_hcon->conn_state == HID_CONN_STATE_CONFIG))
5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_hcon->conn_state = HID_CONN_STATE_CONNECTED;
5338f322bfe42a57902e7c45713a5c6215dfbe2494aHemant Gupta        /* Reset disconnect reason to success, as connection successful */
5348f322bfe42a57902e7c45713a5c6215dfbe2494aHemant Gupta        p_hcon->disc_reason = HID_SUCCESS;
5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        hh_cb.devices[dhandle].state = HID_DEV_CONNECTED;
5372e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        hh_cb.callback( dhandle,  hh_cb.devices[dhandle].addr, HID_HDEV_EVT_OPEN, 0, NULL ) ;
5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         hidh_l2cif_config_cfm
5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function processes the L2CAP configuration confirmation
5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  event.
5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void hidh_l2cif_config_cfm (UINT16 l2cap_cid, tL2CAP_CFG_INFO *p_cfg)
5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 dhandle;
5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tHID_CONN    *p_hcon = NULL;
5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT32  reason;
5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
558d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati    HIDH_TRACE_EVENT ("HID-Host Rcvd cfg cfm, CID: 0x%x  Result: %d", l2cap_cid, p_cfg->result);
5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Find CCB based on CID */
5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if( (dhandle = find_conn_by_cid(l2cap_cid)) < HID_HOST_MAX_DEVICES )
5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_hcon = &hh_cb.devices[dhandle].conn;
5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_hcon == NULL)
5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
566d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati        HIDH_TRACE_WARNING ("HID-Host Rcvd L2CAP cfg ind, unknown CID: 0x%x", l2cap_cid);
5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If configuration failed, disconnect the channel(s) */
5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_cfg->result != L2CAP_CFG_OK)
5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        hidh_conn_disconnect (dhandle);
5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        reason = HID_L2CAP_CFG_FAIL | (UINT32) p_cfg->result ;
5752e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        hh_cb.callback( dhandle, hh_cb.devices[dhandle].addr, HID_HDEV_EVT_CLOSE, reason, NULL ) ;
5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (l2cap_cid == p_hcon->ctrl_cid)
5807f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta    {
5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_hcon->conn_flags |= HID_CONN_FLAGS_MY_CTRL_CFG_DONE;
5827f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta        if ((p_hcon->conn_flags & HID_CONN_FLAGS_IS_ORIG) &&
5837f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta           (p_hcon->conn_flags & HID_CONN_FLAGS_HIS_CTRL_CFG_DONE))
5847f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta        {
5857f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta            /* Connect interrupt channel */
5867f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta            p_hcon->disc_reason = HID_L2CAP_CONN_FAIL;  /* Reset initial reason for CLOSE_EVT: Connection Attempt was made but failed */
5877f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta            if ((p_hcon->intr_cid = L2CA_ConnectReq (HID_PSM_INTERRUPT, hh_cb.devices[dhandle].addr)) == 0)
5887f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta            {
589d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati                HIDH_TRACE_WARNING ("HID-Host INTR Originate failed");
5907f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta                reason = HID_L2CAP_REQ_FAIL ;
5917f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta                p_hcon->conn_state = HID_CONN_STATE_UNUSED;
5927f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta                hidh_conn_disconnect (dhandle);
5937f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta                hh_cb.callback( dhandle, hh_cb.devices[dhandle].addr, HID_HDEV_EVT_CLOSE, reason, NULL ) ;
5947f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta                return;
5957f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta            }
5967f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta            else
5977f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta            {
5987f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta                /* Transition to the next appropriate state, waiting for connection confirm on interrupt channel. */
5997f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta                p_hcon->conn_state = HID_CONN_STATE_CONNECTING_INTR;
6007f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta            }
6017f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta        }
6027f7d49370a7527052995c0f1ce355f72b073510dHemant Gupta    }
6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_hcon->conn_flags |= HID_CONN_FLAGS_MY_INTR_CFG_DONE;
6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If all configuration is complete, change state and tell management we are up */
6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (((p_hcon->conn_flags & HID_CONN_FLAGS_ALL_CONFIGURED) == HID_CONN_FLAGS_ALL_CONFIGURED)
6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project     && (p_hcon->conn_state == HID_CONN_STATE_CONFIG))
6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_hcon->conn_state = HID_CONN_STATE_CONNECTED;
6118f322bfe42a57902e7c45713a5c6215dfbe2494aHemant Gupta        /* Reset disconnect reason to success, as connection successful */
6128f322bfe42a57902e7c45713a5c6215dfbe2494aHemant Gupta        p_hcon->disc_reason = HID_SUCCESS;
6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        hh_cb.devices[dhandle].state = HID_DEV_CONNECTED;
6152e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        hh_cb.callback( dhandle, hh_cb.devices[dhandle].addr, HID_HDEV_EVT_OPEN, 0, NULL ) ;
6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         hidh_l2cif_disconnect_ind
6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function handles a disconnect event from L2CAP. If
6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  requested to, we ack the disconnect before dropping the CCB
6265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
6285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
6305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void hidh_l2cif_disconnect_ind (UINT16 l2cap_cid, BOOLEAN ack_needed)
6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 dhandle;
6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tHID_CONN    *p_hcon = NULL;
6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16 disc_res = HCI_SUCCESS;
6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16 hid_close_evt_reason;
6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Find CCB based on CID */
6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if( (dhandle = find_conn_by_cid(l2cap_cid)) < HID_HOST_MAX_DEVICES )
6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_hcon = &hh_cb.devices[dhandle].conn;
6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_hcon == NULL)
6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
643d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati        HIDH_TRACE_WARNING ("HID-Host Rcvd L2CAP disc, unknown CID: 0x%x", l2cap_cid);
6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (ack_needed)
6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        L2CA_DisconnectRsp (l2cap_cid);
6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
650d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati    HIDH_TRACE_EVENT ("HID-Host Rcvd L2CAP disc, CID: 0x%x", l2cap_cid);
6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_hcon->conn_state = HID_CONN_STATE_DISCONNECTING;
6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (l2cap_cid == p_hcon->ctrl_cid)
6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_hcon->ctrl_cid = 0;
6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_hcon->intr_cid = 0;
6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_hcon->ctrl_cid == 0) && (p_hcon->intr_cid == 0))
6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        hh_cb.devices[dhandle].state = HID_DEV_NO_CONN;
6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_hcon->conn_state = HID_CONN_STATE_UNUSED;
6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if( !ack_needed )
6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            disc_res = btm_get_acl_disc_reason_code();
6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (HID_HOST_MAX_CONN_RETRY > 0)
6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if( (disc_res == HCI_ERR_CONNECTION_TOUT || disc_res == HCI_ERR_UNSPECIFIED) &&
6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (!(hh_cb.devices[dhandle].attr_mask & HID_RECONN_INIT)) &&
6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (hh_cb.devices[dhandle].attr_mask & HID_NORMALLY_CONNECTABLE))
6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            hh_cb.devices[dhandle].conn_tries = 0;
67378bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov            period_ms_t interval_ms = HID_HOST_REPAGE_WIN * 1000;
67478bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov            alarm_set_on_queue(hh_cb.devices[dhandle].conn.process_repage_timer,
67578bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                               interval_ms, hidh_process_repage_timer_timeout,
67678bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                               UINT_TO_PTR(dhandle), btu_general_alarm_queue);
6770ab408fe6f6cb698ba1fcd8492d117c0d3574c7dHemant Gupta            hh_cb.callback( dhandle,  hh_cb.devices[dhandle].addr, HID_HDEV_EVT_CLOSE, disc_res, NULL);
6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Set reason code for HID_HDEV_EVT_CLOSE */
6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            hid_close_evt_reason = p_hcon->disc_reason;
6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* If we got baseband sent HCI_DISCONNECT_COMPLETE_EVT due to security failure, then set reason to HID_ERR_AUTH_FAILED */
6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ((disc_res == HCI_ERR_AUTH_FAILURE)                        ||
6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                (disc_res == HCI_ERR_KEY_MISSING)                         ||
6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                (disc_res == HCI_ERR_HOST_REJECT_SECURITY)                ||
6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                (disc_res == HCI_ERR_PAIRING_NOT_ALLOWED)                 ||
6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                (disc_res == HCI_ERR_UNIT_KEY_USED)                       ||
6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                (disc_res == HCI_ERR_PAIRING_WITH_UNIT_KEY_NOT_SUPPORTED) ||
6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                (disc_res == HCI_ERR_ENCRY_MODE_NOT_ACCEPTABLE)           ||
6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                (disc_res == HCI_ERR_REPEATED_ATTEMPTS))
6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                hid_close_evt_reason = HID_ERR_AUTH_FAILED;
6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
6975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6982e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            hh_cb.callback( dhandle,  hh_cb.devices[dhandle].addr, HID_HDEV_EVT_CLOSE, hid_close_evt_reason, NULL ) ;
6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         hidh_l2cif_disconnect_cfm
7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function handles a disconnect confirm event from L2CAP.
7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
7115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void hidh_l2cif_disconnect_cfm (UINT16 l2cap_cid, UINT16 result)
7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 dhandle;
7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tHID_CONN    *p_hcon = NULL;
7175cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(result);
7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Find CCB based on CID */
7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if( (dhandle = find_conn_by_cid(l2cap_cid)) < HID_HOST_MAX_DEVICES )
7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_hcon = &hh_cb.devices[dhandle].conn;
7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_hcon == NULL)
7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
725d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati        HIDH_TRACE_WARNING ("HID-Host Rcvd L2CAP disc cfm, unknown CID: 0x%x", l2cap_cid);
7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
729d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati    HIDH_TRACE_EVENT ("HID-Host Rcvd L2CAP disc cfm, CID: 0x%x", l2cap_cid);
7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (l2cap_cid == p_hcon->ctrl_cid)
7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_hcon->ctrl_cid = 0;
7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
734bf51271f145204a0489597ccd9c851daa7ee0ad7Hemant Gupta    {
7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_hcon->intr_cid = 0;
736bf51271f145204a0489597ccd9c851daa7ee0ad7Hemant Gupta        if (p_hcon->ctrl_cid)
737bf51271f145204a0489597ccd9c851daa7ee0ad7Hemant Gupta        {
738d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati            HIDH_TRACE_EVENT ("HID-Host Initiating L2CAP Ctrl disconnection");
739bf51271f145204a0489597ccd9c851daa7ee0ad7Hemant Gupta            L2CA_DisconnectReq (p_hcon->ctrl_cid);
740bf51271f145204a0489597ccd9c851daa7ee0ad7Hemant Gupta        }
741bf51271f145204a0489597ccd9c851daa7ee0ad7Hemant Gupta    }
7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_hcon->ctrl_cid == 0) && (p_hcon->intr_cid == 0))
7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        hh_cb.devices[dhandle].state = HID_DEV_NO_CONN;
7465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_hcon->conn_state = HID_CONN_STATE_UNUSED;
7472e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        hh_cb.callback( dhandle, hh_cb.devices[dhandle].addr, HID_HDEV_EVT_CLOSE, p_hcon->disc_reason, NULL ) ;
7485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         hidh_l2cif_cong_ind
7555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function handles a congestion status event from L2CAP.
7575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
7595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
7615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void hidh_l2cif_cong_ind (UINT16 l2cap_cid, BOOLEAN congested)
7625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 dhandle;
7645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tHID_CONN    *p_hcon = NULL;
7655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Find CCB based on CID */
7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if( (dhandle = find_conn_by_cid(l2cap_cid)) < HID_HOST_MAX_DEVICES )
7685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_hcon = &hh_cb.devices[dhandle].conn;
7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_hcon == NULL)
7715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
772d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati        HIDH_TRACE_WARNING ("HID-Host Rcvd L2CAP congestion status, unknown CID: 0x%x", l2cap_cid);
7735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
7745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
776d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati    HIDH_TRACE_EVENT ("HID-Host Rcvd L2CAP congestion status, CID: 0x%x  Cong: %d", l2cap_cid, congested);
7775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (congested)
7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_hcon->conn_flags |= HID_CONN_FLAGS_CONGESTED;
7805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
7815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_hcon->conn_flags &= ~HID_CONN_FLAGS_CONGESTED;
7835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
7895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         hidh_l2cif_data_ind
7915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when data is received from L2CAP.
7935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  if we are the originator of the connection, we are the SDP
7945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  client, and the received message is queued up for the client.
7955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  If we are the destination of the connection, we are the SDP
7975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  server, so the message is passed to the server processing
7985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  function.
7995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
8015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
8035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void hidh_l2cif_data_ind (UINT16 l2cap_cid, BT_HDR *p_msg)
8045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
8055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8           *p_data = (UINT8 *)(p_msg + 1) + p_msg->offset;
8065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8           ttype, param, rep_type, evt;
8075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 dhandle;
8085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tHID_CONN    *p_hcon = NULL;
8095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
810d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati    HIDH_TRACE_DEBUG ("HID-Host hidh_l2cif_data_ind [l2cap_cid=0x%04x]", l2cap_cid);
8115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Find CCB based on CID */
8135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project     if ((dhandle = find_conn_by_cid(l2cap_cid)) < HID_HOST_MAX_DEVICES)
8145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_hcon = &hh_cb.devices[dhandle].conn;
8155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_hcon == NULL)
8175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
818d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati        HIDH_TRACE_WARNING ("HID-Host Rcvd L2CAP data, unknown CID: 0x%x", l2cap_cid);
819abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov        osi_free(p_msg);
8205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
8215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ttype    = HID_GET_TRANS_FROM_HDR(*p_data);
8255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    param    = HID_GET_PARAM_FROM_HDR(*p_data);
8265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    rep_type = param & HID_PAR_REP_TYPE_MASK;
8275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_data++;
8285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Get rid of the data type */
8305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_msg->len--;
8315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_msg->offset++;
8325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (ttype)
8345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
8355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_TRANS_HANDSHAKE:
8362e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        hh_cb.callback(dhandle,  hh_cb.devices[dhandle].addr, HID_HDEV_EVT_HANDSHAKE, param, NULL);
837abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov        osi_free(p_msg);
8385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
8395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_TRANS_CONTROL:
8415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        switch (param)
8425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
8435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case HID_PAR_CONTROL_VIRTUAL_CABLE_UNPLUG:
8445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            hidh_conn_disconnect( dhandle ) ;
8455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Device is unplugging from us. Tell USB */
8462e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            hh_cb.callback(dhandle,  hh_cb.devices[dhandle].addr, HID_HDEV_EVT_VC_UNPLUG, 0, NULL);
8475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
8485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        default:
8505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
8515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
852abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov        osi_free(p_msg);
8535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
8545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_TRANS_DATA:
8575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        evt = (hh_cb.devices[dhandle].conn.intr_cid == l2cap_cid) ?
8585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    HID_HDEV_EVT_INTR_DATA : HID_HDEV_EVT_CTRL_DATA;
8592e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        hh_cb.callback(dhandle, hh_cb.devices[dhandle].addr, evt, rep_type, p_msg);
8605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
8615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_TRANS_DATAC:
8635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        evt = (hh_cb.devices[dhandle].conn.intr_cid == l2cap_cid) ?
8645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    HID_HDEV_EVT_INTR_DATC : HID_HDEV_EVT_CTRL_DATC;
8652e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        hh_cb.callback(dhandle,  hh_cb.devices[dhandle].addr, evt, rep_type, p_msg);
8665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
8675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    default:
869abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov        osi_free(p_msg);
8705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
8715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
8735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
8755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         hidh_conn_snd_data
8775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is sends out data.
8795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          tHID_STATUS
8815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
8835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttHID_STATUS hidh_conn_snd_data (UINT8 dhandle, UINT8 trans_type, UINT8 param,
8845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                UINT16 data, UINT8 report_id, BT_HDR *buf)
8855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
8865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tHID_CONN   *p_hcon = &hh_cb.devices[dhandle].conn;
8875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR      *p_buf;
8885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8       *p_out;
8895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16      bytes_copied;
8905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN     seg_req = FALSE;
8915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16      data_size;
8925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16      cid;
8932e3d006b96eafb0651fe7f78d28250faf89405dePavlin Radoslavov    UINT16      buf_size;
8945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8       use_data = 0 ;
8955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN     blank_datc = FALSE;
8965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8978fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta    if (!BTM_IsAclConnectionUp(hh_cb.devices[dhandle].addr, BT_TRANSPORT_BR_EDR))
8988fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta    {
899abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov        osi_free(buf);
90020524d393e8b3bea4c573f7980cd843500b0e6a4Pavlin Radoslavov        return HID_ERR_NO_CONNECTION;
9018fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta    }
9028fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta
9035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_hcon->conn_flags & HID_CONN_FLAGS_CONGESTED)
9045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
905abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov        osi_free(buf);
90620524d393e8b3bea4c573f7980cd843500b0e6a4Pavlin Radoslavov        return HID_ERR_CONGESTED;
9075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch( trans_type )
9105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_TRANS_CONTROL:
9125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_TRANS_GET_REPORT:
9135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_TRANS_SET_REPORT:
9145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_TRANS_GET_PROTOCOL:
9155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_TRANS_SET_PROTOCOL:
9165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_TRANS_GET_IDLE:
9175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_TRANS_SET_IDLE:
9185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        cid = p_hcon->ctrl_cid;
9192e3d006b96eafb0651fe7f78d28250faf89405dePavlin Radoslavov        buf_size = HID_CONTROL_BUF_SIZE;
9205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
9215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_TRANS_DATA:
9225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        cid = p_hcon->intr_cid;
9232e3d006b96eafb0651fe7f78d28250faf89405dePavlin Radoslavov        buf_size = HID_INTERRUPT_BUF_SIZE;
9245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
9255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    default:
9265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (HID_ERR_INVALID_PARAM) ;
9275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if( trans_type == HID_TRANS_SET_IDLE )
9305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        use_data = 1;
9315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if( (trans_type == HID_TRANS_GET_REPORT) && (param & 0x08) )
9325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        use_data = 2;
9335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    do
9355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ( buf == NULL || blank_datc )
9375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
938abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov            p_buf = (BT_HDR *)osi_malloc(buf_size);
9395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_buf->offset = L2CAP_MIN_OFFSET;
9415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            seg_req = FALSE;
9425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            data_size = 0;
9435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bytes_copied = 0;
9445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            blank_datc = FALSE;
9455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
9465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if ( (buf->len > (p_hcon->rem_mtu_size - 1)))
9475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
948abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov            p_buf = (BT_HDR *)osi_malloc(buf_size);
9495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_buf->offset = L2CAP_MIN_OFFSET;
9515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            seg_req = TRUE;
9525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            data_size = buf->len;
9535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bytes_copied = p_hcon->rem_mtu_size - 1;
9545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
9555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
9565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
9575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_buf = buf ;
9585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_buf->offset -= 1;
9595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            seg_req = FALSE;
9605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            data_size = buf->len;
9615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bytes_copied = buf->len;
9625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
9635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_out         = (UINT8 *)(p_buf + 1) + p_buf->offset;
9655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *p_out++      = HID_BUILD_HDR(trans_type, param);
9665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If report ID required for this device */
9685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if( (trans_type == HID_TRANS_GET_REPORT) && (report_id != 0) )
9695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
9705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *p_out = report_id;
9715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            data_size = bytes_copied = 1;
9725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
9735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (seg_req)
9765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
9775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memcpy (p_out, (((UINT8 *)(buf+1)) + buf->offset), bytes_copied);
9785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            buf->offset += bytes_copied;
9795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            buf->len -= bytes_copied;
9805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
9815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if( use_data == 1)
9825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
9835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *(p_out+bytes_copied) = data & 0xff;
9845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
9855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if( use_data == 2 )
9865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
9875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *(p_out+bytes_copied) = data & 0xff;
9885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *(p_out+bytes_copied+1) = (data >> 8) & 0xff ;
9895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
9905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_buf->len   = bytes_copied + 1 + use_data;
9925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        data_size    -= bytes_copied;
9935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Send the buffer through L2CAP */
9955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_hcon->conn_flags & HID_CONN_FLAGS_CONGESTED) || (!L2CA_DataWrite (cid, p_buf)))
9965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return (HID_ERR_CONGESTED);
9975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (data_size)
9995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            trans_type = HID_TRANS_DATAC;
10005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if( bytes_copied == (p_hcon->rem_mtu_size - 1) )
10015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
10025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            trans_type = HID_TRANS_DATAC;
10035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            blank_datc = TRUE;
10045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
10055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    } while ((data_size != 0) || blank_datc ) ;
10075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (HID_SUCCESS);
10095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
10105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
10115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         hidh_conn_initiate
10135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called by the management to create a connection.
10155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
10175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
10195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttHID_STATUS hidh_conn_initiate (UINT8 dhandle)
10205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
10212e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    UINT8   service_id = BTM_SEC_SERVICE_HIDH_NOSEC_CTRL;
10225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT32  mx_chan_id = HID_NOSEC_CHN;
10235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tHID_HOST_DEV_CTB *p_dev = &hh_cb.devices[dhandle];
10255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if( p_dev->conn.conn_state != HID_CONN_STATE_UNUSED )
10275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return( HID_ERR_CONN_IN_PROCESS );
10285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev->conn.ctrl_cid = 0;
10305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev->conn.intr_cid = 0;
10315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev->conn.disc_reason = HID_L2CAP_CONN_FAIL;  /* Reset initial reason for CLOSE_EVT: Connection Attempt was made but failed */
10325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* We are the originator of this connection */
10345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev->conn.conn_flags = HID_CONN_FLAGS_IS_ORIG;
10355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(p_dev->attr_mask & HID_SEC_REQUIRED)
10375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
10382e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        service_id = BTM_SEC_SERVICE_HIDH_SEC_CTRL;
10395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        mx_chan_id = HID_SEC_CHN;
10405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_SetOutService (p_dev->addr, service_id, mx_chan_id);
10425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Check if L2CAP started the connection process */
10445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_dev->conn.ctrl_cid = L2CA_ConnectReq (HID_PSM_CONTROL, p_dev->addr)) == 0)
10455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1046d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati        HIDH_TRACE_WARNING ("HID-Host Originate failed");
10472e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        hh_cb.callback( dhandle,  hh_cb.devices[dhandle].addr, HID_HDEV_EVT_CLOSE,
10482e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                HID_ERR_L2CAP_FAILED, NULL ) ;
10495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
10515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
10525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Transition to the next appropriate state, waiting for connection confirm on control channel. */
10535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev->conn.conn_state = HID_CONN_STATE_CONNECTING_CTRL;
10545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return( HID_SUCCESS );
10575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
10585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
10615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         find_conn_by_cid
10635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function finds a connection control block based on CID
10655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          address of control block, or NULL if not found
10675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
10695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic UINT8 find_conn_by_cid (UINT16 cid)
10705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
10715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8      xx;
10725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (xx = 0; xx < HID_HOST_MAX_DEVICES; xx++)
10745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
10755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((hh_cb.devices[xx].in_use) && (hh_cb.devices[xx].conn.conn_state != HID_CONN_STATE_UNUSED)
10765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            && ((hh_cb.devices[xx].conn.ctrl_cid == cid) || (hh_cb.devices[xx].conn.intr_cid == cid)))
10775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
10785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (xx);
10815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
10825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid hidh_conn_dereg( void )
10845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
10855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    L2CA_Deregister (HID_PSM_CONTROL);
10865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    L2CA_Deregister (HID_PSM_INTERRUPT);
10875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
10885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
10905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         hidh_conn_retry
10925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to retry a failed connection.
10945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
10965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
10985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void hidh_conn_retry(  UINT8 dhandle )
10995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
11005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tHID_HOST_DEV_CTB *p_dev = &hh_cb.devices[dhandle];
11015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev->conn.conn_state = HID_CONN_STATE_UNUSED;
11035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (HID_HOST_REPAGE_WIN > 0)
110478bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov    period_ms_t interval_ms = HID_HOST_REPAGE_WIN * 1000;
110578bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov    alarm_set_on_queue(p_dev->conn.process_repage_timer,
110678bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                       interval_ms, hidh_process_repage_timer_timeout,
110778bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                       UINT_TO_PTR(dhandle), btu_general_alarm_queue);
11085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
110978bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov    hidh_process_repage_process(dhandle);
11105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
11115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1112