bta_hh_act.cc revision 8af480e24549ba51a3f6858d9d9af504715e0bea
15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************
25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Copyright (C) 2005-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 HID host action functions.
225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/
245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_target.h"
265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_INCLUDED == TRUE)
285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h>
305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_sys.h"
325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_api.h"
335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "l2c_api.h"
345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_hh_int.h"
355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_hh_co.h"
36d7ffd64accbd50a27289a388856e56244ccbb5daMyles Watson#include "osi/include/osi.h"
375cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen#include "utl.h"
385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
408af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *  Constants
418af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ****************************************************************************/
425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
458af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *  Local Function prototypes
468af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ****************************************************************************/
47e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssenstatic void bta_hh_cback (uint8_t dev_handle, BD_ADDR addr, uint8_t event,
48e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen                            uint32_t data, BT_HDR *pdata);
49e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssenstatic tBTA_HH_STATUS bta_hh_get_trans_status(uint32_t result);
505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
51e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE)
52e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssenstatic const char* bta_hh_get_w4_event(uint16_t event);
53e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssenstatic const char * bta_hh_hid_event_name(uint16_t event);
545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
578af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *  Action Functions
588af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ****************************************************************************/
595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
608af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
618af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_hh_api_enable
628af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
638af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      Perform necessary operations to enable HID host.
648af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
658af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
668af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          void
678af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
688af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_api_enable(tBTA_HH_DATA *p_data)
705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_HH_STATUS      status = BTA_HH_ERR;
72e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen    uint8_t               xx;
735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* initialize BTE HID */
755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    HID_HostInit();
765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset(&bta_hh_cb, 0, sizeof(tBTA_HH_CB));
785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    HID_HostSetSecurityLevel("", p_data->api_enable.sec_mask);
805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Register with L2CAP */
825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( HID_HostRegister (bta_hh_cback) == HID_SUCCESS)
835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* store parameters */
855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_hh_cb.p_cback = p_data->api_enable.p_cback;
865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        status = BTA_HH_OK;
885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* initialize device CB */
89ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        for (xx = 0; xx < BTA_HH_MAX_DEVICE; xx ++)
905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_hh_cb.kdev[xx].state        = BTA_HH_IDLE_ST;
925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_hh_cb.kdev[xx].hid_handle   = BTA_HH_INVALID_HANDLE;
935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_hh_cb.kdev[xx].index        = xx;
945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
95ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
96ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        /* initialize control block map */
97ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        for (xx = 0; xx < BTA_HH_MAX_KNOWN; xx ++)
98ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            bta_hh_cb.cb_index[xx]          = BTA_HH_IDX_INVALID;
995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1012e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if (BTA_HH_LE_INCLUDED == TRUE)
1022e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (status == BTA_HH_OK)
1032e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
1042e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        bta_hh_le_enable();
1052e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
1062e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    else
1072e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif
108ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        /* signal BTA call back event */
109ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        (* bta_hh_cb.p_cback)(BTA_HH_ENABLE_EVT, (tBTA_HH *)&status);
1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1128af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1138af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_hh_api_disable
1148af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1158af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      Perform necessary operations to disable HID host.
1168af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1178af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1188af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          void
1198af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1208af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_api_disable(void)
1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
123e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen    uint8_t xx;
1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* service is not enabled */
1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (bta_hh_cb.p_cback == NULL)
1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* no live connection, signal DISC_CMPL_EVT directly */
1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!bta_hh_cb.cnt_num)
1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_hh_disc_cmpl();
1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else /* otherwise, disconnect all live connections */
1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
136e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen        bta_hh_cb.w4_disable = true;
1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
138ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        for(xx = 0; xx < BTA_HH_MAX_DEVICE; xx ++)
1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* send API_CLOSE event to every connected device */
1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ( bta_hh_cb.kdev[xx].state == BTA_HH_CONN_ST )
1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* disconnect all connected devices */
1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_hh_sm_execute(&bta_hh_cb.kdev[xx],
1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                BTA_HH_API_CLOSE_EVT,
1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                NULL);
1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return;
1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1558af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1568af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_hh_disc_cmpl
1578af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1588af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      All connections have been closed, disable service.
1598af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1608af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1618af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          void
1628af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1638af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_disc_cmpl(void)
1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
166d628a0695e73973e0bd54dd026bfed900b69f804Myles Watson#if (BTA_HH_LE_INCLUDED == TRUE)
167d628a0695e73973e0bd54dd026bfed900b69f804Myles Watson    HID_HostDeregister();
168d628a0695e73973e0bd54dd026bfed900b69f804Myles Watson    bta_hh_le_deregister();
169d628a0695e73973e0bd54dd026bfed900b69f804Myles Watson#else
1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_HH_STATUS  status = BTA_HH_OK;
1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Deregister with lower layer */
1734540f59bc447dc2b7b31a3e974b74a60b2417e7dVenkatRaghavan VijayaRaghavan    if (HID_HostDeregister() != HID_SUCCESS)
1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        status = BTA_HH_ERR;
1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
176ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    bta_hh_cleanup_disable(status);
1774540f59bc447dc2b7b31a3e974b74a60b2417e7dVenkatRaghavan VijayaRaghavan#endif
1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
179ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1818af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1828af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_hh_sdp_cback
1838af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1848af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      SDP callback function.
1858af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1868af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          void
1878af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1888af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
189e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssenstatic void bta_hh_sdp_cback(uint16_t result, uint16_t attr_mask,
1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                  tHID_DEV_SDP_INFO *sdp_rec )
1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_HH_DEV_CB     *p_cb = bta_hh_cb.p_cur;
193e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen    uint8_t              hdl = 0;
1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_HH_STATUS    status = BTA_HH_ERR_SDP;
1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
196ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    /* make sure sdp succeeded and hh has not been disabled */
197ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if ((result == SDP_SUCCESS) && (p_cb != NULL))
1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* security is required for the connection, add attr_mask bit*/
2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_cb->sec_mask)
2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            attr_mask |= HID_SEC_REQUIRED;
2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
203e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE)
204e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_EVENT("bta_hh_sdp_cback: p_cb: %d result 0x%02x, \
2052e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                            attr_mask 0x%02x, handle %x", \
2062e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                            p_cb, result, attr_mask,p_cb->hid_handle);
2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* check to see type of device is supported , and should not been added before */
2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (bta_hh_tod_spt(p_cb, sdp_rec->sub_class))
2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* if not added before */
2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_cb->hid_handle == BTA_HH_INVALID_HANDLE)
2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /*  add device/update attr_mask information */
2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if(HID_HostAddDev (p_cb->addr, attr_mask, &hdl) == HID_SUCCESS)
2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    status = BTA_HH_OK;
2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    /* update cb_index[] map */
2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bta_hh_cb.cb_index[hdl] = p_cb->index;
2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else
2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_cb->app_id = 0;
2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
2269628abf10efe5df159f7ad4c192c3ef89fd7731cZhihai Xu            }
2272a2701cdddac0859a95e58aec542742c450145b9Kim Schulz            else
2282a2701cdddac0859a95e58aec542742c450145b9Kim Schulz            {
2292a2701cdddac0859a95e58aec542742c450145b9Kim Schulz                hdl = p_cb->hid_handle;
2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* else : incoming connection after SDP should update the SDP information as well */
2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_cb->app_id != 0)
2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* update cb information with attr_mask, dscp_info etc. */
2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_hh_add_device_to_list(p_cb,  hdl, attr_mask,
2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                            &sdp_rec->dscp_info,
2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                            sdp_rec->sub_class,
2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                            sdp_rec->ssr_max_latency,
2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                            sdp_rec->ssr_min_tout,
2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                            p_cb->app_id);
2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_cb->dscp_info.ctry_code = sdp_rec->ctry_code;
2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                status = BTA_HH_OK;
2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else /* type of device is not supported */
2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            status = BTA_HH_ERR_TOD_UNSPT;
2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* free disc_db when SDP is completed */
254cceb430489a70add1b996d54289867c17f4ac0fdPavlin Radoslavov    osi_free_and_reset((void **)&bta_hh_cb.p_disc_db);
2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* send SDP_CMPL_EVT into state machine */
2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_hh_sm_execute(p_cb, BTA_HH_SDP_CMPL_EVT, (tBTA_HH_DATA *)&status);
2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return;
2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2628af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2638af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_hh_di_sdp_cback
2648af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2658af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      SDP DI callback function.
2668af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2678af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          void
2688af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2698af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
270e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssenstatic void bta_hh_di_sdp_cback(uint16_t result)
2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_HH_DEV_CB     *p_cb = bta_hh_cb.p_cur;
2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_HH_STATUS         status = BTA_HH_ERR_SDP;
2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tSDP_DI_GET_RECORD  di_rec;
2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tHID_STATUS ret;
276e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE)
277e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_EVENT("bta_hh_di_sdp_cback: p_cb: %d result 0x%02x", p_cb, result);
2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
2792e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if DI record does not exist on remote device, vendor_id in tBTA_HH_DEV_DSCP_INFO will be
2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         * set to 0xffff and we will allow the connection to go through. Spec mandates that DI
2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         * record be set, but many HID devices do not set this. So for IOP purposes, we allow the
2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         * connection to go through and update the DI record to invalid DI entry.*/
284ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if (((result == SDP_SUCCESS) || (result == SDP_NO_RECS_MATCH)) && (p_cb != NULL))
2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if(result == SDP_SUCCESS && SDP_GetNumDiRecords(bta_hh_cb.p_disc_db) != 0)
2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* always update information with primary DI record */
2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (SDP_GetDiRecord(1, &di_rec, bta_hh_cb.p_disc_db) == SDP_SUCCESS)
2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
291ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                bta_hh_update_di_info(p_cb, di_rec.rec.vendor, di_rec.rec.product, di_rec.rec.version, 0);
2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else /* no DI recrod available */
2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
297ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            bta_hh_update_di_info(p_cb, BTA_HH_VENDOR_ID_INVALID, 0, 0, 0);
2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((ret = HID_HostGetSDPRecord(p_cb->addr,
3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                 bta_hh_cb.p_disc_db,
3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                 p_bta_hh_cfg->sdp_db_size,
3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                 bta_hh_sdp_cback)) == HID_SUCCESS)
3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            status = BTA_HH_OK;
3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
309e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE)
310e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_DEBUG ("bta_hh_di_sdp_cback:  HID_HostGetSDPRecord failed: Status 0x%2x",
3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                               ret);
3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
31720524d393e8b3bea4c573f7980cd843500b0e6a4Pavlin Radoslavov    if (status != BTA_HH_OK) {
318cceb430489a70add1b996d54289867c17f4ac0fdPavlin Radoslavov        osi_free_and_reset((void **)&bta_hh_cb.p_disc_db);
3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* send SDP_CMPL_EVT into state machine */
3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_hh_sm_execute(p_cb, BTA_HH_SDP_CMPL_EVT, (tBTA_HH_DATA *)&status);
3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return;
3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3288af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3298af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_hh_start_sdp
3308af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3318af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      Start SDP service search, and obtain necessary SDP records.
3328af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  Only one SDP service search request is allowed at the same
3338af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  time. For every BTA_HhOpen API call, do SDP first unless SDP
3348af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  has been done previously.
3358af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3368af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          void
3378af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3388af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_start_sdp(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data)
3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_HH_STATUS          status = BTA_HH_ERR_SDP;
342e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen    uint8_t                   hdl;
3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cb->sec_mask  = p_data->api_conn.sec_mask;
3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cb->mode      = p_data->api_conn.mode;
346ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    bta_hh_cb.p_cur = p_cb;
3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3482e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if (BTA_HH_LE_INCLUDED == TRUE)
3492e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (bta_hh_is_le_device(p_cb, p_data->api_conn.bd_addr))
3502e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
3512e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        bta_hh_le_open_conn(p_cb, p_data->api_conn.bd_addr);
3522e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        return;
3532e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
3542e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif
3552e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if previously virtually cabled device, skip SDP */
3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_cb->app_id)
3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        status = BTA_HH_OK;
360e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE)
361e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_DEBUG("bta_hh_start_sdp:: skip SDP for known devices");
3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_cb->hid_handle == BTA_HH_INVALID_HANDLE)
3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3652e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            if (HID_HostAddDev (p_cb->addr, p_cb->attr_mask, &hdl) \
3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                == HID_SUCCESS)
3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* update device CB with newly register device handle */
3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_hh_add_device_to_list(p_cb,  hdl, p_cb->attr_mask, NULL,
3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                          p_cb->sub_class,
3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                          p_cb->dscp_info.ssr_max_latency,
3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                          p_cb->dscp_info.ssr_min_tout,
3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                          p_cb->app_id);
3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* update cb_index[] map */
3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_hh_cb.cb_index[hdl] = p_cb->index;
3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
378ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                status = BTA_HH_ERR_NO_RES;
3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_hh_sm_execute(p_cb, BTA_HH_SDP_CMPL_EVT, (tBTA_HH_DATA *)&status);
3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* GetSDPRecord. at one time only one SDP precedure can be active */
3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if (!bta_hh_cb.p_disc_db)
3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
387717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov        bta_hh_cb.p_disc_db = (tSDP_DISCOVERY_DB *)osi_malloc(p_bta_hh_cfg->sdp_db_size);
388717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov        bta_hh_cb.p_cur = p_cb;
389717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov        /* do DI discovery first */
390717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov        if (SDP_DiDiscover(p_data->api_conn.bd_addr,
391717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov                           bta_hh_cb.p_disc_db,
392717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov                           p_bta_hh_cfg->sdp_db_size,
393717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov                           bta_hh_di_sdp_cback) != SDP_SUCCESS) {
394e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE)
395717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov            APPL_TRACE_DEBUG("bta_hh_start_sdp:  SDP_DiDiscover failed: \
3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    Status 0x%2X",status);
3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
398717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov            status = BTA_HH_ERR_SDP;
399717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov            osi_free_and_reset((void **)&bta_hh_cb.p_disc_db);
400717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov        } else {
401717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov            status = BTA_HH_OK;
4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
403556b78b577f7476d29a8a210a8354707a54fc80aHemant Gupta    } else if (bta_hh_cb.p_disc_db) {
404556b78b577f7476d29a8a210a8354707a54fc80aHemant Gupta        /* It is possible that there is incoming/outgoing collision case. DUT initiated
405556b78b577f7476d29a8a210a8354707a54fc80aHemant Gupta         * HID connection at same time remote has connected L2CAP for HID control,
406556b78b577f7476d29a8a210a8354707a54fc80aHemant Gupta         * so SDP would be in progress, when this flow reaches here. Just do nothing
407556b78b577f7476d29a8a210a8354707a54fc80aHemant Gupta         * when the code reaches here, and ongoing SDP completion or failure will handle this case.
408556b78b577f7476d29a8a210a8354707a54fc80aHemant Gupta         */
409556b78b577f7476d29a8a210a8354707a54fc80aHemant Gupta        APPL_TRACE_DEBUG("%s: ignoring as SDP already in progress", __func__);
410556b78b577f7476d29a8a210a8354707a54fc80aHemant Gupta        return;
4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (status != BTA_HH_OK)
4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_hh_sm_execute(p_cb, BTA_HH_SDP_CMPL_EVT, (tBTA_HH_DATA *)&status);
4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return;
4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4208af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4218af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_hh_sdp_cmpl
4228af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4238af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      When SDP completed, initiate a connection or report error depend
4248af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  on SDP result.
4258af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4268af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4278af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          void
4288af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
4298af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_sdp_cmpl(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data)
4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_HH_CONN            conn_dat;
4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_HH_STATUS          status = p_data->status;
4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
435e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE)
436e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG ("bta_hh_sdp_cmpl:  status 0x%2X",p_data->status);
4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* initialize call back data */
4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset((void *)&conn_dat, 0, sizeof(tBTA_HH_CONN));
4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    conn_dat.handle = p_cb->hid_handle;
4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bdcpy(conn_dat.bda, p_cb->addr);
4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if SDP compl success */
4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( status == BTA_HH_OK)
4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* not incoming connection doing SDP, initiate a HID connection */
4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!p_cb->incoming_conn)
4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            tHID_STATUS ret;
4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* set security level */
4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            HID_HostSetSecurityLevel("", p_cb->sec_mask);
4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* open HID connection */
455891723a42851285ec7e6c2f616a405611789da6bHemant Gupta            ret = HID_HostOpenDev (p_cb->hid_handle);
456891723a42851285ec7e6c2f616a405611789da6bHemant Gupta            APPL_TRACE_DEBUG ("%s: HID_HostOpenDev returned=%d", __func__, ret);
457891723a42851285ec7e6c2f616a405611789da6bHemant Gupta            if (ret == HID_SUCCESS || ret == HID_ERR_ALREADY_CONN)
458891723a42851285ec7e6c2f616a405611789da6bHemant Gupta            {
459891723a42851285ec7e6c2f616a405611789da6bHemant Gupta                status = BTA_HH_OK;
460891723a42851285ec7e6c2f616a405611789da6bHemant Gupta            }
461891723a42851285ec7e6c2f616a405611789da6bHemant Gupta            else if (ret == HID_ERR_CONN_IN_PROCESS)
462891723a42851285ec7e6c2f616a405611789da6bHemant Gupta            {
463891723a42851285ec7e6c2f616a405611789da6bHemant Gupta                /* Connection already in progress, return from here, SDP
464891723a42851285ec7e6c2f616a405611789da6bHemant Gupta                 * will be performed after connection is completed.
465891723a42851285ec7e6c2f616a405611789da6bHemant Gupta                 */
466891723a42851285ec7e6c2f616a405611789da6bHemant Gupta                APPL_TRACE_DEBUG ("%s: connection already in progress", __func__);
467891723a42851285ec7e6c2f616a405611789da6bHemant Gupta                return;
468891723a42851285ec7e6c2f616a405611789da6bHemant Gupta            }
469891723a42851285ec7e6c2f616a405611789da6bHemant Gupta            else
4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
471e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE)
472891723a42851285ec7e6c2f616a405611789da6bHemant Gupta                APPL_TRACE_DEBUG ("%s: HID_HostOpenDev failed: Status 0x%2X", __func__, ret);
4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* open fail, remove device from management device list */
4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                HID_HostRemoveDev( p_cb->hid_handle);
4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                status = BTA_HH_ERR;
4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else /* incoming connection SDP finish */
4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_hh_sm_execute(p_cb, BTA_HH_OPEN_CMPL_EVT, NULL);
4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (status != BTA_HH_OK)
4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4872e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        /* Check if this was incoming connection request  from an unknown device
4882e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach           **and connection failed due to missing HID Device SDP UUID
4892e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach           **In above condition, disconnect the link as well as remove the
4902e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach           **device from list of HID devices*/
4912e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        if ((status == BTA_HH_ERR_SDP) &&
4922e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach           (p_cb->incoming_conn) &&(p_cb->app_id == 0))
4932e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        {
494e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_DEBUG ("bta_hh_sdp_cmpl:SDP failed for  incoming conn :hndl %d",
4952e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                p_cb->incoming_hid_handle);
4962e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            HID_HostRemoveDev( p_cb->incoming_hid_handle);
4972e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        }
4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        conn_dat.status = status;
4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (* bta_hh_cb.p_cback)(BTA_HH_OPEN_EVT, (tBTA_HH *)&conn_dat);
5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* move state machine W4_CONN ->IDLE */
5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_hh_sm_execute(p_cb, BTA_HH_API_CLOSE_EVT, NULL);
5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* if this is an outgoing connection to an unknown device, clean up cb */
5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_cb->app_id == 0 && !p_cb->incoming_conn)
5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* clean up device control block */
5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_hh_clean_up_kdev(p_cb);
5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
510e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE)
5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_hh_trace_dev_db();
5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return;
5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5188af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5198af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_hh_api_disc_act
5208af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5218af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      HID Host initiate a disconnection.
5228af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5238af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5248af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          void
5258af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5268af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_api_disc_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data)
5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_HH_CBDATA    disc_dat;
5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tHID_STATUS     status;
5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
532e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_LE_INCLUDED == TRUE)
5332e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (p_cb->is_le_device)
5342e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        bta_hh_le_api_disc_act(p_cb);
5352e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    else
5362e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif
5372e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
5382e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        /* found an active connection */
539e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen        disc_dat.handle = p_data ?(uint8_t)p_data->hdr.layer_specific :p_cb->hid_handle;
5402e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        disc_dat.status = BTA_HH_ERR;
5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5422e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        status = HID_HostCloseDev(disc_dat.handle);
5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5442e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        if (status)
5452e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            (* bta_hh_cb.p_cback)(BTA_HH_CLOSE_EVT, (tBTA_HH *)&disc_dat);
5462e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return;
5492e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5528af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5538af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_hh_open_cmpl_act
5548af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5558af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      HID host connection completed
5568af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5578af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5588af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          void
5598af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
5608af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_open_cmpl_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data)
5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_HH_CONN        conn ;
564e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen    uint8_t   dev_handle = p_data ? (uint8_t)p_data->hid_cback.hdr.layer_specific : \
5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        p_cb->hid_handle;
5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset((void *)&conn, 0, sizeof (tBTA_HH_CONN));
5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    conn.handle = dev_handle;
5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bdcpy(conn.bda, p_cb->addr);
5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* increase connection number */
5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_hh_cb.cnt_num ++;
5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* initialize device driver */
5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_hh_co_open(p_cb->hid_handle, p_cb->sub_class,
576ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                       p_cb->attr_mask,  p_cb->app_id);
5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5782e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if (BTA_HH_LE_INCLUDED == TRUE)
5792e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    conn.status = p_cb->status;
5802e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    conn.le_hid = p_cb->is_le_device;
5812e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    conn.scps_supported = p_cb->scps_supported;
5822e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
5832e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (!p_cb->is_le_device)
5842e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif
5852e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
5862e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        /* inform role manager */
5872e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        bta_sys_conn_open( BTA_ID_HH ,p_cb->app_id, p_cb->addr);
5882e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* set protocol mode when not default report mode */
5902e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if ( p_cb->mode != BTA_HH_PROTO_RPT_MODE
5912e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if (BTA_HH_LE_INCLUDED == TRUE)
5922e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach         && !p_cb->is_le_device
5932e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif
5942e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        )
5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((HID_HostWriteDev(dev_handle,
5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                              HID_TRANS_SET_PROTOCOL, HID_PAR_PROTOCOL_BOOT_MODE,
5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                              0,
5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                              0, NULL)) != HID_SUCCESS)
6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* HID connection is up, while SET_PROTO fail */
6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            conn.status = BTA_HH_ERR_PROTO;
6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (* bta_hh_cb.p_cback)(BTA_HH_OPEN_EVT, (tBTA_HH *)&conn);
6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            conn.status = BTA_HH_OK;
6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cb->w4_evt = BTA_HH_OPEN_EVT;
6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (* bta_hh_cb.p_cback)(BTA_HH_OPEN_EVT, (tBTA_HH *)&conn);
6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
614e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen    p_cb->incoming_conn = false;
6152e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    p_cb->incoming_hid_handle = BTA_HH_INVALID_HANDLE;
6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6198af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
6208af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_hh_open_act
6218af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
6228af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      HID host receive HID_OPEN_EVT .
6238af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
6248af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
6258af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          void
6268af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
6278af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
6285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_open_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data)
6295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_HH_API_CONN    conn_data;
6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
632e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen    uint8_t   dev_handle = p_data ? (uint8_t)p_data->hid_cback.hdr.layer_specific : \
6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        p_cb->hid_handle;
6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
635e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE)
636e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_EVENT ("bta_hh_open_act:  Device[%d] connected", dev_handle);
6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* SDP has been done */
6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_cb->app_id != 0)
6415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_hh_sm_execute(p_cb, BTA_HH_OPEN_CMPL_EVT, p_data);
6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /*  app_id == 0 indicates an incoming conenction request arrives without SDP
6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        performed, do it first */
6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
648e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen        p_cb->incoming_conn = true;
6492e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        /* store the handle here in case sdp fails - need to disconnect */
6502e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        p_cb->incoming_hid_handle = dev_handle;
6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memset(&conn_data, 0, sizeof(tBTA_HH_API_CONN));
6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bdcpy(conn_data.bd_addr, p_cb->addr);
6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_hh_start_sdp(p_cb, (tBTA_HH_DATA *)&conn_data);
6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return;
6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6628af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
6638af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_hh_data_act
6648af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
6658af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      HID Host process a data report
6668af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
6678af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
6688af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          void
6698af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
6708af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_data_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA * p_data)
6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR  *pdata = p_data->hid_cback.p_data;
674e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen    uint8_t   *p_rpt = (uint8_t *)(pdata + 1) + pdata->offset;
6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
676e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen    bta_hh_co_data((uint8_t)p_data->hid_cback.hdr.layer_specific, p_rpt, pdata->len,
6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_cb->mode, p_cb->sub_class, p_cb->dscp_info.ctry_code, p_cb->addr, p_cb->app_id);
6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
679cceb430489a70add1b996d54289867c17f4ac0fdPavlin Radoslavov    osi_free_and_reset((void **)&pdata);
6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6848af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
6858af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_hh_handsk_act
6868af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
6878af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      HID Host process a handshake acknoledgement.
6888af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
6898af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
6908af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          void
6918af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
6928af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_handsk_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA * p_data)
6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_HH_CBDATA  cback_data ;
6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_HH_HSDATA  hs_data;
6975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_HH_CONN    conn ;
6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
699e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE)
700e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("HANDSHAKE received for: event = %s data= %d",
7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_hh_get_w4_event(p_cb->w4_evt), p_data->hid_cback.data);
7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset(&hs_data, 0, sizeof(tBTA_HH_HSDATA));
7052e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    memset(&cback_data, 0, sizeof(tBTA_HH_CBDATA));
7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (p_cb->w4_evt)
7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* GET_ transsaction, handshake indicate unsupported request */
7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_HH_GET_PROTO_EVT:
7115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            hs_data.rsp_data.proto_mode = BTA_HH_PROTO_UNKNOWN;
7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* fall through */
7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_HH_GET_RPT_EVT:
7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_HH_GET_IDLE_EVT :
7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            hs_data.handle = p_cb->hid_handle;
7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* if handshake gives an OK code for these transaction, fill in UNSUPT */
7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ((hs_data.status = bta_hh_get_trans_status(p_data->hid_cback.data)) == BTA_HH_OK)
7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 hs_data.status = BTA_HH_HS_TRANS_NOT_SPT;
7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (* bta_hh_cb.p_cback)(p_cb->w4_evt, (tBTA_HH *)&hs_data);
7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cb->w4_evt = 0;
7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* acknoledgement from HID device for SET_ transaction */
7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_HH_SET_RPT_EVT:
7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_HH_SET_PROTO_EVT:
7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_HH_SET_IDLE_EVT :
7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            cback_data.handle  = p_cb->hid_handle;
7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            cback_data.status = bta_hh_get_trans_status(p_data->hid_cback.data);
7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (* bta_hh_cb.p_cback)(p_cb->w4_evt, (tBTA_HH *)&cback_data);
7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cb->w4_evt = 0;
7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* SET_PROTOCOL when open connection */
7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_HH_OPEN_EVT:
7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            conn.status =p_data->hid_cback.data ? BTA_HH_ERR_PROTO: BTA_HH_OK;
7375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            conn.handle = p_cb->hid_handle;
7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bdcpy(conn.bda, p_cb->addr);
7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (* bta_hh_cb.p_cback)(p_cb->w4_evt, (tBTA_HH *)&conn);
740e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE)
7415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_hh_trace_dev_db();
7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cb->w4_evt = 0;
7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        default:
7475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* unknow transaction handshake response */
748e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_DEBUG("unknown transaction type");
7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* transaction achknoledgement received, inform PM for mode change */
7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_sys_idle(BTA_ID_HH, p_cb->app_id, p_cb->addr);
7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return;
7555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
7578af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
7588af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_hh_ctrl_dat_act
7598af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
7608af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      HID Host process a data report from control channel.
7618af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
7628af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
7638af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          void
7648af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
7658af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_ctrl_dat_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA * p_data)
7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR          *pdata = p_data->hid_cback.p_data;
769e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen    uint8_t           *data = (uint8_t *)(pdata + 1) + pdata->offset;
7705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_HH_HSDATA    hs_data;
7715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
772e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE)
773e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("Ctrl DATA received w4: event[%s]",
7745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        bta_hh_get_w4_event(p_cb->w4_evt));
7755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
7765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    hs_data.status  = BTA_HH_OK;
7775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    hs_data.handle  = p_cb->hid_handle;
7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (p_cb->w4_evt)
7805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTA_HH_GET_IDLE_EVT:
7825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        hs_data.rsp_data.idle_rate = *data;
7835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
7845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTA_HH_GET_RPT_EVT:
7855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        hs_data.rsp_data.p_rpt_data = pdata;
7865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
7875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTA_HH_GET_PROTO_EVT:
7885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* match up BTE/BTA report/boot mode def*/
7895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        hs_data.rsp_data.proto_mode = ((*data) == HID_PAR_PROTOCOL_REPORT)? \
7905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    BTA_HH_PROTO_RPT_MODE : BTA_HH_PROTO_BOOT_MODE;
791e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE)
792e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_DEBUG("GET_PROTOCOL Mode = [%s]",
7935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (hs_data.rsp_data.proto_mode == BTA_HH_PROTO_RPT_MODE)? "Report" : "Boot");
7945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
7955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
7965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* should not expect control DATA for SET_ transaction */
7975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTA_HH_SET_PROTO_EVT:
7985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* fall through */
7995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTA_HH_SET_RPT_EVT:
8005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* fall through */
8015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTA_HH_SET_IDLE_EVT :
8025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* fall through */
8035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    default:
804e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE)
805e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_DEBUG("invalid  transaction type for DATA payload: 4_evt[%s]",
8065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        bta_hh_get_w4_event(p_cb->w4_evt));
8075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
8085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
8095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* inform PM for mode change */
8125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_sys_busy(BTA_ID_HH, p_cb->app_id, p_cb->addr);
8135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_sys_idle(BTA_ID_HH, p_cb->app_id, p_cb->addr);
8145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    (* bta_hh_cb.p_cback)(p_cb->w4_evt, (tBTA_HH *)&hs_data);
8165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cb->w4_evt = 0;
818cceb430489a70add1b996d54289867c17f4ac0fdPavlin Radoslavov    osi_free_and_reset((void **)&pdata);
8195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
8215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
8238af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
8248af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_hh_open_failure
8258af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
8268af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      report HID open failure when at wait for connection state and receive
8278af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  device close event.
8288af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
8298af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
8308af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          void
8318af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
8328af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
8332e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_open_failure(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data)
8342e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
8352e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBTA_HH_CONN            conn_dat ;
836e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen    uint32_t                  reason = p_data->hid_cback.data;    /* Reason for closing (32-bit) */
8372e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
8382e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    memset(&conn_dat, 0, sizeof(tBTA_HH_CONN));
8392e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach     conn_dat.handle = p_cb->hid_handle;
8402e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach     conn_dat.status = (reason == HID_ERR_AUTH_FAILED) ?
8412e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                    BTA_HH_ERR_AUTH_FAILED : BTA_HH_ERR;
8422e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach     bdcpy(conn_dat.bda, p_cb->addr);
8432e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach     HID_HostCloseDev(p_cb->hid_handle);
8442e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
8452e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach     /* Report OPEN fail event */
8462e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach     (*bta_hh_cb.p_cback)(BTA_HH_OPEN_EVT, (tBTA_HH *)&conn_dat);
8472e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
848e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE)
8492e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    bta_hh_trace_dev_db();
8502e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif
8512e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    /* clean up control block, but retain SDP info and device handle */
852e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen    p_cb->vp            = false;
8532e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    p_cb->w4_evt        = 0;
8542e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
8552e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    /* if no connection is active and HH disable is signaled, disable service */
8562e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (bta_hh_cb.cnt_num == 0 && bta_hh_cb.w4_disable)
8572e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
8582e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        bta_hh_disc_cmpl();
8592e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
8602e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
861891723a42851285ec7e6c2f616a405611789da6bHemant Gupta    /* Error in opening hid connection, reset flags */
862e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen    p_cb->incoming_conn = false;
863891723a42851285ec7e6c2f616a405611789da6bHemant Gupta    p_cb->incoming_hid_handle = BTA_HH_INVALID_HANDLE;
8642e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
8652e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
8662e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
8678af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
8688af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_hh_close_act
8698af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
8708af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      HID Host process a close event
8718af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
8728af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
8738af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          void
8748af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
8758af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
8765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_close_act (tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data)
8775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
8785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_HH_CONN            conn_dat ;
8795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_HH_CBDATA          disc_dat = {BTA_HH_OK, 0};
880e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen    uint32_t                  reason = p_data->hid_cback.data;    /* Reason for closing (32-bit) */
8815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if HID_HDEV_EVT_VC_UNPLUG was received, report BTA_HH_VC_UNPLUG_EVT */
883e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen    uint16_t     event = p_cb->vp ? BTA_HH_VC_UNPLUG_EVT : BTA_HH_CLOSE_EVT;
8845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    disc_dat.handle = p_cb->hid_handle;
8865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    disc_dat.status = p_data->hid_cback.data;
8875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Check reason for closing */
8895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((reason & (HID_L2CAP_CONN_FAIL|HID_L2CAP_REQ_FAIL)) ||  /* Failure to initialize connection (page timeout or l2cap error) */
8905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (reason == HID_ERR_AUTH_FAILED) ||                      /* Authenication error (while initiating) */
8915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (reason == HID_ERR_L2CAP_FAILED))                       /* Failure creating l2cap connection */
8925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
8935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Failure in opening connection */
8945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        conn_dat.handle = p_cb->hid_handle;
8955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        conn_dat.status = (reason == HID_ERR_AUTH_FAILED) ? BTA_HH_ERR_AUTH_FAILED : BTA_HH_ERR;
8965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bdcpy(conn_dat.bda, p_cb->addr);
8975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        HID_HostCloseDev(p_cb->hid_handle);
8985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Report OPEN fail event */
9005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*bta_hh_cb.p_cback)(BTA_HH_OPEN_EVT, (tBTA_HH *)&conn_dat);
9015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
902e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE)
9035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_hh_trace_dev_db();
9045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
9055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
9065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* otherwise report CLOSE/VC_UNPLUG event */
9085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
9095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* finaliza device driver */
9115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_hh_co_close(p_cb->hid_handle, p_cb->app_id);
9125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* inform role manager */
9135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_sys_conn_close( BTA_ID_HH ,p_cb->app_id, p_cb->addr);
9145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* update total conn number */
9155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_hh_cb.cnt_num --;
9165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (disc_dat.status)
9185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            disc_dat.status = BTA_HH_ERR;
9195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*bta_hh_cb.p_cback)(event, (tBTA_HH *)&disc_dat);
9215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* if virtually unplug, remove device */
9235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_cb->vp )
9245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
9255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            HID_HostRemoveDev( p_cb->hid_handle);
9265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_hh_clean_up_kdev(p_cb);
9275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
9285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
929e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE)
9305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_hh_trace_dev_db();
9315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
9325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* clean up control block, but retain SDP info and device handle */
935e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen    p_cb->vp            = false;
9365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cb->w4_evt        = 0;
9375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if no connection is active and HH disable is signaled, disable service */
9395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (bta_hh_cb.cnt_num == 0 && bta_hh_cb.w4_disable)
9405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_hh_disc_cmpl();
9425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return;
9455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
9465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
9488af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
9498af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_hh_get_dscp_act
9508af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
9518af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      Get device report descriptor
9528af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
9538af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
9548af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          void
9558af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
9568af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
957d35a648d39710bbc5ac59f8add85166455af5af7Myles Watsonvoid bta_hh_get_dscp_act(tBTA_HH_DEV_CB *p_cb,
958d35a648d39710bbc5ac59f8add85166455af5af7Myles Watson                         UNUSED_ATTR tBTA_HH_DATA *p_data)
9595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
9605cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen
9612e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if (BTA_HH_LE_INCLUDED == TRUE)
9622e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (p_cb->is_le_device)
9632e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
9642e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        bta_hh_le_get_dscp_act(p_cb);
9652e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
9662e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    else
9672e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif
9685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    (*bta_hh_cb.p_cback)(BTA_HH_GET_DSCP_EVT, (tBTA_HH *)&p_cb->dscp_info);
9695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
9705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
9728af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
9738af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_hh_maint_dev_act
9748af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
9758af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      HID Host maintain device list.
9768af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
9778af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
9788af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          void
9798af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
9808af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
9815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_maint_dev_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data)
9825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
9835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_HH_MAINT_DEV       *p_dev_info = &p_data->api_maintdev;
9845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_HH_DEV_INFO        dev_info ;
985e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen    uint8_t                   dev_handle;
9865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    dev_info.status = BTA_HH_ERR;
9885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    dev_info.handle = BTA_HH_INVALID_HANDLE;
9895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (p_dev_info->sub_event)
9915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTA_HH_ADD_DEV_EVT:    /* add a device */
9935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bdcpy(dev_info.bda, p_dev_info->bda);
9945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* initialize callback data */
9955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_cb->hid_handle == BTA_HH_INVALID_HANDLE)
9965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
9972e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if (BTA_HH_LE_INCLUDED == TRUE)
9982e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            if (bta_hh_is_le_device(p_cb, p_data->api_conn.bd_addr))
9992e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            {
10002e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                dev_info.handle   = bta_hh_le_add_device(p_cb, p_dev_info);
10012e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                dev_info.status   = BTA_HH_OK;
10022e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            }
10032e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            else
10042e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif
10052e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
10065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (HID_HostAddDev(p_dev_info->bda, p_dev_info->attr_mask, &dev_handle)\
10075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            == HID_SUCCESS)
10085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
10095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                dev_info.handle   = dev_handle;
10105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                dev_info.status   = BTA_HH_OK;
10115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1012e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_LE_INCLUDED == TRUE)
10135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* update DI information */
10145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_hh_update_di_info(p_cb,
10155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      p_dev_info->dscp_info.vendor_id,
10165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      p_dev_info->dscp_info.product_id,
1017ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                                      p_dev_info->dscp_info.version,
10182e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                      p_dev_info->dscp_info.flag);
10192e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#else
10202e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                bta_hh_update_di_info(p_cb,
10212e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                      p_dev_info->dscp_info.vendor_id,
10222e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                      p_dev_info->dscp_info.product_id,
10232e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                      p_dev_info->dscp_info.version,
1024ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                                      0);
10255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10262e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif
10275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* add to BTA device list */
10285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_hh_add_device_to_list(p_cb, dev_handle,
10295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                          p_dev_info->attr_mask,
10305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                          &p_dev_info->dscp_info.descriptor,
10315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                          p_dev_info->sub_class,
10325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                          p_dev_info->dscp_info.ssr_max_latency,
10335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                          p_dev_info->dscp_info.ssr_min_tout,
10345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                          p_dev_info->app_id);
10355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* update cb_index[] map */
10365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_hh_cb.cb_index[dev_handle] = p_cb->index;
10375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
10385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
10395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else    /* device already been added */
10405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
10415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            dev_info.handle = p_cb->hid_handle;
10425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            dev_info.status = BTA_HH_OK;
10435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
1044e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE)
10455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_hh_trace_dev_db();
10465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
10475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1048ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        break;
10495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTA_HH_RMV_DEV_EVT:    /* remove device */
1050e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen        dev_info.handle = (uint8_t)p_dev_info->hdr.layer_specific;
10515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bdcpy(dev_info.bda, p_cb->addr);
1052ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
1053e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_LE_INCLUDED == TRUE)
10542e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        if (p_cb->is_le_device)
10552e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        {
10562e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            bta_hh_le_remove_dev_bg_conn(p_cb);
10572e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            bta_hh_sm_execute(p_cb, BTA_HH_API_CLOSE_EVT, NULL);
10582e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            bta_hh_clean_up_kdev(p_cb);
10592e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        }
10602e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        else
10612e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif
10625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
10635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if(HID_HostRemoveDev( dev_info.handle ) == HID_SUCCESS)
10645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
10655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                dev_info.status  = BTA_HH_OK;
10665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* remove from known device list in BTA */
10685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_hh_clean_up_kdev(p_cb);
10695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
10705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
10715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
10725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    default:
1074e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_DEBUG("invalid command");
10755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
10765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    (* bta_hh_cb.p_cback)(p_dev_info->sub_event, (tBTA_HH *)&dev_info);
10795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
10805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
10818af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
10828af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_hh_write_dev_act
10838af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
10848af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      Write device action. can be SET/GET/DATA transaction.
10858af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
10868af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          void
10878af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
10888af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
10895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_write_dev_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data)
10905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
10915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_HH_CBDATA     cbdata = {BTA_HH_OK, 0};
1092e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen    uint16_t  event = (p_data->api_sndcmd.t_type - BTA_HH_FST_BTE_TRANS_EVT) +
10935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        BTA_HH_FST_TRANS_CB_EVT;
10945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1095e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_LE_INCLUDED == TRUE)
10962e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (p_cb->is_le_device)
10972e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        bta_hh_le_write_dev_act(p_cb, p_data);
10982e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    else
10992e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif
11002e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
11012e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
11025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cbdata.handle = p_cb->hid_handle;
11035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* match up BTE/BTA report/boot mode def */
11055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_data->api_sndcmd.t_type == HID_TRANS_SET_PROTOCOL)
11065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
11075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_data->api_sndcmd.param = ( p_data->api_sndcmd.param == BTA_HH_PROTO_RPT_MODE) ?\
11085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        HID_PAR_PROTOCOL_REPORT :HID_PAR_PROTOCOL_BOOT_MODE;
11095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
11105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (HID_HostWriteDev (p_cb->hid_handle,
11125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                       p_data->api_sndcmd.t_type,
11135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                       p_data->api_sndcmd.param,
11145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                       p_data->api_sndcmd.data,
11155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                       p_data->api_sndcmd.rpt_id,
11165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                       p_data->api_sndcmd.p_data) != HID_SUCCESS)
11175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1118e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_ERROR("HID_HostWriteDev Error ");
11195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        cbdata.status = BTA_HH_ERR;
11205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_data->api_sndcmd.t_type != HID_TRANS_CONTROL &&
11225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_data->api_sndcmd.t_type != HID_TRANS_DATA)
11235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (* bta_hh_cb.p_cback)(event, (tBTA_HH *)&cbdata);
11245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if (p_data->api_sndcmd.param == BTA_HH_CTRL_VIRTUAL_CABLE_UNPLUG)
11255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (* bta_hh_cb.p_cback)(BTA_HH_VC_UNPLUG_EVT, (tBTA_HH *)&cbdata);
11265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
11275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
11285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
11295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        switch(p_data->api_sndcmd.t_type)
11315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
11325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case HID_TRANS_SET_PROTOCOL:
11335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* fall through */
11345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case HID_TRANS_GET_REPORT:
11355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* fall through */
11365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case HID_TRANS_SET_REPORT:
11375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* fall through */
11385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case HID_TRANS_GET_PROTOCOL:
11395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* fall through */
11405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case HID_TRANS_GET_IDLE:
11415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* fall through */
11425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case HID_TRANS_SET_IDLE:/* set w4_handsk event name for callback function use */
11435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cb->w4_evt = event;
11445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
11455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case HID_TRANS_DATA:  /* output report */
11465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* fall through */
11475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case HID_TRANS_CONTROL:
11485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* no handshake event will be generated */
11495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* if VC_UNPLUG is issued, set flag */
11505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_data->api_sndcmd.param == BTA_HH_CTRL_VIRTUAL_CABLE_UNPLUG)
1151e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen                p_cb->vp = true;
11525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
11545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* currently not expected */
11555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case HID_TRANS_DATAC:
11565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        default:
1157e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_DEBUG("bta_hh_write_dev_act:: cmd type = %d",
11585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            p_data->api_sndcmd.t_type);
11595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
11605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
11615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* if not control type transaction, notify PM for energy control */
11635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_data->api_sndcmd.t_type != HID_TRANS_CONTROL)
11645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
11655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* inform PM for mode change */
11665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_sys_busy(BTA_ID_HH, p_cb->app_id, p_cb->addr);
11675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_sys_idle(BTA_ID_HH, p_cb->app_id, p_cb->addr);
11685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
11695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if (p_data->api_sndcmd.param == BTA_HH_CTRL_SUSPEND)
11705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
11715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project			bta_sys_sco_close(BTA_ID_HH, p_cb->app_id, p_cb->addr);
11725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
11735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if (p_data->api_sndcmd.param == BTA_HH_CTRL_EXIT_SUSPEND)
11745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
11755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_sys_busy(BTA_ID_HH, p_cb->app_id, p_cb->addr);
11765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
11775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
11785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11792e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
11805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return;
11815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
11825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
11848af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *  Static Function
11858af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ****************************************************************************/
11865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
11878af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
11888af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_hh_cback
11898af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
11908af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      BTA HH callback function.
11918af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
11928af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
11938af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          void
11948af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
11958af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
1196e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssenstatic void bta_hh_cback (uint8_t dev_handle, BD_ADDR addr, uint8_t event,
1197e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen                        uint32_t data, BT_HDR *pdata)
11985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1199e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen    uint16_t  sm_event = BTA_HH_INVALID_EVT;
1200e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen    uint8_t   xx = 0;
12015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1202e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE)
1203e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("bta_hh_cback::HID_event [%s]", bta_hh_hid_event_name(event));
12045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
12055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (event)
12075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
12085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_HDEV_EVT_OPEN:
12095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        sm_event = BTA_HH_INT_OPEN_EVT;
12105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
12115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_HDEV_EVT_CLOSE:
12125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        sm_event = BTA_HH_INT_CLOSE_EVT;
12135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
12145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_HDEV_EVT_INTR_DATA:
12155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        sm_event = BTA_HH_INT_DATA_EVT;
12165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
12175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_HDEV_EVT_HANDSHAKE:
12185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        sm_event = BTA_HH_INT_HANDSK_EVT;
12195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
12205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_HDEV_EVT_CTRL_DATA:
12215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        sm_event = BTA_HH_INT_CTRL_DATA;
12225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
12235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_HDEV_EVT_RETRYING:
12245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
12255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_HDEV_EVT_INTR_DATC:
12265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_HDEV_EVT_CTRL_DATC:
12275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Unhandled events: Free buffer for DATAC */
1228cceb430489a70add1b996d54289867c17f4ac0fdPavlin Radoslavov        osi_free_and_reset((void **)&pdata);
12295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
12305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_HDEV_EVT_VC_UNPLUG:
1231ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        for (xx = 0; xx < BTA_HH_MAX_DEVICE; xx++)
12325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
12335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (bta_hh_cb.kdev[xx].hid_handle == dev_handle)
12345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
1235e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen               bta_hh_cb.kdev[xx].vp = true;
12365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project               break;
12375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
12385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
12395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
12405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
12415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1242717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov    if (sm_event != BTA_HH_INVALID_EVT) {
1243717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov        tBTA_HH_CBACK_DATA *p_buf =
1244717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov            (tBTA_HH_CBACK_DATA *)osi_malloc(sizeof(tBTA_HH_CBACK_DATA) +
1245717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov                                             sizeof(BT_HDR));
1246717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov        p_buf->hdr.event = sm_event;
1247e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen        p_buf->hdr.layer_specific = (uint16_t)dev_handle;
1248717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov        p_buf->data = data;
12492e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        bdcpy(p_buf->addr, addr);
1250717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov        p_buf->p_data = pdata;
12515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_sys_sendmsg(p_buf);
12535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
12545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1255717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov
12565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
12578af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
12588af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_hh_get_trans_status
12598af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
12608af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      translate a handshake result code into BTA HH
12618af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  status code
12628af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
12638af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
1264e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssenstatic tBTA_HH_STATUS bta_hh_get_trans_status(uint32_t result)
12655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
12665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch(result)
12675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
12685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_PAR_HANDSHAKE_RSP_SUCCESS :                /*   (0) */
12695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return BTA_HH_OK;
12705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_PAR_HANDSHAKE_RSP_NOT_READY :              /*   (1) */
12715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_PAR_HANDSHAKE_RSP_ERR_INVALID_REP_ID:      /*   (2) */
12725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_PAR_HANDSHAKE_RSP_ERR_UNSUPPORTED_REQ :    /*   (3) */
12735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_PAR_HANDSHAKE_RSP_ERR_INVALID_PARAM :      /*   (4) */
12745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (tBTA_HH_STATUS)result;
12755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_PAR_HANDSHAKE_RSP_ERR_UNKNOWN :            /*   (14) */
12765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_PAR_HANDSHAKE_RSP_ERR_FATAL  :             /*   (15) */
12775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    default:
12785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return BTA_HH_HS_ERROR;
12795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
12805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
12815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
12825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
12838af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *  Debug Functions
12848af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ****************************************************************************/
12855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1286e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (BTA_HH_DEBUG == TRUE)
1287e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssenstatic const char* bta_hh_get_w4_event(uint16_t event)
12885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
12895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (event)
12905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
12915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTA_HH_GET_RPT_EVT:
12925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return "BTA_HH_GET_RPT_EVT";
12935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTA_HH_SET_RPT_EVT:
12945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return "BTA_HH_SET_RPT_EVT";
12955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTA_HH_GET_PROTO_EVT:
12965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return "BTA_HH_GET_PROTO_EVT";
12975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTA_HH_SET_PROTO_EVT:
12985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return "BTA_HH_SET_PROTO_EVT";
12995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTA_HH_GET_IDLE_EVT:
13005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return "BTA_HH_GET_IDLE_EVT";
13015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTA_HH_SET_IDLE_EVT:
13025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return "BTA_HH_SET_IDLE_EVT";
13035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTA_HH_OPEN_EVT:
13045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return "BTA_HH_OPEN_EVT";
13055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    default:
13065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return "Unknown event";
13075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
13085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
13105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1311e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssenstatic const char * bta_hh_hid_event_name(uint16_t event)
13125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
13135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (event)
13145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
13155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_HDEV_EVT_OPEN:
13165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return "HID_HDEV_EVT_OPEN";
13175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_HDEV_EVT_CLOSE:
13185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return "HID_HDEV_EVT_CLOSE";
13195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_HDEV_EVT_RETRYING:
13205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return "HID_HDEV_EVT_RETRYING";
13215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_HDEV_EVT_INTR_DATA:
13225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return "HID_HDEV_EVT_INTR_DATA";
13235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_HDEV_EVT_INTR_DATC:
13245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return "HID_HDEV_EVT_INTR_DATC";
13255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_HDEV_EVT_CTRL_DATA:
13265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return "HID_HDEV_EVT_CTRL_DATA";
13275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_HDEV_EVT_CTRL_DATC:
13285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return "HID_HDEV_EVT_CTRL_DATC";
13295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_HDEV_EVT_HANDSHAKE:
13305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return "HID_HDEV_EVT_HANDSHAKE";
13315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_HDEV_EVT_VC_UNPLUG:
13325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return "HID_HDEV_EVT_VC_UNPLUG";
13335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    default:
13345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return "Unknown HID event";
13355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
13365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
13375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
13385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* BTA_HH_INCLUDED */
13395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1340