bta_hh_act.cc revision 4540f59bc447dc2b7b31a3e974b74a60b2417e7d
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
275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if defined(BTA_HH_INCLUDED) && (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"
365cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen#include "utl.h"
375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Constants
405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*****************************************************************************/
415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Local Function prototypes
455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*****************************************************************************/
462e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachstatic void bta_hh_cback (UINT8 dev_handle, BD_ADDR addr, UINT8 event,
472e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                            UINT32 data, BT_HDR *pdata);
485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTA_HH_STATUS bta_hh_get_trans_status(UINT32 result);
495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_HH_DEBUG
515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic char* bta_hh_get_w4_event(UINT16 event);
525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic char * bta_hh_hid_event_name(UINT16 event);
535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Action Functions
575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*****************************************************************************/
585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_hh_api_enable
615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Perform necessary operations to enable HID host.
635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_api_enable(tBTA_HH_DATA *p_data)
695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_HH_STATUS      status = BTA_HH_ERR;
715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8               xx;
725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* initialize BTE HID */
745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    HID_HostInit();
755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset(&bta_hh_cb, 0, sizeof(tBTA_HH_CB));
775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    HID_HostSetSecurityLevel("", p_data->api_enable.sec_mask);
795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Register with L2CAP */
815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( HID_HostRegister (bta_hh_cback) == HID_SUCCESS)
825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* store parameters */
845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_hh_cb.p_cback = p_data->api_enable.p_cback;
855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        status = BTA_HH_OK;
875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* initialize device CB */
88ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        for (xx = 0; xx < BTA_HH_MAX_DEVICE; xx ++)
895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_hh_cb.kdev[xx].state        = BTA_HH_IDLE_ST;
915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_hh_cb.kdev[xx].hid_handle   = BTA_HH_INVALID_HANDLE;
925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_hh_cb.kdev[xx].index        = xx;
935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
94ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
95ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        /* initialize control block map */
96ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        for (xx = 0; xx < BTA_HH_MAX_KNOWN; xx ++)
97ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            bta_hh_cb.cb_index[xx]          = BTA_HH_IDX_INVALID;
985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1002e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if (BTA_HH_LE_INCLUDED == TRUE)
1012e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (status == BTA_HH_OK)
1022e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
1032e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        bta_hh_le_enable();
1042e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
1052e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    else
1062e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif
107ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        /* signal BTA call back event */
108ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        (* bta_hh_cb.p_cback)(BTA_HH_ENABLE_EVT, (tBTA_HH *)&status);
1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_hh_api_disable
1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Perform necessary operations to disable HID host.
1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_api_disable(void)
1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 xx;
1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* service is not enabled */
1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (bta_hh_cb.p_cback == NULL)
1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* no live connection, signal DISC_CMPL_EVT directly */
1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!bta_hh_cb.cnt_num)
1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_hh_disc_cmpl();
1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else /* otherwise, disconnect all live connections */
1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_hh_cb.w4_disable = TRUE;
1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
137ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        for(xx = 0; xx < BTA_HH_MAX_DEVICE; xx ++)
1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* send API_CLOSE event to every connected device */
1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ( bta_hh_cb.kdev[xx].state == BTA_HH_CONN_ST )
1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* disconnect all connected devices */
1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_hh_sm_execute(&bta_hh_cb.kdev[xx],
1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                BTA_HH_API_CLOSE_EVT,
1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                NULL);
1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return;
1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_hh_disc_cmpl
1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      All connections have been closed, disable service.
1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_disc_cmpl(void)
1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_HH_STATUS  status = BTA_HH_OK;
1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Deregister with lower layer */
1684540f59bc447dc2b7b31a3e974b74a60b2417e7dVenkatRaghavan VijayaRaghavan    if (HID_HostDeregister() != HID_SUCCESS)
1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        status = BTA_HH_ERR;
1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1712e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if (BTA_HH_LE_INCLUDED == TRUE)
1722e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    bta_hh_le_deregister();
1734540f59bc447dc2b7b31a3e974b74a60b2417e7dVenkatRaghavan VijayaRaghavan    UNUSED(status);
1744540f59bc447dc2b7b31a3e974b74a60b2417e7dVenkatRaghavan VijayaRaghavan#else
175ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    bta_hh_cleanup_disable(status);
1764540f59bc447dc2b7b31a3e974b74a60b2417e7dVenkatRaghavan VijayaRaghavan#endif
1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
178ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_hh_sdp_cback
1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      SDP callback function.
1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_hh_sdp_cback(UINT16 result, UINT16 attr_mask,
1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                  tHID_DEV_SDP_INFO *sdp_rec )
1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_HH_DEV_CB     *p_cb = bta_hh_cb.p_cur;
1924540f59bc447dc2b7b31a3e974b74a60b2417e7dVenkatRaghavan VijayaRaghavan    UINT8              hdl = 0;
1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_HH_STATUS    status = BTA_HH_ERR_SDP;
1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
195ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    /* make sure sdp succeeded and hh has not been disabled */
196ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if ((result == SDP_SUCCESS) && (p_cb != NULL))
1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* security is required for the connection, add attr_mask bit*/
1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_cb->sec_mask)
2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            attr_mask |= HID_SEC_REQUIRED;
2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_HH_DEBUG
203e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_EVENT("bta_hh_sdp_cback: p_cb: %d result 0x%02x, \
2042e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                            attr_mask 0x%02x, handle %x", \
2052e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                            p_cb, result, attr_mask,p_cb->hid_handle);
2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* check to see type of device is supported , and should not been added before */
2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (bta_hh_tod_spt(p_cb, sdp_rec->sub_class))
2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* if not added before */
2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_cb->hid_handle == BTA_HH_INVALID_HANDLE)
2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /*  add device/update attr_mask information */
2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if(HID_HostAddDev (p_cb->addr, attr_mask, &hdl) == HID_SUCCESS)
2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    status = BTA_HH_OK;
2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    /* update cb_index[] map */
2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bta_hh_cb.cb_index[hdl] = p_cb->index;
2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else
2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_cb->app_id = 0;
2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
2259628abf10efe5df159f7ad4c192c3ef89fd7731cZhihai Xu            }
2262a2701cdddac0859a95e58aec542742c450145b9Kim Schulz            else
2272a2701cdddac0859a95e58aec542742c450145b9Kim Schulz            {
2282a2701cdddac0859a95e58aec542742c450145b9Kim Schulz                hdl = p_cb->hid_handle;
2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* else : incoming connection after SDP should update the SDP information as well */
2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_cb->app_id != 0)
2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* update cb information with attr_mask, dscp_info etc. */
2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_hh_add_device_to_list(p_cb,  hdl, attr_mask,
2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                            &sdp_rec->dscp_info,
2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                            sdp_rec->sub_class,
2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                            sdp_rec->ssr_max_latency,
2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                            sdp_rec->ssr_min_tout,
2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                            p_cb->app_id);
2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_cb->dscp_info.ctry_code = sdp_rec->ctry_code;
2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                status = BTA_HH_OK;
2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else /* type of device is not supported */
2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            status = BTA_HH_ERR_TOD_UNSPT;
2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* free disc_db when SDP is completed */
2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    utl_freebuf((void **)&bta_hh_cb.p_disc_db);
2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* send SDP_CMPL_EVT into state machine */
2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_hh_sm_execute(p_cb, BTA_HH_SDP_CMPL_EVT, (tBTA_HH_DATA *)&status);
2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return;
2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_hh_di_sdp_cback
2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      SDP DI callback function.
2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_hh_di_sdp_cback(UINT16 result)
2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_HH_DEV_CB     *p_cb = bta_hh_cb.p_cur;
2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_HH_STATUS         status = BTA_HH_ERR_SDP;
2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tSDP_DI_GET_RECORD  di_rec;
2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tHID_STATUS ret;
2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_HH_DEBUG
276e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_EVENT("bta_hh_di_sdp_cback: p_cb: %d result 0x%02x", p_cb, result);
2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
2782e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if DI record does not exist on remote device, vendor_id in tBTA_HH_DEV_DSCP_INFO will be
2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         * set to 0xffff and we will allow the connection to go through. Spec mandates that DI
2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         * record be set, but many HID devices do not set this. So for IOP purposes, we allow the
2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         * connection to go through and update the DI record to invalid DI entry.*/
283ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if (((result == SDP_SUCCESS) || (result == SDP_NO_RECS_MATCH)) && (p_cb != NULL))
2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if(result == SDP_SUCCESS && SDP_GetNumDiRecords(bta_hh_cb.p_disc_db) != 0)
2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* always update information with primary DI record */
2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (SDP_GetDiRecord(1, &di_rec, bta_hh_cb.p_disc_db) == SDP_SUCCESS)
2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
290ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                bta_hh_update_di_info(p_cb, di_rec.rec.vendor, di_rec.rec.product, di_rec.rec.version, 0);
2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else /* no DI recrod available */
2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
296ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            bta_hh_update_di_info(p_cb, BTA_HH_VENDOR_ID_INVALID, 0, 0, 0);
2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((ret = HID_HostGetSDPRecord(p_cb->addr,
3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                 bta_hh_cb.p_disc_db,
3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                 p_bta_hh_cfg->sdp_db_size,
3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                 bta_hh_sdp_cback)) == HID_SUCCESS)
3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            status = BTA_HH_OK;
3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_HH_DEBUG
309e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_DEBUG ("bta_hh_di_sdp_cback:  HID_HostGetSDPRecord failed: Status 0x%2x",
3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                               ret);
3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (status != BTA_HH_OK)
3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        utl_freebuf((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/*******************************************************************************
3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_hh_start_sdp
3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Start SDP service search, and obtain necessary SDP records.
3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  Only one SDP service search request is allowed at the same
3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  time. For every BTA_HhOpen API call, do SDP first unless SDP
3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  has been done previously.
3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
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;
3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8                   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;
3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_HH_DEBUG
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    {
3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_hh_cb.p_disc_db = (tSDP_DISCOVERY_DB *) GKI_getbuf(p_bta_hh_cfg->sdp_db_size);
3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (bta_hh_cb.p_disc_db == NULL)
3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            status = BTA_HH_ERR_NO_RES;
3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_hh_cb.p_cur = p_cb;
3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* do DI discovery first */
3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (SDP_DiDiscover(p_data->api_conn.bd_addr,
3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                         bta_hh_cb.p_disc_db,
3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                         p_bta_hh_cfg->sdp_db_size,
4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                         bta_hh_di_sdp_cback) != SDP_SUCCESS)
4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_HH_DEBUG
403e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati                APPL_TRACE_DEBUG ("bta_hh_start_sdp:  SDP_DiDiscover failed: \
4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    Status 0x%2X",status);
4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                status = BTA_HH_ERR_SDP;
4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                utl_freebuf((void **)&bta_hh_cb.p_disc_db);
4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                status = BTA_HH_OK;
4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (status != BTA_HH_OK)
4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_hh_sm_execute(p_cb, BTA_HH_SDP_CMPL_EVT, (tBTA_HH_DATA *)&status);
4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return;
4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_hh_sdp_cmpl
4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      When SDP completed, initiate a connection or report error depend
4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  on SDP result.
4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_sdp_cmpl(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data)
4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_HH_CONN            conn_dat;
4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_HH_STATUS          status = p_data->status;
4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_HH_DEBUG
437e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG ("bta_hh_sdp_cmpl:  status 0x%2X",p_data->status);
4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* initialize call back data */
4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset((void *)&conn_dat, 0, sizeof(tBTA_HH_CONN));
4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    conn_dat.handle = p_cb->hid_handle;
4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bdcpy(conn_dat.bda, p_cb->addr);
4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if SDP compl success */
4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( status == BTA_HH_OK)
4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* not incoming connection doing SDP, initiate a HID connection */
4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!p_cb->incoming_conn)
4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            tHID_STATUS ret;
4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* set security level */
4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            HID_HostSetSecurityLevel("", p_cb->sec_mask);
4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* open HID connection */
4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ((ret = HID_HostOpenDev (p_cb->hid_handle)) != HID_SUCCESS)
4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_HH_DEBUG
459e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati                APPL_TRACE_DEBUG ("bta_hh_sdp_cmpl:  HID_HostOpenDev failed: \
4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    Status 0x%2X",ret);
4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* open fail, remove device from management device list */
4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                HID_HostRemoveDev( p_cb->hid_handle);
4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                status = BTA_HH_ERR;
4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                status = BTA_HH_OK;
4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else /* incoming connection SDP finish */
4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_hh_sm_execute(p_cb, BTA_HH_OPEN_CMPL_EVT, NULL);
4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (status != BTA_HH_OK)
4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4792e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        /* Check if this was incoming connection request  from an unknown device
4802e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach           **and connection failed due to missing HID Device SDP UUID
4812e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach           **In above condition, disconnect the link as well as remove the
4822e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach           **device from list of HID devices*/
4832e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        if ((status == BTA_HH_ERR_SDP) &&
4842e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach           (p_cb->incoming_conn) &&(p_cb->app_id == 0))
4852e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        {
486e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_DEBUG ("bta_hh_sdp_cmpl:SDP failed for  incoming conn :hndl %d",
4872e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                p_cb->incoming_hid_handle);
4882e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            HID_HostRemoveDev( p_cb->incoming_hid_handle);
4892e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        }
4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        conn_dat.status = status;
4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (* bta_hh_cb.p_cback)(BTA_HH_OPEN_EVT, (tBTA_HH *)&conn_dat);
4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* move state machine W4_CONN ->IDLE */
4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_hh_sm_execute(p_cb, BTA_HH_API_CLOSE_EVT, NULL);
4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* if this is an outgoing connection to an unknown device, clean up cb */
4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_cb->app_id == 0 && !p_cb->incoming_conn)
4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* clean up device control block */
5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_hh_clean_up_kdev(p_cb);
5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_HH_DEBUG
5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_hh_trace_dev_db();
5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return;
5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_hh_api_disc_act
5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      HID Host initiate a disconnection.
5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_api_disc_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data)
5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_HH_CBDATA    disc_dat;
5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tHID_STATUS     status;
5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5242e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if BTA_HH_LE_INCLUDED == TRUE
5252e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (p_cb->is_le_device)
5262e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        bta_hh_le_api_disc_act(p_cb);
5272e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    else
5282e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif
5292e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
5302e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        /* found an active connection */
5312e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        disc_dat.handle = p_data ?(UINT8)p_data->hdr.layer_specific :p_cb->hid_handle;
5322e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        disc_dat.status = BTA_HH_ERR;
5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5342e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        status = HID_HostCloseDev(disc_dat.handle);
5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5362e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        if (status)
5372e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            (* bta_hh_cb.p_cback)(BTA_HH_CLOSE_EVT, (tBTA_HH *)&disc_dat);
5382e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return;
5412e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_hh_open_cmpl_act
5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      HID host connection completed
5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_open_cmpl_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data)
5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_HH_CONN        conn ;
5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   dev_handle = p_data ? (UINT8)p_data->hid_cback.hdr.layer_specific : \
5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        p_cb->hid_handle;
5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset((void *)&conn, 0, sizeof (tBTA_HH_CONN));
5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    conn.handle = dev_handle;
5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bdcpy(conn.bda, p_cb->addr);
5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* increase connection number */
5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_hh_cb.cnt_num ++;
5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* initialize device driver */
5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_hh_co_open(p_cb->hid_handle, p_cb->sub_class,
568ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                       p_cb->attr_mask,  p_cb->app_id);
5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5702e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if (BTA_HH_LE_INCLUDED == TRUE)
5712e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    conn.status = p_cb->status;
5722e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    conn.le_hid = p_cb->is_le_device;
5732e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    conn.scps_supported = p_cb->scps_supported;
5742e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
5752e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (!p_cb->is_le_device)
5762e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif
5772e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
5782e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        /* inform role manager */
5792e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        bta_sys_conn_open( BTA_ID_HH ,p_cb->app_id, p_cb->addr);
5802e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* set protocol mode when not default report mode */
5822e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if ( p_cb->mode != BTA_HH_PROTO_RPT_MODE
5832e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if (BTA_HH_LE_INCLUDED == TRUE)
5842e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach         && !p_cb->is_le_device
5852e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif
5862e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        )
5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((HID_HostWriteDev(dev_handle,
5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                              HID_TRANS_SET_PROTOCOL, HID_PAR_PROTOCOL_BOOT_MODE,
5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                              0,
5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                              0, NULL)) != HID_SUCCESS)
5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* HID connection is up, while SET_PROTO fail */
5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            conn.status = BTA_HH_ERR_PROTO;
5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (* bta_hh_cb.p_cback)(BTA_HH_OPEN_EVT, (tBTA_HH *)&conn);
5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            conn.status = BTA_HH_OK;
6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cb->w4_evt = BTA_HH_OPEN_EVT;
6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (* bta_hh_cb.p_cback)(BTA_HH_OPEN_EVT, (tBTA_HH *)&conn);
6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cb->incoming_conn = FALSE;
6072e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    p_cb->incoming_hid_handle = BTA_HH_INVALID_HANDLE;
6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_hh_open_act
6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      HID host receive HID_OPEN_EVT .
6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_open_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data)
6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_HH_API_CONN    conn_data;
6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   dev_handle = p_data ? (UINT8)p_data->hid_cback.hdr.layer_specific : \
6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        p_cb->hid_handle;
6265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6272e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if BTA_HH_DEBUG
628e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_EVENT ("bta_hh_open_act:  Device[%d] connected", dev_handle);
6295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
6305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* SDP has been done */
6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_cb->app_id != 0)
6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_hh_sm_execute(p_cb, BTA_HH_OPEN_CMPL_EVT, p_data);
6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /*  app_id == 0 indicates an incoming conenction request arrives without SDP
6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        performed, do it first */
6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_cb->incoming_conn = TRUE;
6412e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        /* store the handle here in case sdp fails - need to disconnect */
6422e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        p_cb->incoming_hid_handle = dev_handle;
6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memset(&conn_data, 0, sizeof(tBTA_HH_API_CONN));
6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bdcpy(conn_data.bd_addr, p_cb->addr);
6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_hh_start_sdp(p_cb, (tBTA_HH_DATA *)&conn_data);
6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return;
6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_hh_data_act
6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      HID Host process a data report
6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_data_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA * p_data)
6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR  *pdata = p_data->hid_cback.p_data;
6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   *p_rpt = (UINT8 *)(pdata + 1) + pdata->offset;
6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_hh_co_data((UINT8)p_data->hid_cback.hdr.layer_specific, p_rpt, pdata->len,
6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_cb->mode, p_cb->sub_class, p_cb->dscp_info.ctry_code, p_cb->addr, p_cb->app_id);
6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    utl_freebuf((void **)&pdata);
6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_hh_handsk_act
6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      HID Host process a handshake acknoledgement.
6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_handsk_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA * p_data)
6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_HH_CBDATA  cback_data ;
6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_HH_HSDATA  hs_data;
6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_HH_CONN    conn ;
6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_HH_DEBUG
692e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("HANDSHAKE received for: event = %s data= %d",
6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_hh_get_w4_event(p_cb->w4_evt), p_data->hid_cback.data);
6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset(&hs_data, 0, sizeof(tBTA_HH_HSDATA));
6972e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    memset(&cback_data, 0, sizeof(tBTA_HH_CBDATA));
6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (p_cb->w4_evt)
7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* GET_ transsaction, handshake indicate unsupported request */
7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_HH_GET_PROTO_EVT:
7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            hs_data.rsp_data.proto_mode = BTA_HH_PROTO_UNKNOWN;
7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* fall through */
7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_HH_GET_RPT_EVT:
7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_HH_GET_IDLE_EVT :
7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            hs_data.handle = p_cb->hid_handle;
7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* if handshake gives an OK code for these transaction, fill in UNSUPT */
7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ((hs_data.status = bta_hh_get_trans_status(p_data->hid_cback.data)) == BTA_HH_OK)
7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 hs_data.status = BTA_HH_HS_TRANS_NOT_SPT;
7115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (* bta_hh_cb.p_cback)(p_cb->w4_evt, (tBTA_HH *)&hs_data);
7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cb->w4_evt = 0;
7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* acknoledgement from HID device for SET_ transaction */
7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_HH_SET_RPT_EVT:
7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_HH_SET_PROTO_EVT:
7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_HH_SET_IDLE_EVT :
7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            cback_data.handle  = p_cb->hid_handle;
7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            cback_data.status = bta_hh_get_trans_status(p_data->hid_cback.data);
7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (* bta_hh_cb.p_cback)(p_cb->w4_evt, (tBTA_HH *)&cback_data);
7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cb->w4_evt = 0;
7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* SET_PROTOCOL when open connection */
7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_HH_OPEN_EVT:
7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            conn.status =p_data->hid_cback.data ? BTA_HH_ERR_PROTO: BTA_HH_OK;
7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            conn.handle = p_cb->hid_handle;
7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bdcpy(conn.bda, p_cb->addr);
7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (* bta_hh_cb.p_cback)(p_cb->w4_evt, (tBTA_HH *)&conn);
7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_HH_DEBUG
7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_hh_trace_dev_db();
7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cb->w4_evt = 0;
7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
7375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        default:
7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* unknow transaction handshake response */
740e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_DEBUG("unknown transaction type");
7415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* transaction achknoledgement received, inform PM for mode change */
7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_sys_idle(BTA_ID_HH, p_cb->app_id, p_cb->addr);
7465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return;
7475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_hh_ctrl_dat_act
7515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      HID Host process a data report from control channel.
7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
7585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_ctrl_dat_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA * p_data)
7595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR          *pdata = p_data->hid_cback.p_data;
7615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8           *data = (UINT8 *)(pdata + 1) + pdata->offset;
7625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_HH_HSDATA    hs_data;
7635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_HH_DEBUG
765e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("Ctrl DATA received w4: event[%s]",
7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        bta_hh_get_w4_event(p_cb->w4_evt));
7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
7685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    hs_data.status  = BTA_HH_OK;
7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    hs_data.handle  = p_cb->hid_handle;
7705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (p_cb->w4_evt)
7725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTA_HH_GET_IDLE_EVT:
7745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        hs_data.rsp_data.idle_rate = *data;
7755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
7765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTA_HH_GET_RPT_EVT:
7775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        hs_data.rsp_data.p_rpt_data = pdata;
7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTA_HH_GET_PROTO_EVT:
7805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* match up BTE/BTA report/boot mode def*/
7815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        hs_data.rsp_data.proto_mode = ((*data) == HID_PAR_PROTOCOL_REPORT)? \
7825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    BTA_HH_PROTO_RPT_MODE : BTA_HH_PROTO_BOOT_MODE;
7835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_HH_DEBUG
784e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_DEBUG("GET_PROTOCOL Mode = [%s]",
7855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (hs_data.rsp_data.proto_mode == BTA_HH_PROTO_RPT_MODE)? "Report" : "Boot");
7865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
7875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
7885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* should not expect control DATA for SET_ transaction */
7895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTA_HH_SET_PROTO_EVT:
7905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* fall through */
7915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTA_HH_SET_RPT_EVT:
7925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* fall through */
7935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTA_HH_SET_IDLE_EVT :
7945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* fall through */
7955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    default:
7965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_HH_DEBUG
797e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_DEBUG("invalid  transaction type for DATA payload: 4_evt[%s]",
7985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        bta_hh_get_w4_event(p_cb->w4_evt));
7995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
8005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
8015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* inform PM for mode change */
8045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_sys_busy(BTA_ID_HH, p_cb->app_id, p_cb->addr);
8055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_sys_idle(BTA_ID_HH, p_cb->app_id, p_cb->addr);
8065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    (* bta_hh_cb.p_cback)(p_cb->w4_evt, (tBTA_HH *)&hs_data);
8085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cb->w4_evt = 0;
8105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    utl_freebuf((void **)&pdata);
8115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
8135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
8155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8162e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Function         bta_hh_open_failure
8172e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
8182e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Description      report HID open failure when at wait for connection state and receive
8192e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**                  device close event.
8202e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
8212e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
8222e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach** Returns          void
8232e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
8242e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach*******************************************************************************/
8252e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachvoid bta_hh_open_failure(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data)
8262e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach{
8272e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    tBTA_HH_CONN            conn_dat ;
8282e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    UINT32                  reason = p_data->hid_cback.data;    /* Reason for closing (32-bit) */
8292e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
8302e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    memset(&conn_dat, 0, sizeof(tBTA_HH_CONN));
8312e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach     conn_dat.handle = p_cb->hid_handle;
8322e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach     conn_dat.status = (reason == HID_ERR_AUTH_FAILED) ?
8332e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                    BTA_HH_ERR_AUTH_FAILED : BTA_HH_ERR;
8342e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach     bdcpy(conn_dat.bda, p_cb->addr);
8352e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach     HID_HostCloseDev(p_cb->hid_handle);
8362e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
8372e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach     /* Report OPEN fail event */
8382e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach     (*bta_hh_cb.p_cback)(BTA_HH_OPEN_EVT, (tBTA_HH *)&conn_dat);
8392e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
8402e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if BTA_HH_DEBUG
8412e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    bta_hh_trace_dev_db();
8422e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif
8432e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    /* clean up control block, but retain SDP info and device handle */
8442e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    p_cb->vp            = FALSE;
8452e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    p_cb->w4_evt        = 0;
8462e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
8472e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    /* if no connection is active and HH disable is signaled, disable service */
8482e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (bta_hh_cb.cnt_num == 0 && bta_hh_cb.w4_disable)
8492e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
8502e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        bta_hh_disc_cmpl();
8512e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
8522e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
8532e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach}
8542e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
8552e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach/*******************************************************************************
8562e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach**
8575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_hh_close_act
8585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      HID Host process a close event
8605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
8635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
8655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_close_act (tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data)
8665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
8675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_HH_CONN            conn_dat ;
8685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_HH_CBDATA          disc_dat = {BTA_HH_OK, 0};
8695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT32                  reason = p_data->hid_cback.data;    /* Reason for closing (32-bit) */
8705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if HID_HDEV_EVT_VC_UNPLUG was received, report BTA_HH_VC_UNPLUG_EVT */
8725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16     event = p_cb->vp ? BTA_HH_VC_UNPLUG_EVT : BTA_HH_CLOSE_EVT;
8735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    disc_dat.handle = p_cb->hid_handle;
8755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    disc_dat.status = p_data->hid_cback.data;
8765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Check reason for closing */
8785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((reason & (HID_L2CAP_CONN_FAIL|HID_L2CAP_REQ_FAIL)) ||  /* Failure to initialize connection (page timeout or l2cap error) */
8795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (reason == HID_ERR_AUTH_FAILED) ||                      /* Authenication error (while initiating) */
8805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (reason == HID_ERR_L2CAP_FAILED))                       /* Failure creating l2cap connection */
8815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
8825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Failure in opening connection */
8835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        conn_dat.handle = p_cb->hid_handle;
8845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        conn_dat.status = (reason == HID_ERR_AUTH_FAILED) ? BTA_HH_ERR_AUTH_FAILED : BTA_HH_ERR;
8855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bdcpy(conn_dat.bda, p_cb->addr);
8865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        HID_HostCloseDev(p_cb->hid_handle);
8875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Report OPEN fail event */
8895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*bta_hh_cb.p_cback)(BTA_HH_OPEN_EVT, (tBTA_HH *)&conn_dat);
8905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_HH_DEBUG
8925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_hh_trace_dev_db();
8935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
8945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
8955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* otherwise report CLOSE/VC_UNPLUG event */
8975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
8985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
8995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* finaliza device driver */
9005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_hh_co_close(p_cb->hid_handle, p_cb->app_id);
9015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* inform role manager */
9025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_sys_conn_close( BTA_ID_HH ,p_cb->app_id, p_cb->addr);
9035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* update total conn number */
9045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_hh_cb.cnt_num --;
9055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (disc_dat.status)
9075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            disc_dat.status = BTA_HH_ERR;
9085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*bta_hh_cb.p_cback)(event, (tBTA_HH *)&disc_dat);
9105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* if virtually unplug, remove device */
9125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_cb->vp )
9135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
9145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            HID_HostRemoveDev( p_cb->hid_handle);
9155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_hh_clean_up_kdev(p_cb);
9165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
9175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_HH_DEBUG
9195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_hh_trace_dev_db();
9205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
9215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* clean up control block, but retain SDP info and device handle */
9245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cb->vp            = FALSE;
9255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cb->w4_evt        = 0;
9265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if no connection is active and HH disable is signaled, disable service */
9285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (bta_hh_cb.cnt_num == 0 && bta_hh_cb.w4_disable)
9295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_hh_disc_cmpl();
9315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return;
9345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
9355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
9375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_hh_get_dscp_act
9395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Get device report descriptor
9415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
9445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
9465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_get_dscp_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data)
9475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
9485cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(p_data);
9495cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen
9502e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if (BTA_HH_LE_INCLUDED == TRUE)
9512e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (p_cb->is_le_device)
9522e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
9532e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        bta_hh_le_get_dscp_act(p_cb);
9542e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
9552e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    else
9562e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif
9575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    (*bta_hh_cb.p_cback)(BTA_HH_GET_DSCP_EVT, (tBTA_HH *)&p_cb->dscp_info);
9585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
9595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
9615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_hh_maint_dev_act
9635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      HID Host maintain device list.
9655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
9685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
9705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_maint_dev_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data)
9715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
9725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_HH_MAINT_DEV       *p_dev_info = &p_data->api_maintdev;
9735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_HH_DEV_INFO        dev_info ;
9745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8                   dev_handle;
9755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    dev_info.status = BTA_HH_ERR;
9775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    dev_info.handle = BTA_HH_INVALID_HANDLE;
9785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (p_dev_info->sub_event)
9805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTA_HH_ADD_DEV_EVT:    /* add a device */
9825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bdcpy(dev_info.bda, p_dev_info->bda);
9835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* initialize callback data */
9845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_cb->hid_handle == BTA_HH_INVALID_HANDLE)
9855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
9862e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if (BTA_HH_LE_INCLUDED == TRUE)
9872e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            if (bta_hh_is_le_device(p_cb, p_data->api_conn.bd_addr))
9882e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            {
9892e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                dev_info.handle   = bta_hh_le_add_device(p_cb, p_dev_info);
9902e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                dev_info.status   = BTA_HH_OK;
9912e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            }
9922e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            else
9932e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif
9942e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
9955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (HID_HostAddDev(p_dev_info->bda, p_dev_info->attr_mask, &dev_handle)\
9965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            == HID_SUCCESS)
9975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
9985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                dev_info.handle   = dev_handle;
9995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                dev_info.status   = BTA_HH_OK;
10005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10012e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if (defined BTA_HH_LE_INCLUDED && BTA_HH_LE_INCLUDED == TRUE)
10025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* update DI information */
10035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_hh_update_di_info(p_cb,
10045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      p_dev_info->dscp_info.vendor_id,
10055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      p_dev_info->dscp_info.product_id,
1006ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                                      p_dev_info->dscp_info.version,
10072e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                      p_dev_info->dscp_info.flag);
10082e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#else
10092e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                bta_hh_update_di_info(p_cb,
10102e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                      p_dev_info->dscp_info.vendor_id,
10112e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                      p_dev_info->dscp_info.product_id,
10122e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                                      p_dev_info->dscp_info.version,
1013ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                                      0);
10145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10152e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif
10165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* add to BTA device list */
10175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_hh_add_device_to_list(p_cb, dev_handle,
10185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                          p_dev_info->attr_mask,
10195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                          &p_dev_info->dscp_info.descriptor,
10205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                          p_dev_info->sub_class,
10215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                          p_dev_info->dscp_info.ssr_max_latency,
10225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                          p_dev_info->dscp_info.ssr_min_tout,
10235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                          p_dev_info->app_id);
10245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* update cb_index[] map */
10255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_hh_cb.cb_index[dev_handle] = p_cb->index;
10265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
10275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
10285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else    /* device already been added */
10295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
10305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            dev_info.handle = p_cb->hid_handle;
10315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            dev_info.status = BTA_HH_OK;
10325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
10335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_HH_DEBUG
10345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_hh_trace_dev_db();
10355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
10365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1037ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        break;
10385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTA_HH_RMV_DEV_EVT:    /* remove device */
10395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        dev_info.handle = (UINT8)p_dev_info->hdr.layer_specific;
10405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bdcpy(dev_info.bda, p_cb->addr);
1041ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
10422e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if BTA_HH_LE_INCLUDED == TRUE
10432e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        if (p_cb->is_le_device)
10442e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        {
10452e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            bta_hh_le_remove_dev_bg_conn(p_cb);
10462e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            bta_hh_sm_execute(p_cb, BTA_HH_API_CLOSE_EVT, NULL);
10472e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach            bta_hh_clean_up_kdev(p_cb);
10482e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        }
10492e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        else
10502e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif
10515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
10525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if(HID_HostRemoveDev( dev_info.handle ) == HID_SUCCESS)
10535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
10545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                dev_info.status  = BTA_HH_OK;
10555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* remove from known device list in BTA */
10575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_hh_clean_up_kdev(p_cb);
10585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
10595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
10605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
10615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    default:
1063e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_DEBUG("invalid command");
10645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
10655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    (* bta_hh_cb.p_cback)(p_dev_info->sub_event, (tBTA_HH *)&dev_info);
10685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
10695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
10705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_hh_write_dev_act
10725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Write device action. can be SET/GET/DATA transaction.
10745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
10765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
10785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_hh_write_dev_act(tBTA_HH_DEV_CB *p_cb, tBTA_HH_DATA *p_data)
10795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
10805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_HH_CBDATA     cbdata = {BTA_HH_OK, 0};
10815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16  event = (p_data->api_sndcmd.t_type - BTA_HH_FST_BTE_TRANS_EVT) +
10825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        BTA_HH_FST_TRANS_CB_EVT;
10835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10842e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#if BTA_HH_LE_INCLUDED == TRUE
10852e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    if (p_cb->is_le_device)
10862e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        bta_hh_le_write_dev_act(p_cb, p_data);
10872e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    else
10882e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach#endif
10892e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    {
10902e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach
10915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cbdata.handle = p_cb->hid_handle;
10925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* match up BTE/BTA report/boot mode def */
10945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_data->api_sndcmd.t_type == HID_TRANS_SET_PROTOCOL)
10955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
10965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_data->api_sndcmd.param = ( p_data->api_sndcmd.param == BTA_HH_PROTO_RPT_MODE) ?\
10975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        HID_PAR_PROTOCOL_REPORT :HID_PAR_PROTOCOL_BOOT_MODE;
10985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (HID_HostWriteDev (p_cb->hid_handle,
11015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                       p_data->api_sndcmd.t_type,
11025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                       p_data->api_sndcmd.param,
11035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                       p_data->api_sndcmd.data,
11045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                       p_data->api_sndcmd.rpt_id,
11055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                       p_data->api_sndcmd.p_data) != HID_SUCCESS)
11065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1107e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_ERROR("HID_HostWriteDev Error ");
11085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        cbdata.status = BTA_HH_ERR;
11095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_data->api_sndcmd.t_type != HID_TRANS_CONTROL &&
11115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_data->api_sndcmd.t_type != HID_TRANS_DATA)
11125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (* bta_hh_cb.p_cback)(event, (tBTA_HH *)&cbdata);
11135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if (p_data->api_sndcmd.param == BTA_HH_CTRL_VIRTUAL_CABLE_UNPLUG)
11145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (* bta_hh_cb.p_cback)(BTA_HH_VC_UNPLUG_EVT, (tBTA_HH *)&cbdata);
11155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
11165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
11175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
11185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        switch(p_data->api_sndcmd.t_type)
11205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
11215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case HID_TRANS_SET_PROTOCOL:
11225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* fall through */
11235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case HID_TRANS_GET_REPORT:
11245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* fall through */
11255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case HID_TRANS_SET_REPORT:
11265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* fall through */
11275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case HID_TRANS_GET_PROTOCOL:
11285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* fall through */
11295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case HID_TRANS_GET_IDLE:
11305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* fall through */
11315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case HID_TRANS_SET_IDLE:/* set w4_handsk event name for callback function use */
11325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cb->w4_evt = event;
11335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
11345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case HID_TRANS_DATA:  /* output report */
11355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* fall through */
11365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case HID_TRANS_CONTROL:
11375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* no handshake event will be generated */
11385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* if VC_UNPLUG is issued, set flag */
11395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_data->api_sndcmd.param == BTA_HH_CTRL_VIRTUAL_CABLE_UNPLUG)
11405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_cb->vp = TRUE;
11415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
11435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* currently not expected */
11445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case HID_TRANS_DATAC:
11455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        default:
1146e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_DEBUG("bta_hh_write_dev_act:: cmd type = %d",
11475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            p_data->api_sndcmd.t_type);
11485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
11495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
11505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* if not control type transaction, notify PM for energy control */
11525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_data->api_sndcmd.t_type != HID_TRANS_CONTROL)
11535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
11545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* inform PM for mode change */
11555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_sys_busy(BTA_ID_HH, p_cb->app_id, p_cb->addr);
11565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_sys_idle(BTA_ID_HH, p_cb->app_id, p_cb->addr);
11575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
11585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if (p_data->api_sndcmd.param == BTA_HH_CTRL_SUSPEND)
11595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
11605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project			bta_sys_sco_close(BTA_ID_HH, p_cb->app_id, p_cb->addr);
11615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
11625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if (p_data->api_sndcmd.param == BTA_HH_CTRL_EXIT_SUSPEND)
11635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
11645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_sys_busy(BTA_ID_HH, p_cb->app_id, p_cb->addr);
11655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
11665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
11675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11682e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach    }
11695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return;
11705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
11715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
11735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Static Function
11745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*****************************************************************************/
11755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
11765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_hh_cback
11785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      BTA HH callback function.
11805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
11835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
11852e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbachstatic void bta_hh_cback (UINT8 dev_handle, BD_ADDR addr, UINT8 event,
11862e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach                        UINT32 data, BT_HDR *pdata)
11875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
11885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_HH_CBACK_DATA    *p_buf = NULL;
11895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16  sm_event = BTA_HH_INVALID_EVT;
11905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   xx = 0;
11915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_HH_DEBUG
1193e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("bta_hh_cback::HID_event [%s]", bta_hh_hid_event_name(event));
11945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
11955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (event)
11975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
11985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_HDEV_EVT_OPEN:
11995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        sm_event = BTA_HH_INT_OPEN_EVT;
12005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
12015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_HDEV_EVT_CLOSE:
12025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        sm_event = BTA_HH_INT_CLOSE_EVT;
12035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
12045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_HDEV_EVT_INTR_DATA:
12055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        sm_event = BTA_HH_INT_DATA_EVT;
12065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
12075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_HDEV_EVT_HANDSHAKE:
12085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        sm_event = BTA_HH_INT_HANDSK_EVT;
12095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
12105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_HDEV_EVT_CTRL_DATA:
12115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        sm_event = BTA_HH_INT_CTRL_DATA;
12125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
12135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_HDEV_EVT_RETRYING:
12145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
12155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_HDEV_EVT_INTR_DATC:
12165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_HDEV_EVT_CTRL_DATC:
12175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Unhandled events: Free buffer for DATAC */
12185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        utl_freebuf((void **)&pdata);
12195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
12205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_HDEV_EVT_VC_UNPLUG:
1221ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        for (xx = 0; xx < BTA_HH_MAX_DEVICE; xx++)
12225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
12235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (bta_hh_cb.kdev[xx].hid_handle == dev_handle)
12245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
12255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project               bta_hh_cb.kdev[xx].vp = TRUE;
12265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project               break;
12275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
12285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
12295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
12305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
12315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (sm_event != BTA_HH_INVALID_EVT &&
12335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (p_buf = (tBTA_HH_CBACK_DATA *)GKI_getbuf(sizeof(tBTA_HH_CBACK_DATA) +
12345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    sizeof(BT_HDR))) != NULL)
12355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
12365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_buf->hdr.event  = sm_event;
12375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_buf->hdr.layer_specific = (UINT16)dev_handle;
12385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_buf->data       = data;
12392e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach        bdcpy(p_buf->addr, addr);
12405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_buf->p_data     = pdata;
12415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_sys_sendmsg(p_buf);
12435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
12445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
12465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
12475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_hh_get_trans_status
12495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      translate a handshake result code into BTA HH
12515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  status code
12525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
12545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTA_HH_STATUS bta_hh_get_trans_status(UINT32 result)
12555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
12565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch(result)
12575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
12585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_PAR_HANDSHAKE_RSP_SUCCESS :                /*   (0) */
12595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return BTA_HH_OK;
12605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_PAR_HANDSHAKE_RSP_NOT_READY :              /*   (1) */
12615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_PAR_HANDSHAKE_RSP_ERR_INVALID_REP_ID:      /*   (2) */
12625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_PAR_HANDSHAKE_RSP_ERR_UNSUPPORTED_REQ :    /*   (3) */
12635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_PAR_HANDSHAKE_RSP_ERR_INVALID_PARAM :      /*   (4) */
12645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (tBTA_HH_STATUS)result;
12655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_PAR_HANDSHAKE_RSP_ERR_UNKNOWN :            /*   (14) */
12665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_PAR_HANDSHAKE_RSP_ERR_FATAL  :             /*   (15) */
12675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    default:
12685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return BTA_HH_HS_ERROR;
12695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
12705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
12715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
12725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
12735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Debug Functions
12745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*****************************************************************************/
12755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (defined BTA_HH_DEBUG && BTA_HH_DEBUG == TRUE)
12775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic char* bta_hh_get_w4_event(UINT16 event)
12785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
12795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (event)
12805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
12815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTA_HH_GET_RPT_EVT:
12825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return "BTA_HH_GET_RPT_EVT";
12835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTA_HH_SET_RPT_EVT:
12845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return "BTA_HH_SET_RPT_EVT";
12855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTA_HH_GET_PROTO_EVT:
12865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return "BTA_HH_GET_PROTO_EVT";
12875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTA_HH_SET_PROTO_EVT:
12885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return "BTA_HH_SET_PROTO_EVT";
12895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTA_HH_GET_IDLE_EVT:
12905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return "BTA_HH_GET_IDLE_EVT";
12915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTA_HH_SET_IDLE_EVT:
12925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return "BTA_HH_SET_IDLE_EVT";
12935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTA_HH_OPEN_EVT:
12945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return "BTA_HH_OPEN_EVT";
12955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    default:
12965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return "Unknown event";
12975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
12985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
13005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic char * bta_hh_hid_event_name(UINT16 event)
13025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
13035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (event)
13045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
13055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_HDEV_EVT_OPEN:
13065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return "HID_HDEV_EVT_OPEN";
13075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_HDEV_EVT_CLOSE:
13085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return "HID_HDEV_EVT_CLOSE";
13095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_HDEV_EVT_RETRYING:
13105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return "HID_HDEV_EVT_RETRYING";
13115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_HDEV_EVT_INTR_DATA:
13125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return "HID_HDEV_EVT_INTR_DATA";
13135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_HDEV_EVT_INTR_DATC:
13145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return "HID_HDEV_EVT_INTR_DATC";
13155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_HDEV_EVT_CTRL_DATA:
13165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return "HID_HDEV_EVT_CTRL_DATA";
13175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_HDEV_EVT_CTRL_DATC:
13185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return "HID_HDEV_EVT_CTRL_DATC";
13195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_HDEV_EVT_HANDSHAKE:
13205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return "HID_HDEV_EVT_HANDSHAKE";
13215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case HID_HDEV_EVT_VC_UNPLUG:
13225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return "HID_HDEV_EVT_VC_UNPLUG";
13235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    default:
13245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return "Unknown HID event";
13255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
13265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
13275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
13285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* BTA_HH_INCLUDED */
13295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1330